Use PoDoFo to insert the cover page, bypassing https://github.com/podofo/podofo/issues/76

This commit is contained in:
Kovid Goyal 2023-05-19 15:26:49 +05:30
parent cb1c6efd61
commit 59fab1d482
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 9 additions and 19 deletions

View File

@ -10,7 +10,6 @@ import sys
from collections import namedtuple from collections import namedtuple
from functools import lru_cache from functools import lru_cache
from html5_parser import parse from html5_parser import parse
from io import BytesIO
from itertools import count, repeat from itertools import count, repeat
from qt.core import ( from qt.core import (
QApplication, QByteArray, QMarginsF, QObject, QPageLayout, Qt, QTimer, QUrl, QApplication, QByteArray, QMarginsF, QObject, QPageLayout, Qt, QTimer, QUrl,
@ -29,10 +28,7 @@ from calibre.ebooks.oeb.base import XHTML, XPath
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.toc import get_toc from calibre.ebooks.oeb.polish.toc import get_toc
from calibre.ebooks.oeb.polish.utils import guess_type from calibre.ebooks.oeb.polish.utils import guess_type
from calibre.ebooks.pdf.image_writer import ( from calibre.ebooks.pdf.image_writer import PDFMetadata, get_page_layout
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 import setup_unix_signals
from calibre.srv.render_book import check_for_maths from calibre.srv.render_book import check_for_maths
from calibre.utils.fonts.sfnt.container import Sfnt, UnsupportedFont from calibre.utils.fonts.sfnt.container import Sfnt, UnsupportedFont
@ -42,9 +38,9 @@ from calibre.utils.fonts.sfnt.subset import pdf_subset
from calibre.utils.logging import default_log from calibre.utils.logging import default_log
from calibre.utils.monotonic import monotonic from calibre.utils.monotonic import monotonic
from calibre.utils.podofo import ( from calibre.utils.podofo import (
dedup_type3_fonts, get_podofo, remove_unused_fonts, set_metadata_implementation, add_image_page, dedup_type3_fonts, get_podofo, remove_unused_fonts,
set_metadata_implementation,
) )
from calibre.utils.resources import get_path as P from calibre.utils.resources import get_path as P
from calibre.utils.short_uuid import uuid4 from calibre.utils.short_uuid import uuid4
from calibre.utils.webengine import secure_webengine, send_reply, setup_profile from calibre.utils.webengine import secure_webengine, send_reply, setup_profile
@ -481,15 +477,8 @@ def update_metadata(pdf_doc, pdf_metadata):
def add_cover(pdf_doc, cover_data, page_layout, opts): def add_cover(pdf_doc, cover_data, page_layout, opts):
buf = BytesIO() r = page_layout.fullRect(QPageLayout.Unit.Point)
page_size = page_layout.fullRectPoints().size() add_image_page(pdf_doc, cover_data, page_size=(r.left(), r.top(), r.width(), r.height()), preserve_aspect_ratio=opts.preserve_cover_aspect_ratio)
img = Image(cover_data)
writer = PDFStream(buf, (page_size.width(), page_size.height()), compress=True)
writer.apply_fill(color=(1, 1, 1))
draw_image_page(writer, img, preserve_aspect_ratio=opts.preserve_cover_aspect_ratio)
writer.end()
cover_pdf_doc = data_as_pdf_doc(buf.getvalue())
pdf_doc.insert_existing_page(cover_pdf_doc)
# }}} # }}}

View File

@ -169,10 +169,10 @@ def test_dedup_type3_fonts(src):
def add_image_page(pdf_doc, image_data, page_size=None, page_num=1, preserve_aspect_ratio=True): def add_image_page(pdf_doc, image_data, page_size=None, page_num=1, preserve_aspect_ratio=True):
if page_size is None: if page_size is None:
from qt.core import QPageSize from qt.core import QPageSize
page_size = QPageSize(QPageSize.PageSizeId.A4) p = QPageSize(QPageSize.PageSizeId.A4).rect(QPageSize.Unit.Point)
page = page_size.rect(QPageSize.Unit.Point) page_size = p.left(), p.top(), p.width(), p.height()
pdf_doc.add_image_page( pdf_doc.add_image_page(
image_data, page.left(), page.top(), page.width(), page.height(), page.left(), page.top(), page.width(), page.height(), page_num, preserve_aspect_ratio) image_data, *page_size, *page_size, page_num, preserve_aspect_ratio)
def test_add_image_page(image='/t/t.jpg', dest='/t/t.pdf', **kw): def test_add_image_page(image='/t/t.jpg', dest='/t/t.pdf', **kw):

View File

@ -432,6 +432,7 @@ PDFDoc_add_image_page(PDFDoc *self, PyObject *args) {
} }
} }
painter.DrawImage(*img, image_x, image_y, scaling_x / img->GetRect().Width, scaling_y / img->GetRect().Height); painter.DrawImage(*img, image_x, image_y, scaling_x / img->GetRect().Width, scaling_y / img->GetRect().Height);
painter.FinishDrawing();
return Py_BuildValue("dd", img->GetRect().Width, img->GetRect().Height); return Py_BuildValue("dd", img->GetRect().Width, img->GetRect().Height);
} }
// }}} // }}}