From 1f4614db3302d26b4886e5588173dcd89d6c42f2 Mon Sep 17 00:00:00 2001 From: Patrick Ullmann Date: Wed, 7 Oct 2026 19:47:02 +0200 Subject: [PATCH 1/6] ADD (command/ocr): OCR implemented --- .github/workflows/snapshot.yaml | 2 + README.md | 40 +++++++++++++++++++- completions/pdfmt.bash | 3 +- sources/command/help.sh | 1 + sources/command/ocr/_index.sh | 14 +++++++ sources/command/ocr/add.sh | 58 ++++++++++++++++++++++++++++ sources/command/ocr/exists.sh | 39 +++++++++++++++++++ sources/command/ocr/help.sh | 18 +++++++++ sources/command/ocr/show.sh | 32 ++++++++++++++++ sources/common/config.sh | 28 ++++++++++++++ sources/main.sh | 1 + tests/_data/no-ocr.pdf | Bin 0 -> 61832 bytes tests/command/ocr/_index_test.sh | 53 ++++++++++++++++++++++++++ tests/command/ocr/add_test.sh | 63 +++++++++++++++++++++++++++++++ tests/command/ocr/exists_test.sh | 44 +++++++++++++++++++++ tests/command/ocr/help_test.sh | 26 +++++++++++++ tests/command/ocr/show_test.sh | 51 +++++++++++++++++++++++++ tests/common/config_test.sh | 14 +++++++ tests/common/platform_test.sh | 2 +- tests/main_test.sh | 50 +++++++++++++----------- 20 files changed, 514 insertions(+), 25 deletions(-) create mode 100644 sources/command/ocr/_index.sh create mode 100644 sources/command/ocr/add.sh create mode 100644 sources/command/ocr/exists.sh create mode 100644 sources/command/ocr/help.sh create mode 100644 sources/command/ocr/show.sh create mode 100644 tests/_data/no-ocr.pdf create mode 100644 tests/command/ocr/_index_test.sh create mode 100644 tests/command/ocr/add_test.sh create mode 100644 tests/command/ocr/exists_test.sh create mode 100644 tests/command/ocr/help_test.sh create mode 100644 tests/command/ocr/show_test.sh diff --git a/.github/workflows/snapshot.yaml b/.github/workflows/snapshot.yaml index e7aee2c..2e7868f 100644 --- a/.github/workflows/snapshot.yaml +++ b/.github/workflows/snapshot.yaml @@ -28,6 +28,7 @@ jobs: sudo apt-get update sudo apt-get install -y \ shellcheck \ + ocrmypdf \ pdftk \ poppler-utils \ sane-utils \ @@ -37,6 +38,7 @@ jobs: brew install \ bash \ shellcheck \ + ocrmypdf \ pdftk-java \ poppler \ sane-backends \ diff --git a/README.md b/README.md index d37aa1e..5f941b7 100644 --- a/README.md +++ b/README.md @@ -302,9 +302,10 @@ chmod +x ~/.local/share/pdfmt/workflows/$WORKFLOW_NAME `pdfmt` currently provides commands for: | Task | Examples | -| ------------------ | ---------------------------------------------------------------- | +|--------------------|------------------------------------------------------------------| | **Extract pages** | Extract even pages, odd pages, or arbitrary ranges | | **Merge PDFs** | Merge documents, interleave duplex scans, insert documents | +| **OCR PDFs** | Execute OCR operations on PDF files | | **Remove pages** | Remove even pages, odd pages, or arbitrary ranges | | **Scan documents** | Scan using an ADF or flatbed scanner | | **Sort pages** | Reverse, shuffle, swap, move and handle duplex page orders | @@ -343,6 +344,10 @@ Below is a quick overview of all available commands. To get detailed usage instr | | `merge duplex` | Interleave two PDFs (front/back scans) into one duplex document | | | `merge help` | Help of category *Merge* | | | `merge insert` | Insert a PDF into another document at a specific page | +| **OCR** | `ocr add` | Add an OCR text layer to a PDF document | +| | `ocr exists` | Check if a PDF document contains an OCR/text layer | +| | `ocr help` | Help of category *Ocr* | +| | `ocr show` | Display the extracted OCR text layer of a PDF document | | **Remove** | `remove even` | Remove all even-numbered pages | | | `remove help` | Help of category *Remove* | | | `remove odd` | Remove all odd-numbered pages | @@ -385,8 +390,9 @@ The required runtime tools are: | [pdftk](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/) | `pdftk` | `pdftk-java` | PDF manipulation | | [ImageMagick](https://imagemagick.org/) | `imagemagick` | `imagemagick` | Image/PDF operations | | [SANE](https://sane-project.org/) | `sane-utils` | `sane-backends` | Scanning | +| [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) | `ocrmypdf` | `ocrmypdf` | OCR operations | -Not every command requires every dependency. For example, SANE is only needed for the `scan` command. +Not every command requires every dependency. For example, SANE is only needed for the `scan` command and OCRmyPDF is only needed for `ocr add`. #### Linux @@ -502,6 +508,36 @@ Available settings include: |------------------|----------------------------------|-----------------------------------------------------------------------------| | `workflow.paths` | `~/.local/share/pdfmt/workflows` | List of directories separated by : where your workflow scripts are located | +### OCR configuration + +The `ocr` command uses: + +```text +~/.config/pdfmt/ocr.conf +``` + +Available settings include: + +| Setting | Default | Description | +|----------------|---------|-------------------------------------------------------------------------| +| `ocr.language` | `eng` | Language codes used for OCR text recognition. | +| `ocr.plugin` | ` ` | The OCRmyPDF engine plugin to be used. If empty Tesseract will be used. | + +**Note:** If a configured plugin like `ocrmypdf_rapidocr` is not installed on the system, `pdfmt ocr add` will exit with a clear error message rather than creating faulty PDFs. + +#### Recommendation for OCR: RapidOCR or EasyOCR + +`pdfmt` uses OCRmyPDF for text recognition, which also supports plugins. For optimal performance and accuracy (especially on CPUs and Intel Macs), the RapidOCR plugin is recommended. If you need maximum recognition quality on complex layouts and have a powerful GPU and RAM available, take a look at EasyOCR. + +After installing your preferred plugin, you can enable it by updating the configuration file: + +```bash +# Enable RapidOCR: +ocr.plugin=ocrmypdf_rapidocr +``` + +**Note:** If you get errors like `ValueError: Unsupported rec.lang_type='latin' for PP-OCRv6 small model.` ensure the correct model for RapidOCR is installed. + --- ## A command-line tool that stays out of your way diff --git a/completions/pdfmt.bash b/completions/pdfmt.bash index f7f8de5..3651803 100644 --- a/completions/pdfmt.bash +++ b/completions/pdfmt.bash @@ -9,7 +9,7 @@ function _pdfmt_completions() # Level 1: Main commands if [[ "$COMP_CWORD" -eq 1 ]]; then - local commands="extract merge remove scan sort split stamp version workflow help" + local commands="extract merge ocr remove scan sort split stamp version workflow help" mapfile -t COMPREPLY < <(compgen -W "$commands" -- "$current") return 0 fi @@ -19,6 +19,7 @@ function _pdfmt_completions() case "${COMP_WORDS[1]}" in extract) mapfile -t COMPREPLY < <(compgen -W "even odd range help" -- "$current") ;; merge) mapfile -t COMPREPLY < <(compgen -W "all duplex insert help" -- "$current") ;; + ocr) mapfile -t COMPREPLY < <(compgen -W "add exists remove show help" -- "$current") ;; remove) mapfile -t COMPREPLY < <(compgen -W "even odd range help" -- "$current") ;; scan) mapfile -t COMPREPLY < <(compgen -W "adf flatbed help" -- "$current") ;; sort) mapfile -t COMPREPLY < <(compgen -W "duplex move random reverse swap help" -- "$current") ;; diff --git a/sources/command/help.sh b/sources/command/help.sh index d24730b..30388c5 100644 --- a/sources/command/help.sh +++ b/sources/command/help.sh @@ -9,6 +9,7 @@ Usage: Core Commands: extract Save specific pages into a new PDF merge Combine PDFs into a single document + ocr OCR operations for PDF files remove Delete specific pages from a PDF scan Create PDFs directly from a scanner split Split a PDF into multiple files diff --git a/sources/command/ocr/_index.sh b/sources/command/ocr/_index.sh new file mode 100644 index 0000000..0bd935d --- /dev/null +++ b/sources/command/ocr/_index.sh @@ -0,0 +1,14 @@ +function command_ocr() +{ + local -r command="${1:-}" + [[ -n "${command}" ]] && shift + + case "${command}" in + add) command_ocr_add "$@" ;; + exists) command_ocr_exists "$@" ;; + show) command_ocr_show "$@" ;; + + help|--help|-h|'') command_ocr_help "$@" ;; + *) _log_error "Unknown command '$command'"; return 1; ;; + esac +} diff --git a/sources/command/ocr/add.sh b/sources/command/ocr/add.sh new file mode 100644 index 0000000..b7e8459 --- /dev/null +++ b/sources/command/ocr/add.sh @@ -0,0 +1,58 @@ +function command_ocr_add() +{ + if (( $# < 2 )); then + cat < + +Examples: + pdfmt ocr add input.pdf output.pdf + +TEXT + return 0 + fi + + + # Load + # ----------------------------------------------------------------------------------------------------------------- + _config_load_ocr + + local -r input_file="${1:-}" + local -r output_file="${2:-}" + local -r language="${OCR_LANGUAGE:-eng}" + local -r plugin="${OCR_PLUGIN:-}" + + + # Validate + # ----------------------------------------------------------------------------------------------------------------- + _assert_is_installed ocrmypdf || return $? + _assert_is_file "${input_file}" || return $? + _assert_is_not_file "${output_file}" || return $? + _assert_matches_regex '^[a-z]{3}$' "${language}" "Invalid language format: ${language}" || return $? + + if [[ -n "${plugin}" ]]; then + if ! ocrmypdf --plugin "${plugin}" --help &>/dev/null; then + _log_error "OCRmyPDF plugin is not installed or invalid: '${plugin}'" >&2 + return 1 + fi + fi + + + # Handle + # ----------------------------------------------------------------------------------------------------------------- + # Skip OCR if the PDF already contains extractable text. + # Extract text stream and test if at least one alphanumeric character exists, + if pdftotext -enc UTF-8 "${input_file}" - 2>/dev/null | grep -q '[[:alnum:]]'; then + return 0 + fi + + # build options + local opts=(-l "${language}") + if [[ -n "${plugin}" && "${plugin}" != "tesseract" ]]; then + opts+=(--plugin "${plugin}") + fi + + ocrmypdf "${opts[@]}" "${input_file}" "${output_file}" +} diff --git a/sources/command/ocr/exists.sh b/sources/command/ocr/exists.sh new file mode 100644 index 0000000..a3c1eee --- /dev/null +++ b/sources/command/ocr/exists.sh @@ -0,0 +1,39 @@ +function command_ocr_exists() +{ + if (( $# < 1 )); then + cat < + +Examples: + pdfmt ocr exists document.pdf + +TEXT + return 0 + fi + + + # Load + # ----------------------------------------------------------------------------------------------------------------- + local -r input_file="${1:-}" + + + # Validate + # ----------------------------------------------------------------------------------------------------------------- + _assert_is_installed pdftotext || return $? + _assert_is_file "${input_file}" || return $? + + + # Handle + # ----------------------------------------------------------------------------------------------------------------- + # Extract text stream and test if at least one alphanumeric character exists. + if pdftotext -enc UTF-8 "${input_file}" - 2>/dev/null | grep -q '[[:alnum:]]'; then + echo "true" + return 0 + else + echo "false" + return 1 + fi +} diff --git a/sources/command/ocr/help.sh b/sources/command/ocr/help.sh new file mode 100644 index 0000000..248347f --- /dev/null +++ b/sources/command/ocr/help.sh @@ -0,0 +1,18 @@ +function command_ocr_help() +{ + cat < [arguments] + +Commands: + add Add an OCR text layer to a PDF document + exists Check if a PDF document contains an OCR text layer + show Print the OCR text layer to stdout + +General Commands: + help Display this help message + +TEXT +} diff --git a/sources/command/ocr/show.sh b/sources/command/ocr/show.sh new file mode 100644 index 0000000..871114a --- /dev/null +++ b/sources/command/ocr/show.sh @@ -0,0 +1,32 @@ +function command_ocr_show() +{ + if (( $# < 1 )); then + cat < + +Examples: + pdfmt ocr show document.pdf + +TEXT + return 0 + fi + + + # Load + # ----------------------------------------------------------------------------------------------------------------- + local -r input_file="${1:-}" + + + # Validate + # ----------------------------------------------------------------------------------------------------------------- + _assert_is_installed pdftotext || return $? + _assert_is_file "${input_file}" || return $? + + + # Handle + # ----------------------------------------------------------------------------------------------------------------- + pdftotext -enc UTF-8 "${input_file}" - +} diff --git a/sources/common/config.sh b/sources/common/config.sh index 8bd1346..8fe0ede 100644 --- a/sources/common/config.sh +++ b/sources/common/config.sh @@ -119,3 +119,31 @@ EOF local value= value="$(_config_get_value "$config_file" "workflow.paths")"; export WORKFLOW_PATHS="$value" } + +function _config_load_ocr() +{ + local -r config_dir="${HOME}/.config/pdfmt" + local -r config_file="${config_dir}/ocr.conf" + + if [[ ! -f "${config_file}" ]]; then + mkdir -p "$config_dir" + cat < "$config_file" +# Config for command: ocr +# ===================================================================================================================== +# Language codes used for OCR text recognition. +ocr.language=eng + +# Used OCRmyPDF plugin. +# Default: -empty- (Tesseract will be used) +# Possible options if installed: +# - ocrmypdf_rapidocr +# - ocrmypdf_easyocr +ocr.plugin= + +EOF + fi + + local value= + value="$(_config_get_value "$config_file" "ocr.language")"; export OCR_LANGUAGE="$value" + value="$(_config_get_value "$config_file" "ocr.plugin")"; export OCR_PLUGIN="$value" +} diff --git a/sources/main.sh b/sources/main.sh index 06bc975..b3f1f7b 100644 --- a/sources/main.sh +++ b/sources/main.sh @@ -26,6 +26,7 @@ function main() case "${command}" in extract) command_extract "$@" ;; merge) command_merge "$@" ;; + ocr) command_ocr "$@" ;; remove) command_remove "$@" ;; scan) command_scan "$@" ;; sort) command_sort "$@" ;; diff --git a/tests/_data/no-ocr.pdf b/tests/_data/no-ocr.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2a26baf7da7f87b8613e922af5f9d957e94d6aeb GIT binary patch literal 61832 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⪚cn(%pan=LH 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 literal 0 HcmV?d00001 diff --git a/tests/command/ocr/_index_test.sh b/tests/command/ocr/_index_test.sh new file mode 100644 index 0000000..1d10e49 --- /dev/null +++ b/tests/command/ocr/_index_test.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +# ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function set_up() +{ + # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. + source "$ROOT_DIR/sources/command/ocr/_index.sh" + # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. + source "$ROOT_DIR/sources/command/ocr/help.sh" + # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. + source "$ROOT_DIR/sources/command/ocr/add.sh" + # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. + source "$ROOT_DIR/sources/command/ocr/exists.sh" + # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. + source "$ROOT_DIR/sources/command/ocr/show.sh" +} + +# ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function tear_down() +{ + : +} + +# ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function test_command_ocr() +{ + local exit_code=0 + local output + + output=$(command_ocr "") || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt ocr " "${output}" + + output=$(command_ocr help) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt ocr " "${output}" + + output=$(command_ocr add) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt ocr add" "${output}" + + output=$(command_ocr exists) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt ocr exists" "${output}" + + output=$(command_ocr show) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt ocr show" "${output}" + + output=$(command_ocr foobar 2>&1) || exit_code=$? + assert_same "1" "${exit_code}" + assert_same "ERROR: Unknown command 'foobar'" "${output}" +} diff --git a/tests/command/ocr/add_test.sh b/tests/command/ocr/add_test.sh new file mode 100644 index 0000000..0f3ead4 --- /dev/null +++ b/tests/command/ocr/add_test.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash + +# ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function set_up() +{ + # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. + source "$ROOT_DIR/sources/command/ocr/add.sh" + + export TEST_DIR="/tmp/bashunit_test_$$" + mkdir -p "$TEST_DIR" + cd "$TEST_DIR" || exit 1 + + export HOME="${TEST_DIR}" + + mkdir -p "${HOME}/.config/pdfmt" + cat > "${HOME}/.config/pdfmt/ocr.conf" < "${HOME}/.config/pdfmt/ocr.conf" < [arguments]" "${output}" + output=$(main extract) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt extract [arguments]" "${output}" - output=$(main merge) || exit_code=$? - assert_same "0" "${exit_code}" - assert_contains "pdfmt merge [arguments]" "${output}" + output=$(main merge) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt merge [arguments]" "${output}" - output=$(main remove) || exit_code=$? - assert_same "0" "${exit_code}" - assert_contains "pdfmt remove [arguments]" "${output}" + output=$(main ocr) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt ocr [arguments]" "${output}" - output=$(main scan) || exit_code=$? - assert_same "0" "${exit_code}" - assert_contains "pdfmt scan [arguments]" "${output}" + output=$(main remove) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt remove [arguments]" "${output}" - output=$(main sort) || exit_code=$? - assert_same "0" "${exit_code}" - assert_contains "pdfmt sort [arguments]" "${output}" + output=$(main scan) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt scan [arguments]" "${output}" - output=$(main split) || exit_code=$? - assert_same "0" "${exit_code}" - assert_contains "pdfmt split [arguments]" "${output}" + output=$(main sort) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt sort [arguments]" "${output}" - output=$(main stamp) || exit_code=$? - assert_same "0" "${exit_code}" - assert_contains "pdfmt stamp [arguments]" "${output}" + output=$(main split) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt split [arguments]" "${output}" + + output=$(main stamp) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt stamp [arguments]" "${output}" output=$(main foobar 2>&1) || exit_code=$? assert_same "1" "${exit_code}" From 8ad7026f1e18894f24fd2ba8e29fef94357c4d09 Mon Sep 17 00:00:00 2001 From: Patrick Ullmann Date: Wed, 7 Oct 2026 19:58:57 +0200 Subject: [PATCH 2/6] FIX (command/main): missing test case for workflow --- tests/main_test.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/main_test.sh b/tests/main_test.sh index 25ef04a..d46a2e1 100644 --- a/tests/main_test.sh +++ b/tests/main_test.sh @@ -41,6 +41,10 @@ function set_up() source "$ROOT_DIR/sources/command/stamp/_index.sh" # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. source "$ROOT_DIR/sources/command/stamp/help.sh" + # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. + source "$ROOT_DIR/sources/command/workflow/_index.sh" + # shellcheck disable=SC1091 # ROOT_DIR is provided by the bootstrap. + source "$ROOT_DIR/sources/command/workflow/help.sh" } # ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -102,6 +106,10 @@ function test_command_main() assert_same "0" "${exit_code}" assert_contains "pdfmt stamp [arguments]" "${output}" + output=$(main workflow) || exit_code=$? + assert_same "0" "${exit_code}" + assert_contains "pdfmt workflow [arguments]" "${output}" + output=$(main foobar 2>&1) || exit_code=$? assert_same "1" "${exit_code}" assert_same "ERROR: Unknown command 'foobar'" "${output}" From 93c502e5c6e705a24cfe3535ad7457390ee96652 Mon Sep 17 00:00:00 2001 From: Patrick Ullmann Date: Wed, 7 Oct 2026 19:59:18 +0200 Subject: [PATCH 3/6] FIX (command/ocr): typo in unittest --- tests/command/ocr/add_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/command/ocr/add_test.sh b/tests/command/ocr/add_test.sh index 0f3ead4..93f239b 100644 --- a/tests/command/ocr/add_test.sh +++ b/tests/command/ocr/add_test.sh @@ -56,7 +56,7 @@ function test_command_ocr_add_ocr_already_exists() local exit_code=0 local output - output="$(command_ocr_add "${ROOT_DIR}/tests/_data/pages.pdf" outpud.pdf)" || exit_code=$? + output="$(command_ocr_add "${ROOT_DIR}/tests/_data/pages.pdf" output.pdf)" || exit_code=$? assert_same "0" "${exit_code}" assert_same "" "${output}" assert_not_same "output.pdf" "$(printf '%s\n' *)" From 488ca18bb73b7e0071551a6e44a1b0cae8997198 Mon Sep 17 00:00:00 2001 From: Patrick Ullmann Date: Wed, 7 Oct 2026 20:00:19 +0200 Subject: [PATCH 4/6] FIX (command/workflow): corrupt pdf file --- tests/_data/no-ocr.pdf | Bin 61832 -> 59741 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/_data/no-ocr.pdf b/tests/_data/no-ocr.pdf index 2a26baf7da7f87b8613e922af5f9d957e94d6aeb..f84c74a504240693c50d8b597d55078b287cfbc2 100644 GIT binary patch delta 1184 zcma)5J#W)c6b-GKLPP-}K!A#Lho)1h{rnYML=iM4ZAD8%0!mTU!5=TFOOhAa4r)Q7 zbb^7U%7BDAF|Y$G5)AwR#0*0PY@i~L=tjBE`QlrZ2m9Ig+vAY{!F^+Ce-IS?+d)F=pPGce1n1gTVvRvli> zKeu2)n$@cT5D+f7jt}!7htP#KxY@4@<)6FIYCx-j4@z^~%qn$UbBrxx8xb$nP)B9Z z6*8(DfE}}@hvjW@IqI{zXCqr=FJwJt=V^dQ0apZJs)CE8LzKsA)C*iJOf=`r&00&; z4nPl&sZ@vS3B>%gCa2Zn+Nf_zEQreHlgF1{ZP&jAd%k@7_~IG(eKH7pU-n1VzxH22 z-CKZ`1DtwW#vBo`XJ}ZC5Wo|E?n-XJYPWdI4g4(i(yUTrRj#Iv2D38r@-@>&v&ZRm z*QOJmxx$}q=1`QB#{~6np3#L$Q**@CD^(weqAT11bk7c$2Sml`eA{wBJ-nA2H@EiT zoJs1I7BMTD2tvMY1!1~Eqd+LQ4i`4;)KXd1b-u+@^FzL;@!lndq(Pa5Q@GkU21Pys$QR y=Jw&8zH=kd%%h#@qdRLOr{Mn8fyv|n8i{P&=^t*q*&5uh8j7UH;_>sdnb;3+QDm_I delta 3395 zcmcInTWlOx8Qx@tn+`N2LeK;e^~lk78k*fRXYV`gt{d+qHF#@x?KDPKP{uQ7*JIBu zGiT#*c0EFPeU04kSCwD8gt5Dz@06|E{%5s~HrN`=z!pV`^< zx`_jRU@Tc@&ivQ!`_F&=z4V9Znb)I!Y`R*HlSEF4y?FV{-x6Z63G1Y-DonR68MQqW zKY_;JFYZ-q4^32RB}Z$mxH_XKuGJ?dXKT&b+T1J}6Ea9b_QH}-EaFLOwb>%d!cG&{ zb%RkC;kuzPTBWM3(Q;Yvm`fE?=$=2zww?CV>$rT|;i(s){2q?aDTJVq1*=^^|nUGvbqz*A@n#}HWP zKwxA@l?+rv&5FVl!*2IYr2IfPFxUWi@DYzrb(o=B)Dr*(rf8smNYBN3NI@zg|JlGjE!@729-di&KynLW+kO7Qhr|8fY?mqyU*Jvt2|ofy<6*0q}wKiXAg- z*F!0e|4c*imQgSKejR0UIg&1ye{^nS^)K6mv%h%X$9#Na5*u?k>?*5UOQIL>JP{RF7UNX8Csxi-71M!e*Q}l=~_uVnrTQ4r$QI?`%k%a=F|hT>ZxV5p!wohStyPv zP|GylRh)P$IF=rwo?05MG$-q$T%ap=O~-_aLtWFbJh@vE0~Hz8d>e}>5Mj$Dajr3q zm~9)&Iz!1sAwl9Kbr7{&#iT2?3nV78BA9fwmfWoR_0S@`mc&KI92w)4m6gOwDq*{A zObUepmXbJ`jDtknTeX+t<@^@$Z}FjX5&PPOSxH+l`}*pnR}(AEJ;QD9!Ve! zR4dR*p|##p)$i#JiS~5+HFs<6&~ey_0@)$gwmS=DP(I3U1$W3#xL?FTgf9;P^*=+` zXxyBvK6a+b3(|BN4Y_Ko9TWP|M71P#I=Uv4e6A%erzt($T}U@ z2+p9UVrozhq6d{p09s9zTefQ|4BCL>7n#kOyO0gV zYL~=r9CGKW`(pWs6^Ls=J;;V$?kxgEyl#wF%X^9?*lJemP&atcp~?c#heaH8W`ah4s$gJ^#q# zhlJ;)UA4Chzq!1&qjmS6s^8WAIDX)sGlKQA1Lm)+bIHb?ue|cTJ00@DcmH~goc`v+ zJMTO2^6f7@`Eh^x_>Lb={&xN|A3nW(E%wRU*M9fd?$+Mo+7oa7W8c#U|9tV=Pfoq_ zTI=gCJbLNn&pon+-nzVY?AcHJ+p_kFZ(I}JcyUTu`srQKU4MV@%87fmmws^jb9a5| z?hD_!aL??yU3a{>|Mw>zTl)NkPe1#OEAQ_4+y09aPk;2e^WWcnb>FXdf3|wYS^mk7 z|9P9g_|-$#ZgLN4Q%+Fwj{o8-+96L>0{!YxT-_ zI#o#?s%8uMOfo~pQ-vhSWThmjW@`nhJdp4=6@eRn!qR9kYLYC1*Q02jfScrC7T7Sr z_L<4%_?S1CW!2-y|8@PDuUy?3jeaP4TlD?=UmqVCsXuxhJs%x?VaKSyXV0tF!_HHC zpIIAmpL*@SFOcfvU%dJbL2qA*jf_NIz4(FBjp%qxaaq>|JhFtO@-Uy*rs_g$oZtJk zuHNFU_lToG^B2}({qMB5&>G>qunhgAsV+&o;iRL?Sn$9jjT|MpVIaI-LfN*J;S4;Kx!x!+!vWF(OC+ From 719529bdb49e0b6895e058e91547d0b0731d857c Mon Sep 17 00:00:00 2001 From: Patrick Ullmann Date: Wed, 7 Oct 2026 20:24:48 +0200 Subject: [PATCH 5/6] FIX (readme): workflow sample related to pdfmt-workflows --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f941b7..0653e13 100644 --- a/README.md +++ b/README.md @@ -225,7 +225,7 @@ With a workflow, all of that can become: pdfmt workflow run scan-duplex adf output.pdf ``` -A workflow is simply an executable shell script: +A workflow is simply an executable shell script like this one, a simplified version of `scan-duplex` from the official [pdfmt-workflows](https://github.com/eifelcode/pdfmt-workflows) repository (see also pre-defined workflows below): ```bash #!/usr/bin/env bash From 3af96c5046d56ab27afcf8119d32e364a3527925 Mon Sep 17 00:00:00 2001 From: Patrick Ullmann Date: Wed, 7 Oct 2026 22:12:36 +0200 Subject: [PATCH 6/6] ADD (readme): samples for ocr --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0653e13..3bcc984 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ **pdfmt** is a command-line toolkit for the PDF tasks you keep doing again and again. -Merge PDFs. Split them. Extract pages. Reorder documents. Scan from your scanner. Add stamps. And when a task becomes repetitive, turn it into a reusable workflow. +Merge PDFs. Split them. Extract pages. Reorder documents. Scan from your scanner and OCR them. Add stamps. And when a task becomes repetitive, turn it into a reusable workflow. No GUI required. No cloud upload required. Just your PDFs, your terminal, and the tools you already use. @@ -27,11 +27,12 @@ Working with PDFs often means reaching for a different tool for every little tas * "I scanned the front and back separately. Now I need to put them back together." * "I need to merge these five documents." * "I need to add a processed stamp." +* "I need to OCR my documents." * "I have to do this every week." `pdfmt` is designed for exactly these situations. -Instead of remembering a collection of different commands and tools, you can use one interface: +Instead of remembering a collection of different commands, options, pipes and tools, you can use one interface: ```bash pdfmt [arguments] @@ -193,6 +194,20 @@ Here, page 1 becomes part of every resulting PDF. --- +### Add an OCR text layer to a PDF document + +If you have scanned documents, you can simply add an OCR text layer and then search for text within those PDFs: + +```bash +# add the OCR text layer +pdfmt ocr add file-without-ocr.pdf file-with-ocr.pdf + +# show the OCR text layer (to use with grep) +pdfmt ocr show file-with-ocr.pdf +``` + +--- + ### Mark an invoice as processed You received an invoice as a PDF and want to mark it as processed: