Як шукати вміст кількох файлів у форматі PDF?


226

Як я міг шукати вміст файлів PDF у каталозі / підкаталозі? Я шукаю деякі інструменти командного рядка. Здається, що grepне можна шукати файли PDF.


5
Grep не працюватиме, оскільки PDF - це двійковий формат, а текст часто стискається чи кодується різними способами.
позначте Стефана

4
Ось рішення GUI: Adobe Reader, див. Wikispaces.psu.edu/display/training/…
Мартін Тома


3
Adobe Reader працює нормально, але він не індексує; тому якщо у вас багато файлів, це буде повільно. Будь-яке рішення щодо індексації?
Рубі

Відповіді:


211

Ваш дистрибутив повинен надати утиліту під назвою pdftotext:

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

"-" необхідно мати вихід pdftotext для stdout, а не для файлів. Параметри --with-filenameта --label=параметри додадуть ім'я файлу у виведення grep. Необов’язковий --colorпрапор є приємним і вказує греп для виведення кольорів за допомогою терміналу.

(В Ubuntu pdftotextпередбачено пакетом xpdf-utilsабо poppler-utils.)

Цей метод, використовуючи pdftotextта grep, має перевагу перед тим, pdfgrepякщо ви хочете використовувати функції GNU, grepякі pdfgrepне підтримують. Примітка : pdfgrep-1.3.x підтримує -Cопцію для друку рядка контексту.


1
@Kurt Pfeifle Зроблена вами редагування "(Редагувати -kp-)" не працює, оскільки grepфільтрує надруковані імена файлів.
Рафаель Аренс

@sjr ні, хоча pdfgrepрішення добре для дійсно швидких і простих пошуків, часто я хочу отримати певний контекст, оскільки один рядок буде недостатньо корисним - так як я додав до цієї відповіді: Наприклад, ви можете додати опція -C5 перед "вашим шаблоном", щоб до результату включити 5 рядків контексту - pdfgrep це не підтримує
Colin D Bennett

о, це здорово, радий знати, що в цьому є переваги, хоча для більшості людей це набагато менш очевидно, ніж це робиться
sjr

2
@sjr Тільки для запису: я використовую Ubuntu 12.10 і pdfgrepмарний, він повідомляє про величезну кількість сміття у файлах, з якими він не може працювати. Ваше рішення з іншого боку допомогло. Тому, будь ласка, не видаляйте її, навіть через 3 роки це все ще корисно!
Алі

Мені вдалося використовувати його також у cygwin, хоча для того, щоб зробити його функцією з параметром, я повинен був зробити так, щоб "your_pattern" став "$ 1"
Кошмар

214

Існує pdfgrep , який робить саме те, що пропонує його назва.

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

Я використовував його для простих пошуків, і він працював чудово.

(Є пакети в Debian, Ubuntu та Fedora.)

Оскільки версія 1.3.0 pdfgrep підтримує рекурсивний пошук. Ця версія доступна в Ubuntu з Ubuntu 12.10 (Quantal).


1
Від Natty (Ubuntu 11.04) вгору (Див. Пакети.ubuntu.com/… )
Мартін Тома

2
@pavon pdfgrepтепер має таку можливість рекурсії, включаючи -Rтакож слідування за посиланнями
Tobias Kienzler

30

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

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


1
@Glutanimate Це допоможе (і мені, можливо, і іншим), якщо ви можете додати приклад, що стосується оригінального запитання (інструмент командного рядка для пошуку декількох PDF-файлів): Я також хотів би дізнатися, як виконати пошук підстановки та як шукати поточний каталог , включаючи всі підкаталоги . Як би це виглядало recoll / xapianв командному рядку (не-GUI)? Дякую!
горіх про natty

@ LeszekŻarna Можливо, ви могли б опублікувати тестований приклад?
горіх про natty

Посібник recoll користувача може містити деякі покажчики, але пропонує досить технічне та "поза темою" прочитання ...
nutty про natty

1
@nutty: recll -t -q dir: pwdext: pdf 'neuro *' - stackoverflow з'їв основи навколо pwd.
medoc

13

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

pdfgrep -HiR 'pattern' /path

При виконанні pdfgrep --help:

  • Н: Надрукуйте ім'я файлу для кожної відповідності.
  • i: Ігноруйте відмінності випадків.
  • R: Пошук каталогів рекурсивно.

Він добре працює на моєму Ubuntu.


7

Я зробив цей руйнівний невеликий сценарій. Повеселіться з цим.

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
}

2
+1. Але замість цього $filename.вам слід це зробити grep.
Рафаель Аренс

3

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

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

цікавий момент щодо xargsможливості паралельної обробки. Зауважте, що ваш --labelпараметр-аргумент буде буквально {} , оскільки grepкоманда вже не виконується в контексті finds exec.
mklement0

2

У мене була така ж проблема, і тому я написав сценарій, який шукає рядки у всіх PDF-файлах у вказаній папці та друкує PDF-файли, які відповідають рядку запиту.

Можливо, це вам буде корисно.

Завантажити його можна тут


може бути корисно поставити сценарій у коментарі?
baxx

Я спробував ваш сценарій, і він виявляється набагато повільніше, ніж pdfgrepоднолінійне рішення або sjr, і це дозволило мені продовжувати процес, використовуючи 100% потоку процесора навіть після того, як я Ctrl-C припинив його.
Джейсон

2

Якщо ви хочете побачити імена файлів з pdftotext, використовуйте наступну команду:

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

2

Існує ще одна утиліта під назвою ripgrep-all , яка заснована на ripgrep .

Він може обробляти більше, ніж просто документи PDF, як документи Office та фільми, і автор стверджує, що це швидше pdfgrep.

Синтаксис команд для рекурсивного пошуку в поточному каталозі, а другий обмежує лише файли PDF:

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

1

Існує з відкритим вихідним кодом загальний ресурс Grep інструмент crgrep , який виконує пошук в PDF - файлах , але і інші ресурси , такі як зміст вкладені в архіви, таблиці бази даних, зображень мета-даних, залежностей POM файлів і веб - ресурсів - і комбінації цих включаючи рекурсивний пошук.

Повний опис на вкладці Файли в значній мірі охоплює те, що інструмент підтримує.

Я розробив crgrep як інструмент із відкритим кодом.


Крейг - чи є у вас зв’язок із цим проектом? Якщо це так, ви повинні вказати це у своїй відповіді. Я говорю це тому, що ви щойно опублікували практично однакову відповідь на два інші старі питання ...
Стівен C

Оновлений пост, щоб уточнити, що я є автором групової гри
Крейг,

1

Спочатку конвертуйте всі ваші PDF-файли в текстові файли:

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

Потім використовуйте grepяк звичайне. Це особливо добре, оскільки це швидко, коли у вас є кілька запитів і багато файлів PDF.


Це робиться в поєднанні з ag github.com/ggreer/the_silver_searcher . Здатний розбирати психеделікс Gb мікросекундами. Плоскі файли на все життя
NVRM

0

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

Якщо ви використовуєте мову програмування, можливо, для цього є написані бібліотеки PDF. наприклад, http://search.cpan.org/dist/CAM-PDF/ для Perl


0

спробуйте використовувати "acroread" у простому сценарії, як описано вище

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.