使用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!
字样。
有任何线索吗?我做错了吗?除了* .pdf.twig版本之外,是否必须使用替代* .html.twig?我不这么认为...... :(
答案 0 :(得分:8)
好的,我明白了。
出于某种原因,捆绑文档中的示例对我不起作用。然而,在de bundle中有这个类: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存储到磁盘中。
答案 1 :(得分:2)
这是因为您错过了网址中的“_format”选项。
$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);
}
应该可以正常工作。