v1.22.0

firecrawl/pdf-inspectorv1.22.0Sep 20, 2026by abimaelmartell

Upgrading?

AI Summary

This release enhances text extraction capabilities by supporting right-to-left languages, decoding symbolic fonts, and handling tracked display text. It also introduces new font metadata fields and fixes rendering issues with zero-area Form XObjects.

Key Highlights

  • Support for right-to-left text extraction using the Unicode Bidirectional Algorithm for Hebrew and Arabic.
  • Decoding of symbolic fonts through Adobe Glyph List and built-in encodings.
  • Improved handling of tracked display text to preserve word structure.
  • Addition of new font metadata fields `bold_source` and `fixed_pitch`.
  • Fix for rendering text in Form XObjects with zero-area bounding boxes.

Breaking Changes

  • Rust: `TextItem` literals now require the new `bold_source` and `fixed_pitch` fields.

New Features

  • Right-to-left text extraction (Hebrew, Arabic).
  • Symbolic font decoding (Symbol, ZapfDingbats).
  • Tracked display text handling.
  • New font metadata fields (`bold_source`, `fixed_pitch`).
  • Opt-in `bold_from_weight` option.
  • Rust function `widen_degenerate_form_bboxes_mem`.

Full Release Notes

Changes since 1.21.0:

- Read right-to-left lines back through the Unicode Bidirectional Algorithm: Hebrew and Arabic text stored in visual order comes out in reading order even when the line holds numbers, Latin phrases or punctuation; glyph-by-glyph positioned words cluster into words by the line's own gaps; presentation forms normalize to their letters once the text is in reading order (#552).
- Decode simple fonts through their `/BaseEncoding`, the Symbol and ZapfDingbats built-in encodings and their glyph names — Adobe Glyph List, `uniXXXX` and numbered `gNN`/`cidNN` names resolved against the embedded program — so symbol bullets, arrows and math operators read as the glyphs they are. A code the `/Differences` array names but cannot map reads as nothing, and a Type3 font's glyph-procedure names are never taken for glyph indexes (#553).
- Keep tracked display text whole when its letter spacing is written as `TJ` offsets, so a spaced-out title reads as words rather than one letter per word (#548).
- Add `bold_source` (where `is_bold` came from) and `fixed_pitch` to text items, and `bold_weight_threshold` to the positioned-text options; with `bold_from_weight` adjacent runs merge by the bold verdict; `is_bold_font` recognises Demi, Semibold, Ultra, Heavy and Black faces and the foundry abbreviations (#547).
- Widen the zero-area `/BBox` of Form XObjects at load so their text is extracted and the page renders; Rust gains `widen_degenerate_form_bboxes_mem(bytes)` for the repaired document (#550).
- Judge a CID-keyed font page's text decoded before calling it vector text, and bound Form XObject content inflation (#551).
- Regression fixtures for the boxes of text drawn with a reflected matrix (#549).

`bold_from_weight` and `bold_weight_threshold` stay opt-in; the default `is_bold` now also reads the weight names above as bold.

**Rust migration:** `TextItem` literals need the new `bold_source` and `fixed_pitch` fields.

Release preparation: #556.

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

Related Repositories