我必须将一些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 exec的结果:
"/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 ()
答案 0 :(得分:1)
根据我的阅读,您的控制台能够显示带有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)
。
答案 1 :(得分:0)
首先,阅读文本流的交互式程序较少。在这种情况下,您应该使用cat
代替。由于PDF是二进制格式而不是基于文本的格式,因此该课程或课程无效。
为什么不使用像pdftotext
这样的pdf文本转换器?
答案 2 :(得分:0)
PHP代码是如何执行的?在命令行中,当您使用浏览器php file.php
点击它时,通过http://servername/something/file.php
或Web服务器?
有一种猜测是,在命令行执行此操作时执行的less
与运行PHP代码时的less
不同。