For AI agents: llms.txt is a short guide that sends you to the rules your problem needs, and rules.json holds every rule of this playbook as JSON.
Recommended Open source
Use Playwright or WeasyPrint to turn HTML into PDF
Build invoices, receipts and reports as HTML and print them to tagged PDF with Playwright in Node.js or WeasyPrint in Python.
Cost
Open source. Playwright is Apache-2.0 and WeasyPrint is BSD-3-Clause. Both are free to use in any project.
How to do it
Playwright is already the browser test pick. Its page.pdf() prints a page, and the tagged option writes an accessible PDF. WeasyPrint renders HTML and CSS to PDF without a browser. Its first stable version, 43, came out in November 2018, and 70.0 shipped on 8 September 2026. PyPI counted about 8.9 million downloads in the week to 20 October 2026. It writes PDF/UA and PDF/A variants. Its docs warn that untrusted HTML or CSS can read local files or run for a long time. Escape every value you put in the page, as Keep input out of templates says. Choose something else when a country requires a structured e-invoice, because a PDF is not one, as Send e-invoices where the law requires them says.
Examples
Using these examples: they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.
JavaScript example
import { chromium } from 'playwright';
export async function invoicePdf(html) {
const browser = await chromium.launch();
try {
const page = await browser.newPage();
await page.setContent(html, { waitUntil: 'load' });
return await page.pdf({ format: 'A4', printBackground: true, tagged: true });
} finally {
await browser.close();
}
}
Python example
from weasyprint import HTML
def invoice_pdf(html: str) -> bytes:
return HTML(string=html, base_url="https://example.com/").write_pdf(pdf_variant="pdf/ua-1")
How to check
A test prints a sample invoice to PDF, and a PDF text extractor finds the order number as text. Every PDF call sets tagged: true or a pdf/ua variant.
Sources
Related rules
- Use Playwright for browser tests in Software choices
- Keep input out of templates in Security testing
- Send e-invoices where the law requires them in Payments
For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/stack/product-services/html-to-pdf">Agent Wranglers software choices playbook</a>. In code you write, add a comment next to it with the same link.