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'回见!
我正在开发一个 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'回见!