Ubuntuで最初にテキストに変換せずに、grepの力を使用してpdfファイルを検索する方法はありますか?
Ubuntuで最初にテキストに変換せずに、grepの力を使用してpdfファイルを検索する方法はありますか?
回答:
パッケージをインストールしてから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デスクトップのデフォルト)、その場で「変換」してパイプすることができますgrep
:
pdftotext my.pdf - | grep 'pattern'
これは.txtファイルを作成しません。
pdftotext
は、書き込むファイル名です。ただし、通常、ツールでは、stdout
代わりにaを指定することにより、ファイルの代わりに書き込むことができます-
。同様に、stdout
このような引数を完全に省略した場合、一部のツールはデフォルトで書き込みを行います(ただし、あいまいさを生じさせない限り、これは常に可能とは限りません)。
pdfgrepはまさにこの目的のために書かれており、Ubuntuで利用可能です。
ほとんど互換性を保とうとするgrep
ため、PDF専用の「grepの力」を提供します。それは、次のような一般的な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
存在することを考慮すると(上記参照)、フラットな「no」は正しくありません。
あなたはstrings
最初にそれをパイプすることができます:-
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
、必要ありませんcat
strings
またはにあまりフレンドリーではありませんgrep
。
これを試して
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
行を印刷するために、パターンはpdf内で発生します
pdfファイルを含むフォルダーにcdしてから..
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 のフラグです。標準のgrepにはより多くの機能があるため、これはpdfgrepよりもいくらか優れています。
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
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 {}
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