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 PyQt5.QtWebEngineWidgets import QWebEnginePage
from calibre.constants import iswindows 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.container import Container as ContainerBase
from calibre.ebooks.oeb.polish.split import merge_html from calibre.ebooks.oeb.polish.split import merge_html
from calibre.ebooks.pdf.image_writer import ( 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.ebooks.pdf.render.serialize import PDFStream
from calibre.gui2 import setup_unix_signals from calibre.gui2 import setup_unix_signals
from calibre.gui2.webengine import secure_webengine from calibre.gui2.webengine import secure_webengine
from calibre.utils.logging import default_log 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 from polyglot.builtins import range
OK, LOAD_FAILED, KILL_SIGNAL = range(0, 3) OK, LOAD_FAILED, KILL_SIGNAL = range(0, 3)
@ -100,6 +101,14 @@ class Renderer(QWebEnginePage):
return self.pdf_data 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): def add_cover(pdf_doc, cover_data, page_layout, opts):
buf = BytesIO() buf = BytesIO()
page_size = page_layout.fullRectPoints().size() 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 PyQt5.Qt import QMarginsF, QPageLayout, QPageSize, QSize
from calibre.constants import filesystem_encoding 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.common import cicero, cm, didot, inch, mm, pica
from calibre.ebooks.pdf.render.serialize import PDFStream from calibre.ebooks.pdf.render.serialize import PDFStream
from calibre.utils.img import image_and_format_from_data from calibre.utils.img import image_and_format_from_data
from calibre.utils.imghdr import identify from calibre.utils.imghdr import identify
from calibre.utils.podofo import get_podofo, set_metadata_implementation
from polyglot.builtins import as_unicode 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) 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): def convert(images, output_path, opts, metadata, report_progress):
buf = BytesIO() buf = BytesIO()
page_layout = get_page_layout(opts, for_comic=True) 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 = PDFStream(buf, (page_size.width(), page_size.height()), compress=True)
writer.apply_fill(color=(1, 1, 1)) writer.apply_fill(color=(1, 1, 1))
pdf_metadata = PDFMetadata(metadata) 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): for i, path in enumerate(images):
img = Image(as_unicode(path, filesystem_encoding)) img = Image(as_unicode(path, filesystem_encoding))
draw_image_page(writer, img) draw_image_page(writer, img)
writer.end_page() writer.end_page()
# report progress
writer.end() 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: with open(output_path, 'wb') as f:
f.write(raw) f.write(buf.getvalue())