1

我必须将一些 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”来表示“是的,无论如何我都想看到它”。

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 () 
4

3 回答 3

1

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

您的网络服务器可能有一种方法,通过环境变量和 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).

于 2012-10-03T14:28:18.590 回答
0

首先,less 是一个读取文本流的交互式程序。在这种情况下,您应该cat改用。由于 PDF 是二进制格式,而不是基于文本的格式,因此这或当然也不起作用。

为什么不使用 pdf 到文本转换器之类的pdftotext

于 2012-10-03T13:36:07.983 回答
0

PHP 代码是如何执行的?当您使用浏览器点击它时,是在命令行上,通过php file.php还是通过 Web 服务器http://servername/something/file.php

一种猜测是,less您在命令行上执行的操作与less运行 PHP 代码时执行的操作不同。

于 2012-10-03T14:14:42.100 回答