Есть ли способ поиска 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
и, таким образом, предоставляет «мощь grep», предназначенную только для PDF-файлов. Это включает в себя общие параметры grep, такие как --recursive
, --ignore-case
или --color
.
В отличие от pdftotext | grep
pdfgrep может выводить номер страницы соответствия быстрым способом и обычно быстрее, когда не нужно искать весь документ (например, --max-count
или --quiet
).
Основное использование:
pdfgrep PATTERN FILE..
где PATTERN
ваша строка поиска и FILE
список имен файлов (или подстановочные знаки в оболочке).
Смотрите man-страницу для получения дополнительной информации.
Нет.
PDF состоит из кусков данных, некоторые из которых текстовые, некоторые из них рисунки, а некоторые из них действительно волшебно причудливые XYZ (например, файлы .u3d). Эти фрагменты в большинстве случаев сжимаются (например, flat, проверьте http://www.verypdf.com/pdfinfoeditor/compression.htm ). Для того, чтобы 'grep' .pdf, вы должны обратить сжатие или извлекать текст.
Вы можете сделать это либо для каждого файла с помощью таких инструментов, как pdf2text
и grep результата, либо запустить 'indexer' (посмотрите на xapian.org или lucene ), который создает индекс для поиска из ваших файлов .pdf, а затем вы можете использовать поиск инструменты движка этого индексатора для получения содержимого PDF.
Но нет, вы не можете grep
pdf файлы и надеяться на надежные ответы без предварительного извлечения текста.
pdfgrep
существование (см. Выше), плоское «нет» неверно.
Вы могли бы передать это 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
Перейдите в вашу папку, содержащую ваш 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
и затем делать это с помощью grep pdftotext
. Grepping pdf без какого-либо преобразования не является практическим подходом, так как PDF
это в основном двоичный формат.
В каталоге:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
или в каталоге и его подкаталогах:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Кроме того, поскольку некоторые из них pdf
являются сканированием, они должны быть сначала OCRed. Я написал довольно простой способ поиска по всем PDF-файлам, которые не могут быть 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
затем перечислите все не доступные для поиска PDF-файлы в каталоге:
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