BASH-скрипт для проверки PDF-файлов - PullRequest
3 голосов
/ 03 ноября 2011

Не знаю, с чего начать на самом деле

У меня есть сервер Linux с более чем 8000 PDF, и мне нужно знать, какие PDF-файлы были созданы, а какие нет.

Думал, что это какой-то скрипт, вызывающий XPDF для проверки pdf, но, честно говоря, не уверен, что это возможно

Заранее благодарен за любую помощь

Ответы [ 2 ]

4 голосов
/ 04 ноября 2011

Убедитесь, что у вас установлен инструмент командной строки pdffonts.(Существует две версии этого: одна поставляется как часть xpdf-utils, другая - как часть poppler-utils.)

Все PDF-файлы, которые состоят только из отсканированных страниц, не будут использовать никаких шрифтов (ни встроенные, ни внедренные).

В командной строке

pdffonts /path/to/scanned.pdf

будет не отображать информацию о шрифте для этого файла.

Этого может быть достаточно, чтобы разделить файлы на два разных набора.

Если у вас есть PDF-файлы, в которых есть отсканированные страницы и «обычные» страницы (или отсканированные и обработанные страницы), вам придется расширить и уточнить вышеупомянутый упрощенный подход.См. man pdffonts или pdffonts --help для получения дополнительной информации.

2 голосов
/ 26 февраля 2013

Проблема с pdffonts в том, что иногда он ничего не возвращает, например:

name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------

И иногда это возвращает:

name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
[none]                               Type 3            yes no  no     266  0
[none]                               Type 3            yes no  no       9  0
[none]                               Type 3            yes no  no     297  0
[none]                               Type 3            yes no  no     341  0
[none]                               Type 3            yes no  no     381  0
[none]                               Type 3            yes no  no     394  0
[none]                               Type 3            yes no  no     428  0
[none]                               Type 3            yes no  no     441  0
[none]                               Type 3            yes no  no     451  0
[none]                               Type 3            yes no  no     480  0
[none]                               Type 3            yes no  no     492  0
[none]                               Type 3            yes no  no     510  0
[none]                               Type 3            yes no  no     524  0
[none]                               Type 3            yes no  no     560  0
[none]                               Type 3            yes no  no     573  0
[none]                               Type 3            yes no  no     584  0
[none]                               Type 3            yes no  no     593  0
[none]                               Type 3            yes no  no     601  0
[none]                               Type 3            yes no  no     644  0

Имея это в виду, давайте напишем небольшой текстовый инструмент, чтобы получить все шрифты из pdf:

pdffonts my-doc.pdf | tail -n +3 | cut -d' ' -f1 | sort | uniq

Если ваш pdf не OCR, он ничего не выведет или [none].

Если вы хотите, чтобы он работал быстрее, используйте флаг -l только для анализа, скажем, первых 5 страниц:

pdffonts -l 5 my-doc.pdf | tail -n +3 | cut -d' ' -f1 | sort | uniq

Теперь оберните его в скрипт bash, например is-pdf-ocred.sh

#!/bin/bash
MYFONTS=$(pdffonts -l 5 "$1" | tail -n +3 | cut -d' ' -f1 | sort | uniq)
if [ "$MYFONTS" = '' ] || [ "$MYFONTS" = '[none]' ]; then
    echo "NOT OCR'ed: $1"
else 
    echo "$1 is OCR'ed."
fi 

Наконец, мы хотим иметь возможность искать PDF-файлы. Команда find не знает о ваших псевдонимах или функциях в .bashrc, поэтому нам нужно указать путь к сценарию. Запустите его в выбранном вами каталоге так:

find . -type f -name "*.pdf" -exec /path/to/my/script/is-pdf-ocred.sh '{}' \;

Я предполагаю, что pdf файлы заканчиваются на .pdf, хотя это не всегда предположение, которое вы можете сделать. Вы, вероятно, захотите передать его в меньший поток или вывести в текстовый файл:

find . -type f -name "*.pdf" -exec /path/to/my/script/is-pdf-ocred.sh '{}' \; | less
find . -type f -name "*.pdf" -exec /path/to/my/script/is-pdf-ocred.sh '{}' \; > pdfs.txt

Мне удалось сделать около 200 PDF-файлов за чуть более 10 секунд, используя флаг -l 5.

...