From c84fc56e454ab3126e9f46e0f13251defa8d621f Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Thu, 29 Jan 2026 12:41:56 -0800 Subject: [PATCH] Update CLI completions to match current options Add new options: --mode, --ocr-engine, --rasterizer, --continue-on-soft-render-error, --tesseract-non-ocr-timeout, --tesseract-downsample-large-images, --tesseract-downsample-above, --unpaper-args (fish), --plugin (fish). Update --output-type to include 'auto' as default. Update --pdf-renderer to include 'fpdf2' and mark hocr as deprecated. Remove non-working options: --remove-background, --threshold. --- misc/completion/ocrmypdf.bash | 77 +++++++++++++++++++++++++++++++---- misc/completion/ocrmypdf.fish | 38 +++++++++++++++-- 2 files changed, 103 insertions(+), 12 deletions(-) diff --git a/misc/completion/ocrmypdf.bash b/misc/completion/ocrmypdf.bash index a4cb6801..a80d6cc2 100644 --- a/misc/completion/ocrmypdf.bash +++ b/misc/completion/ocrmypdf.bash @@ -21,14 +21,13 @@ __ocrmypdf_arguments() --subject (set metadata) --keywords (set metadata) --rotate-pages (rotate pages to correct orientation) ---remove-background (attempt to remove background from pages) --deskew (fix small horizontal alignment skew) --clean (clean document images before OCR) --clean-final (clean document images and keep result) --unpaper-args (a quoted string of arguments to pass to unpaper) --oversample (oversample images to this DPI) --remove-vectors (don\'t send vector objects to OCR) ---threshold (threshold images before OCR) +--mode (processing mode for pages with existing text) --force-ocr (OCR documents that already have printable text) --skip-text (skip OCR on any pages that already contain text) --redo-ocr (redo OCR on any pages that seem to have OCR already) @@ -42,9 +41,12 @@ __ocrmypdf_arguments() --pages (apply OCR to only the specified pages) --max-image-mpixels (image decompression bomb threshold) --pdf-renderer (select PDF renderer options) +--ocr-engine (OCR engine to use) +--rasterizer (PDF page rasterizer) --rotate-pages-threshold (page rotation confidence) --pdfa-image-compression (set PDF/A image compression options) --fast-web-view (if file size if above this amount in MB linearize PDF) +--continue-on-soft-render-error (continue after recoverable render errors) --plugin (name of plugin to import) --keep-temporary-files (keep temporary files (debug) --tesseract-config (set custom tesseract config file) @@ -52,6 +54,10 @@ __ocrmypdf_arguments() --tesseract-oem (set tesseract --oem) --tesseract-thresholding (set tesseract image thresholding) --tesseract-timeout (maximum number of seconds to wait for OCR) +--tesseract-non-ocr-timeout (maximum seconds for non-OCR operations) +--tesseract-downsample-large-images (downsample large images before OCR) +--no-tesseract-downsample-large-images (do not downsample large images) +--tesseract-downsample-above (downsample images larger than this pixel size) --user-words (specify location of user words file) --user-patterns (specify location of user patterns file) --no-progress-bar (disable the progress bar) @@ -68,7 +74,8 @@ __ocrmypdf_arguments() __ocrmypdf_output-type() { - local choices="pdfa (output a PDF/A (default)) + local choices="auto (best-effort PDF/A without Ghostscript (default)) +pdfa (output a PDF/A-2b) pdf (output a standard PDF) pdfa-1 (output a PDF/A-1b) pdfa-2 (output a PDF/A-2b) @@ -114,10 +121,11 @@ __ocrmypdf_optimize() __ocrmypdf_pdf-renderer() { - local choices="auto (auto select PDF renderer) -hocr (use hOCR renderer) -hocrdebug (uses hOCR renderer in debug mode, showing recognized text) -sandwich (use sandwich renderer)" + local choices="auto (auto select PDF renderer, uses fpdf2) +fpdf2 (use fpdf2 renderer with full language support) +sandwich (use sandwich renderer) +hocr (use hOCR renderer - deprecated) +hocrdebug (uses hOCR renderer in debug mode - deprecated)" COMPREPLY=( $( compgen -W "$choices" -- "$cur") ) @@ -210,6 +218,46 @@ UseDeviceIndependentColor (convert with device independent color)" fi } +__ocrmypdf_mode() +{ + local choices="default (error if text is found) +force (rasterize all content and run OCR) +skip (skip pages with existing text) +redo (re-OCR pages, replacing old invisible text)" + + COMPREPLY=( $( compgen -W "$choices" -- "$cur") ) + # Remove description if only one completion exists + if [[ ${#COMPREPLY[*]} -eq 1 ]]; then + COMPREPLY=( ${COMPREPLY[0]%% *} ) + fi +} + +__ocrmypdf_ocr-engine() +{ + local choices="auto (select best available engine) +tesseract (use Tesseract OCR) +none (skip OCR entirely)" + + COMPREPLY=( $( compgen -W "$choices" -- "$cur") ) + # Remove description if only one completion exists + if [[ ${#COMPREPLY[*]} -eq 1 ]]; then + COMPREPLY=( ${COMPREPLY[0]%% *} ) + fi +} + +__ocrmypdf_rasterizer() +{ + local choices="auto (prefer pypdfium, fall back to Ghostscript) +ghostscript (use Ghostscript rasterizer) +pypdfium (use pypdfium rasterizer - faster)" + + COMPREPLY=( $( compgen -W "$choices" -- "$cur") ) + # Remove description if only one completion exists + if [[ ${#COMPREPLY[*]} -eq 1 ]]; then + COMPREPLY=( ${COMPREPLY[0]%% *} ) + fi +} + __ocrmypdf_check_previous() { case $prev in @@ -241,6 +289,18 @@ __ocrmypdf_check_previous() __ocrmypdf_pdf-renderer return 0 ;; + -m|--mode) + __ocrmypdf_mode + return 0 + ;; + --ocr-engine) + __ocrmypdf_ocr-engine + return 0 + ;; + --rasterizer) + __ocrmypdf_rasterizer + return 0 + ;; --pdfa-image-compression) __ocrmypdf_pdfa-image-compression return 0 @@ -260,7 +320,8 @@ __ocrmypdf_check_previous() --title|--author|--subject|--keywords|--unpaper-args|--pages|--plugin|\ --jpeg-quality|--png-quality|--image-dpi|--oversample|--skip-big|--max-image-mpixels|\ - --tesseract-timeout|--rotate-pages-threshold|--fast-web-view) + --tesseract-timeout|--tesseract-non-ocr-timeout|--tesseract-downsample-above|\ + --rotate-pages-threshold|--fast-web-view) # argument required but no completions available return 0 ;; diff --git a/misc/completion/ocrmypdf.fish b/misc/completion/ocrmypdf.fish index 9d1ca073..a831c439 100644 --- a/misc/completion/ocrmypdf.fish +++ b/misc/completion/ocrmypdf.fish @@ -11,8 +11,16 @@ complete -c ocrmypdf -s r -l rotate-pages -d "rotate pages to correct orientatio complete -c ocrmypdf -s d -l deskew -d "fix small horizontal alignment skew" complete -c ocrmypdf -s c -l clean -d "clean document images before OCR" complete -c ocrmypdf -s i -l clean-final -d "clean document images and keep result" +complete -c ocrmypdf -x -l unpaper-args -d "quoted string of arguments to pass to unpaper" complete -c ocrmypdf -l remove-vectors -d "don't send vector objects to OCR" +function __fish_ocrmypdf_mode + echo -e "default\t"(_ "error if text is found") + echo -e "force\t"(_ "rasterize all content and run OCR") + echo -e "skip\t"(_ "skip pages with existing text") + echo -e "redo\t"(_ "re-OCR pages, replacing old invisible text") +end +complete -c ocrmypdf -x -s m -l mode -a '(__fish_ocrmypdf_mode)' -d "processing mode for pages with existing text" complete -c ocrmypdf -s f -l force-ocr -d "OCR documents that already have printable text" complete -c ocrmypdf -s s -l skip-text -d "skip OCR on any pages that already contain text" complete -c ocrmypdf -l redo-ocr -d "redo OCR on any pages that seem to have OCR already" @@ -32,7 +40,8 @@ complete -c ocrmypdf -x -s l -l language -a '(__fish_ocrmypdf_languages)' -d lan complete -c ocrmypdf -x -l image-dpi -d "assume this DPI if input image DPI is unknown" function __fish_ocrmypdf_output_type - echo -e "pdfa\t"(_ "output a PDF/A (default)") + echo -e "auto\t"(_ "best-effort PDF/A without requiring Ghostscript (default)") + echo -e "pdfa\t"(_ "output a PDF/A-2b") echo -e "pdf\t"(_ "output a standard PDF") echo -e "pdfa-1\t"(_ "output a PDF/A-1b") echo -e "pdfa-2\t"(_ "output a PDF/A-2b") @@ -42,13 +51,28 @@ end complete -c ocrmypdf -x -l output-type -a '(__fish_ocrmypdf_output_type)' -d "select PDF output options" function __fish_ocrmypdf_pdf_renderer - echo -e "auto\t"(_ "auto select PDF renderer") - echo -e "hocr\t"(_ "use hOCR renderer") - echo -e "hocrdebug\t"(_ "uses hOCR renderer in debug mode, showing recognized text") + echo -e "auto\t"(_ "auto select PDF renderer (default, uses fpdf2)") + echo -e "fpdf2\t"(_ "use fpdf2 renderer with full language support") echo -e "sandwich\t"(_ "use sandwich renderer") + echo -e "hocr\t"(_ "use hOCR renderer (deprecated)") + echo -e "hocrdebug\t"(_ "uses hOCR renderer in debug mode (deprecated)") end complete -c ocrmypdf -x -l pdf-renderer -a '(__fish_ocrmypdf_pdf_renderer)' -d "select PDF renderer options" +function __fish_ocrmypdf_ocr_engine + echo -e "auto\t"(_ "select best available engine (default)") + echo -e "tesseract\t"(_ "use Tesseract OCR") + echo -e "none\t"(_ "skip OCR entirely") +end +complete -c ocrmypdf -x -l ocr-engine -a '(__fish_ocrmypdf_ocr_engine)' -d "OCR engine to use" + +function __fish_ocrmypdf_rasterizer + echo -e "auto\t"(_ "prefer pypdfium, fall back to Ghostscript (default)") + echo -e "ghostscript\t"(_ "use Ghostscript rasterizer") + echo -e "pypdfium\t"(_ "use pypdfium rasterizer (faster)") +end +complete -c ocrmypdf -x -l rasterizer -a '(__fish_ocrmypdf_rasterizer)' -d "PDF page rasterizer" + function __fish_ocrmypdf_optimize echo -e "0\t"(_ "do not optimize") echo -e "1\t"(_ "do safe, lossless optimizations (default)") @@ -124,11 +148,17 @@ end complete -c ocrmypdf -x -l tesseract-thresholding -a '(__fish_ocrmypdf_tesseract_thresholding)' -d "set tesseract thresholding method (needs Tesseract 5.x)" complete -c ocrmypdf -x -l tesseract-timeout -d "maximum number of seconds to wait for OCR" +complete -c ocrmypdf -x -l tesseract-non-ocr-timeout -d "maximum seconds to wait for non-OCR operations" +complete -c ocrmypdf -l tesseract-downsample-large-images -d "downsample large images before OCR" +complete -c ocrmypdf -l no-tesseract-downsample-large-images -d "do not downsample large images" +complete -c ocrmypdf -x -l tesseract-downsample-above -d "downsample images larger than this pixel size" complete -c ocrmypdf -x -l rotate-pages-threshold -d "page rotation confidence" complete -c ocrmypdf -r -l user-words -d "specify location of user words file" complete -c ocrmypdf -r -l user-patterns -d "specify location of user patterns file" complete -c ocrmypdf -x -l fast-web-view -d "if file size if above this amount in MB, linearize PDF" +complete -c ocrmypdf -l continue-on-soft-render-error -d "continue processing after recoverable render errors" +complete -c ocrmypdf -r -l plugin -d "name of plugin to import" function __fish_ocrmypdf_color_conversion_strategy echo -e "LeaveColorUnchanged\t"(_ "do not convert color spaces (default)")