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

标签 php linux pdf less-unix

我必须将一些 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 文件,因为您安装了输入预处理器,例如 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)

关于PHP 通过 exec 运行 linux "less"命令 - 二进制文件警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12709486/

相关文章:

php - 使用 PHP linux 将 doc、docx、pdf 转换为 HTML

linux - 如何设置gdb运行在/bin/sh

c# - iTextSharp - 是否可以为同一单元格和行设置不同的字体颜色?

c# - 如何 : Store and Retrieve pdf file to mysql using C#

php - 使用 silverstripe 3.1 创建 pdf 的最佳方法?

php 5.3 fatal error 类 DateTimeZone 未找到

php - 我无法使用 slim 框架在 php 中接收 POST 数据

php - 用于(重新)发送通知电子邮件的重力表单 API

java - JTextField super.paintComponent() 在 Linux 上忽略背景颜色

mysql中的PHP注册表