v0.9.15
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: hiddenclips,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 anyPixelsPerInchother than the default 72 (correctly positioned, just too thick); the identical bug in CSSoutline; and a blurredbox-shadow's number of concentric approximation layers, which varied withPixelsPerInchalone (a smoothness/quality difference rather than a wrong position). All three are now fixed, closing out the family of scaling defectsPdfGenerateConfig.PixelsPerInchcould 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 toPixelsPerInch, 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
PixelsPerInchthreshold (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: adisc/circlemarker'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-defaultPixelsPerInch. 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 alist-style-position: insidemarker'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