0

我正在尝试从 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?

4

2 回答 2

2

我在 CentOS 上运行 PDFTK 的 PHP 遇到了完全相同的问题,我花了好几个小时寻找东西,所以我希望有人会发现这很有用。我对 PDFTK 的特定用途是 Drupal 上的 FillPDF 模块。退出代码 11 问题的解决方案是设置本地策略模块以允许 httpd 运行 PDFTK。如果你像这样为 pdftk grep /var/log/audit/audit.log

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

您应该会看到一些错误,其中可能是“execmem”错误。这是我为解决此问题所做的...

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

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

如果输出看起来不错(例如有输出),运行这个命令来创建模块。

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

于 2011-02-17T16:16:40.357 回答
0

我遇到了与您遇到的问题类似的问题,事实证明 PHP 无权读取 .pdf、.fdf 并且无权在 /tmp 目录中创建扁平化的 .pdf 文件。

看看这是否是问题尝试做

chmod 777 /tmp

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

于 2010-09-08T19:13:26.983 回答