使用jsPDF从iframe创建PDF

时间:2018-11-01 22:09:47

标签: javascript jquery html html5 jspdf

好的,我已经在互联网上搜寻了解决方案,但是找不到任何东西。我试图找到一种方法将iframe的内容另存为PDF。我经常遇到PDF只是空白的问题。看来jsPDF是唯一的方法。我想知道这不起作用的原因是因为fromHTML()函数。我不确定。如果你们中的任何一个想出了解决方案,我将不胜感激!

您可以在HTML文件中尝试以下示例代码:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript"></script>
<script>
    function demoFromHTML() {
    var pdf = new jsPDF('p', 'pt', 'letter');
    source = $('#frame')[0];
    specialElementHandlers = {
        '#bypassme': function (element, renderer) {
            return true
        }
    };
    margins = {
        top: 80,
        bottom: 60,
        left: 40,
        width: 522
    };
    pdf.fromHTML(
    source,
    margins.left,
    margins.top, {
        'width': margins.width,
        'elementHandlers': specialElementHandlers
    },

    function (dispose) {
        pdf.save('Test.pdf');
    }, margins);
}
</script>
<button onclick="javascript:demoFromHTML();">PDF</button>
<iframe id="frame" src='https://wikipedia.org/wiki/Main_Page' style="width: 75%;height: 75%;"></iframe>

4 个答案:

答案 0 :(得分:1)

阅读本文:Convert HTML/CSS Content to a Sleek Multiple Page PDF File Using jsPDF JavaScript library。提供的脚本允许您将任何HTML元素转换为PDF。我对generate()函数进行了一些修改,以便它采用任何HTML元素ID名称并将其导出为PDF文件:

generate = function(doc)
{
	var pdf = new jsPDF('p', 'pt', 'a4');
	pdf.setFontSize(18);
	pdf.fromHTML(document.getElementById(doc), 
		margins.left, // x coord
		margins.top,
		{
			// y coord
			width: margins.width// max width of content on PDF
		},function(dispose) {
			headerFooterFormatting(pdf, pdf.internal.getNumberOfPages());
		}, 
		margins);
		
	var iframe = document.createElement('iframe');
	iframe.setAttribute('style','position:absolute;right:0; top:0; bottom:0; height:100%; width:650px; padding:20px;');
	document.body.appendChild(iframe);
	
	iframe.src = pdf.output('datauristring');
};

它在Chrome上可100%正常运行,但我不确定其他浏览器。

答案 1 :(得分:0)

这里有一个疯狂的猜测,但是我认为这与来自其他域的iframe受保护这一事实有关。 如果有原因,请阅读“跨域策略”,我敢肯定您不能很轻松地解决它。

答案 2 :(得分:0)

尝试

    var source = window.document.getElementsByTagName(tagName)[0];

代替

 source = $('#frame')[0];

答案 3 :(得分:0)

尝试此解决方案。

<button id="generatePDF">Generate PDF</button>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<script>
$( '#generatePDF' ).click( function()
{
    var pdf = new jsPDF('a4');
    pdf.text("Some text inside PDF", 10, 10);

    $( '#docpdf' ).attr('src', pdf.output('datauristring'));
});

</script>

<iframe id="docpdf" style="background-color:#EEE; heigth:400px;">
    PDF goes here 
</iframe>