mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
PDF Output: Allow using images in the header/footer templates
Images can be loaded using <img> tags with data URIs
This commit is contained in:
parent
5012d9066c
commit
4fba18f974
Binary file not shown.
@ -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
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user