diff --git a/src/calibre/ebooks/conversion/plugins/pdf_output.py b/src/calibre/ebooks/conversion/plugins/pdf_output.py index 8a3591c11c..8e5a63c41c 100644 --- a/src/calibre/ebooks/conversion/plugins/pdf_output.py +++ b/src/calibre/ebooks/conversion/plugins/pdf_output.py @@ -94,6 +94,8 @@ class PDFOutput(OutputFormatPlugin): OptionRecommendation(name='pdf_mono_font_size', recommended_value=16, help=_( '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, help=_('Surround all links with a red box, useful for debugging.')), OptionRecommendation(name='uncompressed_pdf', @@ -184,8 +186,7 @@ class PDFOutput(OutputFormatPlugin): def get_cover_data(self): oeb = self.oeb - if (oeb.metadata.cover and - unicode(oeb.metadata.cover[0]) in oeb.manifest.ids): + if (oeb.metadata.cover and unicode(oeb.metadata.cover[0]) in oeb.manifest.ids): cover_id = unicode(oeb.metadata.cover[0]) item = oeb.manifest.ids[cover_id] self.cover_data = item.data diff --git a/src/calibre/ebooks/pdf/render/from_html.py b/src/calibre/ebooks/pdf/render/from_html.py index 070ed083aa..b987700744 100644 --- a/src/calibre/ebooks/pdf/render/from_html.py +++ b/src/calibre/ebooks/pdf/render/from_html.py @@ -24,6 +24,7 @@ from calibre.ebooks.pdf.render.common import (inch, cm, mm, pica, cicero, didot, PAPER_SIZES, current_log) from calibre.ebooks.pdf.render.engine import PdfDevice from calibre.ptempfile import PersistentTemporaryFile +from calibre.utils.resources import load_hyphenator_dicts 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.painter = QPainter(self.doc) + self.book_language = pdf_metadata.mi.languages[0] self.doc.set_metadata(title=pdf_metadata.title, author=pdf_metadata.author, tags=pdf_metadata.tags, mi=pdf_metadata.mi) @@ -344,6 +346,25 @@ class PDFWriter(QObject): 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): if self.paged_js is None: import uuid @@ -352,6 +373,10 @@ class PDFWriter(QObject): self.paged_js += cc('ebooks.oeb.display.indexing') self.paged_js += cc('ebooks.oeb.display.paged') 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.view.page().mainFrame().addToJavaScriptWindowObject("py_bridge", self) @@ -359,6 +384,8 @@ class PDFWriter(QObject): evaljs = self.view.page().mainFrame().evaluateJavaScript evaljs(self.paged_js) self.load_mathjax() + if self.opts.pdf_hyphenate: + self.hyphenate(evaljs) amap = json.loads(evaljs(''' document.body.style.backgroundColor = "white"; diff --git a/src/calibre/gui2/convert/pdf_output.py b/src/calibre/gui2/convert/pdf_output.py index bc1bee52c2..85684b3116 100644 --- a/src/calibre/gui2/convert/pdf_output.py +++ b/src/calibre/gui2/convert/pdf_output.py @@ -24,7 +24,7 @@ class PluginWidget(Widget, Ui_Form): def __init__(self, parent, get_option, get_help, db=None, book_id=None): 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', 'pdf_sans_family', 'pdf_mono_family', 'pdf_standard_font', 'pdf_default_font_size', 'pdf_mono_font_size', 'pdf_page_numbers', diff --git a/src/calibre/gui2/convert/pdf_output.ui b/src/calibre/gui2/convert/pdf_output.ui index 1cf091f6f7..45a35235a5 100644 --- a/src/calibre/gui2/convert/pdf_output.ui +++ b/src/calibre/gui2/convert/pdf_output.ui @@ -91,14 +91,14 @@ - + Add a printable &Table of Contents at the end - + &Title for ToC: @@ -108,10 +108,10 @@ - + - + Serif famil&y: @@ -121,10 +121,10 @@ - + - + Sans fami&ly: @@ -134,10 +134,10 @@ - + - + &Monospace family: @@ -147,10 +147,10 @@ - + - + S&tandard font: @@ -160,10 +160,10 @@ - + - + Default font si&ze: @@ -173,14 +173,14 @@ - + px - + Monospace &font size: @@ -190,21 +190,21 @@ - + px - + Page margins - + Page headers and footers @@ -252,6 +252,13 @@ + + + + &Break long words at the end of lines + + +