Chrome 打包应用程序中的 jspdf : document.writeln() 不可用

jspdf in Chrome packaged app : document.writeln() not available

我正在开发一个 Chrome 应用程序,我希望允许用户将一些 HTML Table 导出为 PDF。 我做了一些研究,发现 jsPdf 是我需要的插件。 现在是我的问题。 jsPDF 及其函数 "fromHTML" 使用 "document.writeln()" 方法,这在 Chrome 打包应用程序中不可用。

"Uncaught Error: document.writeln() is not available in packaged apps."

Console error as jspdf tries to use document.writeln()

我在互联网上进行了大量研究,发现有一些方法可以通过添加一些 "document.create" 来解决这个问题。但是虽然我不知道 jspdf 是如何工作的,但我真的不知道要创建什么。

jspdf 的一部分导致了这个问题:

var $frame, $hiddendiv, framename,  visuallyhidden;

framename = "jsPDFhtmlText" + Date.now().toString() + (Math.random() * 1000).toFixed(0);

visuallyhidden = "position: absolute !important;" + "clip: rect(1px 1px 1px 1px); /* IE6, IE7 */" + "clip: rect(1px, 1px, 1px, 1px);" + "padding:0 !important;" + "border:0 !important;" + "height: 1px !important;" + "width: 1px !important; " + "top:auto;" + "left:-100px;" + "overflow: hidden;";

$hiddendiv = document.createElement('div');
$hiddendiv.style.cssText = visuallyhidden;
$hiddendiv.innerHTML = "<iframe style=\"height:1px;width:1px\" name=\"" + framename + "\" />";
document.body.appendChild($hiddendiv);

$frame = window.frames[framename];
$frame.document.open();
$frame.document.writeln(element);//This causes "Uncaught Error: document.writeln() is not available in packaged apps."
$frame.document.close();
return $frame.document.body;

这里是我对jspdf库的调用,也许我在这里犯了一个错误:

$('#exportMonth').click(function(){
    console.log(TAG + "Starting rendering as PDF");

    var doc = new jsPDF();
    specialElementHandlers = {
        // element with id of "bypass" - jQuery style selector
        // here i've nothing to bypass, so nothing is 'bypassme'
        '#bypassme': function(element, renderer) {
            // true = "handled elsewhere, bypass text extraction"
            return true
        }
    };
    //the id 'month' refers to a div containing a html Table
    doc.fromHTML($('#month').html(),15,15 ,{
        width:600,
        elementHandler:specialElementHandlers
    });
    doc.save('Tst.pdf');

    console.log(TAG + "Should be done");
});

我会继续我的研究,但我现在真的迷路了,我真的需要你的帮助!

我可能忘记说一些事情,请告诉我,我会尽快解决。

非常感谢!

经过大量研究和几次愤怒退出后,我找到了解决方案。我真的不知道它为什么有效,但它确实有效,我会在这里分享这个,以防你们中的一个 运行 遇到这个问题。 我想这更像是一个技巧/黑客而不是真正的解决方案。

替换这个:

doc.fromHTML($('#month').html(),15,15 ,{
    width:600,
    elementHandler:specialElementHandlers
});
doc.save('Tst.pdf');

通过这个:

doc.fromHTML($('#month')[0],15,15 ,{ //ONLY CHANGE IS HERE
    width:600,
    elementHandler:specialElementHandlers
});
doc.save('Tst.pdf');

会起作用。不再产生错误并且 pdf 已成功下载到本地文件。

如果有人知道为什么这有效,我会很乐意学习,因为这有点令人不安。

希望有一天能帮助到某人,

非常感谢'n'回见!