【问题标题】:Print a PDF loaded in IFrame via Javascript通过 Javascript 打印在 IFrame 中加载的 PDF
【发布时间】:2015-01-23 23:45:30
【问题描述】:

为什么做不到?我花了2天时间研究它。就是做不到!

Chrome 的最新版本确实允许父窗口访问 PDF 的 iframe。但无论是 FF 还是 IE 都不允许我触摸上面包含“application/pdf”的 iframe。

代码很简单:

<iframe id="pdfFrame" src="/mydomain/document.pdf"></iframe>

如果我打电话:

pdfFrame.contentWindow.print();

FF 说:

Error: Permission denied to access property 'print'

IE 说:

SCRIPT65535: Invalid calling object 

以前有人遇到过同样的情况吗?有没有人设法解决它?有没有人有不同的建议?我只想从我自己的域中下载 PDF 并将其优雅地发送到打印机。

我尝试使用 CSS @media 格式化我的文档。但这是一团糟。无论我将框架设置为 100% everthing,都只打印文档的一半。

谢谢!!

【问题讨论】:

    标签: javascript html css pdf iframe


    【解决方案1】:

    使用下面的 html 显示 pdf。 iframe 用于 chrome 打印

    <object id="exPDF" type="application/pdf" data="pdfUrl#toolbar=1&navpanes=0&statusbar=0&messages=0" style="width:100%;height:475px;" >
    
    <iframe id="iframePDF" name="iframePDF" src="pdfUrl" width="1" height="1" >
    
    //javascript
    try {
    
        if (isChrome) {
            var iframe = document.getElementById('iframePDF');
            if (iframe.src) {
                var frm = iframe.contentWindow;
    
                frm.focus();// focus on contentWindow is needed on some versions  
                frm.print();
            }
        }
        else {
            var _pdf_o = document.getElementById('exPDF');
            if (_pdf_o != undefined) {
                _pdf_o.print();
            }
            else {
                alert("pdf object not found");
            }
        }
    } catch (e) {
        alert(e.description);
    }
    

    【讨论】:

    • 尝试了您的解决方案。它适用于 Chrome。但在 IE11 和 FF34 中, TAG 都没有定义 print() 函数。我还能尝试什么?
    【解决方案2】:

    这是一个混乱的解决方案,取决于您的经验深度。但是,我建议在 iframe 内容上添加一个窗口事件侦听器。然后在父窗口上发出消息/发布消息。然后,当在 iframe 上接收到消息时,让该页面打印出 pdf,然后它应该在同一级别。 诚然,我个人并没有真正做到这一点,但我使用过在 iframe 之间来回传递的通用事件侦听器/发布消息。

    也许您的 iframe 中没有任何 HTML,如果它只是指向 pdf 的直接链接,请先尝试使用另一个答案。

    也许是个不错的起点: https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage

    【讨论】:

    • 谢谢埃莉诺。但问题是,我可以成功打印 PDF 的唯一方法是将其直接加载到 iframe 中,然后调用 iframe 的 print() 函数。你说的对。我在 iframe 中没有任何 HTML,纯 PDF 内容。所以无法在 iframe 中添加事件侦听器来捕获从主窗口发送的消息... :(
    猜你喜欢
    • 2016-11-04
    • 1970-01-01
    • 2014-02-09
    • 2013-05-12
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多