Используя Symfony2 и PdfBundle для генерации динамически PDF-файлов, я не могу генерировать файлы.
Следуя инструкциям по документации, я установил всю связку:
autoload.php:
'Ps' => __DIR__.'/../vendor/bundles', 'PHPPdf' => __DIR__.'/../vendor/PHPPdf/lib', 'Imagine' => array(__DIR__.'/../vendor/PHPPdf/lib', __DIR__.'/../vendor/PHPPdf/lib/vendor/Imagine/lib'), 'Zend' => __DIR__.'/../vendor/PHPPdf/lib/vendor/Zend/library', 'ZendPdf' => __DIR__.'/../vendor/PHPPdf/lib/vendor/ZendPdf/library',
AppKernel.php:
… новый Ps \ PdfBundle \ PsPdfBundle (), …
Я думаю, что все настройки настроены правильно, так как я не получаю никакой «библиотеки не найденной» и ничего подобного …
Итак, после всего этого я делаю это в контроллере:
... use Ps\PdfBundle\Annotation\Pdf; ... /** * @Pdf() * @Route ("/pdf", name="_pdf") * @Template() */ public function generateInvoicePDFAction($name = 'Pedro') { return $this->render('AcmeStoreBundle:Shop:generateInvoice.pdf.twig', array( 'name' => $name, )); }
И имея этот файл ветки:
<pdf> <dynamic-page> Hello {{ name }}! </dynamic-page> </pdf>
Что ж. Так или иначе, то, что я просто получаю на своей странице, – это просто нормальный html, созданный, как будто это был обычный рендеринг Response.
Предполагается, что аннотация Pdf()
должна дать «особое» поведение создания файла PDF вместо рендеринга обычного HTML.
Итак, имея вышеуказанный код, когда я запрашиваю маршрут http://www.mysite.com/*...*/pdf
, все, что я получаю, это следующий HTML-рендеринг:
<pdf> <dynamic-page> Hello Pedro! </dynamic-page> </pdf>
(так что пустая HTML-страница с просто словами Hello Pedro!
на ней.
Любая подсказка? Я что-то делаю неправильно? Обязательно ли иметь альтернативу * .html.twig отдельно от версии * .pdf.twig? Я так не думаю … 🙁
Ладно, я понял.
По какой-то причине, пример, который поставляется в документации на комплекте, не работает для меня. Тем не менее, есть этот класс в пакете: http://github.com/psliwa/PdfBundle/blob/master/Controller/ExampleController.php , где я мог бы найти пример, который работал для меня. Это код, который я наконец использовал:
/** * @Route ("/generateInvoice", name="_generate_invoice") */ public function generateInvoiceAction($name = 'Pedro') { $facade = $this->get('ps_pdf.facade'); $response = new Response(); $this->render('AcmeStoreBundle:Shop:generateInvoiceAction.pdf.twig', array("name" => $name), $response); $xml = $response->getContent(); $content = $facade->render($xml); return new Response($content, 200, array('content-type' => 'application/pdf')); }
Следующая задача: сохранить этот PDF на диск.
Это потому, что вы пропустили параметр «_формат» в URL-адресе.
$this->render()
не следует использовать с аннотацией @Template
. @Template
будет соответствовать формату правильного шаблона в зависимости от параметра _format
.
... use Ps\PdfBundle\Annotation\Pdf; ... /** * @Pdf() * @Route ("/pdf.{_format}", name="_pdf") * @Template() */ public function generateInvoicePDFAction($name = 'Pedro') { return array('name' => $name); }
Должен работать нормально.