: Use uv sync --frozen in CI to ensure reproducible builds. 8. Pattern: Asynchronous PDF Rendering (For Web APIs) The Impact : Serve PDF reports without blocking the event loop (FastAPI, Quart).
with open("merged.pdf", "wb") as f: writer.write(f)
import pikepdf with pikepdf.open("document.pdf") as pdf: pdf.convert_to_pdfa( version="2b", output_intent=srgb_intent, attach_output_intent=True ) pdf.save("archival.pdf", compress_streams=True) : Use uv sync --frozen in CI to ensure reproducible builds
: Keep content logic in Jinja, layout in CSS (using @media print ), and generation pure Python. 2. Pattern: Zero-Copy PDF Merging with pypdf (formerly PyPDF2) The Impact : Merge hundreds of PDFs without memory explosion.
from pathlib import Path from jinja2 import Environment, FileSystemLoader from weasyprint import HTML def generate_invoice(data: dict) -> bytes: template_dir = Path("templates") env = Environment(loader=FileSystemLoader(template_dir)) template = env.get_template("invoice.html") rendered = template.render(**data) return HTML(string=rendered).write_pdf() with open("merged
from pypdf import PdfWriter, PdfReader writer = PdfWriter() for pdf_path in list_of_pdfs: reader = PdfReader(pdf_path) for page in reader.pages: writer.add_page(page) writer.add_metadata(reader.metadata) # preserves source metadata
# efficiently iterate for page in pdf.pages: if "_summary_" in page.extract_text().lower(): print(page.extract_tables()) from pathlib import Path from jinja2 import Environment,
Modern Python (2025+) uses uv (blazing-fast package manager) with workspaces: