Use PDFStream to set metadata for image PDFs

No need to reparse via PoDoFo
This commit is contained in:
Kovid Goyal 2019-07-09 17:11:03 +05:30
parent 22ba6c3ab7
commit 56a3427b99
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 14 additions and 18 deletions

View File

@ -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()

View File

@ -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())