web-dev-qa-db-ja.com

PDFファイルでgrepするにはどうすればよいですか?

Ubuntuで最初にテキストに変換せずに、grepの機能を使用してPDFファイルを検索する方法はありますか?

160
Dervin Thunk

パッケージpdfgrepをインストールしてから、次のコマンドを使用します。

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

——————

それを行う最も簡単な方法:

pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf 
164
enzotib

あなたが持っている場合 poppler-utilsインストール済み(Ubuntuデスクトップのデフォルト)、オンザフライで「変換」してgrepにパイプできます:

pdftotext my.pdf - | grep 'pattern'

これは.txtファイルを作成しません。

63
wag

pdfgrep はまさにこの目的のために作成され、Ubuntuで使用できます。

これはgrepとほとんど互換性があるようにしており、PDF専用の「grepの機能」を提供します。これには、--recursive--ignore-case--colorなどの一般的なgrepオプションが含まれます。

pdftotext | grepとは対照的に、pdfgrepは一致するページ番号をパフォーマンスの高い方法で出力でき、ドキュメント全体を検索する必要がない場合は一般により高速です(例:--max-countまたは--quiet )。

基本的な使用法は次のとおりです。

pdfgrep PATTERN FILE..

ここで、PATTERNは検索文字列で、FILEはファイル名(またはシェルではワイルドカード)のリストです。

詳細は manpage を参照してください。

16
hpdeifel

番号。

PDFはデータのチャンクで構成され、一部はテキスト、一部は画像、一部は本当に魔法のような豪華なXYZ(例:.u3dファイル)です。これらのチャンクはほとんどの場合圧縮されています(例:フラット、チェック http://www.verypdf.com/pdfinfoeditor/compression.htm )。 .pdfを 'grep'するには、圧縮を元に戻すして別名テキストを抽出します。

pdf2textなどのツールを使用してファイルごとにそれを実行し、結果をgrepするか、「インデクサー」を実行する( xapian.org または lucene を参照) ).pdfファイルから検索可能なインデックスを構築し、そのインデクサーの検索エンジンツールを使用してpdfのコンテンツを取得できます。

しかし、いいえ、最初にテキストを抽出せずにgrep pdfファイルを作成して信頼できる回答を期待することはできません。

7
akira

Recoll PDFを検索できます。正規表現はサポートしていませんが、他の多くの検索オプションがあるため、ニーズに合う可能性があります。

6
user39336

最初にstringsを介してパイプすることができます:-

cat file.pdf | strings | grep <...etc...>
4
Andy Smith

PDFファイル内の検索をサポートする共通リソースgrepツール crgrep を見てください。

また、アーカイブにネストされたコンテンツ、データベーステーブル、画像メタデータ、POMファイルの依存関係、Webリソースなどのその他のリソースや、再帰検索を含むこれらの組み合わせを検索することもできます。

3
Craig

StackOverflowに重複する質問があります。そこに住む人々はharish.venkartsの回答のバリエーションを提案しています:

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

ここでの同様の答えに対する利点は、grepの--with-filenameフラグです。標準のgrepにはより多くの機能があるため、これはpdfgrepよりもいくらか優れています。

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

2
user7610

これを試して

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

ラインを印刷するために、PDF内でパターンが発生します

2
harish.venkat

pDFファイルを含むフォルダーにcdしてから、..

pdfgrep 'pattern' your.pdf

または、複数のpdfファイル(たとえば、フォルダー内のすべてのpdfファイル)を検索する場合

pdfgrep 'pattern'  `ls *.pdf`

または

pdfgrep 'pattern' $(ls *.pdf)
2
Rasmuss Rall

現在のディレクトリで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
Nico

gnomeを使用している場合は、gpdfが必要になる場合があります。 Gnomeを使用していない場合は this を確認してください。 CLI pdfビューアのリストがあります。次に、grepを使用してパターンを検索できます。

0
Dharmit

私はあなたがtpがそれをディスク上で変換しないことを意味すると思います、あなたはそれらをstdoutに変換し、次にpdftotextでそれをgrepすることができます。 PDFはほとんどバイナリ形式であるため、PDFを変換せずに変換することは実用的な方法ではありません。

ディレクトリ:

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

またはディレクトリとそのサブディレクトリ:

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

また、一部のpdfはスキャンであるため、最初にOCRedである必要があります。私は、grepedできないすべてのPDFを検索してOCRする非常に簡単な方法を書きました。

pdfファイルにフォントがない場合、通常は検索できません。これを知っているので、pdffontsを使用できます。

pdffontsの最初の2行はテーブルヘッダーであるため、ファイルが検索可能である場合、3行以上の出力があり、これを作成できることがわかります。

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 {}
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
phuclv