我对如何通过pdftotext
语句构建到shell_exec()
和整个目录的循环感到茫然。
类似的东西:
$pdfs = glob("*.pdf");
foreach($pdfs as $pdfs) {
shell_exec('pdftotext '.$pdfs.' '.$pdfs'.txt');
}
但我不确定如何在我的$pdfs
语句中第二次调用shell_exec()
时删除.pdf扩展名,并将其替换为.txt
不确定这个循环是否正确......
答案 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()
作为一个很好的衡量标准 - 不太可能(如果不是不可能的话)已经存在的文件名将会违反这一点,但最好是安全的。