You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:32:54