This release includes breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+12 more
Summary
AI summaryUpdates 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 casesLayerStackRowCompositionTest— 3 positive + 1 negativePaginationEdgeCaseTest— 2 new boundary cases- Three visual demo PDFs under
target/visual-tests/:
glyph-fallback/,page-capacity/,layer-stack/ - Bonus:
DevelopTestscratch class for manual experimentation
Meta
- Maintainer email in
pom.xmlis 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
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]