使用KnpSnappy生成PDF时Symfony UX Chart.js图表无法显示求助
KnpSnappy生成PDF图表不显示的排查方案
1. 延长JS渲染延迟
你当前设置的javascript-delay为1000ms,复杂图表可能需要更长时间完成渲染。试试把延迟调高到3000-5000ms:
$knpSnappyPdf->getOutputFromHtml($quotation, [ 'header-html' => $header, 'footer-html' => $footer, 'encoding' => 'utf-8', 'margin-left' => 0, 'margin-right' => 0, 'margin-top' => 28, 'margin-bottom' => 18, 'enable-javascript' => true, 'javascript-delay' => 3000, // 延长延迟时间 'no-stop-slow-scripts' => true ]),
2. 检查图表资源加载路径
wkhtmltopdf(KnpSnappy依赖的底层工具)无法访问前端开发服务器的本地资源(比如http://localhost:8080的JS/CSS),也可能无法正常加载CDN资源:
- 把图表依赖的JS库(比如Chart.js)直接内联到PDF的HTML中,或者使用服务器可访问的绝对路径。
- 确保
render_chart生成的HTML里,所有资源路径都是服务器能直接读取的本地路径,而非前端开发环境路径。
3. 手动触发Stimulus控制器初始化
Stimulus的自动初始化在wkhtmltopdf的JS环境中可能不生效,试试在HTML末尾手动触发:
<script> document.addEventListener('DOMContentLoaded', () => { const app = Stimulus.start(); // 如果知道图表对应的控制器ID,手动调用connect方法 // 示例:app.getControllerById('summary-chart-controller').connect(); }); </script>
4. 固定图表容器尺寸
wkhtmltopdf对无明确尺寸的容器渲染容易出问题,给图表容器加上固定宽高:
<div class="card border border-1 border-gray-400"> <div class="card-body pb-3" style="width: 600px; height: 400px;"> {{ render_chart(summaryChart) }} </div> </div>
5. 升级wkhtmltopdf版本
旧版wkhtmltopdf对现代JS语法支持差,导致图表库无法运行。直接升级到最新稳定版,或者把图表相关JS转译为ES5兼容语法。
6. 转成图片嵌入PDF
如果以上方法都没用,换个思路:先在前端把图表生成Base64格式的图片,传给后端后,在PDF的HTML里用<img>标签嵌入:
<div class="card-body pb-3"> <img src="data:image/png;base64,{{ chartBase64Data }}" alt="Summary Chart"> </div>
内容的提问来源于stack exchange,提问作者Eclip tique
相关产品推荐
相关产品推荐

