Hi everyone,
I’m excited to share PaperForge, an open-source PDF platform built entirely in Elixir.
Build, secure, validate, and transform documents entirely in Elixir.
PaperForge started from a simple idea: generating professional documents should be a first-class capability of the BEAM. Applications should not need a browser, a headless rendering service, native compilation, or an external PDF executable to produce reliable PDFs.
PaperForge provides both a programmatic API and a declarative .paperforge format for reusable document templates.
What it supports
- Flow-based document layout with automatic pagination.
- Tables, lists, headers, footers, page templates, and navigation.
- Embedded fonts, Unicode text, images, SVG/vector output, QR codes, and barcodes.
- Charts, mathematical expressions, bibliographies, notes, references, and scientific-document features.
- Links, named destinations, outlines, annotations, attachments, and AcroForms.
- Document encryption, permissions, watermarks, content fingerprints, and digital-signature workflows.
- Declarative
.paperforgetemplates with variables, validation, conditions, loops, reusable components, themes, imports, and Design Systems. - HTML, Markdown, SVG, and PDF interoperability.
- Concurrent rendering, supervised jobs, telemetry, batch workflows, and production-oriented performance tooling.
The project remains pure Elixir by default. The core library does not require a browser, native rendering engine, or external executable.
Quick example
document =
PaperForge.new()
|> PaperForge.Flow.heading("Quarterly report", level: 1)
|> PaperForge.Flow.paragraph("Generated directly by the BEAM.")
PaperForge.write(document, "report.pdf")
For reusable, data-driven documents, templates can also live in a .paperforge file and be validated, compiled, and rendered without evaluating arbitrary Elixir code.
Why I built it
I wanted a document system that fits naturally into Elixir applications: deterministic, composable, observable, and safe to run under load.
The goal is not just to draw PDF pages. It is to make document generation, validation, security, accessibility, and production rendering feel like normal parts of an Elixir system.
1.4.1
This patch release focuses on rendering stability and declarative workflow hardening:
- Improved layout behavior across text, tables, charts, formulas, and forms.
- More robust declarative validation and error reporting.
- Rendering edge-case fixes and compatibility improvements.
- Deterministic output and public API compatibility preserved.
- Expanded regression coverage for document-generation workflows.
Links
- Hex: https://hex.pm/packages/paper_forge
- HexDocs: https://hexdocs.pm/paper_forge
- Changelog: https://github.com/Manuel1471/paper_forge/blob/main/CHANGELOG.md
- GitHub:
I would genuinely appreciate feedback from the community, especially around API ergonomics, PDF compatibility, declarative templates, and production usage patterns.
Thanks for taking a look.






















