mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 10:44:09 -04:00
PDF Output: Add an option to break long words at the ends of lines.
Fixes #1773111 [add hyphenation to ePub-to-PDF conversion](https://bugs.launchpad.net/calibre/+bug/1773111)
This commit is contained in:
parent
c6c689f9e3
commit
4fc540bdaa
@ -94,6 +94,8 @@ class PDFOutput(OutputFormatPlugin):
|
|||||||
OptionRecommendation(name='pdf_mono_font_size',
|
OptionRecommendation(name='pdf_mono_font_size',
|
||||||
recommended_value=16, help=_(
|
recommended_value=16, help=_(
|
||||||
'The default font size for monospaced text')),
|
'The default font size for monospaced text')),
|
||||||
|
OptionRecommendation(name='pdf_hyphenate', recommended_value=False,
|
||||||
|
help=_('Break long words at the end of lines. This can give the text at the right margin a more even appearance.')),
|
||||||
OptionRecommendation(name='pdf_mark_links', recommended_value=False,
|
OptionRecommendation(name='pdf_mark_links', recommended_value=False,
|
||||||
help=_('Surround all links with a red box, useful for debugging.')),
|
help=_('Surround all links with a red box, useful for debugging.')),
|
||||||
OptionRecommendation(name='uncompressed_pdf',
|
OptionRecommendation(name='uncompressed_pdf',
|
||||||
@ -184,8 +186,7 @@ class PDFOutput(OutputFormatPlugin):
|
|||||||
|
|
||||||
def get_cover_data(self):
|
def get_cover_data(self):
|
||||||
oeb = self.oeb
|
oeb = self.oeb
|
||||||
if (oeb.metadata.cover and
|
if (oeb.metadata.cover and unicode(oeb.metadata.cover[0]) in oeb.manifest.ids):
|
||||||
unicode(oeb.metadata.cover[0]) in oeb.manifest.ids):
|
|
||||||
cover_id = unicode(oeb.metadata.cover[0])
|
cover_id = unicode(oeb.metadata.cover[0])
|
||||||
item = oeb.manifest.ids[cover_id]
|
item = oeb.manifest.ids[cover_id]
|
||||||
self.cover_data = item.data
|
self.cover_data = item.data
|
||||||
|
@ -24,6 +24,7 @@ from calibre.ebooks.pdf.render.common import (inch, cm, mm, pica, cicero,
|
|||||||
didot, PAPER_SIZES, current_log)
|
didot, PAPER_SIZES, current_log)
|
||||||
from calibre.ebooks.pdf.render.engine import PdfDevice
|
from calibre.ebooks.pdf.render.engine import PdfDevice
|
||||||
from calibre.ptempfile import PersistentTemporaryFile
|
from calibre.ptempfile import PersistentTemporaryFile
|
||||||
|
from calibre.utils.resources import load_hyphenator_dicts
|
||||||
|
|
||||||
|
|
||||||
def get_page_size(opts, for_comic=False): # {{{
|
def get_page_size(opts, for_comic=False): # {{{
|
||||||
@ -213,6 +214,7 @@ class PDFWriter(QObject):
|
|||||||
self.margin_top, self.margin_bottom = map(lambda x:int(floor(x)), (mt, mb))
|
self.margin_top, self.margin_bottom = map(lambda x:int(floor(x)), (mt, mb))
|
||||||
|
|
||||||
self.painter = QPainter(self.doc)
|
self.painter = QPainter(self.doc)
|
||||||
|
self.book_language = pdf_metadata.mi.languages[0]
|
||||||
self.doc.set_metadata(title=pdf_metadata.title,
|
self.doc.set_metadata(title=pdf_metadata.title,
|
||||||
author=pdf_metadata.author,
|
author=pdf_metadata.author,
|
||||||
tags=pdf_metadata.tags, mi=pdf_metadata.mi)
|
tags=pdf_metadata.tags, mi=pdf_metadata.mi)
|
||||||
@ -344,6 +346,25 @@ class PDFWriter(QObject):
|
|||||||
|
|
||||||
return sections
|
return sections
|
||||||
|
|
||||||
|
def hyphenate(self, evaljs):
|
||||||
|
evaljs(u'''\
|
||||||
|
Hyphenator.config(
|
||||||
|
{
|
||||||
|
'minwordlength' : 6,
|
||||||
|
// 'hyphenchar' : '|',
|
||||||
|
'displaytogglebox' : false,
|
||||||
|
'remoteloading' : false,
|
||||||
|
'doframes' : true,
|
||||||
|
'defaultlanguage' : 'en',
|
||||||
|
'storagetype' : 'session',
|
||||||
|
'onerrorhandler' : function (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Hyphenator.hyphenate(document.body, "%s");
|
||||||
|
''' % self.hyphenate_lang
|
||||||
|
)
|
||||||
|
|
||||||
def do_paged_render(self):
|
def do_paged_render(self):
|
||||||
if self.paged_js is None:
|
if self.paged_js is None:
|
||||||
import uuid
|
import uuid
|
||||||
@ -352,6 +373,10 @@ class PDFWriter(QObject):
|
|||||||
self.paged_js += cc('ebooks.oeb.display.indexing')
|
self.paged_js += cc('ebooks.oeb.display.indexing')
|
||||||
self.paged_js += cc('ebooks.oeb.display.paged')
|
self.paged_js += cc('ebooks.oeb.display.paged')
|
||||||
self.paged_js += cc('ebooks.oeb.display.mathjax')
|
self.paged_js += cc('ebooks.oeb.display.mathjax')
|
||||||
|
if self.opts.pdf_hyphenate:
|
||||||
|
self.paged_js += P('viewer/hyphenate/Hyphenator.js', data=True).decode('utf-8')
|
||||||
|
hjs, self.hyphenate_lang = load_hyphenator_dicts({}, self.book_language)
|
||||||
|
self.paged_js += hjs
|
||||||
self.hf_uuid = str(uuid.uuid4()).replace('-', '')
|
self.hf_uuid = str(uuid.uuid4()).replace('-', '')
|
||||||
|
|
||||||
self.view.page().mainFrame().addToJavaScriptWindowObject("py_bridge", self)
|
self.view.page().mainFrame().addToJavaScriptWindowObject("py_bridge", self)
|
||||||
@ -359,6 +384,8 @@ class PDFWriter(QObject):
|
|||||||
evaljs = self.view.page().mainFrame().evaluateJavaScript
|
evaljs = self.view.page().mainFrame().evaluateJavaScript
|
||||||
evaljs(self.paged_js)
|
evaljs(self.paged_js)
|
||||||
self.load_mathjax()
|
self.load_mathjax()
|
||||||
|
if self.opts.pdf_hyphenate:
|
||||||
|
self.hyphenate(evaljs)
|
||||||
|
|
||||||
amap = json.loads(evaljs('''
|
amap = json.loads(evaljs('''
|
||||||
document.body.style.backgroundColor = "white";
|
document.body.style.backgroundColor = "white";
|
||||||
|
@ -24,7 +24,7 @@ class PluginWidget(Widget, Ui_Form):
|
|||||||
|
|
||||||
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
|
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
|
||||||
Widget.__init__(self, parent, [
|
Widget.__init__(self, parent, [
|
||||||
'use_profile_size', 'paper_size', 'custom_size',
|
'use_profile_size', 'paper_size', 'custom_size', 'pdf_hyphenate',
|
||||||
'preserve_cover_aspect_ratio', 'pdf_serif_family', 'unit',
|
'preserve_cover_aspect_ratio', 'pdf_serif_family', 'unit',
|
||||||
'pdf_sans_family', 'pdf_mono_family', 'pdf_standard_font',
|
'pdf_sans_family', 'pdf_mono_family', 'pdf_standard_font',
|
||||||
'pdf_default_font_size', 'pdf_mono_font_size', 'pdf_page_numbers',
|
'pdf_default_font_size', 'pdf_mono_font_size', 'pdf_page_numbers',
|
||||||
|
@ -91,14 +91,14 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0" colspan="2">
|
<item row="7" column="0" colspan="2">
|
||||||
<widget class="QCheckBox" name="opt_pdf_add_toc">
|
<widget class="QCheckBox" name="opt_pdf_add_toc">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Add a printable &Table of Contents at the end</string>
|
<string>Add a printable &Table of Contents at the end</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="8" column="0">
|
||||||
<widget class="QLabel" name="label_14">
|
<widget class="QLabel" name="label_14">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Title for ToC:</string>
|
<string>&Title for ToC:</string>
|
||||||
@ -108,10 +108,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="8" column="1">
|
||||||
<widget class="QLineEdit" name="opt_toc_title"/>
|
<widget class="QLineEdit" name="opt_toc_title"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Serif famil&y:</string>
|
<string>Serif famil&y:</string>
|
||||||
@ -121,10 +121,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QFontComboBox" name="opt_pdf_serif_family"/>
|
<widget class="QFontComboBox" name="opt_pdf_serif_family"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="0">
|
<item row="11" column="0">
|
||||||
<widget class="QLabel" name="label_5">
|
<widget class="QLabel" name="label_5">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Sans fami&ly:</string>
|
<string>Sans fami&ly:</string>
|
||||||
@ -134,10 +134,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="1">
|
<item row="11" column="1">
|
||||||
<widget class="QFontComboBox" name="opt_pdf_sans_family"/>
|
<widget class="QFontComboBox" name="opt_pdf_sans_family"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="0">
|
<item row="12" column="0">
|
||||||
<widget class="QLabel" name="label_6">
|
<widget class="QLabel" name="label_6">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Monospace family:</string>
|
<string>&Monospace family:</string>
|
||||||
@ -147,10 +147,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="1">
|
<item row="12" column="1">
|
||||||
<widget class="QFontComboBox" name="opt_pdf_mono_family"/>
|
<widget class="QFontComboBox" name="opt_pdf_mono_family"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="0">
|
<item row="13" column="0">
|
||||||
<widget class="QLabel" name="label_7">
|
<widget class="QLabel" name="label_7">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>S&tandard font:</string>
|
<string>S&tandard font:</string>
|
||||||
@ -160,10 +160,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="1">
|
<item row="13" column="1">
|
||||||
<widget class="QComboBox" name="opt_pdf_standard_font"/>
|
<widget class="QComboBox" name="opt_pdf_standard_font"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="0">
|
<item row="14" column="0">
|
||||||
<widget class="QLabel" name="label_8">
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Default font si&ze:</string>
|
<string>Default font si&ze:</string>
|
||||||
@ -173,14 +173,14 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="1">
|
<item row="14" column="1">
|
||||||
<widget class="QSpinBox" name="opt_pdf_default_font_size">
|
<widget class="QSpinBox" name="opt_pdf_default_font_size">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> px</string>
|
<string> px</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="0">
|
<item row="15" column="0">
|
||||||
<widget class="QLabel" name="label_9">
|
<widget class="QLabel" name="label_9">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Monospace &font size:</string>
|
<string>Monospace &font size:</string>
|
||||||
@ -190,21 +190,21 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="1">
|
<item row="15" column="1">
|
||||||
<widget class="QSpinBox" name="opt_pdf_mono_font_size">
|
<widget class="QSpinBox" name="opt_pdf_mono_font_size">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> px</string>
|
<string> px</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="0" colspan="2">
|
<item row="16" column="0" colspan="2">
|
||||||
<widget class="QGroupBox" name="page_margins_box">
|
<widget class="QGroupBox" name="page_margins_box">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Page margins</string>
|
<string>Page margins</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="16" column="0" colspan="2">
|
<item row="17" column="0" colspan="2">
|
||||||
<widget class="QGroupBox" name="template_box">
|
<widget class="QGroupBox" name="template_box">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Page headers and footers</string>
|
<string>Page headers and footers</string>
|
||||||
@ -252,6 +252,13 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="6" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="opt_pdf_hyphenate">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Break long words at the end of lines</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user