0

ステートメントpdftotextを介してディレクトリ全体へのループを構築する方法について、私は途方に暮れています。shell_exec()

何かのようなもの :

$pdfs = glob("*.pdf");

foreach($pdfs as $pdfs) {
    shell_exec('pdftotext '.$pdfs.' '.$pdfs'.txt');
}

$pdfsしかし、shell_exec()ステートメントで2回目に呼び出したときに.pdf拡張子を削除して、それを次のように置き換える方法がわかりません。.txt

このループが正しいかどうかもわかりません。

4

2 に答える 2

1
$pdfs = glob("*.pdf");

$fmt='/path/to/pdftotext "%s" "%s.txt"';

foreach($pdfs as $thispdf) {
    shell_exec(sprintf($fmt, $thispdf, basename($thispdf, ".pdf")));
}
于 2012-04-04T15:24:46.923 に答える
1

試す

foreach(glob("*.pdf") as $src) {

  // Manually remove file extension because glob() may return a dir path component
  $parts = explode('.', $src);
  $parts[count($parts) - 1] = 'txt';
  $dest = implode('.', $parts);

  // Escape shell arguments, just in case
  shell_exec('pdftotext '.escapeshellarg($src).' '.escapeshellarg($dest));

}

基本的に、ディレクトリ内のPDFファイルをループし、ファイル名の名前コンポーネント(で抽出pathinfo()のみを使用して、各ファイルに対してコマンドを実行します。出力ファイルの編集を参照test.pdfしてください(したがってtest.txt)。

の結果をglob()直接使用するforeachと、上記のコードで発生した変数の名前の衝突を簡単に回避できます。

編集

上記のコードを変更して、出力ファイル名を生成するときにファイル拡張子を手動で削除しました。これはglob()、ファイル名だけでなく、パス文字列のディレクトリコンポーネントを返す可能性があるためです。pathinfo()またはを使用basename()すると、これが削除されます。ファイル名にaが含まれることがわかっているため.(これを指示するために渡されるルールglob())、最後のファイル以降のすべてを安全に削除できます。また、適切な対策として追加escapeshellarg()しました。すでに存在するファイル名がこれに反する可能性はほとんどありませんが(不可能ではないにしても)、安全であることが最善です。

于 2012-04-04T15:25:00.577 に答える