我不知道如何通过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")));
}