Как искать содержимое нескольких файлов pdf?

Как я могу искать содержимое PDF-файлов в каталоге/подкаталоге? Я ищу некоторые инструменты командной строки. Кажется, что grep не удается найти PDF-файлы.

12 ответов


ваш дистрибутив должен предоставить утилиту под названием pdftotext:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

" - " необходимо иметь вывод pdftotext в stdout, а не в файлы. The --with-filename и --label= options поместит имя файла в вывод grep. Необязательный --color флаг хороший и говорит grep выводить с помощью цветов на терминале.

(В Ubuntu, pdftotext идет xpdf-utils или poppler-utils.)

этот метод, используя pdftotext и grep, имеет преимущество над pdfgrep если вы хотите использовать функции GNU grep это pdfgrep не поддерживает. Примечание: pdfgrep-1.3.X поддерживает -C опция для печати строки контекста.


здесь pdfgrep, который делает именно то, что предполагает его название.

pdfgrep -R 'a pattern to search recursively from path' /some/path

я использовал его для простого поиска и он работал нормально.

(есть пакеты в Debian, Ubuntu и Fedora.)

начиная с версии 1.3.0 pdfgrep поддерживает рекурсивный поиск. Эта версия доступна в Ubuntu с Ubuntu 12.10 (Quantal).


вспомните это фантастическое полнотекстовое приложение для поиска GUI для Unix / Linux, которое поддерживает десятки различных форматов, включая PDF. Он даже может передать точный номер страницы и поискового запроса программа просмотра документов и, таким образом, позволяет перейти к результату прямо из ее интерфейса.

Recoll также поставляется с жизнеспособным интерфейсом командной строки и веб-интерфейс браузера.


моя фактическая версия pdfgrep (1.3.0) позволяет следующее:

pdfgrep -HiR 'pattern' /path

при выполнении pdfgrep --help:

  • H: печать имени файла для каждого совпадения.
  • i: игнорировать различия в случаях.
  • R: рекурсивный поиск каталогов.

Он хорошо работает на моем Ubuntu.


Я сделал это деструктивные небольшой скрипт. Повеселись с ним.

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "3[34;1m// === PDF Document:3[33;1m $filename3[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i  "$filename."
        # remove it!  rm -f "$filename."
    done
}

У меня была та же проблема, и поэтому я написал сценарий, который ищет все pdf-файлы в указанной папке для строки и печатает PDF-файлы, которые соответствуют строке запроса.

возможно, это будет полезно для вас.

можно скачать здесь


Если вы хотите видеть имена файлов с pdftotext использовать следующую команду:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 

Мне нравится ответ @sjr, однако я предпочитаю xargs vs-exec. Я нахожу xargs более универсальным. Например, с -P мы можем воспользоваться несколькими процессорами, когда это имеет смысл.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"

существует общий ресурс с открытым исходным кодом grep tool crgrep который ищет в PDF-файлах, но и другие ресурсы, такие как контент, вложенный в архивы, таблицы базы данных, метаданные изображения, зависимости файлов POM и веб-ресурсы - и комбинации из них, включая рекурсивный поиск.

полное описание на вкладке "файлы" в значительной степени охватывает то, что поддерживает инструмент.

Я разработал crgrep как инструмент с открытым исходным кодом.


сначала конвертируйте все ваши pdf-файлы в текстовые файлы:

for file in *.pdf;do pdftotext "$file"; done

затем использовать grep как обычно. Это особенно хорошо, так как это быстро, когда у вас есть несколько запросов и много PDF-файлов.


вам нужны некоторые инструменты, такие как pdf2text, чтобы сначала преобразовать pdf в текстовый файл, а затем искать внутри текста. (Вы, вероятно, пропустите некоторую информацию или символы).

Если вы используете язык программирования, вероятно, для этой цели написаны библиотеки pdf. например http://search.cpan.org/dist/CAM-PDF/ для Perl


попробуйте использовать "acroread" в простом скрипте, как один выше