Repository navigation
Releases: vouchagent/Emboss
Release list
Emboss v1.3.1
Fixed
- SVG
<text>/<tspan>could render invisibly. Embedded fonts (Source Sans/Serif/Code) were resolved through a process-wide cache that never marked glyphs as used, so subsetting embedded just a space and blanked every other glyph's outline. This broke real diagram output -- architecture-diagram service/group labels and sequence-diagram participant labels came out as blank boxes. Fixed by resolving SVG fonts through the document's ownFontRegistry, which also fixes a latent determinism bug where glyph usage could leak between unrelated documents rendered in the same process. \left(...\right)corrupted anything nested inside it. The delimiter parser stopped at the first backslash looking for\right, so any nested command (\frac,\sqrt, a Greek letter) inside a\left...\rightgroup truncated it early and corrupted the rest of the expression --\left(1 + \frac{1}{x}\right)^x, an extremely common LaTeX pattern, rendered as garbled text.- Fixed 8 open Dependabot alerts in
docs/(nanoid, brace-expansion, dompurify, mermaid).
See CHANGELOG.md for full details.
Emboss v1.3.0
Added
- HTML/CSS import:
Document.from_html(html, **kw)compiles a bounded, report-template subset of HTML/CSS into aDocument-- a migration path for existing HTML-based document pipelines. Stdlib-only parser; a real CSS cascade (tag/class/id specificity, descendant combinators, comma-separated selectors, inline-style override, custom properties withvar()/fallback resolution); tags for headings, paragraphs, lists (nested), tables (colspan), images (local paths anddata:URIs), links, inline formatting, and blockquotes; adisplay: flexrow compiles to the newColumnsblock. Columnsblock: side-by-side content regions, each an independent block flow (paragraphs, headings, lists, tables, images, even nestedColumns), rendered as one atomic row sized to its tallest column. Wired through every export adapter (HTML, Markdown, DOCX) and the Pydantic LLM schema.- SVG completeness fixes:
<tspan>multi-line/positioned text, real embedded-font text metrics (Source Sans/Serif/Code) in place of base-14 approximation,stroke-dasharray/stroke-dashoffset,<symbol>viewBox scaling in<use>, andmarker-start/marker-endarrowheads oriented along the true path tangent.
See CHANGELOG.md for full details.
Emboss v1.2.0
Added
- Six new diagram types, all exposed in the fluent API, JSON spec, Pydantic schema, and LLM spec prompt:
- Swimlanes:
doc.diagram(..., lanes=[...])-- banded columns/rows, one per lane. - Status-colored landscape / capability map:
ArchNode(status=...)draws a badge and an auto-generated legend. - Roadmap / timeline:
doc.roadmap(periods, workstreams, milestones=None)-- period-labeled workstream bars with milestone markers, no date arithmetic required. - Org chart:
doc.org_chart(nodes, edges)-- each parent centered over the full width its children occupy; a node with two parents, or a cycle, raisesValueError. - Gantt chart:
doc.gantt(tasks, milestones=None)-- the continuous-date counterpart to roadmap (real dates, progress, status, dependency arrows). - Force-directed layout:
doc.diagram(..., layout="force")-- a deterministic spring-embedder layout (fixed iterations, norandom()) for network topologies with no natural hierarchy.
- Swimlanes:
- Image/logo watermarks:
LegalFeatures(watermark_image=..., watermark_image_scale=1.0)alongside the existing text watermark.
Changed
spec_prompt()and the PydanticLegalConfigschema now explicitly instruct an LLM never to add a watermark, Bates numbering, or line numbering unless the user asked for one.
Full suite: 2226 passed, 5 skipped. ruff clean. CI and CodeQL green.
Emboss v1.1.0
Added
- CJK text support: register a CJK-capable font (
Document.fonts.register) and Chinese, Japanese, and Korean text renders correctly -- real glyphs, correct widths, correct line wrapping. Root-caused and fixed two bugs: the line breaker only tokenized on ASCII spaces (a spaceless CJK paragraph overflowed instead of wrapping), and the oversized-run fallback fragmented CJK text one character per render fragment (corrupting extracted text with phantom spaces). RTL and complex-script shaping remain unsupported, stated honestly. - AI provenance / content credentials:
GeneratorInforecords which model generated a document, from a hash of the prompt (never the raw text), plus generation parameters and an optional human reviewer, folded into the reproducibility manifest.read_generator_info(pdf_bytes)reads it back, orNonewhen absent. MCP gainsget_provenance. - Data binding:
Document.table_from_csv/chart_from_csvbuild a table or chart directly from a CSV path, file object, CSV text, or a pandas DataFrame (duck-typed; pandas stays optional), composing withverify_totalsandattach_data. - Interactive form fields:
TextField,CheckboxField,DropdownFieldas real spec elements, producing genuine AcroForm widgets tagged as PDF/UA structure, for intake and KYC-style documents.
Full suite: 2127 passed, 5 skipped. ruff clean. veraPDF conformance green.
Emboss v1.0.0
The first stable release. Development Status is now 5 - Production/Stable,
and the public API (emboss.__all__) is covered by semantic versioning.
Added
- Mermaid parser:
parse_mermaid(and a```mermaidMarkdown fence) maps flowchart/graph, sequenceDiagram, and erDiagram source onto Emboss's existing diagram builders, so Mermaid-authored documentation renders as native vector graphics. An unsupported kind raisesMermaidErrornaming it, rather than rendering wrong. - Include-from-source:
include_source(path, lines=, marker=)pulls a code block's content from a source file by line range or a named region, so documented examples cannot drift from the code. A fenced block withfile=PATHloads through it in Markdown. emboss build: concatenates a directory of Markdown files, in order, into one tagged PDF -- the build-step workflow a documentation team already has.- Controlled-document block:
DocumentControl/Approval/RevisionEntryfor ISO 9001 / IEC 62304 / medical-device documentation -- a document identifier, version, status, an approvals table, and a revision history, expanding into real, fully tagged tables.
Security
pip-auditagainst the full dependency set found two transitive vulnerabilities Emboss never imports directly:pillow(viapikepdf) andstarlette(viamcp), neither pinned to an upper bound by the package declaring them. Known-patched floors (pillow>=12.3.0,starlette>=1.3.1) are now pinned in Emboss's own optional-dependencies. Re-scan: no known vulnerabilities across base + every extra.
Full suite: 2025 passed, 5 skipped, verified against the patched dependency set. ruff clean. veraPDF conformance green.
Emboss v0.6.0
Added
- PAdES (eIDAS) baseline signatures (ETSI EN 319 142):
sign_pdf_pades/amend_sign_padesproduce B-B (CAdES-BES CMS with the ESS signing-certificate-v2 attribute and/SubFilter /ETSI.CAdES.detached) and B-T (with an RFC 3161 signature timestamp). The EU-recognized profile for legal signature validity. LTV/DSS out of scope. - PDF/X-4 print output (ISO 15930-7):
Document(pdfx=True, pdfx_condition=..., pdfx_output_profile=...)emits a GTS_PDFX OutputIntent with a CMYK DestOutputProfile, the GTS_PDFXVersion Info key, and the pdfxid XMP. - WTPDF 1.0 Reuse conformance:
Document(wtpdf=True)declares Well-Tagged PDF 1.0 in XMP;verify_wtpdf()self-checks structure tree, language, reusable structure types, and figure Alt text.
Docs
- README leads with a For Decision-Makers section: problem, five-outcomes table, a standards-and-regulations table (PDF/UA, PDF/A, Factur-X, PAdES, PDF/X-4, WTPDF), and an impact-vs-existing-tools comparison. New Signatures and Print/Reuse Conformance docs pages.
Full suite: 1936 passed, 5 skipped. ruff clean. veraPDF conformance green.
Emboss v0.5.0
Added
- MCP server (
pip install emboss-pdf[mcp],emboss-mcp): Emboss documents callable from an AI assistant (Claude Desktop) over the Model Context Protocol, standard FastMCP API. Query tools answer from the embedded structure, not from guessing at pixels, and return explicit not-found signals (search_documentgives a definite "not in this document"). Editing tools (edit_document_text,patch_node,insert_block,remove_node) change a document without regenerating it; every edit goes through the declarative spec, so the result is re-validated and re-tagged and unchanged blocks keep their ids. - Factur-X / ZUGFeRD EN 16931 e-invoicing (
Document.attach_facturx): a visual invoice PDF that carries a machine-readable CII invoice XML asfactur-x.xmlon PDF/A-3, for the France B2B mandate (Sept 2026).Invoice.validate()reconciles line nets, tax, and totals before any XML is produced. - Table arithmetic validation (
verify_totals=True): refuse to render a table whose Total row or column does not equal the sum of its cells.
Full suite: 1900+ passed. ruff clean. veraPDF conformance green.
Emboss v0.3.0
Added
- Specialized diagram types, each described as a plain node/edge list, laid out automatically, rendered as native vector graphics with deterministic
/Alttext, and exposed in the fluent API, JSON spec, Pydantic schema, and LLM spec prompt:architecture_diagram— cloud/deployment topologies with twelve built-in service glyphs (compute, database, storage, queue, gateway, cache, cdn, function, loadbalancer, user, external, generic) and nesting groups that draw zones such as a VPC wrapping public and private subnets. Relabels cleanly to AWS, Azure, or GCP.sequence_diagram— participant lifelines with sync/async/return message styles, activation bars, and self-loops.er_diagram— entities with typed PK/FK attributes and labeled relationships carrying from/to cardinality.
Changed
- Code-block backgrounds now fit the width of the code instead of always spanning the full page; wide or wrapped code still fills to the margin.
- Architecture zone titles render on a solid chip above the edges, so a zone title never collides with an edge label crossing its boundary.
Fixed
\|in math now sets as a double norm bar (a single bar read as the letter l), and\midsets as the conditioning bar; both resolve to glyphs the embedded font carries.
Docs
- README and the diagrams guide document the three specialized diagram types with examples.
- New Data-Carrying Tables and Charts section documents element-level CSV attachment (
attach_data=True) and how to open embedded files across readers.
Full suite: 1765 passed, 3 skipped. veraPDF conformance green.
Emboss v0.2.0
Deterministic, PDF/UA-tagged, veraPDF-conformant PDF generation, built for LLM-driven document pipelines.
Highlights
Enterprise foundations
- Real veraPDF conformance run in CI (
emboss verify --conformance), not a simulated check - Self-describing PDFs:
render(embed_spec=True)attaches the document's own spec, layout map, and a Markdown twin;Document.from_pdf()recovers from either - Stable node ids and a queryable layout map on every render
- Document diff and redline:
diff_documents()/render_redline()/emboss diff - Reproducibility manifest and
emboss reproduce - Redaction by construction (content never enters the stream) and DocMDP certification signing
- BrandKit: one versioned brand object propagates across every document
emboss stripfor external distribution
Document structure
- CoverPage, Abstract, Authors, PullQuote, StatTiles, visible TableOfContents, Appendix, Index, Glossary
- Executive decks (
SlideDeck): nine layouts, four themes, fit-to-slide validation - Diagram element: node/edge graphs with automatic layered-DAG layout
- Equation numbering,
@eq/\eqrefreferences, real math alphabets, MathML input - Landscape and mixed page geometry within one document
Typography and rendering
- Full SVG subset: arcs, gradients, transforms, clipping, real opacity
- Hardened charts: zero baseline, no truncation, pattern fills, fact-verified captions
- CMYK and PDF/A archival output
- Bundled OFL font set (Source Serif/Sans/Code, Emboss Math)
LLM integration
- Provider-native structured outputs, a validation repair loop, genre exemplars
Document.from_llm()auto-routing, YAML front matter in Markdown input
Install: pip install emboss-pdf
See CHANGELOG.md for the complete list.
Emboss v0.1.0
Initial release of Emboss: precision PDF generation for Python.
Highlights:
- Declarative EmbossSpec document model with deterministic, byte-identical output
- Knuth-Plass optimal line breaking, hyphenation, kerning, optical margin alignment
- PDF/UA structure tagging by default; PDF/A archival output
- Tables, charts, math notation, code highlighting, SVG, multi-column layout
- 3-tier LLM integration: spec_prompt() + from_json(), generate() one-liner, Document.from_markdown()
- CMYK and spot color support for print production
- Style presets: legal, finance, academic, corporate, minimal
Install: pip install emboss-pdf