Skip to content

Releases: vouchagent/Emboss

Emboss v1.3.1

Choose a tag to compare

@vouchagent vouchagent released this 09 Aug 07:41

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 own FontRegistry, 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...\right group 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

Choose a tag to compare

@vouchagent vouchagent released this 09 Aug 06:30

Added

  • HTML/CSS import: Document.from_html(html, **kw) compiles a bounded, report-template subset of HTML/CSS into a Document -- 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 with var()/fallback resolution); tags for headings, paragraphs, lists (nested), tables (colspan), images (local paths and data: URIs), links, inline formatting, and blockquotes; a display: flex row compiles to the new Columns block.
  • Columns block: side-by-side content regions, each an independent block flow (paragraphs, headings, lists, tables, images, even nested Columns), 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>, and marker-start/marker-end arrowheads oriented along the true path tangent.

See CHANGELOG.md for full details.

Emboss v1.2.0

Choose a tag to compare

@vouchagent vouchagent released this 30 Jul 23:01

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, raises ValueError.
    • 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, no random()) for network topologies with no natural hierarchy.
  • Image/logo watermarks: LegalFeatures(watermark_image=..., watermark_image_scale=1.0) alongside the existing text watermark.

Changed

  • spec_prompt() and the Pydantic LegalConfig schema 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

Choose a tag to compare

@vouchagent vouchagent released this 30 Jul 04:09

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: GeneratorInfo records 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, or None when absent. MCP gains get_provenance.
  • Data binding: Document.table_from_csv / chart_from_csv build a table or chart directly from a CSV path, file object, CSV text, or a pandas DataFrame (duck-typed; pandas stays optional), composing with verify_totals and attach_data.
  • Interactive form fields: TextField, CheckboxField, DropdownField as 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

Choose a tag to compare

@vouchagent vouchagent released this 29 Jul 23:26

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 ```mermaid Markdown 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 raises MermaidError naming 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 with file=PATH loads 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/RevisionEntry for 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-audit against the full dependency set found two transitive vulnerabilities Emboss never imports directly: pillow (via pikepdf) and starlette (via mcp), 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

Choose a tag to compare

@vouchagent vouchagent released this 29 Jul 18:20

Added

  • PAdES (eIDAS) baseline signatures (ETSI EN 319 142): sign_pdf_pades / amend_sign_pades produce 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

Choose a tag to compare

@vouchagent vouchagent released this 29 Jul 18:00

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_document gives 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 as factur-x.xml on 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

Choose a tag to compare

@vouchagent vouchagent released this 29 Jul 05:48

Added

  • Specialized diagram types, each described as a plain node/edge list, laid out automatically, rendered as native vector graphics with deterministic /Alt text, 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 \mid sets 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

Choose a tag to compare

@vouchagent vouchagent released this 29 Jul 03:45

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 strip for 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/\eqref references, 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

Choose a tag to compare

@vouchagent vouchagent released this 27 Jul 01:45

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