- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
添加到此 stackoverflow 问题:Generating pdf using multiple graphs using html2canvas and jspdf
我尝试使用 Promise javascript api,如下所示:
function GeneratePDFforCharts(divNamesForPDF)
{
var arrayOfPromises = [];
//Note: Checking if the browser supports Promises
if (window.Promise) {
for (var i = 0; i < divNamesForPDF.length; i++)
{
var promise = new Promise(function (resolve, reject) {
//asynchronous code goes here
//Note: The Promise is passed a callback function. The callback takes two arguments, resolve and reject.
//Note: If everything is successful, the promise is fullfilled by calling resolve(). In case of an error, reject() is called with an Error object.
var element = $(divNamesForPDF[i]).get(0);
html2canvas(element, {
onrendered: function (canvas) {
resolve(canvas.toDataURL('image/png'));
}
});
});
arrayOfPromises.push(promise);
}
Promise.all(arrayOfPromises).then(function (canvases) {
var count = 0;
var pageNumber = 1;
var doc = new jsPDF('l', 'mm', [297, 210], true); //true is set for pdf compression
for (var i = 0; i < canvases.length; i++)
{
if (isOdd(count)) //2nd chart
{
doc.addImage(canvases[i], 'PNG', 10, 105, 270, 100, null, 'FAST'); //x, y, width, height - FAST is used for png compression
var pageNo = pageNumber.toString();
doc.text(140, 207, pageNo); //x, y, text
pageNumber++;
}
else //1st chart
{
if (count != 0)
{
doc.addPage();
}
doc.addImage(canvases[i], 'PNG', 10, 5, 270, 100, null, 'FAST');
}
count++;
}
doc.save('IEA_Global_MonthlyStocks_Analytics.pdf');
});
}
}
我正在做的是发送代表谷歌图表面板的 33 个 divname 作为 jspdf 的参数来生成 pdf。
问题:但是,当单击“生成 pdf”按钮时,Chrome 浏览器会崩溃。经过调试,似乎是通过了for循环。然而它永远不会出现在 Promise.all 函数中。
此外,最好指出以下几点:
对此有何反馈?请问我做错了什么吗?
最佳答案
代码似乎可以工作,但扩展性不太好。
通过并行执行所有操作,JavaScript 的垃圾收集 (GC) 可能没有机会清除中间对象,并且过大的堆会导致崩溃。
执行系列操作可能会产生积极的效果。该代码只是从问题中的代码派生出来的。
首先,一个适配器函数,它 promise html2canvas()
:
function html2canvasAsync(element) {
return new Promise(function(resolve, reject) {
html2canvas(element, {
onrendered: function (canvas) {
resolve(canvas.toDataURL('image/png'));
}
});
});
};
现在调用 divNamesForPDF.reduce(...)
来序列化异步操作并逐步添加到 jsPDF doc
中:
function GeneratePDFforCharts(divNamesForPDF) {
if (window.Promise) {
var doc = new jsPDF('l', 'mm', [297, 210], true); //true is set for pdf compression
return divNamesForPDF.reduce(function(p, name, i) {
return p.then(function(pageNumber) {
return html2canvasAsync($(name).get(0)) // or `document.getElementById(name)` ?
// return html2canvasAsync(document.getElementById(name)) // possibly?
.then(function(canvas) {
if (isOdd(i)) { // odds
doc.addImage(canvas, 'PNG', 10, 105, 270, 100, null, 'FAST'); //x, y, width, height - FAST is used for png compression
doc.text(140, 207, pageNumber.toString()); //x, y, text
pageNumber++;
} else { // evens
if (i > 0) {
doc.addPage();
}
doc.addImage(canvas, 'PNG', 10, 5, 270, 100, null, 'FAST');
}
return pageNumber;
}).catch(function(e) {
// Error handling is a good idea
console.log(e);
doc.text(35, 25, e.message); // possibly add the error message to doc
});
});
}, Promise.resolve(1)) // starter promise resolved with page number 1
.then(function() {
doc.save('IEA_Global_MonthlyStocks_Analytics.pdf');
});
}
}
仅检查语法
正如我所说,这并不比“可能”更好地解决问题。尝试一下并不需要花费任何费用。最糟糕的情况可能是 Chrome 再次崩溃。
关于javascript - 使用多个谷歌图表和jspdf生成PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39891974/
我正在使用带有插件 jspdf-autotable 的 jspdf 来为一个非常宽的表格创建一个 pdf,有没有办法让表格/列数据自动适应任何页面大小? 我尝试了下面的代码溢出:'linebreak'
我的表有 13 列。如何为每列获得不同的宽度?我可以像这样给每个列宽吗? 样式:{溢出:'换行符',列宽:[100,80,80,70,80,80,70,70,70,70,60,80,100]}, 我的
如何使用jspdf和jspadf-autotable在PDF中实现嵌套表格?类似于下图的内容: 最佳答案 jspdf-autotable 中不支持嵌套表格,但您可以使用 didDrawCell Hoo
在 jsPDF 中使用 .cell 时如何删除填充? 我到处都看了,文档很模糊 this.pdf = new jsPDF(); this.pdf.cell(0, 0, 10, 10, "cell ce
表格插件 JsPDF-AutoTable: https://github.com/simonbengtsson/jsPDF-AutoTable 如何使页面横向与纵向相反?在文档中,它只是说“仅支持 p
是否可以添加 HyperLink在 jsPDF ? 这是我用于相同的代码。 var doc = new jsPDF('p', 'pt'); doc.fromHTML( 'Cl
我对 jsPDF autotable 有疑问。 我的代码: $('#printBtn').on('click', function() { var pdf = new jsPDF('p
我有自动表的问题。我的表由 thead、tbody 和 tfoot 组成。我的脚是我在每一列上的总值(value)。我能够生成 pdf,但 tfoot 或总页脚不断打印在每一页上。我在检查文档时使用
有人可以帮忙举一个为 jspdf-autotable 设置自定义字体的例子吗? 我尝试了以下 var doc = new jsPDF('p', 'pt'); doc.setFont("rotobo")
我有一个带图像的 html 表。当我尝试转换为 PDF 时,只有数据来了。图像未以 PDF 格式显示。 如何获取pdf格式的表格td图片? 契约(Contract)标题包含复选框图像。但不是以 pdf
我正在做的是使用 jsPDF 创建我生成的图形的 PDF。但是,我不确定如何包装标题(使用 text() 函数添加)。标题的长度因图形而异。目前,我的标题正在页面外运行。任何帮助,将不胜感激! 这是我
我正在使用img jsPDF AutoTable库从我的HTML表创建PDF文件,Everythink工作正常,PDF总是创建,但我对我的国家/地区典型的一些特殊字符有疑问。在我的 PDF 文件中,包
JsPdf-autoTable是一款非常棒的软件,并且非常简单就能让基础功能发挥作用。 现在我想在每个页面的顶部添加一个 Logo 和一些文本,并在每个页面上添加一个 page X of Y 页脚,但
我有一个用于保存 html 页面的按钮。当用户单击按钮时,我想触发 jsPDF 函数,但它返回“jspdf PubSub 错误”并且生成的 pdf 文件为空白。 var doc = new jsPD
我是使用 jsPDF 的新手,能够很好地生成普通 PDF,但是当我尝试应用外部 CSS 或普通样式背景颜色时,它没有任何效果。 我的 JSP 包括: 我正在使用下
我正在尝试将“页码 x of y”添加到使用 jspdf 和 jspdf-autotable 生成的 PDF 中。我使用了 jspdf-autotable 示例网站上的 Examples.js 文件中
我正在使用jspdf和jspdf-autotable将基于数据的表格导出为PDF。 有时,我的数据可能包含 DOM 元素,这些元素不由 jspdf-autotable 插件处理。在大多数情况下,DOM
我刚刚开始使用 jsPDF 和 AutoTable 插件,它几乎完美地满足了我们的使用需求。一个问题... 是否可以将列定义中的 dataKey 分配给映射到表的 JSON 中的嵌套属性? 我们有一个
我刚刚开始使用 jsPDF 和 AutoTable 插件,它几乎完美地满足了我们的使用需求。一个问题... 是否可以将列定义中的 dataKey 分配给映射到表的 JSON 中的嵌套属性? 我们有一个
我使用 Array.prototype.push() 创建了一个包含来自动态表的值的数组.然后像这样把它转换成pdf doc.autoTable(vHeader, vData, opt); doc.s
我是一名优秀的程序员,十分优秀!