我必须将一些 PDF 文件转换为 TXT。我以“less”命令结束,因为例如 pdftotext 在 PDF 中有一些表格问题。问题是,当我从 exec 函数(或 shell_exec/system)运行命令时,不仅仅是向我显示信息,选择的 PDF 是二进制文件,结果文件只是 TXT,其中包含 PDF 数据。但是当我在终端正常做同样的事情时,一切都很好。我也尝试以 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”来表示“是的,无论如何我都想看到它。”
设置 | 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 ()
最佳答案
据我了解,您的控制台能够使用 less
显示 PDF 文件,因为您安装了输入预处理器,例如 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)
。
关于PHP 通过 exec 运行 linux "less"命令 - 二进制文件警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12709486/