diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index bfe23cee67..31ce61328a 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -703,6 +703,15 @@ if isosx: import traceback traceback.print_exc() +def load_builtin_fonts(): + import glob + from PyQt4.Qt import QFontDatabase + base = P('fonts/liberation/*.ttf') + for f in glob.glob(base): + QFontDatabase.addApplicationFont(f) + return 'Liberation Serif', 'Liberation Sans', 'Liberation Mono' + + def ipython(user_ns=None): from calibre.utils.ipython import ipython ipython(user_ns=user_ns) diff --git a/src/calibre/ebooks/conversion/plugins/pdf_output.py b/src/calibre/ebooks/conversion/plugins/pdf_output.py index 2c35fc91b9..35504b31fb 100644 --- a/src/calibre/ebooks/conversion/plugins/pdf_output.py +++ b/src/calibre/ebooks/conversion/plugins/pdf_output.py @@ -88,6 +88,25 @@ class PDFOutput(OutputFormatPlugin): help=_('Preserve the aspect ratio of the cover, instead' ' of stretching it to fill the full first page of the' ' generated pdf.')), + OptionRecommendation(name='pdf_serif_family', + recommended_value='Times New Roman', help=_( + 'The font family used to render serif fonts')), + OptionRecommendation(name='pdf_sans_family', + recommended_value='Helvetica', help=_( + 'The font family used to render sans-serif fonts')), + OptionRecommendation(name='pdf_mono_family', + recommended_value='Courier New', help=_( + 'The font family used to render monospaced fonts')), + OptionRecommendation(name='pdf_standard_font', choices=['serif', + 'sans', 'mono'], + recommended_value='serif', help=_( + 'The font family used to render monospaced fonts')), + OptionRecommendation(name='pdf_default_font_size', + recommended_value=20, help=_( + 'The default font size')), + OptionRecommendation(name='pdf_mono_font_size', + recommended_value=16, help=_( + 'The default font size for monospaced text')), ]) def convert(self, oeb_book, output_path, input_plugin, opts, log): diff --git a/src/calibre/ebooks/pdf/writer.py b/src/calibre/ebooks/pdf/writer.py index ccbc942eb7..1ec98ce181 100644 --- a/src/calibre/ebooks/pdf/writer.py +++ b/src/calibre/ebooks/pdf/writer.py @@ -13,14 +13,14 @@ from future_builtins import map from PyQt4.Qt import (QEventLoop, QObject, QPrinter, QSizeF, Qt, QPainter, QPixmap, QTimer, pyqtProperty, QString) -from PyQt4.QtWebKit import QWebView, QWebPage +from PyQt4.QtWebKit import QWebView, QWebPage, QWebSettings from calibre.ptempfile import PersistentTemporaryDirectory from calibre.ebooks.pdf.pageoptions import (unit, paper_size, orientation) from calibre.ebooks.pdf.outline_writer import Outline from calibre.ebooks.metadata import authors_to_string from calibre.ptempfile import PersistentTemporaryFile -from calibre import __appname__, __version__, fit_image, isosx, force_unicode +from calibre import (__appname__, __version__, fit_image, isosx, force_unicode) from calibre.ebooks.oeb.display.webview import load_html def get_custom_size(opts): @@ -123,10 +123,25 @@ class PDFMetadata(object): # {{{ class Page(QWebPage): - def __init__(self, log): + def __init__(self, opts, log): self.log = log QWebPage.__init__(self) + settings = self.settings() + settings.setFontSize(QWebSettings.DefaultFontSize, + opts.pdf_default_font_size) + settings.setFontSize(QWebSettings.DefaultFixedFontSize, + opts.pdf_mono_font_size) + settings.setFontSize(QWebSettings.MinimumLogicalFontSize, 8) + settings.setFontSize(QWebSettings.MinimumFontSize, 8) + std = {'serif':opts.pdf_serif_family, 'sans':opts.pdf_sans_family, + 'mono':opts.pdf_mono_family}.get(opts.pdf_standard_font, + opts.pdf_serif_family) + settings.setFontFamily(QWebSettings.StandardFont, std) + settings.setFontFamily(QWebSettings.SerifFont, opts.pdf_serif_family) + settings.setFontFamily(QWebSettings.SansSerifFont, + opts.pdf_sans_family) + settings.setFontFamily(QWebSettings.FixedFont, opts.pdf_mono_family) def javaScriptConsoleMessage(self, msg, lineno, msgid): self.log.debug(u'JS:', unicode(msg)) @@ -149,7 +164,7 @@ class PDFWriter(QObject): # {{{ self.loop = QEventLoop() self.view = QWebView() - self.page = Page(self.log) + self.page = Page(opts, self.log) self.view.setPage(self.page) self.view.setRenderHints(QPainter.Antialiasing|QPainter.TextAntialiasing|QPainter.SmoothPixmapTransform) self.view.loadFinished.connect(self._render_html, diff --git a/src/calibre/gui2/convert/__init__.py b/src/calibre/gui2/convert/__init__.py index 84667aa740..e01238a2e5 100644 --- a/src/calibre/gui2/convert/__init__.py +++ b/src/calibre/gui2/convert/__init__.py @@ -9,8 +9,9 @@ __docformat__ = 'restructuredtext en' import textwrap, codecs, importlib from functools import partial -from PyQt4.Qt import QWidget, QSpinBox, QDoubleSpinBox, QLineEdit, QTextEdit, \ - QCheckBox, QComboBox, Qt, QIcon, pyqtSignal, QLabel +from PyQt4.Qt import (QWidget, QSpinBox, QDoubleSpinBox, QLineEdit, QTextEdit, + QCheckBox, QComboBox, Qt, QIcon, pyqtSignal, QLabel, QFontComboBox, QFont, + QFontInfo) from calibre.customize.conversion import OptionRecommendation from calibre.ebooks.conversion.config import load_defaults, \ @@ -35,8 +36,6 @@ def bulk_defaults_for_input_format(fmt): return load_defaults(w.COMMIT_NAME) return {} - - class Widget(QWidget): TITLE = _('Unknown') @@ -143,6 +142,8 @@ class Widget(QWidget): if not ans: ans = None return ans + elif isinstance(g, QFontComboBox): + ans = unicode(QFontInfo(g.currentFont().family())) elif isinstance(g, EncodingComboBox): ans = unicode(g.currentText()).strip() try: @@ -205,6 +206,8 @@ class Widget(QWidget): if not val: val = '' getattr(g, 'setPlainText', g.setText)(val) getattr(g, 'setCursorPosition', lambda x: x)(0) + elif isinstance(g, QFontComboBox): + g.setCurrentFont(QFont(val or '')) elif isinstance(g, EncodingComboBox): if val: g.setEditText(val) diff --git a/src/calibre/gui2/convert/pdf_output.py b/src/calibre/gui2/convert/pdf_output.py index 940d6b68f8..a2bfcc667f 100644 --- a/src/calibre/gui2/convert/pdf_output.py +++ b/src/calibre/gui2/convert/pdf_output.py @@ -19,13 +19,17 @@ class PluginWidget(Widget, Ui_Form): def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, ['paper_size', 'custom_size', - 'orientation', 'preserve_cover_aspect_ratio']) + 'orientation', 'preserve_cover_aspect_ratio', 'pdf_serif_family', + 'pdf_sans_family', 'pdf_mono_family', 'pdf_standard_font', + 'pdf_default_font_size', 'pdf_mono_font_size']) self.db, self.book_id = db, book_id for x in get_option('paper_size').option.choices: self.opt_paper_size.addItem(x) for x in get_option('orientation').option.choices: self.opt_orientation.addItem(x) + for x in get_option('pdf_standard_font').option.choices: + self.opt_pdf_standard_font.addItem(x) self.initialize_options(get_option, get_help, db, book_id) diff --git a/src/calibre/gui2/convert/pdf_output.ui b/src/calibre/gui2/convert/pdf_output.ui index 738e75aff5..4a6c99659d 100644 --- a/src/calibre/gui2/convert/pdf_output.ui +++ b/src/calibre/gui2/convert/pdf_output.ui @@ -6,14 +6,14 @@ 0 0 - 400 - 300 + 590 + 395 Form - + @@ -40,26 +40,6 @@ - - - - Qt::Vertical - - - - 20 - 213 - - - - - - - - Preserve &aspect ratio of cover - - - @@ -73,6 +53,112 @@ + + + + Preserve &aspect ratio of cover + + + + + + + Qt::Vertical + + + + 20 + 213 + + + + + + + + Se&rif family: + + + opt_pdf_serif_family + + + + + + + + + + &Sans family: + + + opt_pdf_sans_family + + + + + + + + + + &Monospace family: + + + opt_pdf_mono_family + + + + + + + + + + S&tandard font: + + + opt_pdf_standard_font + + + + + + + + + + Default font si&ze: + + + opt_pdf_default_font_size + + + + + + + px + + + + + + + Monospace &font size: + + + opt_pdf_mono_font_size + + + + + + + px + + + diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 2dbc16d84c..55791afd4a 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -4,19 +4,19 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' # Imports {{{ -import os, math, glob, json +import os, math, json from base64 import b64encode from functools import partial from PyQt4.Qt import (QSize, QSizePolicy, QUrl, SIGNAL, Qt, pyqtProperty, - QPainter, QPalette, QBrush, QFontDatabase, QDialog, QColor, QPoint, - QImage, QRegion, QIcon, pyqtSignature, QAction, QMenu, QString, - pyqtSignal, QSwipeGesture, QApplication, pyqtSlot) + QPainter, QPalette, QBrush, QDialog, QColor, QPoint, QImage, QRegion, + QIcon, pyqtSignature, QAction, QMenu, QString, pyqtSignal, + QSwipeGesture, QApplication, pyqtSlot) from PyQt4.QtWebKit import QWebPage, QWebView, QWebSettings from calibre.gui2.viewer.flip import SlideFlip from calibre.gui2.shortcuts import Shortcuts -from calibre import prints +from calibre import prints, load_builtin_fonts from calibre.customize.ui import all_viewer_plugins from calibre.gui2.viewer.keys import SHORTCUTS from calibre.gui2.viewer.javascript import JavaScriptLoader @@ -27,13 +27,6 @@ from calibre.ebooks.oeb.display.webview import load_html from calibre.constants import isxp, iswindows # }}} -def load_builtin_fonts(): - base = P('fonts/liberation/*.ttf') - for f in glob.glob(base): - QFontDatabase.addApplicationFont(f) - return 'Liberation Serif', 'Liberation Sans', 'Liberation Mono' - - class Document(QWebPage): # {{{ page_turn = pyqtSignal(object)