From 56a3427b999dac16bcbbf40350169de2bec2c562 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 9 Jul 2019 17:11:03 +0530 Subject: [PATCH] Use PDFStream to set metadata for image PDFs No need to reparse via PoDoFo --- src/calibre/ebooks/pdf/html_writer.py | 13 +++++++++++-- src/calibre/ebooks/pdf/image_writer.py | 19 +++---------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/calibre/ebooks/pdf/html_writer.py b/src/calibre/ebooks/pdf/html_writer.py index ef163d4b96..f723642894 100644 --- a/src/calibre/ebooks/pdf/html_writer.py +++ b/src/calibre/ebooks/pdf/html_writer.py @@ -11,16 +11,17 @@ from PyQt5.Qt import QApplication, QTimer, QUrl from PyQt5.QtWebEngineWidgets import QWebEnginePage from calibre.constants import iswindows +from calibre.ebooks.metadata.xmp import metadata_to_xmp_packet from calibre.ebooks.oeb.polish.container import Container as ContainerBase from calibre.ebooks.oeb.polish.split import merge_html from calibre.ebooks.pdf.image_writer import ( - Image, PDFMetadata, draw_image_page, get_page_layout, update_metadata + Image, PDFMetadata, draw_image_page, get_page_layout ) from calibre.ebooks.pdf.render.serialize import PDFStream from calibre.gui2 import setup_unix_signals from calibre.gui2.webengine import secure_webengine from calibre.utils.logging import default_log -from calibre.utils.podofo import get_podofo +from calibre.utils.podofo import get_podofo, set_metadata_implementation from polyglot.builtins import range OK, LOAD_FAILED, KILL_SIGNAL = range(0, 3) @@ -100,6 +101,14 @@ class Renderer(QWebEnginePage): return self.pdf_data +def update_metadata(pdf_doc, pdf_metadata): + if pdf_metadata.mi: + xmp_packet = metadata_to_xmp_packet(pdf_metadata.mi) + set_metadata_implementation( + pdf_doc, pdf_metadata.title, pdf_metadata.mi.authors, + pdf_metadata.mi.book_producer, pdf_metadata.mi.tags, xmp_packet) + + def add_cover(pdf_doc, cover_data, page_layout, opts): buf = BytesIO() page_size = page_layout.fullRectPoints().size() diff --git a/src/calibre/ebooks/pdf/image_writer.py b/src/calibre/ebooks/pdf/image_writer.py index de2a21d3cb..41bf746b2b 100644 --- a/src/calibre/ebooks/pdf/image_writer.py +++ b/src/calibre/ebooks/pdf/image_writer.py @@ -9,12 +9,10 @@ from io import BytesIO from PyQt5.Qt import QMarginsF, QPageLayout, QPageSize, QSize from calibre.constants import filesystem_encoding -from calibre.ebooks.metadata.xmp import metadata_to_xmp_packet from calibre.ebooks.pdf.render.common import cicero, cm, didot, inch, mm, pica from calibre.ebooks.pdf.render.serialize import PDFStream from calibre.utils.img import image_and_format_from_data from calibre.utils.imghdr import identify -from calibre.utils.podofo import get_podofo, set_metadata_implementation from polyglot.builtins import as_unicode @@ -131,14 +129,6 @@ def draw_image_page(writer, img, preserve_aspect_ratio=True): writer.draw_image_with_transform(ref, translation=translation, scaling=scaling) -def update_metadata(pdf_doc, pdf_metadata): - if pdf_metadata.mi: - xmp_packet = metadata_to_xmp_packet(pdf_metadata.mi) - set_metadata_implementation( - pdf_doc, pdf_metadata.title, pdf_metadata.mi.authors, - pdf_metadata.mi.book_producer, pdf_metadata.mi.tags, xmp_packet) - - def convert(images, output_path, opts, metadata, report_progress): buf = BytesIO() page_layout = get_page_layout(opts, for_comic=True) @@ -146,16 +136,13 @@ def convert(images, output_path, opts, metadata, report_progress): writer = PDFStream(buf, (page_size.width(), page_size.height()), compress=True) writer.apply_fill(color=(1, 1, 1)) pdf_metadata = PDFMetadata(metadata) + writer.set_metadata(pdf_metadata.title, pdf_metadata.author, pdf_metadata.tags, pdf_metadata.mi) for i, path in enumerate(images): img = Image(as_unicode(path, filesystem_encoding)) draw_image_page(writer, img) writer.end_page() + # report progress writer.end() - podofo = get_podofo() - pdf_doc = podofo.PDFDoc() - pdf_doc.load(buf.getvalue()) - update_metadata(pdf_doc, pdf_metadata) - raw = pdf_doc.write() with open(output_path, 'wb') as f: - f.write(raw) + f.write(buf.getvalue())