繁体   English   中英

jsPDF addHTML 方法不起作用,没有错误消息

[英]jsPDF addHTML method not working with no error message

我使用jsPdf官方演示站点的示例来测试新的addHTML功能,稍作改动即可直接保存生成的PDF。

console.log("testing");
var pdf = new jsPDF('p','pt','a4');
pdf.addHTML(document.body,function() {
    console.log("started");
    pdf.save()
    console.log("finished");
});
console.log("testing again");

当我运行上面的脚本时,它不会生成错误消息,但也不会生成 PDF。 在控制台中,只显示“测试”和“再次测试”,所以我猜脚本没有运行。

我错过了什么? 我正在使用 bootstrap tab 函数和一些使用highchart生成的图表。 jsPDF 处理起来是不是太复杂了?

这是因为回调函数改成了promise。

进行以下更改。

pdf.addHTML(document.body,function() {
    console.log("started");
    pdf.save()
    console.log("finished");
});

pdf.addHTML(document.body).then(()=> {
    console.log("started");
    pdf.save()
    console.log("finished");
});

首先,您需要html2canvasrasterizeHTML才能使用 jsPDF 的 addHTML 方法。 进一步的问题是 jsPDF 覆盖了 html2canvas 库定义的许多方法。 只需查看jsPDF源代码并搜索html2canvas。 即使在我的项目中包含 html2canvas 脚本后,我也遇到了您描述的完全相同的问题。

最后一个问题是包含脚本的顺序。 对我来说,它适用于当前版本的 jsPDF (1.1.239) 和 html2canvas (0.5.0-alpha1),当首先包含 jsPDF 和 html2canvas 之后。 在我的项目中,它看起来像这样:

<head>
    <script src="./lib/jspdf/jspdf.debug.js"></script>
    <script src="./lib/html2canvas/html2canvas.js"></script>
    <!-- more includes ... -->
</head>

我认为在 jsPDF 中覆盖 html2canvas 方法是不好的做法,因为在 html2canvas 更改时很难维护,正如这个问题所示。

当脚本包含通过 RequireJS 完成时,这个问题的行为可能会有所不同。

jspdf 无法转换 svg 元素。 使用这个库可以很容易地做到这一点

示例用法 -

function _svgToCanvas() {
    var nodesToRecover = [];
    var nodesToRemove = [];

    var svgElems = document.getElementsByTagName("svg");

    for (var i = 0; i < svgElems.length; i++) {
        var node = svgElems[i];
        var parentNode = node.parentNode;
        var svg = parentNode.innerHTML;

        var canvas = document.createElement('canvas');

        canvg(canvas, svg);

        nodesToRecover.push({
            parent: parentNode,
            child: node
        });
        parentNode.removeChild(node);

        nodesToRemove.push({
            parent: parentNode,
            child: canvas
        });

        parentNode.appendChild(canvas);
    }
}

进而 -

var pdf = new jsPDF('p', 'px', 'a4');
var options = {
    pagesplit: true
};
pdf.addHTML($('body'), 0, 0, options, function () {
     console.log("done");
     pdf.save('test.pdf')
  });

有同样的问题。 虽然我不确定addHTML的确切问题是什么,但我设法使用html2canvas让它工作:

html2canvas(document.body).then(canvas => {
    var pdf = new jsPDF('p', 'pt', 'a4');
    pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 0, 0, 210, 297);
    pdf.save();
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM