WeasyPrint
Rebuilt a one-page resume as a real PDF from HTML/CSS after the original Figma source turned out to be off-limits to automation — shipped inside a single job-hunt session.
Kozea/WeasyPrint · BSD · evaluated 2026-08-10
Goals
Attach an up-to-date resume PDF to a recruiter reply that needed a new Artium AI entry added. No PDF resume existed anywhere on the machine (confirmed via a full filesystem search for *.pdf/*.docx with "resume" in the name), and the one editable design source — a Figma file — just needed that single entry added before export.
Effectiveness
Recommended for this shape of problem. ~/.venvs/pdftools (pymupdf, weasyprint, pypdf, reportlab) went from "not installed" to a shipped PDF attachment inside one session, once Figma automation turned out to be a dead end. The output isn't a pixel-clone of the original (DejaVu Sans stood in for DM Sans/Inter, icons simplified), but layout, colors, and structure matched closely enough that nothing needed manual touch-up before sending.
What made it effective
- Found an older-but-clean PDF resume elsewhere on disk as a starting reference, reverse-engineered its structure into HTML/CSS, patched in the new Artium entry, and rendered straight to PDF with WeasyPrint — no intermediate manual export step.
- The one-page constraint held automatically; no overflow or reflow fighting to get it back under one page.
- Left the rebuilt file in place (
Career/CV_Gavin_Morgan_updated_2026-08-10.pdf) and kept the venv installed, so the next resume tweak doesn't re-pay the install cost.
Friction, pain points, surprises
- The original ask was to edit the actual Figma source and export from there — that path died immediately. The design URL returned a CloudFront 403 "Request blocked" to headless browser automation before any login screen even rendered; Figma's marketing site loaded fine over the same connection, so this is bot detection scoped specifically to the file endpoint, not a general network or auth problem.
- Even with valid credentials it wouldn't have mattered: Figma's REST API is read-only for file content. There's no programmatic edit path for a
.figfile regardless of auth level — "go find a token" is not a fix here, and isn't worth retrying next time this pattern comes up. - Font mismatch (DM Sans/Inter unavailable locally) is the one visible gap between the WeasyPrint rebuild and the Figma-designed original. Installing those two font families once would close it if a Figma-sourced-resume-to-PDF-edit need recurs.
- The filesystem search for an existing resume initially came back empty because the actual file was filed as "CV," not "resume" — a vocabulary gap, not a WeasyPrint issue, but it cost a round-trip before the right file turned up.