diff --git a/src/calibre/ebooks/conversion/config.py b/src/calibre/ebooks/conversion/config.py
index b7591d8f03..9d39528a04 100644
--- a/src/calibre/ebooks/conversion/config.py
+++ b/src/calibre/ebooks/conversion/config.py
@@ -221,7 +221,7 @@ OPTIONS = {
'fb2': ('no_inline_fb2_toc',),
- 'pdf': ('no_images', 'unwrap_factor', 'new_pdf_engine', 'pdf_header_skip', 'pdf_footer_skip', 'pdf_header_regex', 'pdf_footer_regex'),
+ 'pdf': ('no_images', 'unwrap_factor', 'pdf_engine', 'pdf_header_skip', 'pdf_footer_skip', 'pdf_header_regex', 'pdf_footer_regex'),
'rtf': ('ignore_wmf',),
diff --git a/src/calibre/ebooks/conversion/plugins/pdf_input.py b/src/calibre/ebooks/conversion/plugins/pdf_input.py
index 2408f79b58..2b3d6aa560 100644
--- a/src/calibre/ebooks/conversion/plugins/pdf_input.py
+++ b/src/calibre/ebooks/conversion/plugins/pdf_input.py
@@ -7,6 +7,8 @@ import os
from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation
from polyglot.builtins import as_bytes
+ENGINES = 'calibre', 'pdftohtml'
+
class PDFInput(InputFormatPlugin):
@@ -23,8 +25,10 @@ class PDFInput(InputFormatPlugin):
help=_('Scale used to determine the length at which a line should '
'be unwrapped. Valid values are a decimal between 0 and 1. The '
'default is 0.45, just below the median line length.')),
- OptionRecommendation(name='new_pdf_engine', recommended_value=False,
- help=_('Use the new, experimental, PDF conversion engine.')),
+ OptionRecommendation(name='pdf_engine', recommended_value='calibre', choices=('calibre', 'pdftohtml'),
+ help=_('The PDF engine to use, the "calibre" engine is recommended as it has automatic header and footer removal.'
+ ' Choices: {}'
+ ).format(', '.join(ENGINES))),
OptionRecommendation(name='pdf_header_skip', recommended_value=-1,
help=_('Skip everything to the specified number of pixels at the top of a page.'
' Negative numbers mean auto-detect and remove headers, zero means do not remove headers and positive numbers'
@@ -35,14 +39,14 @@ class PDFInput(InputFormatPlugin):
help=_('Skip everything to the specified number of pixels at the bottom of a page.'
' Negative numbers mean auto-detect and remove footers, zero means do not remove footers and positive numbers'
' mean remove footers that appear below that many pixels from the bottom of the page. Works only'
- ' with the new PDF engine.'
+ ' with the calibre PDF engine.'
)),
OptionRecommendation(name='pdf_header_regex', recommended_value='',
help=_('Regular expression to remove lines at the top of a page. '
- 'This only looks at the first line of a page and works only with the new PDF engine.')),
+ 'This only looks at the first line of a page and works only with the calibre PDF engine.')),
OptionRecommendation(name='pdf_footer_regex', recommended_value='',
help=_('Regular expression to remove lines at the bottom of a page. '
- 'This only looks at the last line of a page and works only with the new PDF engine.')),
+ 'This only looks at the last line of a page and works only with the calibre PDF engine.')),
}
def convert(self, stream, options, file_ext, log,
@@ -53,7 +57,7 @@ class PDFInput(InputFormatPlugin):
log.debug('Converting file to html...')
# The main html file will be named index.html
self.opts, self.log = options, log
- if options.new_pdf_engine:
+ if options.pdf_engine == 'calibre':
from calibre.ebooks.pdf.reflow import PDFDocument
from calibre.utils.cleantext import clean_ascii_chars
pdftohtml(os.getcwd(), stream.name, self.opts.no_images, as_xml=True)
diff --git a/src/calibre/gui2/convert/pdf_input.py b/src/calibre/gui2/convert/pdf_input.py
index a431660978..615f0947e2 100644
--- a/src/calibre/gui2/convert/pdf_input.py
+++ b/src/calibre/gui2/convert/pdf_input.py
@@ -17,17 +17,23 @@ class PluginWidget(Widget, Ui_Form):
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, OPTIONS['input']['pdf'])
self.db, self.book_id = db, book_id
+ from calibre.ebooks.conversion.plugins.pdf_input import ENGINES
+ self.opt_pdf_engine.addItems(ENGINES)
self.initialize_options(get_option, get_help, db, book_id)
- self.opt_new_pdf_engine.toggled.connect(self.update_engine_opts)
+ self.opt_pdf_engine.currentIndexChanged.connect(self.update_engine_opts)
self.update_engine_opts()
def set_value_handler(self, g, val):
if val is None and isinstance(g, QDoubleSpinBox):
g.setValue(0.0)
return True
+ if g is self.opt_pdf_engine:
+ idx = g.findText(val)
+ if idx > -1:
+ g.setCurrentIndex(idx)
def update_engine_opts(self):
- enabled = self.opt_new_pdf_engine.isChecked()
+ enabled = self.opt_pdf_engine.currentText() == 'calibre'
self.opt_pdf_footer_skip.setEnabled(enabled)
self.opt_pdf_header_skip.setEnabled(enabled)
self.opt_pdf_header_regex.setEnabled(enabled)
diff --git a/src/calibre/gui2/convert/pdf_input.ui b/src/calibre/gui2/convert/pdf_input.ui
index e966f8a6f6..194c8e6f85 100644
--- a/src/calibre/gui2/convert/pdf_input.ui
+++ b/src/calibre/gui2/convert/pdf_input.ui
@@ -14,36 +14,6 @@
Form
- -
-
-
- Line &un-wrapping factor:
-
-
- opt_unwrap_factor
-
-
-
- -
-
-
- 1.000000000000000
-
-
- 0.010000000000000
-
-
- 0.450000000000000
-
-
-
- -
-
-
- No &images
-
-
-
-
@@ -54,35 +24,6 @@
- -
-
-
- Automatically
-
-
- px
-
-
- -1
-
-
- 99999
-
-
- -1
-
-
-
- -
-
-
- Remove footers at &bottom of page by:
-
-
- opt_pdf_footer_skip
-
-
-
-
@@ -102,15 +43,8 @@
- -
-
-
- Regular expression to remove &header at top of page:
-
-
- opt_pdf_header_regex
-
-
+
-
+
-
@@ -119,16 +53,6 @@
- -
-
-
- Regular expression to remove &footer at bottom of page:
-
-
- opt_pdf_footer_regex
-
-
-
-
@@ -149,10 +73,92 @@
- -
-
+
-
+
- New, experimental, PDF conversion &engine
+ Regular expression to remove &header at top of page:
+
+
+ opt_pdf_header_regex
+
+
+
+ -
+
+
+ No &images
+
+
+
+ -
+
+
+ Regular expression to remove &footer at bottom of page:
+
+
+ opt_pdf_footer_regex
+
+
+
+ -
+
+
+ 1.000000000000000
+
+
+ 0.010000000000000
+
+
+ 0.450000000000000
+
+
+
+ -
+
+
+ Remove footers at &bottom of page by:
+
+
+ opt_pdf_footer_skip
+
+
+
+ -
+
+
+ PDF &engine:
+
+
+ opt_pdf_engine
+
+
+
+ -
+
+
+ Line &un-wrapping factor:
+
+
+ opt_unwrap_factor
+
+
+
+ -
+
+
+ Automatically
+
+
+ px
+
+
+ -1
+
+
+ 99999
+
+
+ -1
diff --git a/src/pyj/book_list/conversion_widgets.pyj b/src/pyj/book_list/conversion_widgets.pyj
index e56e60cdf1..35fe521616 100644
--- a/src/pyj/book_list/conversion_widgets.pyj
+++ b/src/pyj/book_list/conversion_widgets.pyj
@@ -487,7 +487,7 @@ def pdf_input(container):
container.appendChild(g)
g.appendChild(float_spin('unwrap_factor', _('Line &un-wrapping factor:'), max=1, step=0.01))
g.appendChild(checkbox('no_images', _('No &images')))
- g.appendChild(checkbox('new_pdf_engine', _('New, experimental, PDF conversion &engine')))
+ g.appendChild(choices('pdf_engine', _('PDF &engine:'), {'calibre': 'calibre', 'pdftohtml': 'pdftohtml'}))
g.appendChild(int_spin('pdf_header_skip', _('Remove headers at &top of page by:'), min=-1, max=999999, step=1))
g.appendChild(int_spin('pdf_footer_skip', _('Remove footers at &bottom of page by:'), min=-1, max=999999, step=1))
g.appendChild(lineedit('pdf_header_regex', _('Regular expression to remove &header at top of page:')))