diff --git a/src/calibre/ebooks/render_html.py b/src/calibre/ebooks/render_html.py index 8579c09534..f563441fc0 100644 --- a/src/calibre/ebooks/render_html.py +++ b/src/calibre/ebooks/render_html.py @@ -10,13 +10,13 @@ import sys from PyQt5.Qt import ( QApplication, QMarginsF, QPageLayout, QPageSize, Qt, QTimer, QUrl ) -from PyQt5.QtWebEngineWidgets import QWebEnginePage +from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineScript from calibre.ebooks.metadata.pdf import page_images from calibre.gui2 import must_use_qt from calibre.gui2.webengine import secure_webengine -from calibre.utils.monotonic import monotonic from calibre.utils.filenames import atomic_rename +from calibre.utils.monotonic import monotonic LOAD_TIMEOUT = 20 PRINT_TIMEOUT = 10 @@ -36,11 +36,24 @@ class Render(QWebEnginePage): def load_finished(self, ok): if ok: - self.start_print() + self.runJavaScript(''' + var ans = {}; + var meta = document.querySelector('meta[name=calibre-html-render-data]'); + if (meta) { + try { + ans = JSON.parse(meta.content); + console.log(ans); + } catch {} + } + ans; + ''', QWebEngineScript.ApplicationWorld, self.start_print) else: self.hang_timer.stop() QApplication.instance().exit(1) + def javaScriptConsoleMessage(self, level, msg, linenumber, source_id): + pass + def start_load(self, path_to_html): self.load(QUrl.fromLocalFile(path_to_html)) self.start_time = monotonic() @@ -56,9 +69,25 @@ class Render(QWebEnginePage): self.hang_timer.stop() QApplication.instance().exit(3) - def start_print(self): + def start_print(self, data): margins = QMarginsF(0, 0, 0, 0) - page_layout = QPageLayout(QPageSize(QPageSize.A4), QPageLayout.Portrait, margins) + page_size = QPageSize(QPageSize.A4) + if isinstance(data, dict): + try: + if 'margins' in data: + margins = QMarginsF(*data[margins]) + if 'size' in data: + sz = data['size'] + if type(getattr(QPageSize, sz, None)) is type(QPageSize.A4): # noqa + page_size = QPageSize(getattr(QPageSize, sz)) + else: + from calibre.ebooks.pdf.image_writer import parse_pdf_page_size + ps = parse_pdf_page_size(sz, data.get('unit', 'inch')) + if ps is not None: + page_size = ps + except Exception: + pass + page_layout = QPageLayout(page_size, QPageLayout.Portrait, margins) self.printToPdf('rendered.pdf', page_layout) self.printing_started = True self.start_time = monotonic()