Skip to content

v0.9.15

Choose a tag to compare

@github-actions github-actions released this 28 Aug 21:09
· 51 commits to main since this release
e672193

PeachPDF 0.9.15 Release Notes

Release date: August 28, 2026
Full changelog: v0.9.14...v0.9.15
Release tag: v0.9.15

PeachPDF 0.9.15 closes out the PixelsPerInch-scaling bug family that 0.9.14 started fixing: border and outline stroke width (not just position) and box-shadow blur quality now scale correctly under a non-default PixelsPerInch, and a list marker mispositioning bug (initially suspected to be a layout defect) turned out to be caused by the very same paint-scaling bug 0.9.14 already fixed. Also fixed: a rounded-border corner typo, and two small marker vertical-alignment issues found along the way.

Highlights

Border and outline stroke width, and box-shadow blur quality, now scale correctly under a non-default PixelsPerInch (#851, #852, #856)

  • 0.9.14's fix for issue #812 corrected rounded-path position scaling (borders, backgrounds, overflow: hidden clips, clip-path, box-shadow ring position) but deliberately left three related gaps for follow-up: a border's stroke width still rendered thicker than declared at any PixelsPerInch other than the default 72 (correctly positioned, just too thick); the identical bug in CSS outline; and a blurred box-shadow's number of concentric approximation layers, which varied with PixelsPerInch alone (a smoothness/quality difference rather than a wrong position). All three are now fixed, closing out the family of scaling defects PdfGenerateConfig.PixelsPerInch could introduce
  • A document rendered at the default PixelsPerInch (72) is unaffected throughout — every case here only differed from spec-correct output at a non-default value

A rounded-border corner typo is fixed (#853)

  • border-radius's top-right corner arc endpoint used the left border's width instead of the right border's own width - a copy-paste mistake, unrelated to PixelsPerInch, only visible with asymmetric left/right border widths and a suppressed top border (border-top: none/hidden). Every other corner already used its own edge's width correctly

An outside/inside ::marker mispositioning bug is fixed - as a side effect of 0.9.14's own #812 fix (#850)

  • A reported bug where a list item's bullet/number rendered one line below its own item, with a sharp PixelsPerInch threshold (correct at 77, broken at 78), was investigated at length and bisected to the exact commit that resolved it: 0.9.14's #812 fix, landed the same day the bug was reported. The root cause was never a layout defect - the marker's computed position was always correct - it was a paint bug: a disc/circle marker's shape is drawn via the same rounded-rectangle path builder (RenderUtils.GetRoundRect) #812 fixed, so the visible dot rendered away from its own correct position at any non-default PixelsPerInch. No code change was needed for this one; it's included here as a closed issue
  • Two small, independent marker defects were also found and fixed while investigating: an outside marker on a bordered <li>/<ul>/<ol> sat slightly too high (missing the border's own width in its position calculation), and a list-style-position: inside marker's shape rendered baseline-aligned like a text glyph instead of centered within its line, unlike an outside marker's shape

Breaking changes & migration notes

None of the changes in this release alter previously-correct output. A document that declared a border/outline width or relied on a specific blur-layer count at a non-default PixelsPerInch will render borders/outlines thinner (now matching the declared width) and may see a different number of blur bands (a rendering-smoothness difference, not a position change); a document with asymmetric left/right border widths, a rounded top-right corner, and a suppressed top border will see that corner's position correct itself. Every other case is unaffected.

See Forward compatibility in the HTML/CSS support docs for how PeachPDF treats this class of change going forward.

All Merged Pull Requests

  • Fix rounded-path rendering under non-default PixelsPerInch — #854
  • Fix rounded border-radius top-right corner using left border width — #855
  • Fix border stroke width ignoring non-default PixelsPerInch — #857
  • Fix box-shadow blur layer count varying with PixelsPerInch — #858
  • Fix outside marker border-top gap and inside marker baseline shift — #859
  • Fix outline stroke width ignoring non-default PixelsPerInch — #860
  • Bump package version to 0.9.15 — #861