Perlのシステム関数のエラー(pdftotext関連?)

結局原因不明だが、Perlのシステム関数ではまったのでメモ。

Perlスクリプト内から以下のシェルを実行することにした。

  1. pdftotext*1で、あるPDFファイル(ここではdata.pdf)からテキスト抽出してファイル(test.txt)に格納する
  2. あるPDFファイル(ここではdata.pdf)のls情報を標準出力する

そこでPerlからシステム関数宛に以下のコマンドを実行した。

 

`pdftotext -raw -nopgbrk data.pdf text.txt`;
`ls -l data.pdf`;

 

すると何故か

Error: Couldn't open file 'data.pdf': No such file or directory.
ls: cannot access data.pdf: そのようなファイルやディレクトリはありません

 
と、エラーが出て停止してしまった。

正確には

  • PDFファイル名は変数で定義されていて、様々な名前のPDFファイルを一度に処理する。
  • PDFファイルは76800件ある。
  • text.txtはテンポラリファイルとして使用し、格納した情報はループごとに別のファイルにコピーして使用する。

となっていて事象が混在しているが、しばらく原因が掴めていなかった。

結論として、スクリプト実行前にtest.txtをあらかじめ作成して置いておくとうまくいった。

他の環境で同様のスクリプトを実行しても再現性は得られず。他の環境ではtest.txtを先に作っておかなくても、pdftotextで実行後に新しくファイルを作成してくれる。エンコードやpdftotextのバージョン情報、変数やシステム関数の記述方法、権限やPDFの著作権情報*2なども検証したのだが、関係なかったようだ。
原因不明のためここに記す。

環境:CentOS release 6.2 (Final) 64 bit
pdftotextのバージョン:0.12.4

 
この部分だけシェルを呼び出すのも管理しにくいし、Perlのモジュール*3でも日本語を含むPDFからのテキスト処理は難しそうだった。