Changelog

View Source

0.7.0 - 2026-07-23

Added

  • Added local CSS @font-face support for embedded and configured stylesheets, including font-family, ordered src: url(...) fallbacks, font-weight, font-style, and supported font-display values.
  • Added TrueType font loading from .ttf files and .otf files that use TrueType outlines. Relative font URLs resolve against the configured stylesheet directory or renderer :base_url.
  • Added print media handling for @media print, @media only print, @media all, and @media only all, while non-print media rules are omitted from the active print cascade.
  • Added PDF document metadata through the HTML renderer's :metadata option for title, author, subject, keywords, creation date, and modification date. Metadata dates accept Date, NaiveDateTime, DateTime, and ISO 8601 strings, and non-ASCII values are written as Unicode PDF strings.
  • Added automatic PDF title metadata from the first non-empty HTML <title> when no explicit metadata title is provided.
  • Added Chromium parity coverage for CSS-declared fonts and print media, plus examples and compatibility documentation for fonts, print CSS, metadata, supported formats, URL resolution, and conversion boundaries.

Changed

  • Changed configured stylesheet handling to preserve each file's directory for relative assets and to apply configured @page rules when deriving default page options.
  • Changed explicit and CSS-declared font registration to try ordered local source candidates until a supported font loads.
  • Changed PNG decoding to stream decompression, require the exact expected decoded size, and reject images whose decoded scanlines exceed 100 MB.
  • Changed RunLengthDecode to operate on binaries and enforce the PDF reader's decoded-stream and decompression-ratio limits.
  • Changed text extraction to accumulate spans and output text without repeated list or binary copying, and capped extraction at 25,000 text spans per page with a :resource_limit_exceeded diagnostic.
  • Changed merge failures to retain the PDF reader's reason and stage in the actionable merge diagnostic.

Fixed

  • Fixed merging PDFs that contain unrelated or stale catalog objects by resolving the active catalog from the trailer's /Root reference.
  • Fixed hexadecimal strings with non-hexadecimal bytes being silently sanitized; the tokenizer now emits :invalid_hex_string with the offending byte position.
  • Fixed PDF DateTime metadata formatting so UTC and non-UTC offsets are encoded correctly.
  • Fixed CSS @font-face parsing for quoted URLs containing commas, ordered fallback sources, invalid or missing descriptors, unsupported formats, and malformed declarations.
  • Fixed CSS diagnostics for malformed font and media rules so rendering returns actionable :invalid_css details with source, line, and column context.

0.6.0 - 2026-07-20

Added

  • Added NativeElixirPdfUtilities.Pdf.Reader, a shared PDF document layer with classic cross-reference tables, cross-reference streams, object streams, incremental and hybrid revision chains, recursive indirect resolution, supported stream filters, page-tree validation, and resource limits.
  • Added committed reader fixtures for classic, xref-stream, object-stream, hybrid, incremental, encrypted, and malformed PDFs.
  • Added Text.extract_spans/2 and Text.extract_file_spans/2 for page-preserving decoded text operations with source indexes, baseline coordinates, font and matrix context, and text rendering-mode metadata.
  • Added strict Unicode decoding for standard simple-font encodings, font-specific Differences, Adobe glyph names, Type 0 fonts, and ToUnicode CMaps.
  • Added PDF reader, text extraction, and merging guides covering supported structures, public behavior, diagnostics, limits, and known boundaries.
  • Added GitHub Actions checks for compilation warnings, formatting, unused dependencies, tests, 100% coverage, Dialyzer, and Chromium browser parity.

Changed

  • Changed text extraction and PDF merging to consume the shared reader model so both utilities honor active revisions, generations, free entries, compressed objects, and the validated page tree.
  • Changed text extraction to reject malformed content and unreliable font encodings with actionable diagnostics instead of guessing or returning partial text.
  • Changed string extraction to project from the same positioned page spans while preserving the existing layout: true and layout: false output.

Fixed

  • Fixed merging pages with malformed inherited /MediaBox values by applying the default page box.
  • Fixed valid cross-reference offsets that point to PDF whitespace immediately before an indirect object header being rejected.
  • Fixed tokenizer comments ending at end-of-input being emitted as tokens.

0.5.1 - 2026-07-10

Changed

  • Merge.merge/1 now rejects malformed classic PDF input with an :invalid_pdf_input diagnostic rather than producing an empty PDF or raising.
  • NativeElixirPdfUtilities.Tokenizer now emits explicit error tokens for unterminated literal and hexadecimal strings.
  • Text.extract/2 rejects malformed token streams with an :invalid_pdf_input diagnostic. It also ignores unusually large ToUnicode CMaps to bound memory and CPU use during extraction.

Fixed

  • Fixed merge crashes caused by malformed tokens, incomplete streams, duplicate object identifiers, and invalid object identifiers.
  • Fixed merged PDFs losing inherited /MediaBox and /Resources values from intermediate /Pages tree nodes.
  • Fixed remapping of non-page /Parent references during a merge.
  • Fixed malformed TTF font input causing HTML-to-PDF rendering to crash.
  • Reduced avoidable repeated binary and list copying while writing larger PDFs.

0.5.0 - 2026-07-10

Added

  • Added NativeElixirPdfUtilities.Diagnostics as the shared public diagnostic contract.
  • Added standardized diagnostic details for merge, text extraction, HTML rendering, pagination, PDF writing, and file failures.
  • Added developer guidance for using the shared diagnostics contract in future public APIs.
  • Added a diagnostics guide under docs/.

Changed

  • Changed Merge.merge/1 to return diagnostic errors instead of raising for empty input.
  • Changed recoverable failures from merge, text extraction, HTML rendering, pagination, PDF writing, and file operations to return {:error, {reason, diagnostic}} with :stage, :reason, :message, :operation, :module, and :source context when available.

0.4.0 - 2026-07-09

Added

  • Added a Chromium-backed browser parity test suite for the supported HTML/CSS rendering surface.
  • Added browser parity fixtures for common layout, CSS cascade, tables, flexbox, grid, pagination, image, link, unit, and production-document scenarios.
  • Added browser parity coverage documentation so supported renderer behavior is tied to explicit fixtures.

Changed

  • Improved HTML-to-PDF browser accuracy for nested table, flexbox, and grid compositions.
  • Improved collapsed table border sizing and painting to better match browser output.
  • Improved @page handling in parity tests so native and Chromium renders use the same page size and margins.
  • Updated contribution guidance to require focused tests and browser parity coverage for visible HTML-to-PDF feature work.

Fixed

  • Fixed CSS custom property resolution inside supported compound values such as padding and side-specific borders.
  • Fixed box-sizing: border-box handling across block, flex, grid, table, and image layout paths.
  • Fixed table layout inside flex and grid items, and flex layout directly inside table cells.
  • Fixed declared table row heights and pagination metadata propagation for table rows.
  • Fixed pagination edge cases around first-page parent padding, overlapping parent/child groups, and zero-height metadata groups.

0.3.0 - 2026-07-08

Added

  • Added NativeElixirPdfUtilities.HtmlToPdf, a native HTML/CSS to PDF renderer for document-oriented templates.
  • Added support for common document HTML including text, headings, paragraphs, spans, lists, links, tables, images, and nested document structure.
  • Added support for common print-oriented CSS including cascade handling, box model sizing, text styling, borders, backgrounds, tables, flexbox, grid, page sizes, page breaks, and @media print behavior.
  • Added embedded image, SVG rasterization, and custom TTF font rendering support for generated PDFs.
  • Added multi-page pagination and PDF writing for rendered HTML documents.
  • Added detailed render diagnostics for invalid HTML, unsupported HTML, invalid CSS, invalid layout, and invalid document failures.
  • Added fixture coverage for purchase orders, material requisitions, stock stickers, and trim cards with realistic scrambled data.
  • Added dedicated HTML-to-PDF compatibility and examples documentation.

Changed

  • Updated the package description to include native HTML/CSS rendering.
  • Updated HexDocs metadata to include the HTML-to-PDF guides.

0.2.0 - 2026-07-03

Added

  • Added embedded text extraction so callers can consume readable text data from PDF binaries.

Changed

  • Refactored tokenizer, merge, and text internals to use explicit case/cond branching instead of guarded multi-head private functions.
  • Split tests into focused tokenizer, merge, and text suites.
  • Improved package documentation and HexDocs metadata for the release.

Fixed

  • Fixed page dictionary rewriting around empty arrays and MediaBox validation.
  • Added 100% test coverage across the current public library modules.

0.1.0 - 2025-09-08

Added

  • Initial PDF tokenizer.
  • Initial PDF merge utility.