Symfony2 - PdfBundle无法正常工作

时间:2012-12-01 01:03:41

标签: php symfony pdf-generation twig

使用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?我不这么认为...... :(

2 个答案:

答案 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);
}

应该可以正常工作。