我安装了laravel 5.6并安装了barryvdh / laravel-dompdf软件包。我使用了一些jquery图表插件来显示刀片文件上的图表,它运行正常。通过使用dompdf包,我试图在pdf上显示这个饼图,但图表没有在pdf上显示。如何在pdf上显示图表,是否有任何解决方案可以在流媒体/下载pdf上显示图表。
在刀片文件上查看时,图表插件/库显示以下图表:
我正在尝试的是在流媒体/下载pdf上显示此图表
代码如下: 控制器代码:
public function generate_pdf(){
$data = [
'foo' => 'bar'
];
//return view('pdf');
$pdf = PDF::loadView('pdf', $data);
return $pdf->stream('document.pdf');
}
pdf.blade.php代码:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Create</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="{{ asset('public/js/piechart.js') }}"></script>
<script>
window.onload = createPieChart;
function createPieChart() {
var pieChart = new PieChart( "piechart",
{
includeLabels: true,
data: [40, 250, 70],
labels: ["11%", "69.6%", "17.4%"],
colors: [
["#FFDAB9", "#FFDAB9"],
["#E6E6FA", "#E6E6FA"],
["#E0FFFF", "#E0FFFF"]
]
}
);
pieChart.draw();
}
</script>
</head>
<body>
<canvas id="piechart" width="400" height="400">
</canvas>
</body>
</html>
这是一个经典问题。它会影响许多不同的工具,而不仅仅是dompdf。至少涉及三个问题:
服务器端工具可以使用生成的HTML,但通常不运行Javascript。它解释HTML和CSS,好像它是一个禁用Javascript的浏览器,因此jQuery和许多其他Javascript库根本不起作用,因此任何生成客户端的图形都无法捕获。
客户端工具可以在所有Javascript(jQuery或其他)完成后运行。但是,还有其他问题......
有许多方法可以在浏览器中呈现图形。老式的方法是在服务器上生成图形并将jpg或png图像下载到浏览器中。但是,这不提供动态图表(不容易),详细的鼠标悬停操作等。因此大多数站点现在使用SVG或其他客户端系统。所有(或几乎所有)当前浏览器都支持SVG,因此它已经在很大程度上取代了旧方法。 SVG(以及较旧的方法)不易捕获以呈现为PDF或其他文档。因此,即使使用客户端系统,您通常也会得到图形所在的“洞”。
生成客户端SVG图表时,所有内容都根据您的屏幕分辨率进行调整。如果您设法将该图表与HTML一起捕获,则文本将是高分辨率的(因为它是文本并且可以被视为具有可缩放字体的PDF中的文本),但图形将限制为最初绘制的分辨率。这适用于临时使用,但在高质量打印机上打印时可能无法产生所需或所需的质量。典型的屏幕分辨率为~100dpi,典型的打印机分辨率为~200dpi-300dpi(额定值更高,但从实际角度来看,200dpi或更高的彩色图像通常是令人满意的,除了艺术品质的照片)。
到目前为止,我发现的最佳解决方案是使用虚拟或“无头”浏览器来创建所有内容 - 运行Javascript并生成SVG输出以及HTML和CSS。然后将输出捕获为高分辨率图像以插入PDF。您可以使用任何服务器端框架/工具包/等。同时进行捕获并创建PDF。
有免费的开源软件包。可能最受欢迎的是PhantomJS,但我刚检查过,它目前已存档/未激活。我已经使用它并且它有效,但有很多问题。
还提供各种服务。我目前使用的是URLBox.io。我没有个人兴趣 - 只是一个非常满意的客户。它包括用于将图像保存到Amazon S3的选项(取决于订阅类型),或者您可以在本地捕获。对我来说最重要的是,您可以设置非常高的分辨率,以便捕获的图像看起来真的很棒。我主要用它来自动将网页图像插入到PDF中。