我正在尝试从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?
答案 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左右。