4

Предположим, у меня есть каталог, полный многих PDF-файлов. В большинстве из них текст полностью доступен для поиска, как мне и нужно. Но некоторые из них - просто изображения, и они должны быть OCR-ed.

Кроме простого пакетного распознавания текста по всему каталогу, есть ли способ быстро определить, какие PDF-файлы являются только изображениями, которые на самом деле нужно обрабатывать с помощью распознавания текста?

Я не программист, но для Linux предпочтительнее решение.

2 ответа2

3

Я не уверен, что это 100% решение, но я придумал следующий сценарий, который должен помочь вам, если не весь путь, пройти большую часть пути (я не прошел спецификацию). каталог, в котором есть все PDF-файлы (он будет искать подкаталоги).

#! /bin/bash

if [[ ! "$#" = "1" ]]
  then
      echo "Usage: $0 /path/to/PDFDirectory"
      exit 1
fi

PDFDIRECTORY="$1"

while IFS= read -r -d $'\0' FILE; do
    PDFFONTS_OUT="$(pdffonts "$FILE" 2>/dev/null)"
    RET_PDFFONTS="$?"
    FONTS="$(( $(echo "$PDFFONTS_OUT" | wc -l) - 2 ))"
    if [[ ! "$RET_PDFFONTS" = "0" ]]
      then
          READ_ERROR=1
          echo "Error while reading $FILE. Skipping..."
          continue
    fi
    if [[ "$FONTS" = "0" ]]
      then
          echo "NOT SEARCHABLE: $FILE"
      else
          echo "SEARCHABLE: $FILE"
    fi
done < <(find "$PDFDIRECTORY" -type f -name '*.pdf' -print0)

echo "Done."
if [[ "$READ_ERROR" = "1" ]]
  then
      echo "There were some errors."
fi

Это работает, ища количество шрифтов, указанных в каждом PDF. Если файл не имеет каких-либо шрифтов, предполагается, что он состоит только из изображения. (Это может привести к сбоям в файлах, защищенных паролем, я понятия не имею, проверять не нужно). Если есть что-то, что можно искать, и что-то, например, изображение, это не сработает, но, вероятно, будет полезно отделить отсканированные изображения с документами в контейнере PDF от "настоящих" PDF.

Конечно, вы можете закомментировать часть цикла if-then-else, которая не применяется, если вы хотите распечатать только те файлы, которые не доступны для поиска.

2

Я буду использовать трюк, это особенный вторичный факт, который я заметил, если у файла pdf нет шрифта, он обычно не доступен для поиска. Зная это, мы можем использовать pdffonts .

Первые 2 строки pdffonts - это заголовок таблицы, поэтому, когда файл доступен для поиска, выводится более двух строк, зная это, мы можем создать:

gedit check_pdf_searchable.sh

затем вставьте это

#!/bin/bash 
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi

затем сделайте его исполняемым

chmod +x check_pdf_searchable.sh

затем перечислите все не доступные для поиска PDF-файлы в каталоге:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}

или в каталоге и его подкаталогах:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .