mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-31 14:33:54 -04:00
PDF Output: Fix the long standing bug that caused the last line on each page to be partially cut off
This commit is contained in:
parent
a1e9ab0b81
commit
9884dde0bc
Binary file not shown.
@ -61,7 +61,7 @@ ORIENTATIONS = ['portrait', 'landscape']
|
|||||||
class PDFOutput(OutputFormatPlugin):
|
class PDFOutput(OutputFormatPlugin):
|
||||||
|
|
||||||
name = 'PDF Output'
|
name = 'PDF Output'
|
||||||
author = 'John Schember and Kovid Goyal'
|
author = 'Kovid Goyal'
|
||||||
file_type = 'pdf'
|
file_type = 'pdf'
|
||||||
|
|
||||||
options = set([
|
options = set([
|
||||||
|
@ -87,11 +87,6 @@ def get_pdf_printer(opts, for_comic=False, output_file_name=None):
|
|||||||
|
|
||||||
return printer
|
return printer
|
||||||
|
|
||||||
def get_printer_page_size(opts, for_comic=False):
|
|
||||||
printer = get_pdf_printer(opts, for_comic=for_comic)
|
|
||||||
size = printer.paperSize(QPrinter.Millimeter)
|
|
||||||
return size.width() / 10., size.height() / 10.
|
|
||||||
|
|
||||||
def draw_image_page(printer, painter, p, preserve_aspect_ratio=True):
|
def draw_image_page(printer, painter, p, preserve_aspect_ratio=True):
|
||||||
page_rect = printer.pageRect()
|
page_rect = printer.pageRect()
|
||||||
if preserve_aspect_ratio:
|
if preserve_aspect_ratio:
|
||||||
@ -138,13 +133,16 @@ class PDFWriter(QObject): # {{{
|
|||||||
self.view.setRenderHints(QPainter.Antialiasing|QPainter.TextAntialiasing|QPainter.SmoothPixmapTransform)
|
self.view.setRenderHints(QPainter.Antialiasing|QPainter.TextAntialiasing|QPainter.SmoothPixmapTransform)
|
||||||
self.view.loadFinished.connect(self._render_html,
|
self.view.loadFinished.connect(self._render_html,
|
||||||
type=Qt.QueuedConnection)
|
type=Qt.QueuedConnection)
|
||||||
|
for x in (Qt.Horizontal, Qt.Vertical):
|
||||||
|
self.view.page().mainFrame().setScrollBarPolicy(x,
|
||||||
|
Qt.ScrollBarAlwaysOff)
|
||||||
self.render_queue = []
|
self.render_queue = []
|
||||||
self.combine_queue = []
|
self.combine_queue = []
|
||||||
self.tmp_path = PersistentTemporaryDirectory(u'_pdf_output_parts')
|
self.tmp_path = PersistentTemporaryDirectory(u'_pdf_output_parts')
|
||||||
|
|
||||||
self.opts = opts
|
self.opts = opts
|
||||||
self.size = get_printer_page_size(opts)
|
|
||||||
self.cover_data = cover_data
|
self.cover_data = cover_data
|
||||||
|
self.paged_js = None
|
||||||
|
|
||||||
def dump(self, items, out_stream, pdf_metadata):
|
def dump(self, items, out_stream, pdf_metadata):
|
||||||
self.metadata = pdf_metadata
|
self.metadata = pdf_metadata
|
||||||
@ -176,6 +174,9 @@ class PDFWriter(QObject): # {{{
|
|||||||
if ok:
|
if ok:
|
||||||
item_path = os.path.join(self.tmp_path, '%i.pdf' % len(self.combine_queue))
|
item_path = os.path.join(self.tmp_path, '%i.pdf' % len(self.combine_queue))
|
||||||
self.logger.debug('\tRendering item %s as %i.pdf' % (os.path.basename(str(self.view.url().toLocalFile())), len(self.combine_queue)))
|
self.logger.debug('\tRendering item %s as %i.pdf' % (os.path.basename(str(self.view.url().toLocalFile())), len(self.combine_queue)))
|
||||||
|
if True:
|
||||||
|
self.do_paged_render(item_path)
|
||||||
|
else:
|
||||||
printer = get_pdf_printer(self.opts, output_file_name=item_path)
|
printer = get_pdf_printer(self.opts, output_file_name=item_path)
|
||||||
self.view.page().mainFrame().evaluateJavaScript('''
|
self.view.page().mainFrame().evaluateJavaScript('''
|
||||||
document.body.style.backgroundColor = "white";
|
document.body.style.backgroundColor = "white";
|
||||||
@ -189,6 +190,39 @@ class PDFWriter(QObject): # {{{
|
|||||||
raise Exception('Document cannot be rendered.')
|
raise Exception('Document cannot be rendered.')
|
||||||
self._render_book()
|
self._render_book()
|
||||||
|
|
||||||
|
def do_paged_render(self, outpath):
|
||||||
|
from PyQt4.Qt import QSize, QPainter
|
||||||
|
if self.paged_js is None:
|
||||||
|
from calibre.utils.resources import compiled_coffeescript
|
||||||
|
self.paged_js = compiled_coffeescript('ebooks.oeb.display.paged',
|
||||||
|
dynamic=False)
|
||||||
|
printer = get_pdf_printer(self.opts, output_file_name=outpath)
|
||||||
|
painter = QPainter(printer)
|
||||||
|
zoomx = printer.logicalDpiX()/self.view.logicalDpiX()
|
||||||
|
zoomy = printer.logicalDpiY()/self.view.logicalDpiY()
|
||||||
|
painter.scale(zoomx, zoomy)
|
||||||
|
|
||||||
|
pr = printer.pageRect()
|
||||||
|
evaljs = self.view.page().mainFrame().evaluateJavaScript
|
||||||
|
evaljs(self.paged_js)
|
||||||
|
self.view.page().setViewportSize(QSize(pr.width()/zoomx,
|
||||||
|
pr.height()/zoomy))
|
||||||
|
evaljs('''
|
||||||
|
document.body.style.backgroundColor = "white";
|
||||||
|
paged_display.set_geometry(1, 0, 0, 0);
|
||||||
|
paged_display.layout();
|
||||||
|
''')
|
||||||
|
mf = self.view.page().mainFrame()
|
||||||
|
while True:
|
||||||
|
mf.render(painter)
|
||||||
|
nsl = evaljs('paged_display.next_screen_location()').toInt()
|
||||||
|
if not nsl[1] or nsl[0] <= 0: break
|
||||||
|
evaljs('window.scrollTo(%d, 0)'%nsl[0])
|
||||||
|
printer.newPage()
|
||||||
|
|
||||||
|
painter.end()
|
||||||
|
printer.abort()
|
||||||
|
|
||||||
def _delete_tmpdir(self):
|
def _delete_tmpdir(self):
|
||||||
if os.path.exists(self.tmp_path):
|
if os.path.exists(self.tmp_path):
|
||||||
shutil.rmtree(self.tmp_path, True)
|
shutil.rmtree(self.tmp_path, True)
|
||||||
@ -237,7 +271,6 @@ class ImagePDFWriter(object):
|
|||||||
def __init__(self, opts, log, cover_data=None):
|
def __init__(self, opts, log, cover_data=None):
|
||||||
self.opts = opts
|
self.opts = opts
|
||||||
self.log = log
|
self.log = log
|
||||||
self.size = get_printer_page_size(opts, for_comic=True)
|
|
||||||
|
|
||||||
def dump(self, items, out_stream, pdf_metadata):
|
def dump(self, items, out_stream, pdf_metadata):
|
||||||
f = PersistentTemporaryFile('_comic2pdf.pdf')
|
f = PersistentTemporaryFile('_comic2pdf.pdf')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user