PHP 通过 exec 运行 linux“less”命令 - 二进制文件警告
题
我必须将一些 PDF 文件转换为 TXT。我最终使用了“less”命令,因为例如 pdftotext 对 PDF 中的表格存在一些问题。问题是,当我从 exec 函数(或 shell_exec/system)运行命令时,不只是显示信息,所选的 PDF 是二进制文件,结果文件只是包含 PDF 数据的 TXT。但是当我在终端中正常执行相同的操作时,一切都很好。我还尝试以 www_data 用户身份登录并以该用户身份运行命令,但也没有问题。
命令:
$ less /var/www/original.pdf > /var/www/new.txt
PHP代码:
exec("less -f /var/www/original.pdf > /var/www/new.txt 2>&1");
PHP 执行结果:
"/var/www/original.pdf" may be a binary file. See it anyway?
exec 命令中的“-f”选项在那里,因为这样您就不需要按“y”来表示“是的,无论如何我都想看到它”。
set | grep less
产量:
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
Lossless LZW RLE Zip' -- "$cur" ));
_apport_parameterless
_apport_parameterless
_apport_parameterless
_apport_parameterless
_apport_parameterless ()
解决方案
据我所知,您的控制台能够显示 PDF 文件 less
因为您安装了输入预处理器,例如 lesspipe
或者 lessfile
. 。制作方法 less
使用这些预处理器是通过读取一个名为 LESSOPEN 的环境变量,它指向 lesspipe
和 lessfile
脚本。
您的网络服务器可能可以通过环境变量和 shell 命令复制此行为,以便您的调用 less
正确解析 PDF。
我建议调用 bash 脚本来为您进行转换,而不是调用 less
直接地。这样,您的 bash 脚本就能够设置适当的环境变量并执行适当的命令,将 PDF 文件转换为可读的输出。
以下是如何执行此操作的示例:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
然后,从 PHP 中调用该脚本,如下所示:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
如果不起作用,请尝试更改 eval $(lesspipe)
到 eval $(lessfile)
.
其他提示
首先,less是一个读取文本流的交互式程序。在这种情况下你应该使用 cat
反而。这个或课程也不起作用,因为 PDF 是二进制格式而不是基于文本的格式。
你为什么不使用像 pdf 到文本转换器 pdftotext
?
PHP代码是如何执行的?在命令行上,通过 php file.php
或者当您使用浏览器访问 Web 服务器时 http://servername/something/file.php
?
一种猜测是 less
你在命令行上执行的时候执行的不一样 less
就像 PHP 代码运行时一样。