gastongouron/ironpress
 Watch   
 Star   
 Fork   
18 days ago
ironpress

v1.6.0

Highlights

  • Add explicit rich HTML header and footer APIs across Rust, the CLI, and every supported binding.
  • Render sanitized images, tables, styled descendants, and custom fonts in page margins.
  • Add a header-only C++17 binding with move-only RAII owners and typed errors.
  • Ship relocatable CMake targets for C and C++, plus pkg-config metadata on Unix.

Compatibility and safety

  • Keep the existing plain-text header and footer APIs unchanged.
  • Apply the document sanitizer, resource policy, CSS cascade, and font pipeline to rich margins.
  • Verify native static and shared consumers across Linux, macOS, and Windows.
  • Preserve full Chromium parity with 1,650 passing fixtures and no rendering failures.

Packages

This release publishes Rust, npm/Node, Python, Ruby, Java, .NET, and native artifacts. Registry propagation may take a few minutes.

See the full changes in the changelog.

22 days ago
ironpress

v1.5.4

Highlights

  • Add a stable, versioned C ABI with explicit ownership and portable native libraries.
  • Add an idiomatic .NET 8 HtmlConverter package with SafeHandle ownership.
  • Add an idiomatic Java 17 HtmlConverter package through JNA and AutoCloseable.
  • Add ironpress/node, a Node.js entry point in the existing npm package.
  • Ship native assets for Linux x86-64 and ARM64, macOS x86-64 and ARM64, and Windows x86-64.

Package safety

  • Install and render through the packed NuGet artifact on every supported platform.
  • Install the Maven JAR from its embedded POM and exercise every native platform.
  • Rebuild and byte-compare reproducible Maven artifacts before publication.
  • Test the packed npm package on every supported Node.js LTS release.

Fixes

  • Load Ruby native extensions from the active Ruby API directory.
  • Parse static-site HTML with a standards-compliant tree instead of regular expressions.
  • Make Ruby, crates.io, and font-pack release jobs deterministic and bounded.

Documentation

  • Add runtime-specific guides for Rust, C, .NET, Java, Python, Ruby, browser JavaScript, and Node.js.
  • Group every binding, guide, and package version in the README.

Registry publication starts from this release and may take a few minutes to propagate.

See the full changes in the changelog.

25 days ago
ironpress

v1.5.3

Added

  • Added explicit Japanese, Korean, Simplified Chinese, Traditional Chinese, and monochrome emoji font packs.
  • Added the same reusable page, quality, sanitization, header, footer, and font controls to Python, Ruby, and WebAssembly.
  • Added installed-artifact tests for the Python, Ruby, and npm packages.

Changed

  • Kept the base crate and WASM module focused on Latin, Arabic, Hebrew, and common Unicode coverage.
  • Made full regional CJK and emoji coverage an explicit host-managed dependency.
  • Switched Python releases to CPython 3.8+ ABI3 wheels.

Fixed

  • Ruby releases now produce real native gems for Linux, macOS, and Windows.
  • Release metadata now rejects version drift between Rust, Python, Ruby, and npm.

CI and documentation

  • Pinned, checksum-verified, cached, and time-bounded the Poppler and font runtime used by parity jobs.
  • Documented the shared binding contract, native-only capabilities, font packs, and WASM host boundary.

Full changelog: https://github.com/gastongouron/ironpress/compare/v1.5.2...v1.5.3

28 days ago
ironpress

v1.5.2

Changed

  • Updated HTML parsing to html5ever and markup5ever_rcdom 0.39.
  • Raised the declared MSRV to Rust 1.88 and added direct CI coverage.

Fixed

  • Preserved non-ASCII CSS strings and decoded escapes in @page margin content.
  • Restored font-family fallback in page margin boxes.
  • Resolved var() inside calc() without dropping the declaration.
  • Selected named pages from the document root.
  • Preserved top and left offsets on positioned boxes with block children.

Security

  • Excluded Tokio releases affected by RUSTSEC-2023-0001.

Compatibility

  • Kept WebAssembly on getrandom 0.3 with its required wasm_js wiring.

CI and documentation

  • Made crates.io publication check the remote registry before skipping a version.
  • Linked the canonical Chromium parity report from the README.

Full changelog: https://github.com/gastongouron/ironpress/compare/v1.5.1...v1.5.2

2026-07-29 17:13:13
ironpress

v1.4.4 — Chromium Visual Parity

Chromium visual parity

Ironpress now achieves 100% verified visual parity with Chromium across a 1,662-fixture adversarial corpus (1,642 PASS / 0 FAIL / 20 reference-disputed). Every fixture comparison uses the same pinned pdftoppm invocation at 300 DPI — no translation, registration, jitter, or raster replacement.

Parity test harness

  • Same-rasterizer parity gate: scripts/parity.sh renders every fixture in-process, rasterizes candidate and oracle PDFs symmetrically, and reports pass/fail with complete RGBA evidence.
  • refs.lock authenticates each fixture, oracle PDF, renderer, fonts, and provenance.
  • baseline.json tracks regression health separately from test history.
  • HTML parity report with full visual diffs for every fixture.
  • CI gate (.github/workflows/parity.yml) runs the same browser-free check.

Layout & rendering fixes

  • Paged media: @page backgrounds cascade through named, :first, :left, :right, and :blank selectors; sheet decoration modeled semantically.
  • Multicol: block flow constraints, nested clip paths, rule positioning, and layout split by semantic responsibility.
  • Grid: block-size constrained before track alignment; multicol reference geometry corrected.
  • Borders: collapsed table borders resolved as a shared grid; opaque square painting unified; rounded background coverage aligned; vector serialization matches Chromium; bevel geometry matched.
  • Filters: inherited filter layer paint space; premultiplied source rendering; raster placement and sampling; linear-light surface parity; descendant clipping to overflow bounds.
  • Inline layout: mixed advances unified; atomic inline origins preserved; generated content traversal unified; layout probes replaced with capabilities.
  • Text: origin-aware text decorations; text combine expansion handling.
  • Tables: cell paint phase ordering; expanded table height honored in flex alignment.
  • Images: source pixels preserved for object-fit: cover; source images reused across page fragments; fragmented JPEG background ownership; certificate image rendering optimized.
  • Backgrounds: nested fills routed through box background geometry; rounded raster phase fixed; full-box radial masks rendered as native shadings.
  • Graphical effects: continued across page boxes; transformed descendants composited in filter sources.
  • Transforms: Fontations transform oracle restored; fractional transform parity; CSS print scale reconstructed exactly.
  • Raster: bounds quantized from exact DPI; x-height quantization matched with Fontations.
  • List markers: built-in markers rendered as vector shapes.
  • Opacity: applied to absolute-positioned elements.

Builder API

  • RasterQuality struct: controls background, filter, and image DPI in one policy. CLI exposes --image-dpi, --filter-dpi, --background-raster-dpi.

Testing

  • 3,500+ unit tests (up from 2,200+)
  • 1,662-fixture parity corpus with same-rasterizer verification

Full changelog: https://github.com/gastongouron/ironpress/blob/main/CHANGELOG.md

2026-04-15 07:32:47
ironpress

v1.4.1

What's New

Architecture

  • Module split: engine.rs (16,500 lines) → 12 focused modules (block, flex, grid, table, text, images, helpers, paginate, inline, context)
  • LayoutContext: single struct replacing scattered width/height/containing-block parameters
  • LayoutEnv: bundles rules, fonts, counter_state (-3 params per function)

Bug Fixes

  • CSS descendant selectors in text runs (pre code, div span) now match correctly
  • margin-left/margin-right on block elements properly reduces width and offsets
  • Borders in flex containers — 4 rendering paths fixed (nested TextBlocks, TableRows, Container children, merged flex cells)
  • float: right now positions elements at the right edge (Container + TextBlock)
  • Percentage width resolves against layout parent, not style-time parent (fixes skill bars, progress indicators)
  • Inline text spacing — single BT/ET block per line eliminates cumulative positioning errors
  • Times-Roman font metrics — proper AFM widths replace Helvetica approximation
  • vw/vh units resolve against actual page size, not hardcoded A4
  • SVG clip-path now works on shape elements (rect, circle, path), not just groups
  • List indentation uses padding-left matching Chrome UA (user CSS padding-left: 0 works)

Features

  • Box-shadow blur — multi-layer concentric approximation replacing solid rectangles
  • Python bindingpip install ironpress (PyO3 + maturin)
  • Ruby bindinggem install ironpress (Magnus)

Testing

  • 2,170+ tests (up from 2,081)
  • 93% line coverage
2026-04-14 02:52:13
ironpress

v1.4.0 — Chromium Parity Round 2 & 3

Rendering Engine

Transforms

  • Correct CSS→PDF Y-axis flip for rotate, translate, and composed matrix transforms
  • Support scaleX(), scaleY(), translateX(), translateY(), skew(), skewX(), skewY()
  • Chained transforms composed into single affine matrix

SVG

  • viewBox placement fixed in flex cell nested elements (fixes invoice logo)
  • Quadratic bezier (Q/T) path commands converted to proper cubic curves
  • radialGradient support with objectBoundingBox and userSpaceOnUse
  • text-anchor attribute (start, middle, end)

Flexbox

  • Inline-block shrink-to-fit width (fixes pill shapes taking full width)
  • Flex-grow second pass relayout for percentage-width children (progress bars)
  • Separate flex-basis from child layout width (fixes flex-wrap with flex: 1)

Grid

  • Grid rows wrapped in Container for border + padding around all rows
  • Cell backgrounds and borders offset by container padding

Box Model

  • border-radius: 50% percentage resolution (circles)
  • Rounded rect background + border stroke for FlexCell elements

Pseudo-elements

  • Absolute ::before/::after positioned from container top (not mutated cursor)
  • Skip inline text collection to prevent double-rendering

Other

  • Container height constrained for overflow: hidden
  • Unicode character width estimates for CJK, emoji, Hebrew, Arabic, Greek
  • dir="rtl" attribute support

Parity Dashboard

  • Compare ALL pages per fixture, not just page 1
  • Visual diff images (red = different, white = identical)
  • Fixed ImageMagick compare exit code handling

CI

  • workflow_dispatch trigger for manual deploys
  • apt package caching, lighter font packages