Чи є спосіб пошуку файлів PDF, використовуючи силу grep, не перетворюючи спочатку текст у Ubuntu?
Чи є спосіб пошуку файлів PDF, використовуючи силу grep, не перетворюючи спочатку текст у Ubuntu?
Відповіді:
Встановіть пакет pdfgrep
, а потім скористайтеся командою:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
———————
Найпростіший спосіб
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
також має рекурсивний прапор. Так що ця відповідь може можливо бути зменшена до: pdfgrep -R pattern /path/
. Хоча це може бути менш ефективно, якщо він проходить через кожен файл, навіть якщо це не PDF. І я зауважую, що у нього є проблеми з міжнародними персонажами, такими як å, ä і ö.
-n
варіант є профілем для pdfgrep, оскільки дозволяє включити номер сторінки у висновок (може бути корисним для подальшої обробки).
pattern
? Що {}
? Що стосується `+ '? Я не маю уявлення після першого читання ... так що я переходжу до сторінки, на яку я йду.
Якщо ви poppler-utils
встановили (за замовчуванням на Ubuntu Desktop), ви можете "перетворити" його на льоту та передати його на grep
:
pdftotext my.pdf - | grep 'pattern'
Це не створить .txt файл.
pdftotext
- це ім'я файлу, до якого він повинен писати. Однак, за умовою, інструменти, як правило, дозволяють писати stdout
в файл -
замість файлу, вказуючи замість нього. Аналогічно, деякі інструменти писатимуть stdout
за замовчуванням, якщо ви повністю опустите такий аргумент (але це не завжди можливо без створення неоднозначності).
pdfgrep був написаний саме для цієї мети і доступний в Ubuntu.
Він намагається бути в основному сумісним grep
і, таким чином, забезпечує "силу грепу", спеціалізовану лише для PDF-файлів. Це включає в себе загальні варіанти grep, такі як --recursive
, --ignore-case
або --color
.
На відміну від pdftotext | grep
pdfgrep може виводити номер сторінки відповідності якісно, і, як правило, швидше, коли не потрібно шукати весь документ (наприклад, --max-count
або --quiet
).
Основне використання:
pdfgrep PATTERN FILE..
де PATTERN
ви шукаєте рядок пошуку та FILE
список імен файлів (або макіяжів у оболонці).
Дивіться довідкову сторінку для більш докладної інформації.
Немає.
PDF складається з фрагментів даних, деякі з них тексту, деякі з них зображень, а деякі з них справді магічні фантазії XYZ (наприклад, файли .u3d). Ці шматки в більшості випадків стискаються (наприклад, плоскі, перевірте http://www.verypdf.com/pdfinfoeditor/compression.htm ). Для того, щоб 'grep' .pdf, ви повинні скасувати стиснення ака вилучити текст.
Ви можете зробити це або в файл з допомогою інструментів , таких як pdf2text
і Grep результат, або ви запускаєте «індексатор» (дивитися на xapian.org або Lucene ) , який будує індекс для пошуку з ваших файлів .pdf , а потім ви можете використовувати пошук інструменти двигуна цього індексатора, щоб отримати вміст pdf.
Але ні, ви не можете grep
pdf-файли і сподіватися на надійні відповіді, не витягуючи текст спочатку.
pdfgrep
існує (див. Вище), плоське "ні" є неправильним.
Відновлення може шукати PDF-файли. Він не підтримує регулярні вирази, але в ньому є багато інших варіантів пошуку, тому він може відповідати вашим потребам.
Ви можете передати це через strings
перше: -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, вам не потрібноcat
strings
або grep
.
Погляньте на загальний ресурс grep tool crgrep, який підтримує пошук у файлах PDF.
Він також дозволяє здійснювати пошук інших ресурсів, таких як вміст, вкладений в архіви, таблиці баз даних, метадані зображення, залежність файлів POM та веб-ресурси - і їх комбінації, включаючи рекурсивний пошук.
спробуйте це
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
для друку рядків візерунок виникає всередині pdf
CD у свою папку, що містить ваш pdf-файл, а потім ..
pdfgrep 'pattern' your.pdf
або якщо ви хочете шукати в більш ніж одному pdf-файлі (наприклад, у всіх pdf-файлах у вашій папці)
pdfgrep 'pattern' `ls *.pdf`
або
pdfgrep 'pattern' $(ls *.pdf)
ls
ідею як вхід для інших команд . Просто pdfgrep 'pattern' *.pdf
достатньо
У 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
Я припускаю, що ви маєте на увазі 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 {}
Якщо ви просто хочете шукати назви / властивості 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