从PHP脚本执行PDFTk失败,错误代码为11

时间:2010-08-10 11:41:44

标签: php pdftk

我正在尝试从PHP脚本中填写PDF。我在以下URL跟随 Sid Steward 的文章。

我在 CentOS linux发行版上配置了 PDFTk 包,我可以从命令提示符执行pdftk,它将FDF表单与PDF合并,并成功生成扁平化(填充)PDF。我正在使用以下命令来使用shell测试Pdftk。

pdftk /tmp/form.pdf fill_form /tmp/fdfbm0pe7 output /tmp/filledform.pdf flatten

但是当尝试通过PHP执行类似命令时,我收到错误。 passthru 命令失败,错误代码 11 。以下是我用来执行命令的php代码:

$command = 'pdftk form.pdf fill_form '. $fdf_fn. ' output - flatten';
passthru($command, $error);

上面的 $ fdf_fn 有FDF文件名。 form.pdf 是可填写的pdf表单。 form.pdf 和我给出上面代码行的PHP脚本文件都在同一个文件夹中。我已经通过回显 shell_exec('pdftk')检查了PDFtk是否通过PHP正确执行,并且它返回了标准帮助详细信息。

仅提供更多详细信息,pdftk的路径为 / usr / bin / ,PHP脚本和PDF表单文件位于 / var / www / html / pdfmerge

有人可以指导我做错了,通过PHP执行命令失败,错误代码为11?

2 个答案:

答案 0 :(得分:2)

我在CentOS上运行PDFTK时遇到了完全相同的问题,花了几个小时来搜索,所以我希望有人会觉得这很有用。我对PDFTK的具体用途是针对Drupal上的FillPDF模块。退出代码11问题的解决方案是设置本地策略模块以允许httpd运行PDFTK。如果你像这样grep /var/log/audit/audit.log来获取pdftk

grep -i pdftk /var/log/audit/audit.log

你应该看到一些错误,可能是“execmem”之类的错误。以下是我为解决问题所做的工作......

运行此命令会将错误从日志中拉出并将它们放入文件中供您查看。

grep -i pdftk /var/log/audit/audit.log | audit2allow -m pdftklocal > pdftklocal.te

如果输出看起来不错(例如有IS输出),请运行此命令以创建模块。

grep -i pdftk /var/log/audit/audit.log | audit2allow -M pdftklocal

创建模块后,您可以通过运行此命令使策略处于活动状态。

/usr/sbin/semodule -i pdftklocal.pp

PDFTK现在应该从PHP运行。如果没有,请运行

检查httpd_enable_cgi是否已打开
getsebool httpd_enable_cgi

如果没有打开,请运行

将其打开
setsebool -P httpd_enable_cgi 1

有关政策模块的详细信息,请访问:http://wiki.centos.org/HowTos/SELinux#head-faa96b3fdd922004cdb988c1989e56191c257c01

答案 1 :(得分:0)

我遇到了类似的问题,结果发现PHP没有读取.pdf,.fdf的权限,也没有权限在/ tmp目录中创建扁平的.pdf文件。

看看是否有问题尝试

chmod 777 /tmp

看看是否能解决问题。我不建议在777离开,但可能会将其移回700左右。