使用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>
问题修复点及解决方案
修正wkhtmltopdf路径格式
原代码中binary选项使用了HTML转义符",导致路径解析错误。直接使用正确的Windows路径,注意反斜杠转义或改用正斜杠:'binary' => 'C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe' // 或使用正斜杠 'binary' => 'C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe'调整PDF生成顺序
必须先设置选项,再添加页面内容,否则选项不会生效:$pdf = new Pdf; $pdf->setOptions([ // 选项配置 ]); $pdf->addPage($render);修复下载路径拼写错误
原代码中response()->download('D:report.pdf')少了斜杠,改为D:/report.pdf。优化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
相关产品推荐
相关产品推荐

