mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
PDF Output: Fix hang when converting some documents. Fixes #1829535 [ebook-convert hangs on some HTML to PDF conversions](https://bugs.launchpad.net/calibre/+bug/1829535)
This commit is contained in:
parent
3d586aa15a
commit
4e604e52d7
@ -24,6 +24,7 @@ from calibre.ebooks.pdf.render.common import (inch, cm, mm, pica, cicero,
|
|||||||
from calibre.ebooks.pdf.render.engine import PdfDevice
|
from calibre.ebooks.pdf.render.engine import PdfDevice
|
||||||
from calibre.ptempfile import PersistentTemporaryFile
|
from calibre.ptempfile import PersistentTemporaryFile
|
||||||
from calibre.utils.resources import load_hyphenator_dicts
|
from calibre.utils.resources import load_hyphenator_dicts
|
||||||
|
from calibre.utils.monotonic import monotonic
|
||||||
from polyglot.builtins import iteritems, itervalues, map, unicode_type
|
from polyglot.builtins import iteritems, itervalues, map, unicode_type
|
||||||
|
|
||||||
|
|
||||||
@ -164,6 +165,12 @@ 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)
|
||||||
|
self.view.loadProgress.connect(self.load_progress)
|
||||||
|
self.ignore_failure = None
|
||||||
|
self.hang_check_timer = t = QTimer(self)
|
||||||
|
t.timeout.connect(self.hang_check)
|
||||||
|
t.setInterval(1000)
|
||||||
|
|
||||||
for x in (Qt.Horizontal, Qt.Vertical):
|
for x in (Qt.Horizontal, Qt.Vertical):
|
||||||
self.view.page().mainFrame().setScrollBarPolicy(x,
|
self.view.page().mainFrame().setScrollBarPolicy(x,
|
||||||
Qt.ScrollBarAlwaysOff)
|
Qt.ScrollBarAlwaysOff)
|
||||||
@ -285,8 +292,23 @@ class PDFWriter(QObject):
|
|||||||
self.logger.debug('Processing %s...' % item)
|
self.logger.debug('Processing %s...' % item)
|
||||||
self.current_item = item
|
self.current_item = item
|
||||||
load_html(item, self.view)
|
load_html(item, self.view)
|
||||||
|
self.last_load_progress_at = monotonic()
|
||||||
|
self.hang_check_timer.start()
|
||||||
|
|
||||||
|
def load_progress(self, progress):
|
||||||
|
self.last_load_progress_at = monotonic()
|
||||||
|
|
||||||
|
def hang_check(self):
|
||||||
|
if monotonic() - self.last_load_progress_at > 60:
|
||||||
|
self.log.warn('Timed out waiting for %s to render' % self.current_item)
|
||||||
|
self.ignore_failure = self.current_item
|
||||||
|
self.view.stop()
|
||||||
|
|
||||||
def render_html(self, ok):
|
def render_html(self, ok):
|
||||||
|
self.hang_check_timer.stop()
|
||||||
|
if self.ignore_failure == self.current_item:
|
||||||
|
ok = True
|
||||||
|
self.ignore_failure = None
|
||||||
if ok:
|
if ok:
|
||||||
try:
|
try:
|
||||||
self.do_paged_render()
|
self.do_paged_render()
|
||||||
@ -296,7 +318,7 @@ class PDFWriter(QObject):
|
|||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
# The document is so corrupt that we can't render the page.
|
# The document is so corrupt that we can't render the page.
|
||||||
self.logger.error('Document cannot be rendered.')
|
self.logger.error('Document %s cannot be rendered.' % self.current_item)
|
||||||
self.loop.exit(1)
|
self.loop.exit(1)
|
||||||
return
|
return
|
||||||
done = self.total_items - len(self.render_queue)
|
done = self.total_items - len(self.render_queue)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user