PHP通过exec运行linux“less”命令 - 二进制文件警告

时间:2012-10-03 13:25:35

标签: php linux pdf less-unix

我必须将一些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 () 

3 个答案:

答案 0 :(得分:1)

根据我的阅读,您的控制台能够显示带有less的PDF文件,因为您安装了输入预处理器,例如lesspipelessfile。使less使用这些预处理器的方法是读取一个名为LESSOPEN的环境变量,该变量指向lesspipelessfile脚本。

您的网络服务器可能有办法通过环境变量和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不同。