javascript - 将 Morris.js 图表导出为 PDF?
问题描述
我正在使用从 MySQL 数据库中检索数据的 Morris.js 创建一个折线图。我想将它下载为包含整个图表的 PDF 文件。
我尝试使用 html2canvas 和 jsPDF 来生成 PDF。但是,生成/下载的 PDF 不包含任何数据。
这是我的代码:
<?php
$connect = mysqli_connect("localhost", "root", "", "testing");
$query = "SELECT * FROM purchase";
$result = mysqli_query($connect, $query);
$chart_data = '';
while($row = mysqli_fetch_array($result))
{
$chart_data .= "{ year:'".$row["year"]."', profit:".$row["profit"].", purchase:".$row["purchase"].", sale:".$row["sale"]."}, ";
}
$chart_data = substr($chart_data, 0, -2);
?>
<div class="row">
<div id="chart" style="width:800px;"></div>
<canvas id="canvas" width="800px;"></canvas>
<button onclick="save();">Download</button>
</div>
Morris.Line({
element : 'chart',
data:[<?php echo $chart_data; ?>],
xkey:'year',
ykeys:['profit', 'sale'],
labels:['Profit', 'Sale'],
hideHover:'auto',
stacked:true
});
function save() {
html2canvas(document.getElementById('canvas'), {
onrendered: function(canvas) {
var img = canvas.toDataURL();
var doc = new jsPDF();
doc.addImage(img, 10, 10);
doc.save('test.pdf');
}
});
}
任何想法或建议将不胜感激。
解决方案
您不需要canvas
元素,因为 html2canvas 正在为您创建一个元素。
为了让它工作,我使用了最新的 html2canvas 版本1.0.0-rc.1 ,它使用了一个Promise而不是一个回调。
这是save
功能:
function save() {
html2canvas(document.getElementById('chart')).then(canvas => {
var w = document.getElementById("chart").offsetWidth;
var h = document.getElementById("chart").offsetHeight;
var img = canvas.toDataURL("image/jpeg", 1);
var doc = new jsPDF('L', 'pt', [w, h]);
doc.addImage(img, 'JPEG', 10, 10, w, h);
doc.save('sample-file.pdf');
}).catch(function(e) {
console.log(e.message);
});
}
一个完整的工作版本:JSFiddle
推荐阅读
- python - 在 django 中导入 css、js 文件链接时遇到问题
- php - 比较php数组中的字符串元素
- c# - 如何在 Visual Studio Code 中更新 C# 版本?
- javascript - Mongoose 中的 GraphQL 关系
- php - 使用 PHP 的 HTTP 标头“Content-Disposition:附件”问题
- laravel - Laravel:对多态关系进行排序
- spark-streaming - 使用 Spark Structured Streaming 水印处理迟到的事件?
- javascript - 复制纯 JS 版本的 D3 Zoomable Sunburst (observable)
- angular - NGRX 正确使用存储选择器
- c - 初始化包含指向另一个结构的结构指针的结构