我想保存包含IFrame内容的PDF文件。我正在使用jsPDF。当我点击调用该函数的按钮时,脚本会创建一个空的PDF页面。
框架内容如下:https://jsfiddle.net/ss6780qn/
我使用以下脚本:
<script src="../jspdf/plugins/standard_fonts_metrics.js"></script>
<script type="text/javascript">
function toPDF(){
var pdf = new jsPDF('p', 'in', 'letter');
// source can be HTML-formatted string, or a reference
// to an actual DOM element from which the text will be scraped.
source = $('#frame')[0]
// we support special element handlers. Register them with jQuery-style
// ID selector for either ID or node name. ("#iAmID", "div", "span" etc.)
// There is no support for any other type of selectors
// (class, of compound) at this time.
specialElementHandlers = {
// element with id of "bypass" - jQuery style selector
'div': function(element, renderer){
// true = "handled elsewhere, bypass text extraction"
return true
}
}
// all coords and widths are in jsPDF instance's declared units
// 'inches' in this case
pdf.fromHTML(
source // HTML string or DOM elem ref.
, 0.5 // x coord
, 0.5 // y coord
, {
'width':7.5 // max width of content on PDF
,'elementHandlers': specialElementHandlers
}
)
pdf.save('Test.pdf');
}
有人知道出了什么问题以及如何解决这个问题吗?
答案 0 :(得分:2)
对于这个问题,看起来像Github上的一个开放案例,自2015年以来仍然开放。请参阅https://github.com/MrRio/jsPDF/issues/496。也许没有解决方案。
另外,源代码在您调用的jsPDFAPI.fromHTML函数之前是以下表示法。请查看可能影响您工作的最后一点表。
* Converts HTML-formatted text into formatted PDF text. * * Notes: * 2012-07-18 * Plugin relies on having browser, DOM around. The HTML is pushed into dom and traversed. * Plugin relies on jQuery for CSS extraction. * Targeting HTML output from Markdown templating, which is a very simple * markup - div, span, em, strong, p. No br-based paragraph separation supported explicitly (but still may work.) * Images, tables are NOT supported.
另外 - 我试图在这里和jsfiddle中设置一个工作片段但是无法使jsPDF.fromHTML工作。我不是jsPDF的专家,但是我已经走到了街区,我不会觉得jsPDF非常强大 - 你可能想要扩大你的网络并找到另一个插件。只是我的意见。
答案 1 :(得分:1)
要从iframe打印html,您需要从iframe获取内容。从iframe获取内容的源代码(我来自this):
function getFrameContents() {
var iFrame = document.getElementById('frame');
var iFrameBody;
if (iFrame.contentDocument) { // FF
iFrameBody = iFrame.contentDocument.getElementsByTagName('body')[0];
} else if (iFrame.contentWindow) { // IE
iFrameBody = iFrame.contentWindow.document.getElementsByTagName('body')[0];
}
//alert(iFrameBody.innerHTML);
return iFrameBody.innerHTML
}
所以你替换:
source = $('#frame')[0]
带
source = getFrameContents();
使用jQuery 或简单:
source = $("#frame").contents().find('body')[0];
但是,仍存在关于CORS(跨源资源共享)的问题。要解决这个问题,您可以创建Web服务器并在其中放置html代码和iframe src,看看它是如何工作的。