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)