Skip to content

1.23.0 — Text-layer repairs

Choose a tag to compare

@abimaelmartell abimaelmartell released this 22 Sep 01:26
7a34011

Changes since 1.22.1:

  • Read a Form XObject whose /BBox numerals are too large for any parser: such numerals are saturated in place before the document is read, so the form's text is extracted and the OCR pipeline renders it instead of an empty page (#560).

  • Read right-to-left runs shown in reading order forwards: a visible run of right-to-left letters painted forwards now votes for visual storage, so pages that came out word-mirrored read correctly; the logical-order reading is kept for invisible text layers (#561).

  • Read a re-encoded simple font by its /Differences names when it kept a stale ToUnicode CMap, and keep one glyph's characters together through the visual-order read-back (#562).

  • Compose a detached spacing accent with the letter it is painted over instead of leaving a stray accent a word on (#563).

  • Treat a return from a zero-advance dependent sign placed behind the pen as no word gap, so scripts that attach signs by stepping the pen back keep their words whole (#564).

  • Classify a page whose text layer is drawn invisibly under a covering image as a scan with the OCR reason invisible_text_layer, following the text rendering mode, the transformation, the graphics state stack and image draws through form content within a per-page budget (#566).

  • Interpolate single-glyph gaps in a ToUnicode CMap when the neighbouring codes make the reading unambiguous, mark the rest as U+FFFD instead of dropping them, and report each font's coverage (#568).

  • A ToUnicode entry whose destination is a control character is a miss, not text: the marker replaces it and the font program, the declared encoding or a blank glyph's advance recovers the letter where it can (#567).

  • pdf2md and detect-pdf take the PDF path as the first non-option argument, so flags may come before or after it, and a missing input names the path that could not be opened; the built-in CMaps are compiled into the binary instead of being read from the crate checkout at run time, so cargo install binaries and published wheels find them (PDF_INSPECTOR_BCMAPS_DIR still overrides) (#570).

API: PdfProcessResult::cmap_gaps (Node cmapGaps, Python cmap_gaps, WebAssembly cmapGaps, and the pdf2md --json / detect-pdf --analyze --json field) lists, per font with gaps among the two-byte codes shown, the codes shown, interpolated and left unmapped (#568). The detector's invisible_text_layer OCR reason is new (#566).

Release preparation: #571.

Full changelog