Як я можу зібрати файли у форматі PDF?


135

Чи є спосіб пошуку файлів PDF, використовуючи силу grep, не перетворюючи спочатку текст у Ubuntu?


1
Я думаю, вам потрібно проаналізувати його pdf2text, щоб отримати якісь корисні результати ...
Йоган


1
Для людей, які приїжджають сюди за допомогою пошуку: Якщо ви готові спершу перетворити його в текстові файли, ознайомтеся з розділом Як шукати вміст кількох файлів PDF?
Мартін Тома

Відповіді:


135

Встановіть пакет pdfgrep, а потім скористайтеся командою:

find /path -iname '*.pdf' -exec pdfgrep pattern {} +

———————

Найпростіший спосіб

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 

5
Це працює і в mac osx (Mavericks). Встановіть його за допомогою варіння. Простий. Дякую.
mikiemorales

7
З цікавості я перевірив джерело pdfgrep, і він використовує poppler для витягування рядків з pdf. Майже точно так само, як відповідь @ wag лише на сторінках, а не, імовірно, на весь документ.
Ендрю Мартін

4
pdfgrepтакож має рекурсивний прапор. Так що ця відповідь може можливо бути зменшена до: pdfgrep -R pattern /path/. Хоча це може бути менш ефективно, якщо він проходить через кожен файл, навіть якщо це не PDF. І я зауважую, що у нього є проблеми з міжнародними персонажами, такими як å, ä і ö.
Рованіон

1
Насправді, цей -nваріант є профілем для pdfgrep, оскільки дозволяє включити номер сторінки у висновок (може бути корисним для подальшої обробки).
JepZ

4
Ця відповідь була б простішою у використанні, якби вона пояснила, які біти команди мають бути скопійовані буквально та які заповнювачі. Що pattern? Що {}? Що стосується `+ '? Я не маю уявлення після першого читання ... так що я переходжу до сторінки, на яку я йду.
Марк Амері

56

Якщо ви poppler-utilsвстановили (за замовчуванням на Ubuntu Desktop), ви можете "перетворити" його на льоту та передати його на grep:

pdftotext my.pdf - | grep 'pattern'

Це не створить .txt файл.


1
так .. ви витягуєте текст перед тим, як зіткнути його, що означає, що відповідь "ні".
акіра

18
@akira ОП, ймовірно, означало "без відкриття PDF у глядачах та експорту до тексту"
Michael Mrozek

5
@akira Де ви бачите "тільки греп"?
Михайло Мрозек

6
@akira Ну, я вже сказав те, що, напевно, мав на увазі; він не хоче експортувати текст перед його обробкою. Я дуже сумніваюся, що у нього є проблеми з будь-якою командою, яка будь-яким чином перетворюється на текст; немає причин цього не робити
Майкл Мрозек

2
@sherrellbc Другий аргумент pdftotext- це ім'я файлу, до якого він повинен писати. Однак, за умовою, інструменти, як правило, дозволяють писати stdoutв файл -замість файлу, вказуючи замість нього. Аналогічно, деякі інструменти писатимуть stdoutза замовчуванням, якщо ви повністю опустите такий аргумент (але це не завжди можливо без створення неоднозначності).
Joost

11

pdfgrep був написаний саме для цієї мети і доступний в Ubuntu.

Він намагається бути в основному сумісним grepі, таким чином, забезпечує "силу грепу", спеціалізовану лише для PDF-файлів. Це включає в себе загальні варіанти grep, такі як --recursive, --ignore-caseабо --color.

На відміну від pdftotext | greppdfgrep може виводити номер сторінки відповідності якісно, ​​і, як правило, швидше, коли не потрібно шукати весь документ (наприклад, --max-countабо --quiet).

Основне використання:

pdfgrep PATTERN FILE..

де PATTERNви шукаєте рядок пошуку та FILEсписок імен файлів (або макіяжів у оболонці).

Дивіться довідкову сторінку для більш докладної інформації.


7

Немає.

PDF складається з фрагментів даних, деякі з них тексту, деякі з них зображень, а деякі з них справді магічні фантазії XYZ (наприклад, файли .u3d). Ці шматки в більшості випадків стискаються (наприклад, плоскі, перевірте http://www.verypdf.com/pdfinfoeditor/compression.htm ). Для того, щоб 'grep' .pdf, ви повинні скасувати стиснення ака вилучити текст.

Ви можете зробити це або в файл з допомогою інструментів , таких як pdf2textі Grep результат, або ви запускаєте «індексатор» (дивитися на xapian.org або Lucene ) , який будує індекс для пошуку з ваших файлів .pdf , а потім ви можете використовувати пошук інструменти двигуна цього індексатора, щоб отримати вміст pdf.

Але ні, ви не можете greppdf-файли і сподіватися на надійні відповіді, не витягуючи текст спочатку.


5
Зважаючи на те, що pdfgrepіснує (див. Вище), плоське "ні" є неправильним.
Джонатан Крос

6

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


5

Ви можете передати це через stringsперше: -

cat file.pdf | strings | grep <...etc...>

8
Просто використовуйте strings file.pdf | grep <...>, вам не потрібноcat
phunehehe

Так - мій погляд, здається, краще працює зі потоками ... :-)
Енді Сміт

12
не буде працювати, якщо текст стискається, що це більшість випадків.
акіра

6
Навіть якщо текст нестиснений, він, як правило, невеликі фрагменти речень (навіть не обов'язково цілі слова!) Тонко переплетені з інформацією про форматування. Не дуже дружні до stringsабо grep.
Джандер

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

3

Погляньте на загальний ресурс grep tool crgrep, який підтримує пошук у файлах PDF.

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


2

спробуйте це

find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
    pdftotext "$i" - | grep pattern; done

для друку рядків візерунок виникає всередині pdf


2

CD у свою папку, що містить ваш pdf-файл, а потім ..

pdfgrep 'pattern' your.pdf

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

pdfgrep 'pattern'  `ls *.pdf`

або

pdfgrep 'pattern' $(ls *.pdf)

чому на землі ви використовуєте ls для встановлення імен файлів у параметри? Не тільки повільніше, але й погано використовуватиls ідею як вхід для інших команд . Просто pdfgrep 'pattern' *.pdfдостатньо
phuclv

1

У StackOverflow є повторне запитання. Люди, які пропонують там, пропонують різні варіанти harish.venkarts:

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

Перевага перед подібною відповіддю тут - --with-filenameпрапор grep. Це дещо перевершує і pdfgrep, оскільки стандартний grep має більше функцій.

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files


Я думаю, було б краще залишити це як коментар (або редагувати) у аналогічній відповіді, на яку ви посилаєтесь.
Бернхард

0

Ось швидкий скрипт для пошуку pdf у поточному каталозі:

#!/bin/bash

if [ $# -ne 1 ]; then
  echo "usage $0 VALUE" 1>&2
  exit 1
fi

echo 'SEARCH IS CASE SENSITIVE' 1>&2

find . -name '*.pdf' -exec /bin/bash -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"' $1 \;

0

Я припускаю, що ви маєте на увазі tp не конвертувати його на диску, ви можете конвертувати їх, stdoutа потім поздоровити pdftotext. Збирання PDF без будь-якого перетворення не є практичним підходом, оскільки PDFце здебільшого двійковий формат.

У довіднику:

ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {}  - | grep "keyword"

або в каталозі та його підкаталогах:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {}  - | grep "keyword"

Крім того, оскільки деякі - pdfце сканування, їх потрібно спочатку OCRed. Я написав досить простий спосіб пошуку всіх файлів pdfs, які неможливо grepвідредагувати, та їх OCR.

Я помітив, якщо у 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

потім перелічіть усі файли pdfs, які не можна шукати, у каталозі:

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

або в каталозі та його підкаталогах:

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

0

Якщо ви просто хочете шукати назви / властивості pdf ... або прості рядки, які не стискаються та не кодуються, то замість stringsвас можна скористатися наведеним нижче

grep -a STRING file.pdf
cat -v file.pdf | grep STRING

Від grep --help:

      --binary-files=TYPE   assume that binary files are TYPE;
                            TYPE is 'binary', 'text', or 'without-match'
  -a, --text                equivalent to --binary-files=text

і cat --help:

  -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB

0

gpdf може бути те, що вам потрібно, якщо ви використовуєте Gnome! Перевірте це, якщо ви не використовуєте Gnome. У ньому є список глядачів PDF у форматі CLI. Тоді ви можете скористатися, grepщоб знайти якийсь візерунок.

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