Выполнение PDFTk из PHP-скрипта завершается с ошибкой с кодом 11

Я пытаюсь заполнить PDF-файл из PHP-скрипта. Я слежу за статьей Сида Стюарда по следующей ссылке URL.

Я настроил пакет PDFTk в дистрибутиве Linux CentOS, и я могу выполнить pdftk из командной строки, и он объединяет форму FDF с PDF и успешно создает плоский ( Заполнено) PDF. Я использую следующую команду для тестирования 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, из которого я привел приведенные выше строки кода, находятся в одной папке. Я проверил правильность выполнения PDFtk через PHP, выполнив эхо shell_exec('pdftk'), и он возвращал стандартные сведения о справке.

Просто чтобы предоставить более подробную информацию, путь к pdftk — /usr/bin/, а скрипт PHP и файлы форм PDF расположены в папке /var/www/html/pdfmerge.

Может ли кто-нибудь указать, что я делаю неправильно, что выполнение команды через PHP завершается с ошибкой с кодом 11?


person Jawwad Alam    schedule 10.08.2010    source источник
comment
может глупый вопрос, но можно ли просто использовать shell_exec?   -  person Brandon Frohbieter    schedule 11.08.2010
comment
@Brandon: я пытался выполнить shell_exec, он возвращал NULL, и в результате выполнения команды файл не был создан.   -  person Jawwad Alam    schedule 11.08.2010


Ответы (2)


У меня была точно такая же проблема с PHP, работающим с PDFTK в CentOS, и я потратил несколько часов на поиски вещей, поэтому я надеюсь, что кто-то найдет это полезным. Лично я использую PDFTK для модуля FillPDF в Drupal. Решение проблемы с кодом выхода 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

Если вывод выглядит хорошо (например, вывод ЕСТЬ), запустите эту команду, чтобы создать модуль.

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

person salter14    schedule 17.02.2011
comment
Спасибо... Я несколько дней ломал голову над этим. - person hitmanDX; 20.04.2011

У меня была проблема, аналогичная вашей, и оказалось, что у PHP не было доступа для чтения .pdf, .fdf и не было доступа для создания плоского файла .pdf в каталоге /tmp.

чтобы узнать, не в этом ли проблема, попробуйте сделать

chmod 777 /tmp

чтобы увидеть, решит ли это проблему. Я бы не рекомендовал оставлять 777, но, может быть, вернуться к 700 или около того.

person Bot    schedule 08.09.2010
comment
Привет jostster, спасибо за ответ. Я попробовал ваше предложение, но это не решило проблему - person Jawwad Alam; 12.11.2010