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

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

Ответ 1

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

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

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

(В Ubuntu pdftotext предоставляется пакет xpdf-utils или poppler-utils.)

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

Ответ 2

Существует pdfgrep, что делает то, что предлагает его название.

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

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

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

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

Ответ 3

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

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

Ответ 4

Моя фактическая версия pdfgrep (1.3.0) позволяет:

pdfgrep -HiR 'pattern' /path

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

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

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

Ответ 5

Я сделал этот деструктивный маленький script. Получайте удовольствие от этого.

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

Ответ 6

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

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

Ответ 7

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

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

Вы можете скачать его здесь

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

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

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

Ответ 11

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

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

Ответ 12

Существует еще одна утилита под названием ripgrep-all, основанная на ripgrep.

Он может обрабатывать не только документы PDF, например документы и фильмы Office, и автор утверждает, что это быстрее, чем pdfgrep.

Синтаксис команды для рекурсивного поиска в текущем каталоге, а второй ограничивается только файлами PDF:

rga 'pattern' .
rga --type pdf 'pattern' .

Ответ 13

попробуйте использовать 'acroread' в простой script, как и выше