#1696·OCRmyPDF

Roadmap / wish list: consolidated feature requests and current positions

Author: jbarlow83Created Jun 9, 2026Updated Jun 11, 2026
Labelsenhancement

This issue gathers long-standing feature requests that aren't currently on an active development path, so they live in one place and can drive a discussion about the roadmap.

Please read this first: where I've quoted a position below (often "won't do because…"), that's my current position and reasoning — not a permanent no. Several of these are clustered requests where many people have asked for the same thing, which is exactly the kind of signal that can change priorities. Comments, use cases, and especially pull requests are welcome. If you came here from your own closed/redirected issue, this is the place to make the case.

A recurring principle that shapes a lot of these decisions: OCRmyPDF is biased toward large, unattended, archival batch jobs. A feature that's "right 98–99% of the time" is often unacceptable at that volume, because a 1–2% per-page error rate silently corrupts documents nobody reviews. That bar is why several otherwise-reasonable features below are held back.


1. Page-count-changing features (blank-page removal, splitting, cropping)

A strong, multi-requester cluster — and one I'm currently not pursuing, because anything that adds/removes/reorders pages is high-risk for unattended batches (a misfire deletes real content).

  • #12 — Remove blank pages (many +1s; several proposed heuristics: inkcov, leptonica pixel ratio, --remove-empty-pages)
  • #1032 — Remove pages with no recognizable OCR characters (text-heuristic variant of #12)
  • #96 — Crop empty margins / fit to page"Every now and then I come back to this ticket… It's not so difficult to do on its own, but… I don't have a good idea how to integrate it with the rest of the functionality."
  • #330 — Split a double-page (2-up) layout into single pages"ocrmypdf is biased towards [the archival] use case… I can't justify the effort." Workaround: mutool poster.
  • #510 — Split documents on separator/barcode pages"this strikes me as a custom requirement specific to your workflow rather than a feature of general interest."

2. Text layer handling without full-page rasterization ⭐ biggest under-served cluster

Multiple independent requesters circle the same gap: cleanly remove/replace a pre-existing text layer without rasterizing the whole page (--force-ocr bloats file size; --redo-ocr can mix old and new text). This is probably the single most-requested capability that doesn't yet have a clean answer.

  • #1435 — Option to remove an OCR text layer (reported --redo-ocr --tesseract-timeout 0 workaround does not work)
  • #1608 — Remove a bad text layer while preserving vector graphics as-is
  • #1600 — Performance for files with digital headers/footers (proposes strip-text → OCR → reattach original text)
  • #537 — Text-only / reconstructed searchable PDF — currently declined as framed: Tesseract can't reconstruct fonts, and keeping the image lets a human catch OCR errors. (See --sidecar.)

3. Text-only / no-PDF output

  • #1086 — Generate text only, no PDF — partially solved by --output-type none, but it's undiscoverable and there's no clean way to get the text string from the Python API. Good docs + API win.
  • #650 — Skip all OCR processing efficiently--tesseract-timeout 0 is "a bit of a hack — we still do everything as if OCR were happening." A true no-OCR fast path needs real work.
  • #778 — Rotate pages without OCR (overlaps #650)

4. Deskew / rotation / orientation / edge cleanup

  • #283 — Detect page orientation from OCR text (vs Tesseract OSD) — receptive: "It seems like a decent idea… this effort should replace the existing --rotate-pages provided we can prove it's an improvement in most cases." A prototype with strong results existed; needs a PR over the finish line.
  • #1110 — OCR pages with multiple text rotations (e.g. a rotated table inset) — "a limitation of Tesseract's PDF renderer rather than the engine, which makes it tractable."
  • #520 — Remove grey/black frame after deskew — declined on reliability grounds; better done by scanner software that knows where the page is.
  • #550 — --threshold-final (binarize output) — declined on reliability: "most threshold functions are not reliable enough to trust without manual inspection." (Otsu/Sauvola discussion.) Related demand: better faded/grey-text recognition.
  • #1161 — Custom deskew/rotation logic via plugin — blocked by an architecture gap: "the plugin system doesn't actually support replacement of some steps in the pipeline that ought to be pluggable."

5. Image optimization & output control

Generally open to these, but gated on Debian/Fedora packaging availability and license compatibility.

  • #603 — Losslessly optimize JPEG/PNG (mozjpeg, jpegoptim, optipng/oxipng) — "would accept a pull request, won't do myself"; waiting on mature distro packages.
  • #912 — Multi-resolution / by-area (MRC) compression — complex; possible license-incompatibility with existing open-source implementations.
  • #1447 — Aggressive optimization without color quantization (workaround: --png-quality 100, remove pngquant)
  • #1651 — Force image output options (force DPI/grayscale/JBIG2/JPEG2000, future JPEG-XL)
  • #548 — Guidance/docs for mass-scanning workflows (mostly documentation)

6. OCR backends & Unicode / text extraction

  • #1250 — Pluggable OCR backends via hOCR (open — architecture thread): direction is "hOCR will become the one common backend for any OCR engine" via a simple internal hOCR→PDF format. Known blocker: RTL languages with glyphless fonts.
  • #1584 — PaddleOCR backend (open — actively being worked on): planned mainline support, initially as an optional extra.
  • #1282 — NFKC vs NFC Unicode normalization — leaning toward an ActualText-markup solution over a normalization flag, but most viewers ignore ActualText; unresolved. A contributor has offered a PR.
  • #1518 — Better handling of separated/columnar text for copy-paste order (largely a Tesseract segmentation limitation)
  • #1188 — Ghostscript glyph-level Unicode map generation
  • #892 — ROI / text-block detection preprocessing — steer to a plugin at the image-processing stage.

Note on cloud / ML OCR engines: requests to add Azure / Google / VLM / etc. engines to core (#595, #1186, #1434, #1617, #1628, …) are closed as won't-implement-in-core. The supported path is a plugin — see ocrmypdf-easyocr as a template, with #1250 for the architecture and #1584 for the in-progress PaddleOCR plugin.

7. Metadata, structure & PDF features

  • #331 — Page labels / custom page numbering — should be "fairly easy" once qpdf's page-label support is wired in.
  • #259 — OCR / embed PDF attachments (PDF/A-3) — will not implement; use qpdf input.pdf --add-attachment=file_to_embed.txt -- output.pdf
  • #464 — Viewer preferences / open actions (/FitWindow, /DisplayDocTitle, …) — "not a difficult feature to add"; but no interest in user-hostile ones (hiding toolbars).
  • #1673 — Autogenerate & embed document outlines (needs reliable heading detection)
  • #1106 — PDF/A-4 supportblocked upstream: waiting on Ghostscript.
  • #959 — Auto-assign ASN via barcode — tends toward a Turing-complete spec; best as a plugin.

8. unpaper / preprocessing interface

  • #392 — --unpaper-args / --clean-final"a really messy corner of the interface… open to suggestions." Tension between exposing power via plugins vs. keeping simple CLI args.
  • #436 — Noteshrink integration — achievable today via the filter_page_image plugin hook.

9. Diacritics-warning UX

  • #1556 — Hide the "lots of diacritics" warning
  • #1566 — Show the raw Tesseract message instead of the generic warning (a small UX pass would address both)

10. Progress / demo / misc

  • #1313 — Progress during postprocessing (the Ghostscript PDF/A + copy-out stages lack progress feedback)
  • #1299 — Convert the demo to VHS format

Quick index by disposition

  • Tractable / promising / low-effort: #331, #464, #1086, #283, #1299
  • "Would accept a PR, won't do myself": #603, #283, #1566
  • Declined as framed (reliability / scope): #259, #510, #520, #550, #537, toolbar-hiding in #464
  • Steer to plugins (but plugin system needs work — #1161): #436, #892, #959, #392, #1250, #1110
  • Blocked upstream: #1106 (Ghostscript), parts of #912 (license)
  • Strongest demand patterns: text-layer-without-rasterizing (#1435/#1608/#1600/#537), blank-page removal (#12/#1032), text-only output (#1086/#650), double-page splitting (#330/#510), diacritics-warning UX (#1556/#1566)

If your request is here and the reasoning no longer holds — or you'd like to contribute one — please comment.