KnpSnappyBundle
Snappy是wkhtmltopdf转换工具的PHP封装。它允许您使用webkit引擎从HTML文档生成PDF或图像文件。
KnpSnappyBundle为您的Symfony项目提供了简单的集成。
限制
如果您使用JavaScript渲染页面,可能会遇到一些问题,因为wkhtmltopdf与ES6 API不完全兼容。 解决这个问题的唯一方法是提供修复现代ES6 API与wkhtmltopdf渲染引擎之间差距的polyfills。
安装
使用composer,运行以下命令:
composer require knplabs/knp-snappy-bundle
如果您没有使用Flex,请在内核中启用它:
// config/bundles.php
<?php
return [
//...
Knp\Bundle\SnappyBundle\KnpSnappyBundle::class => ['all' => true],
//...
];
配置
如果您需要更改二进制文件、更改实例选项或甚至禁用一个或两个服务,可以通过配置来实现。
# config/packages/knp_snappy.yaml
knp_snappy:
pdf:
enabled: true
binary: /usr/local/bin/wkhtmltopdf #Windows用户使用"\"C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe\""
options: []
image:
enabled: true
binary: /usr/local/bin/wkhtmltoimage #Windows用户使用"\"C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltoimage.exe\""
options: []
如果您想更改默认为sys_get_temp_dir()
的临时文件夹,可以使用:
# config/packages/knp_snappy.yaml
knp_snappy:
temporary_folder: "%kernel.cache_dir%/snappy"
您还可以使用process_timeout
配置生成器使用的超时时间:
# config/packages/knp_snappy.yaml
knp_snappy:
process_timeout: 20 # 以秒为单位
使用
该bundle注册了两个服务:
knp_snappy.image
服务允许您生成图像;knp_snappy.pdf
服务允许您生成PDF文件。
从URL生成图像
// @var Knp\Snappy\Image
$knpSnappyImage->generate('http://www.google.fr', '/path/to/the/image.jpg');
从URL生成PDF文档
// @var Knp\Snappy\Pdf
$knpSnappyPdf->generate('http://www.google.fr', '/path/to/the/file.pdf');
从多个URL生成PDF文档
// @var Knp\Snappy\Pdf
$knpSnappyPdf->generate(array('http://www.google.fr', 'http://www.knplabs.com', 'http://www.google.com'), '/path/to/the/file.pdf');
从twig视图生成PDF文档
// @var Knp\Snappy\Pdf
$knpSnappyPdf->generateFromHtml(
$this->renderView(
'MyBundle:Foo:bar.html.twig',
array(
'some' => $vars
)
),
'/path/to/the/file.pdf'
);
从控制器渲染图像作为响应
use Knp\Bundle\SnappyBundle\Snappy\Response\JpegResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SomeController extends AbstractController
{
public function imageAction(Knp\Snappy\Image $knpSnappyImage)
{
$html = $this->renderView('MyBundle:Foo:bar.html.twig', array(
'some' => $vars
));
return new JpegResponse(
$knpSnappyImage->getOutputFromHtml($html),
'image.jpg'
);
}
}
从控制器渲染PDF文档作为响应
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SomeController extends AbstractController
{
public function pdfAction(Knp\Snappy\Pdf $knpSnappyPdf)
{
$html = $this->renderView('MyBundle:Foo:bar.html.twig', array(
'some' => $vars
));
return new PdfResponse(
$knpSnappyPdf->getOutputFromHtml($html),
'file.pdf'
);
}
}
渲染包含相对URL(如CSS文件)的PDF文档
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SomeController extends AbstractController
{
public function pdfAction(Knp\Snappy\Pdf $knpSnappyPdf)
{
$pageUrl = $this->generateUrl('homepage', array(), true); // 使用绝对路径!
return new PdfResponse(
$knpSnappyPdf->getOutput($pageUrl),
'file.pdf'
);
}
}
维护者
KNPLabs正在寻找维护者(查看原因)。
如果您有兴趣,欢迎提交PR申请成为维护者。
我们很高兴收到您的回复 :)
致谢
SnappyBundle和Snappy基于优秀的wkhtmltopdf。 SnappyBundle由KnpLabs开发。