Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Chart.js Chartjs+;jsPDF=模糊图像_Chart.js_Jspdf_Html2canvas - Fatal编程技术网

Chart.js Chartjs+;jsPDF=模糊图像

Chart.js Chartjs+;jsPDF=模糊图像,chart.js,jspdf,html2canvas,Chart.js,Jspdf,Html2canvas,我在将图表导出为PDF时遇到一些问题 我有这个部门 <div id="chart-area"> <button type="button" id="btnPrint_" onClick="Print1()">Print</button> <?php echo '<h2 id="title">'.$_SESSION['team_name'].'</h2>'; ?> <canvas

我在将图表导出为PDF时遇到一些问题

我有这个部门

    <div id="chart-area">
    <button type="button" id="btnPrint_" onClick="Print1()">Print</button>
    <?php echo '<h2 id="title">'.$_SESSION['team_name'].'</h2>'; ?>
        <canvas id="myChart" width="800" height="400"></canvas>
        <div id="legend"></div>
    </div>
问题是我的图表在pdf文件中完全模糊

你知道怎么解决这个问题吗

这是我第一次使用ChartJS和jsPDF,所以我可能做错了什么


谢谢

分辨率来自画布大小。增加画布(宽度和高度)越多,下载PDF时的分辨率就越好

但是,您可能不想将画布大小增加太多,因此,您可以使用的一个技巧是创建一个具有更高宽度和高度的隐藏画布,使用它打印图表并创建PDF,从而获得更好的PDF质量

这里有一个小提琴演示了这一点,其中一个选项是下载从原始画布/图表创建的PDF,另一个选项是从隐藏的画布/图表下载新的PDF。在比较这两个结果时,您可以看到质量是如何大大提高的

我不认为这是最好的解决方案,但是,这是我唯一能提高PDF图表文件质量的方法。我目前正在研究这两个库,特别是jsPDF在创建文档时如何处理
w
h
参数


此外,Chart.js确实附带了一个内置函数,可以从图表中提取图像(
.toBase64Image()
),但是,当我进行测试时,质量似乎更差。

我一直在从事一个项目,试图用chartjs生成图形,然后使用Chrome的打印到PDF功能打印它们,我发现chartjs图看起来很糟糕。在阅读了stackoverflow和github上的各种线程之后,我开发了一个对我来说足够好的解决方案

在我的特殊情况下,我需要一个固定大小的图表,我不能让它们响应,因为我需要它们正确地适应打印页面。我使用样式标记设置大小:

我发现,如果在图表中设置responsive:false,然后使用这样的样式标记,Chartjs将不会影响图表的大小。使用任何其他方法,如设置宽度或高度(而不是样式宽度或高度)或使用css类,都无法正确设置它。只有当我为此设置元素的内联样式标记时,Chartjs似乎才起作用

无论如何,对于我来说,获得更好的PDF输出的诀窍是让Chartjs呈现一个更大的图表,然后将其缩小到一个更小的大小,这样它就可以正确地显示在我的页面上

比如说,出于某种原因,我们想要一个300x300像素的图表,当我们将它打印到PDF时,它看起来很差。我们需要让ChartJ将此图表绘制成更大的图表,然后将其调整为300x300。在我自己的项目中,我让Chartjs将其绘制为2倍大。因此,对于本例,我将创建一个画布元素,其大小为600x600,如下所示:

<canvas style="width: 600px; height: 600px;" class="graph" />

同时,我有一个高度和宽度设置为300px的“graph”css类。但是,由于内联样式,图表将不会以300px的速度呈现

然后,您可以按照通常的方式制作图表,但在制作图表的代码行之后,立即从图表中删除内联样式标记。我发现当你这样做的时候,chartjs会把图表画得更大 600x600大小,但随后图表立即调整为300x300。下面是代码的示例:

var ctx=canvas.getContext('2d');var mychart=新图表(ctx,{…)。。。。 }); canvas.removeAttribute(“样式”)

canvas.removeAttribute删除内联样式标记,因此css类 生效并立即使画布以较小的大小重新渲染。没有闪光或任何迹象表明发生了这种情况,但我发现您得到的图表质量要高得多

这还有一个问题。例如,您必须为更大的600x600尺寸设计图表,以使其看起来正确。当你以更大的尺寸绘制图表时,线条和字体不会调整大小,所以所有的东西看起来都很小。我必须手动将图表设置为更大的尺寸来设计它,并首先为图表找出好的字体和线条尺寸,然后在这里执行调整大小的技巧


我还发现,简单地使用较小的图表并制作较粗的线条或较大的字体,似乎与先调整所有内容的大小,然后将其呈现为较小的大小没有相同的效果。

因为一些版本的chart.js具有参数devicePixelRatio。 默认情况下,画布由监视器以DPI编号呈现,因此96或视网膜-不适合打印输出,但非常适合屏幕

如果增加此值,将创建更多像素。展开该值,以便可以将具有打印质量的图表导出为Base64图像。该值不影响图表在监视器上的显示

在我的例子中,我将该值设置为1.5

options:{
      devicePixelRatio: 1.5
}
文件:
非常好用…

我知道已经有一段时间了,但是你有没有试过输出PNG文件而不是JPEG文件?我质疑用于生成JPEG文件的压缩方案,以及它们失去图形内置透明度的事实。@Ecksters,我可能在大多数情况下使用png,它工作得很好。另外,正如您所提到的,它将保持图形的透明度。
<canvas style="width: 600px; height: 600px;" class="graph" />
options:{
      devicePixelRatio: 1.5
}