shell_exec()语句转换为pdftotext整个目录



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

类似于:

$pdfs = glob("*.pdf");
foreach($pdfs as $pdfs) {
    shell_exec('pdftotext '.$pdfs.' '.$pdfs'.txt');
}

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

也不确定这个循环是否正确。。。。

尝试

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)。

foreach中直接使用glob()的结果可以很容易地避免上面代码中的变量命名冲突。

编辑

我修改了上面的代码,以便在生成输出文件名时手动删除文件扩展名。这是因为glob()可能返回路径字符串的目录组件,以及仅返回文件名。使用pathinfo()basename()会去掉这一点,因为我们知道文件名中会出现.(传递给glob()的规则规定了这一点),所以我们可以安全地删除最后一个之后的所有内容。我还添加了escapeshellarg()作为衡量标准——已经存在的文件名极不可能(如果不是不可能的话)与此相冲突,但最好是安全的。

$pdfs = glob("*.pdf");
$fmt='/path/to/pdftotext "%s" "%s.txt"';
foreach($pdfs as $thispdf) {
    shell_exec(sprintf($fmt, $thispdf, basename($thispdf, ".pdf")));
}

相关内容

  • 没有找到相关文章

最新更新