pdfgrep :PDF内のテキスト検索(Grep)をするツール

TOP > pdfgrep ツール


Anna Purni

概要

PDF専用のGREP検索ツールです。通常のソフトではPDF内のバイナリー化されたテキスト部分の検索は出来ません。当ツールはPDFのテキスト検索の結果を表示してくれます。

これ以降はWindows版の pdfgrep の事です。

特徴

  1. pdfgrepはGNUのgrepと互換性を持つようにしています。grepの多くのオプション(-r、-i、-n、-c)がサポートされています。
  2. 複数のPDF指定、フォルダ指定、下位フォルダ指定、除外指定での検索ができます。
  3. POSIXと同様にPerl互換正規表現(PCRE)をサポートしてます。

日本語の扱い

検索では出来ません。検索キーに2バイト文字(日本語)を使うと実行エラーになります。残念ですが。

001 >pdfgrep -nr --max-count 10 --include "A*.pdf" "注釈" 002 pdfgrep: Failed to remove accents: : Illegal byte sequence


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

但し、以下の作業を行えば検索結果に2バイト文字(日本語)は表示出来ます。

言語ファイルのインストール

① ココのサイトを開きます。そして「Poppler Encoding Data」と書かれている下に有る「poppler-data-0.4.7.tar.gz」の部分をクリックします。poppler-data-0.4.7.tar.gz ファイルがダウンロードできます。

pdfgrep 言語ファイルのダウンロード
pdfgrep 言語ファイルのダウンロード

② ダウンロードした poppler-data-0.4.7.tar.gz ファイルを解凍すると poppler-data-0.4.7 フォルダが有ります。それをpoppler にリネームします。

③ pdfgrep.exe の実行フォルダに「share」フォルダを追加します。その share フォルダの下に②のpoppler フォルダごと、そのままコピーします。

④ pdfgrep.exe で日本語が有るPDFファイルで検索テストをします。
>pdfgrep  [半角の英数字の検索文字]  in.pdf  >  list.txt
list.txt テキストに日本語が表示されていたら、インストールは成功です。メモ帳以外のUTL-8Nテキストを開けるエディタで開いてください。

Help の内容

001 >pdfgrep --help 002 Usage: pdfgrep [OPTION]... PATTERN FILE... 003 See 'pdfgrep --help' for more information 004 005 Search for PATTERN in each FILE. 006 PATTERN is an extended regular expression. 007 008 Options: 009 -i, --ignore-case Ignore case distinctions 010 -P, --pcre Use Perl compatible regular expressions (PCRE) 011 -H, --with-filename Print the file name for each match 012 -h, --no-filename Suppress the prefixing of file name on output 013 -n, --page-number Print page number with output lines 014 -c, --count Print only a count of matches per file 015 -C, --context NUM Print at most NUM chars of context 016 --color WHEN Use colors for highlighting; 017 WHEN can be `always', `never' or `auto' 018 -p, --page-count Print only a count of matches per page 019 -m, --max-count NUM Stop reading after NUM matching lines (per file) 020 -q, --quiet Suppress normal output 021 -r, --recursive Search directories recursively 022 -R, --dereference-recursive Likewise, but follow all symlinks 023 --help Print this help 024 -V, --version Show version information


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

形式

pdfgrep  [OPTION]...  PATTERN  FILE...

OPTION

基本的にオプションは省略形とフル文字の二通りが有ります。「-i」は「--ignore-case」と同じです。

  • 省略形は前にハイフンが1つ「-」付きます。
    複数のオプションをまとめて1つのハイフンの後に続けることが出来ます。
    例:頁番号の表示、ファイル名の表示、マッチ件数で停止(10個)
    「-n  -H  -m」  =  「-nHm」   
  • フル文字は前にハイフンが2つ「--」付きます。
    複数のオプションは一つ以上の半角の空白を入れて続けれます。
    例: 頁番号の表示、ファイル名の表示、マッチ件数で停止(10個)
    「 --page-number --with-filename  --max-count 10」

例: pdfgrep --page-number --with-filename  --max-count 5 aa.pdf と同じ

>pdfgrep -nHm 5 PDF aa.pdf aa.pdf:5: fromPDFConverters aa.pdf:13: Embedded PDF aa.pdf:13: Embedded PDF aa.pdf:28: PDF aa.pdf:28:Acrobat PDF


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

-i, --ignore-case

文字列のうち1バイト英字の大文字小文字を区別しません。
注記:「--pcre」オプション使用時のみ指定可能になります。「--pcre」オプション未使用時は無視されます。つまり、その時は常に大文字小文字を区別しません。

-P, --pcre

Perl互換の正規表現を使用して検索文字列を指定します。

-H, --with-filename

ファイル名を表示します。
注記:「--include」オプション 使用時は使えません。

-h, --no-filename

ファイル名を表示しません。

-n, --page-number

頁番号を表示します。

-c, --count

PDFファイル単位で一致した総数のみを表示します。

-C, --context NUM

表示文脈の前後の行を出力します。NUMはデフォルト2です。
注記:↑ この説明は間違いです。pdfgrep の場合は一致した場所の前後の文字数として動作します。動作もやや意味不明なところが有ります。よって、このオプションの使用を推奨できません。

--color WHEN

ハイライトの色を使用します。
注記:実際は使用できません。

-p, --page-count

ページ単位で一致した数だけを表示します。

-m, --max-count NUM

PDFファイル単位で一致した行の数が NUM に達したら、そのファイルの検索を停止します。複数のファイルが対象の場合は次のファイルを検索に行きます。

-q, --quiet

すべての通常の出力を抑える。エラーのみ表示されます。 -s や --no-messages オプションも参照してください.

-r, --recursive

コマンドのカレントフォルダに対し,そのフォルダ下の全てのファイルを処理します.--includeと--excludeによって対象PDFは制限されます。--recurseは --directories と同じです。

-R, --dereference-recursive

-r と同じですが、全てのシンボリックリンクを対象にします。
注記:Windowsではシンボリックリンクでは無く、ショートカットなので結果的に -r と同じ動作になりました。

--help

簡単な説明を表示します。

-V, --version

バージョン情報を表示します。

HELPに表示されないOPTION

pdfgrep --help に表示されないオプションが存在します。これ以降はそのオプションを紹介します。

-F, --fixed-strings

パターン部分を正規表現ではなく固定文字列での検索を行います。
正規表現文字を含む文字列をgrepするときは -F オプションを使います。

-o, --only-matching

パターンと一致する部分のみを表示します。同じ行の前後の文字は表示しません。

--exclude=<string>

検索対象とするPDFファイルを排除します。ワイルドカードが使用できます。複数を指定できます。「--exclude  <string>」でもOK。

例:A*.pdf、B*.pdf、TEST*.pdf ファイルは読み込まない。

--exclude=A*.pdf  --exclude=B*.pdf  --exclude=TEST*.pdf

--include=<string>

検索対象とするPDFファイルを絞り込みます。ワイルドカードが使用できます。「--include  <string>」でもOK。

例:A*.pdf のみ読み込む。

--include=A*.pdf 又は --include A*.pdf 又は --include "A*.pdf"

--password=<string>

ユーザーパスワードを指定します。「--password  <string>」でもOK。

-Z, --null

ファイル名の後にNULL文字を出します。

  • 通常:
    IN.pdf: 5:  ABC
  • 「--null」 オプションを追加:
    IN.pdf  5:  ABC

--match-prefix-separator <string>

表示内容のコロン「:」を別の文字列に変換します。

  • 通常:
    IN.pdf: 5:  ABC
  • 「--match-prefix-separator "XX"」オプションを追加:
    IN.pdfXX5XX  ABC
  • 「--match-prefix-separator "XX" --null」オプションを追加:
    IN.pdf 5XX  ABC

--debug

デバッグ出力を有効にします。

--warn-empty

PDFに検索可能なテキストが含まれていない場合は「標準エラー出力」に警告を表示します。

--unac

検索のパターンとPDF文書の両方からアクセントと合字を削除します。

VBA関数からの起動

以下のVBA関数を利用してpdfgrep.exe をコマンドライン起動できます。

裏ワザ

それでもPDF内を日本語検索したい場合は有ります。実際に過去にその様な問合せが有りました。その時に以下の様な感じのやり方をご提案します。

  1. Popplerのpdftotext.exe でオプション「-layout」で全頁をテキスト出力しする。
  2. そのテキストファイルはUTF-8なのでADODB.Streamを使って変換しながら全て読み込みます。読み込みの例
  3. ファイル内に16進「0C」コードの(見えない)文字が有るとページの区切りとなるので、それで「ファイル名-page-001.txt」等の規則性のあるファイル名で出力します。(?ADODB.Streamで変換して読み込むとコードが変わる?)
  4. 上記の1~3を検索対象の全PDFに対して行います。
  5. そのファイルに対して「GNU utilities for Win32」のegrep.exeを使ってファイル検索を行います。このegrep.exe は2バイト文字(日本語)が処理できます。
    又は自分でテキストを読み込んで検索を行います。

上記をVBA等のプログラムで一括で処理できるようにします。

過去に上記と技術面は異なりますがAccess内にテキストを取り込んで全て処理できるようにした人がいました。

ライセンス

商用です(みたいです)。但し使用制限等は掛かってません。

pdfgrep ソースはGPLバージョン2のフリーライセンスで公開されています。

Windows版バイナリーを公開している『別』サイトで、フリー(無料)と言う表現は見つかりませんでした。サイトのトップには pdfgrep のGPLソースのWindowsコンパイル版と書かれています。更に「Product Options:製品オプション」で「Price:価格」表示が有ります。

これに関してはココを見ると、問題は無いと言う事になるのでしょう。

pdfgrep のコンパイル

ソースコンパイル情報も公開されています。 MinGW , Cygwin でWindows版コンパイルに挑戦しましたが、最後に「Poppler」の取り込みが出来なく、あえなく断念しました。ネットにはイロイロと関連情報が有りますが、C言語に関する基礎部分の知識が無いのでやり方のコピーしか出来ません。

自分でコンパイルがしたい。その手のスペシャリストがいましたら、ご教授をお願いいたします。(日本語が扱えるように修正出来ないから止めます。

備考

  • Windows版以外の情報も本サイトで公開されています。
  • --debug オプションを入れて実行すると「pdfgrep: error: Missing language pack for 'Adobe-Japan1' mapping」のエラーを見ることが出来ます。これを逆に見れば、環境面又はコンパイル時に2バイト文字対応の指定を行える日本語対応出来る?って事でしょうか。

< TOPへ戻る >

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


★ 文章での質問は難しいですよネ。でも、早く解決して、家に帰りたい。


SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れる時はコードを全て全角文字列にしてください。コチラで半角に戻します。それでもエラーが回避できない時はコメント下さい。個別に対処します。



お仕事で当サイトを見ている方へ
考え込んだら、ご質問下さい。
一緒に解決策を考えましょう。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください