我必须将一些 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 的环境变量,它指向 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).

其他提示

首先,less是一个读取文本流的交互式程序。在这种情况下你应该使用 cat 反而。这个或课程也不起作用,因为 PDF 是二进制格式而不是基于文本的格式。

你为什么不使用像 pdf 到文本转换器 pdftotext?

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

一种猜测是 less 你在命令行上执行的时候执行的不一样 less 就像 PHP 代码运行时一样。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top