View Single Post
Old 02-04-2023, 03:04 PM   #4
HebrewReader
Member
HebrewReader doesn't litterHebrewReader doesn't litter
 
Posts: 15
Karma: 156
Join Date: Jan 2023
Device: Kindle Paperwhite (10th Generation)
Another question:

I have working python code for inserting a cover page from an image to a pdf.
However it uses 3rd-party libraries, namely pypdf and reportlab.
I know I can add them to my plugin, but if Calibre's existing code could handle this already, I'd rather make my plugin leaner and use it instead.

So can someone here guide me on if and how to use Calibre's pdf modules?

Here's my existing code for reference:

Code:
import pypdf
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader

def generate_cover_pdf_stream(
        cover_url: str,
        main_pdf_reader: pypdf.PdfReader) -> io.BytesIO:
    cover_pdf_stream = io.BytesIO()
    sample_page = main_pdf_reader.pages[0]
    cover_image = ImageReader(cover_url)
    image_canvas = canvas.Canvas(cover_pdf_stream,
                                 pagesize=(sample_page.mediabox.width, sample_page.mediabox.height),
                                 cropBox=sample_page.cropbox,
                                 artBox=sample_page.artbox,
                                 trimBox=sample_page.trimbox)
    image_canvas.drawImage(cover_image,
                           x=float(sample_page.trimbox.left),
                           y=float(sample_page.trimbox.bottom),
                           width=float(sample_page.trimbox.width),
                           height=float(sample_page.trimbox.height))
    image_canvas.showPage()
    image_canvas.save()
    return cover_pdf_stream


def add_cover(filename_or_stream: str | IO | Path,
              cover_url: str,
              out_filename_or_stream: Path | str | IO):
    reader = pypdf.PdfReader(filename_or_stream)
    merger = pypdf.PdfMerger()

    cover_pdf_stream = generate_cover_pdf_stream(cover_url, reader)
    merger.append(cover_pdf_stream)
    merger.append(reader.stream)

    merger.write(out_filename_or_stream)
Thanks!
HebrewReader is offline   Reply With Quote