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

使用laravel-snappy与wkhtmltopdf生成带图表PDF无报错失败求助

Laravel生成带图表PDF无报错失败的解决方案

问题概述

使用barryvdh/laravel-snappy(^1.0)配合wkhtmltopdf生成含Google Charts的PDF时,无任何报错信息但生成失败,已确认wkhtmltopdf已安装。

原代码

控制器代码

public function download()
{
    $render = view('graph')->render();
    $pdf = new Pdf;
    $pdf->addPage($render);
    $pdf->setOptions([
        'enable-javascript' => true,
        'javascript-delay' => 5000,
        'enable-smart-shrinking' => true,
        'no-stop-slow-scripts' => true,
        'binary' => '"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf"'
    ]);
    if(!$pdf->saveAs('D:/report.pdf')){
        return $pdf->getError();
    }

    
    return response()->download('D:report.pdf');
}

Blade视图代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="https://www.google.com/jsapi"></script>
    <style>
        .pie-chart {
            width: 600px;
            height: 400px;
            margin: 0 auto;
        }
        .text-center{
            text-align: center;
        }
    </style>
</head>
<body>
  
<h2 class="text-center">生成带图表的Laravel PDF</h2>
  
<div id="chartDiv" class="pie-chart"></div>
  
<div class="text-center">
    <a href="{{ route('download') }}">下载PDF文件</a>
    <h2>ItSolutionStuff.com</h2>
</div>
  
<script type="text/javascript">
    window.onload = function() {
        google.load("visualization", "1.1", {
            packages: ["corechart"],
            callback: 'drawChart'
        });
    };
  
    function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', '框架');
        data.addColumn('number', '流行度');
        data.addRows([
            ['Laravel', 33],
            ['Codeigniter', 26],
            ['Symfony', 22],
            ['CakePHP', 10],
            ['Slim', 9]
        ]);
  
        var options = {
            title: '各类PHP框架流行度',
            sliceVisibilityThreshold: .2
        };
  
        var chart = new google.visualization.PieChart(document.getElementById('chartDiv'));
        chart.draw(data, options);
    }
</script>
  
</body>
</html>

问题修复点及解决方案

  1. 修正wkhtmltopdf路径格式
    原代码中binary选项使用了HTML转义符&quot;,导致路径解析错误。直接使用正确的Windows路径,注意反斜杠转义或改用正斜杠:

    'binary' => 'C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
    // 或使用正斜杠
    'binary' => 'C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe'
    
  2. 调整PDF生成顺序
    必须先设置选项,再添加页面内容,否则选项不会生效:

    $pdf = new Pdf;
    $pdf->setOptions([
        // 选项配置
    ]);
    $pdf->addPage($render);
    
  3. 修复下载路径拼写错误
    原代码中response()->download('D:report.pdf')少了斜杠,改为D:/report.pdf。

  4. 优化Google Charts加载逻辑
    google.load的回调参数不需要加引号,改为直接传入函数名,同时可以适当延长JavaScript延迟时间确保图表渲染完成:

    window.onload = function() {
        google.load("visualization", "1.1", {
            packages: ["corechart"],
            callback: drawChart
        });
    };
    

修复后的控制器代码

public function download()
{
    $render = view('graph')->render();
    $pdf = new Pdf;
    
    // 先设置选项
    $pdf->setOptions([
        'enable-javascript' => true,
        'javascript-delay' => 8000, // 延长延迟确保图表渲染
        'enable-smart-shrinking' => true,
        'no-stop-slow-scripts' => true,
        'binary' => 'C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe'
    ]);
    
    $pdf->addPage($render);
    
    $pdfPath = 'D:/report.pdf';
    if(!$pdf->saveAs($pdfPath)){
        return response()->json(['error' => $pdf->getError()], 500);
    }

    return response()->download($pdfPath);
}

内容的提问来源于stack exchange,提问作者santosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:52:20