0

我不知道如何pdftotext通过shell_exec()语句为整个目录构建循环。

就像是 :

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

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

但我不确定如何在第二次调用$pdfs我的shell_exec()声明时删除 .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()直接使用 in的结果可以foreach轻松避免上面代码中的变量命名冲突。

编辑

我已更改上述代码以在生成输出文件名时手动删除文件扩展名。这是因为glob()可能会返回路径字符串的目录组件,以及文件名。使用pathinfo()orbasename()将删除它,并且由于我们知道.文件名中将出现 a (传递给的规则glob()规定了这一点),我们可以安全地删除最后一个之后的所有内容。我还添加escapeshellarg()了一个很好的措施 - 已经存在的文件名极不可能(如果不是不可能的话)会违反这一点,但最好是安全的。

于 2012-04-04T15:25:00.577 回答