v1.24.0

Gerstep/cybosv1.24.0Sep 23, 2026by abimaelmartell

Upgrading?

AI Summary

This release enhances text extraction accuracy and rendering details by reporting text fill and stroke colors, rendering modes, and decoding a wider range of document information fields. It includes fixes for character encoding issues in titles and refines text extraction logic.

Key Highlights

  • TextItem now exposes detailed paint information including fill_color, stroke_color, and render_mode.
  • Document information dictionary is now decoded for Author, Subject, Keywords, Creator, Producer, CreationDate, and ModDate.
  • Fixes for PDFDocEncoding and UTF-16LE decoding in document titles to prevent mojibake.
  • Improved handling of text extraction for the `"` operator.
  • Adjusted ActualText span weight calculation based on the paint of the first painted glyph.

Breaking Changes

  • Rust literals for TextItem and PdfProcessResult types must now include new fields (fill_color, stroke_color, render_mode, author, etc.).
  • Document titles are no longer read as U+FFFD (replacement character) for PDFDocEncoding.
  • Titles in UTF-16LE are no longer read as mojibake.
  • Text extraction logic now skips the `"` operator and the spacing/line move it makes (previously skipped together).

New Features

  • New TextItem properties: fill_color, stroke_color, and render_mode.
  • New PdfProcessResult and PdfTypeResult properties: author, subject, keywords, creator, producer, creation_date, and mod_date.
  • Support for extracting text rendered with the `"` operator.

Full Release Notes

Changes since 1.23.0:

- Report the paint each text run was shown with: `TextItem` gains `fill_color` and `stroke_color` (8-bit sRGB, read from DeviceRGB, DeviceGray, DeviceCMYK, ICCBased by component count and Indexed palettes; `None` for Separation, DeviceN, Pattern and CIE-based spaces) and `render_mode` (the `Tr` mode, so invisible text and clipping-only text can be told apart). Extraction and markdown are unchanged (#579).
- Read the document information dictionary's `/Author`, `/Subject`, `/Keywords`, `/Creator`, `/Producer`, `/CreationDate` and `/ModDate` beside `/Title`, each decoded as a PDF text string (#579).
- Decode the document `/Title` as a PDF text string: titles in PDFDocEncoding no longer read with U+FFFD, titles in UTF-16LE no longer read as mojibake, and titles given by reference are read (#579).
- Extract text a page shows with the `"` operator, which the page parser skipped together with the spacing and line move it makes (#579).
- Take an ActualText span's weight from the paint of its first painted glyph rather than from the paint in force at the span's end (#579).
- Keep two lines of small type apart when their baselines lie less than 5 pt apart: a stacked table header at 4.7 pt on a 4.5 pt pitch no longer comes out as words zipped from both lines, and type of 8⅓ pt and above groups exactly as before (#580).

API: `TextItem::fill_color`, `stroke_color` and `render_mode` (Node `fillColor`, `strokeColor`, `renderMode`; Python `fill_color`, `stroke_color`, `render_mode`; the `pdf2md --items-json` fields), and the `PdfProcessResult` / `PdfTypeResult` fields `author`, `subject`, `keywords`, `creator`, `producer`, `creation_date` and `mod_date` (Node and WebAssembly in camelCase, Python as attributes, and the `pdf2md --json` / `detect-pdf --json` members). Rust literals of these types must include the new fields.

Release preparation: #582.

[Full changelog](https://github.com/firecrawl/pdf-inspector/compare/v1.23.0...v1.24.0)

Related Repositories