diff --git a/resources/compiled_coffeescript.zip b/resources/compiled_coffeescript.zip index 13fed66f11..fe76db4957 100644 Binary files a/resources/compiled_coffeescript.zip and b/resources/compiled_coffeescript.zip differ diff --git a/src/calibre/ebooks/oeb/display/paged.coffee b/src/calibre/ebooks/oeb/display/paged.coffee index 8b0f1e0ad4..935a8c4b28 100644 --- a/src/calibre/ebooks/oeb/display/paged.coffee +++ b/src/calibre/ebooks/oeb/display/paged.coffee @@ -312,6 +312,8 @@ class PagedDisplay this.footer.style.setProperty('left', left+'px') update_header_footer: (pagenum) -> + has_images = false + this.header_footer_images = [] if this.hf_style != null if pagenum%2 == 1 then cls = "even_page" else cls = "odd_page" this.hf_style.innerHTML = "#pdf_page_header_#{ this.hf_uuid } .#{ cls }, #pdf_page_footer_#{ this.hf_uuid } .#{ cls } { display: none }" @@ -322,9 +324,22 @@ class PagedDisplay if this.header != null this.header.innerHTML = this.header_template.replace(/_PAGENUM_/g, pagenum+"").replace(/_TITLE_/g, title+"").replace(/_AUTHOR_/g, author+"").replace(/_TOP_LEVEL_SECTION_/g, tl_section+"").replace(/_SECTION_/g, section+"") runscripts(this.header) + for img in this.header.getElementsByTagName('img') + this.header_footer_images.push(img) + has_images = true if this.footer != null this.footer.innerHTML = this.footer_template.replace(/_PAGENUM_/g, pagenum+"").replace(/_TITLE_/g, title+"").replace(/_AUTHOR_/g, author+"").replace(/_TOP_LEVEL_SECTION_/g, tl_section+"").replace(/_SECTION_/g, section+"") runscripts(this.footer) + for img in this.header.getElementsByTagName('img') + this.header_footer_images.push(img) + has_images = true + has_images + + header_footer_images_loaded: () -> + for img in this.header_footer_images + if not img.complete + return false + return true fit_images: () -> # Ensure no images are wider than the available width in a column. Note diff --git a/src/calibre/ebooks/pdf/render/from_html.py b/src/calibre/ebooks/pdf/render/from_html.py index c8255ac5eb..070ed083aa 100644 --- a/src/calibre/ebooks/pdf/render/from_html.py +++ b/src/calibre/ebooks/pdf/render/from_html.py @@ -159,8 +159,7 @@ class PDFWriter(QObject): self.view = QWebView() self.page = Page(opts, self.log) self.view.setPage(self.page) - 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, type=Qt.QueuedConnection) for x in (Qt.Horizontal, Qt.Vertical): @@ -316,6 +315,16 @@ class PDFWriter(QObject): self.loop.processEvents(self.loop.ExcludeUserInputEvents) evaljs('document.getElementById("MathJax_Message").style.display="none";') + def load_header_footer_images(self): + from calibre.utils.monotonic import monotonic + evaljs = self.view.page().mainFrame().evaluateJavaScript + st = monotonic() + while not evaljs('paged_display.header_footer_images_loaded()'): + self.loop.processEvents(self.loop.ExcludeUserInputEvents) + if monotonic() - st > 5: + self.log.warn('Header and footer images have not loaded in 5 seconds, ignoring') + break + def get_sections(self, anchor_map, only_top_level=False): sections = defaultdict(list) ci = os.path.abspath(os.path.normcase(self.current_item)) @@ -395,7 +404,9 @@ class PDFWriter(QObject): set_section(col, tl_sections, 'current_tl_section') self.doc.init_page() if self.header or self.footer: - evaljs('paged_display.update_header_footer(%d)'%self.current_page_num) + if evaljs('paged_display.update_header_footer(%d)'%self.current_page_num) is True: + self.load_header_footer_images() + self.painter.save() mf.render(self.painter) self.painter.restore()