Emboss PDF Library

Evaluation Report & Comparative Analysis
Prepared by Gaurav Gupta | July 2026
Disclaimer: This is an independent evaluation prepared by the author, not an official, audited, or sponsored comparison, and it is not endorsed by the maintainers of any library discussed. Feature comparisons, ratings, and scores reflect the author's own testing and understanding as of the date above and are opinions, not verified facts of record — library capabilities change over time and may differ from what is described here. Readers should independently verify current capabilities against each project's own documentation and source code before making an adoption decision.

1. Executive Overview

Emboss is a Python PDF generation library that treats a PDF as structured, self-describing data with a deterministic, accessible, verifiable lifecycle. It uses a native typesetting engine (Knuth-Plass line breaking), produces byte-identical output across runs, and generates PDF/UA accessibility tags by default.

This report evaluates Emboss against five established Python PDF libraries: ReportLab, WeasyPrint, FPDF2, borb, and xhtml2pdf.

1.1.0
Current Version
2,127
Test Cases
1
Hard Dependency (fonttools)
~50ms
10-Page Render Time
Apache 2.0
License
Python 3.10+
Requirement

1B. Installation

Installing Emboss to reproduce the results in this report, or to evaluate it yourself:

# Core library (requires Python 3.10+) pip install emboss-pdf

Optional extras, added as needed:

pip install emboss-pdf[all] # pydantic + pikepdf + cryptography pip install emboss-pdf[llm] # pydantic schemas for LLM structured output pip install emboss-pdf[verify] # pikepdf for PDF structural verification pip install emboss-pdf[signing] # cryptography for digital signatures pip install emboss-pdf[mcp] # MCP server for Claude / LLM integration pip install emboss-pdf[dev] # full dev environment (pytest, mypy, ruff)

The only hard dependency is fonttools; everything else above is opt-in. Full source, docs, and the sample application used in Section 3 are at github.com/GGChamp85/Emboss.

2. Emboss Capabilities

Core Document Elements

  • Headings (6 levels), paragraphs, rich text runs
  • Bullet and numbered lists
  • Tables with striping, alignment, captions, cell spanning
  • Images (PNG, JPEG) with captions
  • Horizontal rules and page breaks
  • Footnotes with auto-numbering
  • Table of contents generation
  • Cross-references and auto-numbering

Typography Engine

  • Knuth-Plass optimal line breaking
  • Knuth-Liang hyphenation
  • fi/fl/ffi/ffl ligature substitution
  • GPOS kerning from OpenType tables
  • CJK text support with CIDFont subsetting
  • Base-14 + custom TrueType/OpenType fonts
  • Bundled OFL font set
  • Deterministic number formatting

Visualizations

  • Bar, line, pie, stacked bar charts
  • Node-and-edge diagrams (SVG-based)
  • SVG embedding and rendering
  • LaTeX math notation rendering
  • MathML (Presentation) parsing
  • Syntax-highlighted code blocks
  • Chart fact extraction and caption verification
  • Data binding: CSV to tables/charts

Enterprise & Compliance

  • PDF/UA-1 accessibility tagging (default)
  • PDF/A-2b, PDF/A-3b archival output
  • Factur-X / ZUGFeRD e-invoicing
  • PAdES B-B / B-T digital signatures
  • PKCS#7, DocMDP certification signatures
  • Content redaction
  • Bates numbering, line numbers, watermarks
  • Interactive AcroForm fields

Self-Describing PDFs

  • Embedded spec for full document recovery
  • Per-character text index
  • Node-keyed document diff and redline
  • Reproducibility manifest
  • Node-scoped patching (edit one paragraph)
  • Annotation round-trip
  • Incremental amendment with signature coverage
  • AI provenance / content credentials

AI & Integration

  • MCP server for Claude / LLM integration
  • EmbossSpec JSON format for structured generation
  • Markdown-to-PDF parser
  • HTML export adapter
  • DOCX export adapter
  • Pydantic JSON Schema for LLM tooling
  • Prompt generation for LLM document creation
  • Grounded Q&A (explicit "not in this document")

3. Sample Application Results

A sample application was built using Emboss to demonstrate its capabilities. The application generates a multi-page PDF showcasing typography, tables, charts, code blocks, math notation, diagrams, callouts, footnotes, and bibliography.

$ python sample_app.py
============================================================ Emboss Sample Application Generating comprehensive capability showcase... ============================================================ ============================================================ Emboss Sample Output ============================================================ [PASS] valid_header [PASS] has_eof [PASS] has_xref [PASS] has_catalog [PASS] has_pages [PASS] has_font [PASS] is_tagged [PASS] has_title [PASS] has_lang [INFO] size_bytes: 46,007 Result: 9/9 checks passed Size: 46,007 bytes (44.9 KB) Determinism Check: [PASS] Two renders produced identical bytes Total time: 0.103 seconds Output: emboss_sample_output.pdf ============================================================
Key Results: All 9 structural checks passed. The PDF is PDF/UA tagged, has proper metadata, and two independent renders produced byte-identical output, confirming determinism. Total generation time was 103 milliseconds for a multi-page document with charts, diagrams, math, code blocks, and tables.

Sample Code (Excerpt)

from emboss import Document, TextRun, TableCell, Chart doc = Document( title="Emboss Sample Application", author="Gaurav Gupta", style="corporate", tagged=True, # PDF/UA accessibility toc=True, # Auto table of contents page_numbers=True, ) # Rich text with mixed formatting doc.heading("Revenue Analysis", level=1) doc.paragraph([ TextRun("Revenue grew "), TextRun("24%", bold=True, color="22c55e"), TextRun(" year over year."), ]) # Tables with decimal alignment doc.table( headers=["Region", TableCell("Revenue", align="decimal")], rows=[["North America", "$2,431,000.00"], ["Europe", "$1,204,300.50"]], stripe=True, ) # Native vector charts doc.chart("bar", labels=["Q1","Q2","Q3","Q4"], values=[2.4, 3.1, 2.8, 3.7], title="Quarterly Revenue ($M)") # Math notation doc.math(r"E = mc^{2}") # One call to save doc.save("report.pdf")

4. Library-by-Library Comparison

Emboss Under Evaluation

Precision PDF generation for Python. Declarative specs, Knuth-Plass typography, PDF/UA tagging, deterministic output. Treats a PDF as structured data you can also read.

Strengths

  • Byte-identical deterministic output
  • PDF/UA accessibility by default
  • Knuth-Plass optimal typography
  • Self-describing PDFs (embedded spec, text index)
  • Pure Python, single hard dependency
  • MCP server for AI integration
  • PDF/A, digital signatures, e-invoicing in one package
  • 2,127 tests, veraPDF-verified conformance
  • Node-scoped editing (change one paragraph cheaply)
  • Data embedded at element level (table carries its CSV)

Considerations

  • Newer library (v1.1.0, released July 2026)
  • Smaller community (15 stars, growing)
  • No HTML/CSS input mode (by design)
  • RTL/complex-script shaping not yet supported
  • Single primary maintainer currently
  • No radio-button groups, XFA, or JS form actions

License: Apache 2.0 | API Style: Declarative/Fluent | Dependencies: fonttools only

ReportLab Established

The most established Python PDF library, available since 2000. Offers both an open-source toolkit and a commercial add-on (ReportLab PLUS/RML) for enterprise features.

Strengths

  • Battle-tested for 20+ years in production
  • Comprehensive feature set (canvas + platypus)
  • Built-in charting library
  • Barcode/QR code generation
  • Strong commercial support available
  • Good performance with C extensions
  • CJK font support (CID fonts)
  • Interactive form fields (AcroForm)

Weaknesses

  • PDF/UA accessibility is opt-in and basic (a single tagged="1" attribute added in v4.0), not on by default or independently conformance-checked the way Emboss's is
  • Non-deterministic output (timestamps, random IDs)
  • Steep learning curve, verbose imperative API
  • Aging API design
  • Commercial license for advanced features (RML)
  • C extensions complicate deployment
  • No digital signatures in open-source version
  • No PDF/A support

License: BSD (open-source), Commercial (PLUS) | API Style: Imperative | Stars: ~500 | Dependencies: Pillow, C extensions

WeasyPrint Popular

CSS-based HTML-to-PDF rendering engine. Takes HTML and CSS as input and produces PDF output, acting like a headless browser focused on print media.

Strengths

  • Intuitive for web developers (HTML/CSS input)
  • Excellent CSS Paged Media support
  • Good typography with HarfBuzz shaping
  • Active development, responsive maintainers
  • Large community (7,000+ stars)
  • SVG rendering support

Weaknesses

  • Heavy system dependencies (cairo, Pango, GDK-PixBuf)
  • Painful installation on Windows
  • Slow performance for large documents
  • No interactive forms or digital signatures
  • No built-in chart generation
  • No PDF/UA conformance
  • Non-deterministic output
  • No PDF/A support

License: BSD 3-Clause | API Style: Declarative (HTML/CSS) | Stars: ~7,000 | Dependencies: cairo, Pango, GDK-PixBuf, HarfBuzz

FPDF2 Lightweight

Lightweight, pure-Python PDF generation library. Modern successor to PyFPDF, focused on simplicity and minimal dependencies.

Strengths

  • Ultra-lightweight, essentially zero dependencies
  • Simplest API, easiest to learn
  • Pure Python, installs anywhere
  • Active development with frequent releases
  • Excellent tutorials and documentation
  • Small memory footprint

Weaknesses

  • Limited typography (no Knuth-Plass)
  • No built-in charting
  • No PDF/UA accessibility
  • No digital signatures
  • No interactive forms
  • Cell-based layout model is limiting
  • Not suitable for complex documents
  • LGPL license (copyleft concerns)

License: LGPL 3.0 | API Style: Imperative | Stars: ~1,100 | Dependencies: None (defusedxml, Pillow optional)

borb Niche

Pure Python PDF library supporting both reading and writing. Object-oriented API that maps closely to the PDF specification.

Strengths

  • Read + write capability (unique)
  • Pure Python, no system dependencies
  • Can modify existing PDFs
  • PDF merging, splitting, extraction
  • Comprehensive author documentation (book)

Weaknesses

  • AGPL/commercial dual license
  • Slower performance
  • Single maintainer risk
  • No PDF/UA, no PDF/A, no signatures
  • Limited charting
  • Verbose API in places

License: AGPL v3 / Commercial | API Style: Object-oriented | Stars: ~3,400 | Dependencies: Pillow, fonttools, requests

xhtml2pdf (pisa) Legacy

HTML/CSS-to-PDF converter built on top of ReportLab. Popular in Django projects for converting HTML templates to PDF output.

Strengths

  • Easiest HTML-to-PDF pipeline
  • Good Django/Flask integration
  • One-line conversion API
  • Built on ReportLab's rendering engine
  • Mature project with long history

Weaknesses

  • Limited and outdated CSS support
  • Many CSS rendering bugs
  • Slow development pace
  • No accessibility, no forms, no signatures
  • Inherits ReportLab's dependency overhead
  • Not suitable for complex layouts

License: Apache 2.0 | API Style: Declarative (HTML) | Stars: ~2,200 | Dependencies: ReportLab, html5lib, pypdf

5. Feature Comparison Matrix

Core Features

Feature Emboss ReportLab WeasyPrint FPDF2 borb xhtml2pdf
Tables Yes Yes Yes Yes Yes Yes
Charts (Built-in) Yes Yes No No Limited No
Images Yes Yes Yes Yes Yes Yes
SVG Rendering Yes Yes Yes Yes No No
Math Notation Yes No No No No No
Code Highlighting Yes No No No No No
Diagrams Yes No No No No No
CJK Text Yes Yes Yes Yes Limited Limited
Bibliography/Citations Yes No No No No No
Slide/Presentation Mode Yes No No No No No

Enterprise & Compliance Features

Feature Emboss ReportLab WeasyPrint FPDF2 borb xhtml2pdf
PDF/UA Accessibility Default Partial (opt-in, v4.0+) Partial Minimal No No
Deterministic Output Yes No No Partial No No
PDF/A Archival 2b, 3b No No No No No
Digital Signatures PAdES, PKCS#7 No* No No No No
Interactive Forms Yes Yes No No Read-only No
E-Invoicing (Factur-X) Yes No No No No No
Content Redaction Yes No No No No No
Bates Numbering Yes No No No No No
Embedded Data (CSV in PDF) Yes No No No No No
Self-Describing (embed spec) Yes No No No No No
MCP / AI Integration Yes No No No No No

* ReportLab commercial version has limited signature support. Open-source version does not.

Technical Characteristics

Characteristic Emboss ReportLab WeasyPrint FPDF2 borb xhtml2pdf
Pure Python Yes No No Yes Yes No
Hard Dependencies 1 (fonttools) Pillow, C exts cairo, Pango, etc. 0 ~5 ReportLab + 4
Typography Engine Knuth-Plass Basic paragraph HarfBuzz/Pango Basic Basic ReportLab's
Input Format Python API / JSON Python API HTML/CSS Python API Python API HTML/CSS
License Apache 2.0 BSD / Commercial BSD 3-Clause LGPL 3.0 AGPL / Commercial Apache 2.0
Read Existing PDFs Yes No No No Yes No
Windows Install Easy (pip) Moderate Difficult Easy (pip) Easy (pip) Moderate

6. Dimensional Ratings

Ease of Use

LibraryRatingVisualNotes
FPDF2 9.5/10
Simplest API, fastest onboarding
Emboss 9.0/10
Declarative API, clear naming, minimal boilerplate
xhtml2pdf 8.5/10
One-line HTML-to-PDF conversion
WeasyPrint 8.0/10
Familiar for web developers, but install complexity
borb 6.0/10
Verbose API, maps to raw PDF spec
ReportLab 5.5/10
Powerful but steep learning curve

Enterprise Readiness

LibraryRatingVisualNotes
Emboss 9.5/10
PDF/UA, PDF/A, signatures, e-invoicing, determinism
ReportLab 7.0/10
Proven at scale, commercial support, but missing compliance
WeasyPrint 5.0/10
Reliable but install complexity, no enterprise features
FPDF2 4.0/10
Good for simple needs, lacks compliance features
borb 3.5/10
AGPL license concern, single maintainer
xhtml2pdf 3.0/10
Aging, limited features, no compliance

AI / LLM Integration Potential

LibraryRatingVisualNotes
Emboss 10/10
MCP server, JSON spec, grounded Q&A, node-scoped edits
WeasyPrint 7.0/10
HTML/CSS is well-understood by LLMs
xhtml2pdf 7.0/10
HTML input is trivial for LLMs to produce
FPDF2 6.5/10
Simple API, predictable patterns
ReportLab 4.0/10
Complex API, more tokens needed
borb 3.0/10
Verbose API, less common in training data

Print Production Readiness

LibraryRatingVisualNotes
Emboss 9.0/10
CMYK, PDF/X-4, Knuth-Plass, deterministic
ReportLab 8.0/10
CMYK, precise positioning, production-proven
WeasyPrint 5.0/10
Good typography but CSS-limited, no CMYK
FPDF2 3.0/10
Basic typography, no advanced print features
borb 2.5/10
Not designed for print production
xhtml2pdf 2.0/10
CSS rendering inconsistencies

7. Code Comparison: "Hello World" Report

The same simple report (title, paragraph, table) implemented in each library:

Emboss (12 lines)

from emboss import Document doc = Document(title="Q3 Report", style="finance") doc.heading("Revenue Analysis", level=1) doc.paragraph("Revenue increased 12% year over year.") doc.table( headers=["Region", "Q3"], rows=[["North America", "$2.4M"], ["Europe", "$1.2M"]] ) doc.save("report.pdf") # Output: PDF/UA tagged, deterministic, accessible

ReportLab (~35 lines)

from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Paragraph, Table, Spacer from reportlab.lib.styles import getSampleStyleSheet from reportlab.lib.units import inch doc = SimpleDocTemplate("report.pdf", pagesize=letter) styles = getSampleStyleSheet() story = [] story.append(Paragraph("Revenue Analysis", styles['Heading1'])) story.append(Spacer(1, 12)) story.append(Paragraph("Revenue increased 12% year over year.", styles['Normal'])) story.append(Spacer(1, 12)) data = [["Region", "Q3"], ["North America", "$2.4M"], ["Europe", "$1.2M"]] table = Table(data) story.append(table) doc.build(story) # Output: No tags, no accessibility, non-deterministic

WeasyPrint (~25 lines)

import weasyprint html = """ <html> <head><title>Q3 Report</title> <style> body { font-family: sans-serif; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ccc; padding: 8px; } </style></head> <body> <h1>Revenue Analysis</h1> <p>Revenue increased 12% year over year.</p> <table> <tr><th>Region</th><th>Q3</th></tr> <tr><td>North America</td><td>$2.4M</td></tr> <tr><td>Europe</td><td>$1.2M</td></tr> </table> </body></html> """ weasyprint.HTML(string=html).write_pdf("report.pdf") # Requires: cairo, Pango, GDK-PixBuf installed on system

FPDF2 (~20 lines)

from fpdf import FPDF pdf = FPDF() pdf.add_page() pdf.set_font("Helvetica", size=20) pdf.cell(text="Revenue Analysis", new_x="LMARGIN", new_y="NEXT") pdf.set_font("Helvetica", size=12) pdf.ln(5) pdf.cell(text="Revenue increased 12% year over year.", new_x="LMARGIN", new_y="NEXT") pdf.ln(10) with pdf.table() as table: row = table.row() row.cell("Region") row.cell("Q3") row = table.row() row.cell("North America") row.cell("$2.4M") pdf.output("report.pdf") # Simple but no charts, no accessibility, no typography

8. Features Unique to Emboss

The following features are available in Emboss and in none of the five competing libraries:

1. PDF/UA Accessibility by Default

Every document is automatically tagged with a full PDF/UA structure tree. No separate accessibility pass needed. Verified against the real veraPDF validator in CI.

2. Byte-Identical Determinism

No timestamps, no random IDs. The file /ID is content-derived. Same input produces same bytes on every machine. Hash-verifiable filings, diffable in CI.

3. Knuth-Plass Typography

The same optimal line-breaking algorithm used by TeX. Produces professionally typeset paragraphs with even spacing, not the greedy line-filling of other libraries.

4. Self-Describing PDFs

Documents embed their own spec, a per-character text index, and stable IDs on every block. Generate, review, edit, sign, verify, and reproduce from the same structure.

5. MCP Server for AI

First-class Model Context Protocol server makes every document callable from Claude or other LLMs. Generate, query with certainty, and edit, with explicit "not in this document" grounding.

6. Data Embedded at Element Level

A table or chart carries its own source CSV inside the PDF as a per-element attachment. The figure a reader sees and the data an analyst needs are the same file.

7. Node-Scoped Editing

Change one paragraph in a 50-page report at paragraph cost, not report cost. LLM edits are node-scoped, reducing token consumption dramatically.

8. AI Provenance / Content Credentials

Documents can embed GeneratorInfo with prompt hashes for AI content traceability, supporting responsible AI documentation practices.

9. Document Diff & Redline

Node-keyed document comparison and redline rendering. Compare two versions and see exactly what changed at the structural level.

10. Comprehensive Compliance Stack

PDF/UA + PDF/A + PAdES signatures + Factur-X e-invoicing + PDF/X-4 + WTPDF 1.0, all in one pure-Python package. No other library combines even three of these.

9. Standards & Regulatory Compliance

Standard Purpose Regulatory Driver Emboss Support
PDF/UA-1 Accessibility (tagged, assistive-tech ready) EU Accessibility Act (June 2025), US Section 508, EN 301 549 Full
PDF/A-2b, 3b Archival / long-term retention Records retention, filing ingest Full
Factur-X / ZUGFeRD Electronic invoicing (XML in PDF) France B2B mandate (Sept 2026), EU e-invoicing Full
PAdES B-B / B-T Legally recognized e-signatures eIDAS (EU) Full
PDF/X-4 Print / prepress output Commercial print Full
WTPDF 1.0 (Reuse) Clean re-extraction for RAG / reuse AI and data pipelines Full
Verification: Every conformance claim is checkable via emboss verify out.pdf --conformance ua1 (also 2b, 3b). The CI conformance job runs the real veraPDF validator on every push, not a mock.

10. Emboss Gaps, Issues & Risks

An honest assessment of the library's current limitations, organized by category. These are important considerations for enterprise adoption decisions.

Functional Gaps

GapSeverityDetail
No RTL / complex-script support Medium Arabic, Hebrew, Devanagari, and other complex scripts are explicitly out of scope. CJK (Chinese, Japanese, Korean) is supported as of v1.1.0.
Limited form field types Medium Only TextField, CheckboxField, and DropdownField are supported. No radio-button groups, XFA forms, JavaScript form actions, listbox, or multi-select.
No incremental form field addition Low The incremental amendment system (amend.py) cannot add form fields to an already-rendered PDF. Fields must be defined at generation time.
Base-14 fonts only in AcroForm /DR Low Custom fonts will not render in form field appearance streams. Only the 14 standard PDF fonts are available for form widgets.
No barcode / QR code generation Medium Unlike ReportLab, Emboss has no built-in barcode or QR code rendering. Must embed pre-rendered SVG/images.
Text-only watermarks Low Watermarks via LegalFeatures are text-only. No image/logo watermark support.
No HTML/CSS input mode Low By design (avoids browser dependency), but limits adoption from web-developer audiences who are familiar with HTML-to-PDF workflows.

Maturity & Community Risks

RiskSeverityDetail
Single primary maintainer High Bus factor of 1 (GGChamp85). If the maintainer becomes unavailable, the project could stall. This is the biggest enterprise adoption risk.
Very early community adoption High 15 GitHub stars, 0 forks as of July 2026. No visible third-party production deployments or case studies yet.
Brand new release Medium v1.1.0 released July 30, 2026. While 2,127 tests provide confidence, real-world battle-testing at scale is unproven.
No PyPI download visibility Low Hard to gauge real-world adoption. No public download statistics available yet to assess community traction.
No migration guides Low No published guides for migrating from ReportLab, WeasyPrint, or FPDF2. Teams must learn the API from scratch.

Technical Limitations

LimitationSeverityDetail
Image handling requires Pillow Low Pillow is an optional dependency. Image embedding may be limited without it installed. Not a hard dependency by design.
Pure Python performance ceiling Low No C extensions for acceleration. For typical documents (10-50 pages) this is fine (~50-100ms), but very large documents (1000+ pages) may be slower than C-accelerated ReportLab.
Multi-page table header repetition Low Documentation is unclear on whether long tables automatically repeat headers on subsequent pages.
Docs site in migration Low The Nextra documentation site was just migrated from v2 to v4 (same day as this evaluation). API reference lives primarily in the README, not a searchable docs site.

Not Issues (Intentional Design Choices)

These are sometimes cited as gaps but are deliberate trade-offs that make the library stronger for its target use case:

  • No browser dependency: This is a feature, not a gap. Avoids Chromium/Node attack surface and enables deployment on locked-down servers.
  • Single hard dependency (fonttools): Intentional minimalism for easy vendoring, auditing, and deployment in restricted environments.
  • No timestamps in output: Required for byte-identical determinism. The file /ID is content-derived by design.
  • Declarative-only API: No low-level canvas operations by design. The constraint-driven model prevents layout bugs that plague imperative approaches.
Risk Mitigation: The single-maintainer and early-adoption risks can be mitigated by: (1) contributing to the project and building internal expertise, (2) the Apache 2.0 license allows forking if needed, (3) the 2,127-test suite and clean architecture make the codebase maintainable by new contributors, and (4) the pure-Python design with one dependency means no complex build chain to maintain.

11. Verdict & Recommendation

Summary Assessment

Emboss occupies a unique position in the Python PDF ecosystem. It is the only library that combines PDF/UA accessibility, byte-identical determinism, professional typography (Knuth-Plass), and a comprehensive compliance stack (PDF/A, PAdES, Factur-X) in a single pure-Python package with minimal dependencies.

When to Choose Each Library

Use CaseBest ChoiceWhy
Enterprise reports with compliance needs Emboss PDF/UA, PDF/A, signatures, determinism, e-invoicing all built in
AI/LLM-generated documents Emboss MCP server, JSON spec format, node-scoped edits, provenance
Accessible document generation Emboss Only library with PDF/UA by default, veraPDF-verified
CI/CD document pipelines Emboss Deterministic output enables hash verification and diffing
Quick HTML-to-PDF conversion WeasyPrint Best CSS support, familiar for web developers
Simple invoices/receipts (no compliance) FPDF2 Lightest weight, zero dependencies, fastest onboarding
Legacy systems needing maximum maturity ReportLab 20+ years of production use, commercial support
PDF manipulation (read/merge/split) borb Read + write capability, PDF modification
Django template to PDF xhtml2pdf Simplest Django integration, one-line conversion

Overall Scores

Library Ease of Use Enterprise AI Ready Print Overall
Emboss 9.0 9.5 10.0 9.0 9.4
ReportLab 5.5 7.0 4.0 8.0 6.1
WeasyPrint 8.0 5.0 7.0 5.0 6.3
FPDF2 9.5 4.0 6.5 3.0 5.8
borb 6.0 3.5 3.0 2.5 3.8
xhtml2pdf 8.5 3.0 7.0 2.0 5.1
Key Takeaway: For any use case requiring accessibility compliance, deterministic output, digital signatures, or AI integration, Emboss is the clear choice. Its only trade-off is community maturity (it is a newer library), but its 2,127-test suite, veraPDF-verified conformance, and Apache 2.0 license make it a strong candidate for enterprise adoption.