PDF文書からテキストを抽出する

第二十一回


論文PDFをHyper Estraierで検索できるようにするため,PDF文書をインデックスに登録する必要がある.しかし,Hyper Estraier付属のPDF文書用スクリプトはHTML文書に変換した後,インデックスに追加するという動作をしていた.さらに,タイトルにPDF文書のファイル名ではなく,PDFが作成された際に付けられていたファイル名を付けてしまうなど,いまいちこちらのニーズに合わなかったので自分で作っちゃうことにした.


本来は,シェルスクリプトで書かれた標準添付されたスクリプトを書き直すべきなのだろうが,今回はAPIを使用してRubyスクリプトを作りたかった.そこで,まずはPDF文書からテキストを抽出することから始めてみた.


様々なツール・ソフトがあるようだが,自分は「pdftotext」を使ってみることに.これは,「xpdf」というLinux用ソフトに添付されているツールだ.という訳で,インストールしてみる.ディストリビューションにFedora Core4を利用していたので,以下のコマンドで一発インストール.

$ yum install xpdf

うじゃうじゃっと出力されて無事インストール成功.


しかし,いくつかのPDF文書からテキストで試していると,たまに

Copying of text from this document is not allowed.

と表示されて失敗することがあった.調べてみると,PDF文書のセキュリティの一つとして「内容のコピーと抽出」という項目が許可しないになっていると,テキスト抽出できないようだ.

そこで,反則かもしれないが「pdftotext」を改造して,これらのPDF文書からもテキストを抽出できるようにした.
 # 悪いことに使っちゃイカンよ
とりあえず,「xpdf」のソースを取ってきて展開する.

$ wget ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.01.tar.gz
$ tar zxvf xpdf-3.01.tar.gz

で,展開したディレクトリに移動して,とりあえず「./configure」

$ cd xpdf-3.01
$ ./configure

そして,適当なエディタでxpdf/pdftotext.ccを開き,163行目あたりの1ブロックを以下のようにコメントアウトする.

  // check for copy permission
  //  if (!doc->okToCopy()) {
  //    error(-1, "Copying of text from this document is not allowed.");
  //    exitCode = 3;
  //    goto err2;
  //  }

その後は普通にコンパイルして

$ make
$ make check

コンパイルがうまくいっていれば,yum経由でインストールした方をアンインストールした後,いぢった方をインストール.

$ yum uninstall xpdf
$ su
# make install


これで,PDF文書からテキストを抽出できるようになる.しかし,今度は日本語のフォントが入ってないようなので,これも追加.方法は,

$ cd /usr/local/src
$ wget ftp://ftp.foolabs.com/pub/xpdf/xpdf-japanese.tar.gz
$ tar zxvf xpdf-japanese.tar.gz
$ cd xpdf-japanese
$ ls
Adobe-Japan1.cidToUnicode  EUC-JP.unicodeMap       README                add-to-xpdfrc
CMap                       ISO-2022-JP.unicodeMap  Shift-JIS.unicodeMap
$ cp Adobe-Japan1.cidToUnicode CMap EUC-JP.unicodeMap add-to-xpdfrc ISO-2022-JP.unicodeMap Shift-JIS.unicodeMap /usr/local/share/xpdf/japanese/

と,ファイルをコピーした上で,これまた適当なエディタで/usr/local/etc/xpdfrcを開き,一番最後に以下の1行を追加する.

include /usr/local/share/xpdf/japanese/add-to-xpdfrc

ついでに,扱う文字コードに合わせて

textEncoding            UTF-8

の行のコメントアウトを外しておいた.


これで万事OK.あとは適当に

$ pdftotext <PDF-file> <text-file>

とかやると,のテキストがに書き出される.
自分は,あとでHyper Estraierのインデックスに登録しやすいように

$ pdftotext -raw -nopgbrk <PDF-file> <text-file>

というオプションをつけた形で使っている.これは2段組のレイアウトをちゃんと認識してくれるrawオプションと,ページが変わることを示す記号を出力しないようにするnopgbrkオプションだ.


さて,次回はHyper EstraierのインデックスにPDF文書を登録してみるとするか.


おしまい