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


135

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


1
いくつかの有用な結果を得るためには、pdf2textを解析する必要があると思います...-
ヨハン


1
検索を介してここに来る人々のために:あなたが最初にそれをテキストファイルに変換することをいとわないならば、複数のpdfファイルの内容を検索
マーティントーマ

回答:


135

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

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

——————

簡単な方法は

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

5
これはmac osx(Mavericks)でも機能します。brewを使用してインストールします。シンプル。ありがとう。
mikiemorales 14年

7
好奇心からpdfgrepのソースを確認し、popplerを使用してpdfから文字列を抽出しました。おそらくドキュメント全体ではなく、ページ単位でのみ@wagの答えとほぼ同じです。
アンドリューマーティン14

4
pdfgrep再帰フラグもあります。したがって、この答えはおそらく次のようになりますpdfgrep -R pattern /path/。ただし、PDFでなくてもすべてのファイルを処理すると効果が低下する場合があります。また、å、ä、öなどの国際文字に問題があることに気付きました。
ロバニオン

1
実際、この-nオプションは、出力にページ番号を含めることができるため、pdfgrepの長所です(さらなる処理に役立つ場合があります)。
JepZ

4
この答えは、コマンドのどのビットが文字通りコピーされることを意図しており、どれがプレースホルダーであるかを説明していれば、使いやすいでしょう。なにpattern?なに{}?`+`はどうなっていますか?私は最初に読んだときにわからない...だから私は行くマンページに、私は思う。
マークアメリー

56

poppler-utilsインストール済みの場合(Ubuntuデスクトップのデフォルト)、その場で「変換」してパイプすることができますgrep

pdftotext my.pdf - | grep 'pattern'

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


1
... grepする前にテキストを抽出します。つまり、答えは「いいえ」です。
アキラ

18
@akira OPは、おそらく「ビューアでPDFを開いてテキストにエクスポートすることなく」を意味した
Michael Mrozek

5
@akira「grepのみ」はどこに表示されますか?
マイケルMrozek

6
@akiraまあ、私は彼がおそらく意味することをすでに言った。彼はそれを処理する前にテキストにエクスポートしたくない。私は非常に疑問彼がに問題がある任意のいずれかの方法でテキストに変換し、コマンドを。しない理由はありません
マイケルMrozek

2
@sherrellbcの2番目の引数pdftotextは、書き込むファイル名です。ただし、通常、ツールでは、stdout代わりにaを指定することにより、ファイルの代わりに書き込むことができます-。同様に、stdoutこのような引数を完全に省略した場合、一部のツールはデフォルトで書き込みを行います(ただし、あいまいさを生じさせない限り、これは常に可能とは限りません)。
ヨースト

11

pdfgrepはまさにこの目的のために書かれており、Ubuntuで利用可能です。

ほとんど互換性を保とうとするgrepため、PDF専用の「grepの力」を提供します。それは、次のような一般的なgrepのオプションが含まれ--recursive--ignore-caseまたは--color

対照的にpdftotext | grep、pdfgrepは一致するページ番号をパフォーマンスの高い方法で出力でき、ドキュメント全体(--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のコンテンツを取得するためのインデクサーのエンジンツール。

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


5
pdfgrep存在することを考慮すると(上記参照)、フラットな「no」は正しくありません。
ジョナサンクロス

6

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


5

あなたはstrings最初にそれをパイプすることができます:-

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

8
使用するだけでstrings file.pdf | grep <...>、必要ありませんcat
プネヘヘ

ええ-私の心はストリームでうまく機能しているようです... :
アンディスミス

12
ほとんどの場合、テキストが圧縮されていると機能しません。
アキラ

6
テキストが圧縮されていない場合でも、一般的には文章の一部であり(必ずしも単語全体ではありません!)、フォーマット情報と細かく混在しています。stringsまたはにあまりフレンドリーではありませんgrep
ジャンダー

これに文字列を使用しても機能しない別の理由を考えることができますか?文字列を使用すると、一部のPDFでは機能するが他のPDFでは機能しないことがわかりました。
hourback

3

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

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


2

これを試して

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

行を印刷するために、パターンはpdf内で発生します


2

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

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-filenamegrep のフラグです。標準のgrepにはより多くの機能があるため、これはpdfgrepよりもいくらか優れています。

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、に変換してからでgrepできるということ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にする必要があります。grep編集できないすべてのpdfを検索してOCRする非常に簡単な方法を書きました。

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

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

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

Gnomeを使用している場合、gpdfが必要な場合があります。Gnomeを使用していない場合は、これを確認してください。CLI pdfビューアーのリストがあります。次にgrep、いくつかのパターンを見つけるために使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.