Skip to content

GraphCompose 2.0

v1.6.3 Feature

This release adds 2 notable features for engineering teams evaluating rollout.

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 Tests, Engine, and Templates across a mixed release.

Full changelog

Bug fix patch. Closes two independent hyperlink clickable-area
defects that surfaced on CV gallery presets and made the LinkedIn /
GitHub contact rows hijack each other's clicks (paragraph-level
link path) or drift past their visible text (span-level link path
through multi-space separators). No public API change — engine,
DSL, themes, templates, and backend records all stay
source-compatible with v1.6.2.

Engine

  • Paragraph-level link annotations now hug rendered text.
    PdfFixedLayoutBackend used to emit a paragraph's linkOptions
    as a single rectangle covering the entire fragment box
    (fragment.x() + fragment.width()), ignoring TextAlign.RIGHT
    / TextAlign.CENTER. Stacked right-aligned contact paragraphs
    (e.g. one per LinkedIn / GitHub icon row in Timeline Minimal /
    Sidebar Portrait / Monogram Sidebar) therefore produced
    full-column-wide rects that overlapped the empty alignment gap of
    neighbouring rows — hovering over GitHub clicked the LinkedIn row.
    The backend now emits one per-line rect tight to line.width()
    positioned at the alignment-aware lineX, matching how
    inline-span links already worked. Span-level link emission, table
    / shape / barcode payload links, and bookmark anchoring are
    unchanged.
  • Glyph sanitizer preserves all author whitespace.
    PdfFont.sanitizeForRender used to collapse any run of consecutive
    spaces into a single space, both for whitespace-only tokens (the
    " " halves of a " | " separator) and for inter-word gaps
    in spaced-caps strings (spacedUpper("ARTEM DEMCHYSHYN") produces
    "A R T E M D E M C H Y S H Y N" with deliberate triple-spaces
    between words). The collapse shrank the rendered glyph stream
    under measurement, drifting inline-link rectangles ~8pt per
    " | " separator past their visible labels and visually
    merging spaced-caps titles back into a single run ("A R T E M D E M C H Y S H Y N" — no word boundary). The sanitizer no longer
    collapses adjacent spaces; newlines / NBSP / non-tab control
    characters still resolve to a single space each, but author
    whitespace is now preserved verbatim so wrap geometry,
    link-rectangle emission, and showText(...) all see the same
    string. Layout snapshot baselines for five CV presets and one
    nested-list document widened to reflect the recovered whitespace —
    the deliberate visual change is the bug fix.

Templates

  • Boxed Sections projects render as title + indented description.
    The "Projects" module now renders each bullet-list or
    IndentedBlock item as two stacked paragraphs — bullet plus bold
    project name (with an optional tech-stack chunk in parentheses) on
    the first line, then a hanging-indented description below aligned
    to the project name (not the bullet). The previous single-line
    rendering ran the project name and description together. Bullet
    marker, hanging-indent, and surrounding modules are unchanged.
    Example data in ExampleDataFactory.sampleCvSpecV2 and
    PresetVisualGalleryTest now ships tech-stack chunks ("Java 21, PDFBox, Maven, JMH") so the gallery PDFs reflect the new layout.

Tests

  • New regression in PdfFixedLayoutBackendFeaturesTest
    shouldTightlyHugRightAlignedParagraphLinkRectangles — stacks
    three right-aligned link paragraphs and asserts each clickable
    rect hugs its rendered label width (≤ 150pt), sits flush against
    the inner right margin, and does not overlap the Y-band of
    neighbouring rows.
  • New regression in PdfFixedLayoutBackendFeaturesTest
    shouldKeepCenteredInlineLinkRectanglesAlignedAcrossMultiSpaceSeparators
    — renders a centered contact line built with " | " separators
    and asserts the three resulting link rectangles preserve
    left-to-right order with non-overlapping X ranges and a sane
    per-separator gap (5..40pt), pinning the bug where collapsed
    whitespace pushed later rects past the line.
  • New regression in PdfFontSanitizerTest
    sanitizeForRender_preservesWhitespaceOnlyTokensVerbatim — pins
    the whitespace-only short-circuit so render width stays in
    lockstep with getTextWidth for tokenised contact-line
    separators.

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]