Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,54 @@ Entries for 0.10.0 through 0.23.0 were backfilled on 2026-09-17 from the
published GitHub release notes, which were the record of those releases
while this file lapsed. They are reproduced, not rewritten.

## [0.28.0] - 2026-10-06

Text measured and justified the way it is drawn. Content-sized text boxes
hold the line they are sized for, justified text is justified in every font,
and Korean documents serialize in milliseconds. All packages share the line:
engine (crates.io `forme-pdf`), every `@formepdf/*` npm package, `formepdf`
(PyPI), `forme-go` (tag v0.28.0), and the VS Code extension.

Addresses #181, #182 and #186.

### Changed: these move existing documents

- **Content-sized text holds its shaped line** (#181). Intrinsic width summed
each character's unshaped advance while the line breakers measure shaped
text, so where kerning widened a word, a content-sized box (a flex item, a
table column) came out a fraction of a point too narrow and the word split
mid-way: "Mumbai" in IBM Plex Serif drew as "Mumba" / "i", as plain text and
as nested runs alike. Intrinsic width now uses the line breakers' own
measurement
- **Text with a hard break measures as its widest line.** Styled runs summed
every line's width, so a two-line cell
(`<span>Website Design</span><br><span>…</span>`) claimed both lines laid
end to end. Table columns holding such cells redistribute, closer to Chrome
- **Justified text is justified in every font** (#186). Justification reached
the glyph positions only when Knuth-Plass found a solution. When it fell back
to the greedy breaker, the stretch existed only as PDF word spacing (`Tw`),
which registered (Type0) fonts never apply, so those paragraphs were drawn
ragged. Correction: the 0.26.0 notes said justified registered-font text was
fixed; that held only where Knuth-Plass found a solution
- **Justified styled runs no longer overlap** (#186), a regression in 0.26.0:
on a justified line, each styled run started without the stretch of the run
before it, so "leaders" ran into "(finance"
- **A line ending with a forced break is not justified** (#186), as CSS
`text-align-last` specifies

### Fixed

- Font subsetting builds its glyph-to-codepoint map once instead of scanning
every BMP codepoint per glyph: a Korean document with 1,000 distinct
syllables serializes in 85 ms instead of 4.7 s, byte-identical (#182, from
@captyoungkyu's patch in the issue)

### Internal

- The README links the production-user form at formepdf.com/production
- Intrinsic width now shapes text, so automatic table layout in a registered
font is slower: a 300-row table takes 268 ms instead of 231 ms

## [0.27.0] - 2026-10-02

Text that survives copy and paste. Combining marks and shaped clusters in
Expand Down
1 change: 1 addition & 0 deletions docs/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Full release notes live in the repo's **[CHANGELOG.md](https://github.com/formep

## Recent highlights

- **0.28.0**: text measured and justified the way it is drawn. Content-sized text boxes (flex items, table columns) hold the shaped line they are sized for, so kerned words no longer split mid-word; justified text is justified in registered fonts too, styled runs no longer overlap when justified, and a line ending with a forced break is left unjustified as CSS specifies; Korean documents serialize in milliseconds instead of seconds. Addresses issues #181, #182 and #186. Some of these move existing documents; the [changelog](https://github.com/formepdf/forme/blob/main/CHANGELOG.md) lists them.
- **0.27.0**: text that survives copy and paste. Combining marks and shaped clusters in Arabic, Hebrew, Devanagari and Latin extract as their source text in PDF.js and Poppler, while staying valid PDF/UA and PDF/A; registered emoji fonts work as fallbacks; whitespace a font cannot encode, such as the narrow space in French amounts, no longer prints "?"; and styled right-to-left text places numbers and Latin words where Chrome does. Addresses issues #170, #171 and #175, with fixes contributed by @amruthpillai. Some of these move existing documents; the [changelog](https://github.com/formepdf/forme/blob/main/CHANGELOG.md) lists them.
- **0.26.0**: text is drawn where it is laid out. Registered fonts (including the substitutes every PDF/UA and PDF/A document embeds) keep their kerning, justification and mark placement on the page; right-to-left text reads in the right order, with the HTML `dir` attribute and CSS `direction` honoured; ragged-right lines stay inside their boxes; and tagged output stops nesting its marked content, so files are about 5% smaller and inline link text is tagged inside its link. Fixes issues #156 to #162. Several of these move existing documents; the [changelog](https://github.com/formepdf/forme/blob/main/CHANGELOG.md) lists them.
- **0.25.0**: flex geometry corrected in four places where the engine measured items by their border box and CSS measures them by their outer box, and an item taller than a fixed-height row now overflows it equally in both directions, as Chrome does.
Expand Down
2 changes: 1 addition & 1 deletion engine/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion engine/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "forme-pdf"
version = "0.27.0"
version = "0.28.0"
edition = "2021"
description = "A page-native PDF rendering engine. Layout INTO pages, not onto an infinite canvas."
license = "MIT"
Expand Down
4 changes: 2 additions & 2 deletions html/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions html/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "forme-pdf-html"
# Not on the shared release line until it ships — like server/ and rasterizer/
# it versions independently for now.
version = "0.27.0"
version = "0.28.0"
edition = "2021"
description = "HTML + print-CSS input path for the forme-pdf engine. Satori for paginated documents."
license = "MIT"
Expand All @@ -14,7 +14,7 @@ crate-type = ["cdylib", "rlib"]

[dependencies]
cssparser = "0.37.0"
forme-pdf = { version = "0.27.0", path = "../engine" }
forme-pdf = { version = "0.28.0", path = "../engine" }
html5ever = "0.39.0"
markup5ever_rcdom = "0.39.0"
serde = { version = "1", features = ["derive"] }
Expand Down
Loading
Loading