mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-31 14:33:54 -04:00
Use PDFStream to set metadata for image PDFs
No need to reparse via PoDoFo
This commit is contained in:
parent
22ba6c3ab7
commit
56a3427b99
@ -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()
|
||||||
|
@ -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())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user