shell_exec()语句到pdftotext整个目录?

时间:2012-04-04 15:20:04

标签: php foreach pdftotext

我对如何通过pdftotext语句构建到shell_exec()和整个目录的循环感到茫然。

类似的东西:

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

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

但我不确定如何在我的$pdfs语句中第二次调用shell_exec()时删除.pdf扩展名,并将其替换为.txt

不确定这个循环是否正确......

2 个答案:

答案 0 :(得分:1)

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

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

foreach($pdfs as $thispdf) {
    shell_exec(sprintf($fmt, $thispdf, basename($thispdf, ".pdf")));
}

答案 1 :(得分: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()会将其删除,因为我们知道文件名中会出现.(传递给glob()的规则决定了这一点)我们可以在最后一个之后安全地删除所有内容我还添加了escapeshellarg()作为一个很好的衡量标准 - 不太可能(如果不是不可能的话)已经存在的文件名将会违反这一点,但最好是安全的。