【发布时间】:2020-12-21 20:53:53
【问题描述】:
我正在尝试用 vue-chartjs 绘制图表的报表系统,我想将它们下载为 PDF 或任何文件。
这是 App.vue 的样子
<template>
<div>
<div id="printSection" ref="document">
<AreaChart />
<PieChart />
...
</div>
<button @click="printSection">Print Shit</button>
</div>
</template>
<script>
import AreaChart from "./SuperAdmin/AreaChart";
import PieChart from "./SuperAdmin/PieChart";
...
//import { Printd } from "printd"; //tried with this one
//import html2pdf from 'html2pdf.js'; // and this one
export default {
name: "App",
components: {
AreaChart,
PieChart,
},
data() {
return { };
},
mounted() {
var d = new Printd();
},
methods: {
printSomething () { // this was for printd
this.d.print( this.$el, this.cssText)
},
exportToPDF () { // this was for html2pdf
html2pdf()
html2pdf(this.$refs.document, {
margin: 1,
filename: 'document.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { dpi: 192, letterRendering: true },
jsPDF: { unit: 'in', orientation: 'landscape' }
})
},
printSection() {
this.$htmlToPaper("printSection"); // this was for htmltopaper
}
}
};
</script>
<style>
...
</style>
所以,如您所见,我尝试了 3 个包将图表转换为 PDF,但它们总是打印空文件,除了 html2pdf,它将图表切成两半。
这是我的一张图表:
饼图.vue
<script>
import { Pie } from "vue-chartjs";
import displayshit from '../../service/Hello'
import labels from 'chartjs-plugin-labels'
//import { plugins } from 'chart.js';
export default {
extends: Pie,
async mounted() {
var data = [];
var new_data = [];
var Type = ['Mobile','Card','Both']
var sum = 0 ;
data = (await displayshit.displayanothershit()).data.message;
var Mobile_number = data.find(element=> JSON.stringify(element._id) == JSON.stringify([Type[0]])) || 0
var Card_number = data.find(element=> JSON.stringify(element._id) == JSON.stringify([Type[1]])) || 0
var Both_number = data.find(element=> element._id.length == 2) || 0
new_data.push(Mobile_number.count || 0)
new_data.push(Card_number.count || 0)
new_data.push(Both_number.count || 0)
this.gradient = this.$refs.canvas
.getContext("2d")
.createLinearGradient(0, 0, 0, 450);
this.gradient2 = this.$refs.canvas
.getContext("2d")
.createLinearGradient(0, 0, 0, 450);
this.gradient.addColorStop(0, "rgba(255, 0,0, 0.5)");
this.gradient.addColorStop(0.5, "rgba(255, 0, 0, 0.25)");
this.gradient.addColorStop(1, "rgba(255, 0, 0, 0)");
this.gradient2.addColorStop(0, "rgba(0, 231, 255, 0.9)");
this.gradient2.addColorStop(0.5, "rgba(0, 231, 255, 0.25)");
this.gradient2.addColorStop(1, "rgba(0, 231, 255, 0)");
this.renderChart(
{
labels: Type,
datasets: [
{
backgroundColor: [this.gradient, this.gradient2, "#00D8FF"],
data: new_data
},
],
},
{ responsive: true, maintainAspectRatio: false,plugins: {
labels: {render: 'label',
}
}}
);
},
};
</script>
我想将图表转换为 PDF 文件,但我也希望能够选择在 PDF 中包含哪些图表。
这是一个sandbox 和我的代码。
另外,如果您能解释如何响应式更新图表,那就太好了
【问题讨论】:
-
您能否创建一个 repo 或 codesandbox 来证明您的问题,以便我们更好地帮助您?您提供的代码很难用于重现问题,因为它具有您未包含的依赖项。
-
给你,我已经在沙盒上发布了我的代码 - (codesandbox.io/s/quizzical-pond-v15jz?file=/src/App.vue) 请帮助我
-
我终于找到了解决方案,请参阅下面的答案。抱歉花了这么长时间,但实际上比我想象的要困难得多。
标签: vue.js chart.js jspdf vue-chartjs jsreport