Perlのシステム関数のエラー(pdftotext関連?)
結局原因不明だが、Perlのシステム関数ではまったのでメモ。
Perlスクリプト内から以下のシェルを実行することにした。
- pdftotext*1で、あるPDFファイル(ここではdata.pdf)からテキスト抽出してファイル(test.txt)に格納する
- ある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からのテキスト処理は難しそうだった。