{ "_comment": "Copy to pdf.config.json next to your HTML and edit. Relative paths resolve against THIS file. Run a dry validation with: python3 scripts/build_pdf.py pdf.config.json --check", "input_html": "proposal.html", "output_pdf": "Proposal.pdf", "_comment_page": "page_size: 'Letter' | 'Legal' | 'A4' | 'A3', or a custom object {\"width_mm\":210,\"height_mm\":297}. For A4 also set @page size:A4 in the HTML CSS.", "page_size": "Letter", "cover_full_bleed": true, "render_timeout_ms": 30000, "metadata": { "title": "Commercial Proposal — Project Title", "author": "Your Name", "subject": "One-line description of the proposal", "keywords": "proposal, optional" }, "footer": { "_comment": "Stamped on body pages. skip_first_page hides it on the cover; skip_pages is extra 1-based pages to skip (e.g. the TOC). page_number_format supports {page} and {pages}, e.g. '{page}' or '{page} / {pages}' or 'Pagina {page}'.", "text": "Commercial Proposal · Project Title · Client — Confidential", "skip_first_page": true, "skip_pages": [], "page_number_format": "{page}", "rule": true, "font_size_pt": 7.5, "margin_mm": 12, "color": [0.46, 0.51, 0.57] }, "fonts": { "_comment": "TTF for the footer text. Falls back to Helvetica if the path is missing. Debian/Ubuntu: fonts-crosextra-carlito installs this path.", "footer_ttf": "/usr/share/fonts/truetype/crosextra/Carlito-Regular.ttf" }, "toc": { "_comment": "key -> a UNIQUE phrase from that section's BODY (NOT its title; titles also render in the TOC and match there first). Avoid the first letter of a drop-cap paragraph. Match the keys to the {{PG_*}} tokens in the HTML. Leave this empty {} for a document with no table of contents.", "execsum": "opening paragraph uses a drop cap", "1": "A lede paragraph introduces the section", "2": "Body text for the scope section", "anexoA": "Appendices start on a fresh page" } }