Як я можу зібрати файли у форматі 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.