我正在尝试建立一个pdf文件生成系统。为此,我开始使用 WkHtmlToPdf 以及 KnpSnappy Bundle。这是我所做的:
1 - 我首先下载了一个预编译的二进制文件(MacOs)https://wkhtmltopdf.org/
2 - 然后安装包composer require knplabs/knp-snappy
:(https://github.com/KnpLabs/snappy)
3 - 最后在 bundles.php 中添加捆绑包Knp\Bundle\SnappyBundle\KnpSnappyBundle::class => ['all' => true],
这是我在我的函数中写的,在我的控制器里面:
/**
* @Route("/pdf/{id}", name="room_pdf", methods={"GET"}, requirements={"id"="\d+"})
* @IsGranted("ROLE_ADMIN")
*/
public function pdf(Room $room, \Knp\Snappy\Pdf $knpSnappy)
{
$knpSnappy->setOption("encoding","UTF-8");
$filename = "mypdf";
$html = $this->renderView('room/show.html.twig' , array(
'room' => $room,
));
return new Response(
$knpSnappy->getOutputFromHtml($html),
200,
array(
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="'.$filename.'.pdf"'
)
);
我进行了几次测试,当我尝试使用 URL 或一段 HTML 代码生成 pdf 时,我没有遇到任何问题,但是当我尝试使用 renderView 生成基于 twig 视图的 pdf 时,我最终得到了 pdf 1777 页,包括 1775 页空白
有谁知道可以做什么?
编辑:我通过正确加载我的 css 修复了 1777 页。我在模板的开头添加了这段代码:
{% block stylesheets %}
{% for path in encore_entry_css_files('app') %}
<link rel="stylesheet" href="{{ absolute_url(path) }}">
{% endfor %}
{% endblock %}
所以我最终得到了一个几乎格式化的页面。我的 app.js 文件似乎没有加载,所以我的 pdf 中没有所有有效的引导资源
这是我的终端告诉我的:
Feb 5 21:52:37 |INFO | SNAPPY File "/var/folders/gv/0qb9br_15gggjmhg5zs_qtth0000gn/T/knp_snappy5e3b390a547d50.44491512.pdf"
has been successfully generated. stderr="Loading pages (1/6)\n[> ]
0%\r[======> ]
10%\r[=======> ]
12%\rWarning:
Failed to load file:///build/runtime.js (ignore)
\nWarning: Failed to load file:///build/vendors~app.js (ignore)
\nWarning: Failed to load file:///build/app.js (ignore)
\n
我在模板的末尾添加了这一点:
{% block scripts %}
{% for path in encore_entry_css_files('app') %}
<script src="{{ absolute_url(path) }}"></script>
{% endfor %}
{% endblock %}
现在我的控制台终端看起来像这样
Feb 5 22:21:42 |INFO | SNAPPY File
"/var/folders/gv/0qb9br_15gggjmhg5zs_qtth0000gn/T/knp_snappy5e3b3fd843af90.61904670.pdf"
has been successfully generated. stderr="Loading pages (1/6)\n
但似乎我的引导程序尚未加载..(它在我的 app.js 中声明为“ require('bootstrap'); ”)