Skip to content

GraphCompose 2.0

v1.6.2 Breaking

This release includes breaking changes for platform teams planning a safe upgrade.

Published 2mo Build & Package
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

business-documents cv-templates declarative-api document-generation invoice-template java
+12 more
java-17 layout-engine maven pagination pdf pdf-generator pdf-lib pdf-library pdfbox3 report-generation snapshot-testing template-engine

Summary

AI summary

Updates Meta, Bonus, and https://github.com/DemchaAV/graphcompose-ai-flow across a mixed release.

Full changelog

## v1.6.2 — Sorry, the PDF was crashing on emoji

Patch release. Closes four engine bugs I found while building yet
another CV template and assuming "well, this one definitely works."
It did not.

Zero breaking changes. If you're on v1.6.1, upgrading is safe.
Honest.

What's fixed

🔡 Any Unicode glyph no longer kills the document.
Before: a single in a paragraph, watermark, or footer would
make PDFBox throw IllegalArgumentException deep inside showText
and the whole render went up in smoke. I was convinced this was a
known limitation. It was a bug. PdfFont.sanitizeForRender already
existed in the codebase, nobody was calling it. Now everybody is.
Emoji, arrows, copyright marks — substituted to ? with one WARN
per unique (font, codepoint). No crashes. No surprises.

📏 842pt no longer "too large" for A4.
DocumentPageSize.A4.height() is 841.88977pt. Exactly. Per the
spec. If you are a regular human being who writes 842 because A4
is 842pt tall (as everyone learned) — you used to get
requires outer height 842.0 but page capacity is 841.88977. A
0.11pt overflow. That's 0.04 mm. The capacity check now has a 0.5pt
tolerance — invisible to the eye, but enough to stop fainting at
round-trip rounding.

🎨 Row inside LayerStack is now legal.
Want a dark top band on your CV with a sidebar+main row underneath?
Obviously through a LayerStack (layer 0 = band, layer 1 = row of
two columns). Obviously the validator rejected this, because it
couldn't tell a parent-row-band from a parent-layer-rectangle. It
can now. Row inside a layer works. Row inside another row still
does not — that one is a real composition conflict.

🛠️ Exception messages now tell you what to do.
Before: cannot contain a nested horizontal row; use a section column instead. Sounds like a lecture from your compiler. After:
Wrap the inner row in a LayerStack layer (allowed since v1.6.2), or stack horizontal content as sections inside a vertical column.
Meaning: try this thing. Breakthrough, I know.

Tests

828+ existing tests stay green, plus:

  • PdfFontSanitizerTest — 8 sanitizer cases
  • LayerStackRowCompositionTest — 3 positive + 1 negative
  • PaginationEdgeCaseTest — 2 new boundary cases
  • Three visual demo PDFs under target/visual-tests/:
    glyph-fallback/, page-capacity/, layer-stack/
  • Bonus: DevelopTest scratch class for manual experimentation

Meta

  • Maintainer email in pom.xml is fixed. Nobody was emailing the
    old one, which was convenient. If you ever wanted to reach me —
    it now actually goes somewhere: [email protected].
  • README links to the companion experiment
    graphcompose-ai-flow
    — where I'm exploring AI-assisted document authoring on top of
    GraphCompose. Independent codebase, separate lifecycle, broken
    things welcome
    . Check it out if that sounds fun.

Install

<dependency>
    <groupId>com.github.DemchaAV</groupId>
    <artifactId>GraphCompose</artifactId>
    <version>v1.6.2</version>
</dependency>
implementation("com.github.demchaav:GraphCompose:v1.6.2")

What's next — v1.7

DX helpers on top of an engine that no longer crashes: heading
levels (h1/h2/h3), addFieldRow(label, value),
page.twoColumn(...), addHeadingBar(...), inline shape runs
(ratingDots, badge). All additive. Plan tracked privately;
follow develop.

Full diff: https://github.com/DemchaAV/GraphCompose/compare/v1.6.1...v1.6.2

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track GraphCompose 2.0

Get notified when new releases ship.

Sign up free

About GraphCompose 2.0

All releases →

Related context

Related tools

Earlier breaking changes

  • v2.0.0 Package rename: layered template packages dropped `.v2` suffix; update imports.
  • v2.0.0 Removed dormant ECS engine internals (EntityManager, SystemECS, Entity components, render pipeline).
  • v2.0.0 Removed linkOptions() accessor; use linkTarget() and ExternalLinkTarget.options().
  • v2.0.0 Removed PDF‑typed document‑chrome overloads on DocumentSession; use backend‑neutral metadata/watermark/protect/header/footer.
  • v2.0.0 Removed DSL name-aliases DocumentSession.builder() and DocumentDsl.text(); use builder() and paragraph().

Beta — feedback welcome: [email protected]