【问题标题】:Reliably render a PDF which opens a print dialog when loaded on a web page可靠地呈现在网页上加载时打开打印对话框的 PDF
【发布时间】:2012-04-23 16:47:08
【问题描述】:

我有一个网页 (SSL),其中包含一个几乎不可见的 iframe,其源是从 Java servlet 流式传输的 PDF。几乎不可见的 iframe 的目的是呈现一个 PDF,当页面加载时,它会立即打开一个打印对话框。

这个过程是零星的。通常,当页面加载时,PDF 打印对话框会正确出现。但是,有时,PDF 打印对话框在页面加载时永远不会呈现。我知道这在 Java servlet 中不是问题,因为我可以从日志中验证 PDF 是否正确流式传输到调用页面。如果 PDF 打印对话框在页面加载时始终打开,我需要找到一种方法使其 99.9999........% 可靠。因此,我正在寻找有关如何确保这会发生的任何提示。

这需要适用于 Internet Explorer(特别是版本 8)。

这是打开包含 PDF iframe 的页面的 JavaScript:

function openPrintCheckWindow(){
    pc=window.open("/print_check.jsp", "pc", "toolbar=no,scrollbars=no,resizable=no");
    pc.resizeTo(1000,700);
    pc.moveTo(80,80);
}

这是包含 PDF iframe 的页面的源代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
    <TITLE></TITLE>

    <style> 
    #createpdf {
        position:absolute;
        top:0; 
        right:0; 
    }
    .micr {
        font-family: "MICR Encoding", sans-serif;
        font-size: 0.2in;
    }
    </style>

    <script type="text/javascript"> 
    function doAlert(msg){
    if(msg.length>0){
        alert(msg);
    }
    }

    //doesn't block the load event
    function createIframe(){
        var i = document.createElement("iframe");
        i.src = "/PrintCheckServlet";
        i.width = "2px";
        i.height = "2px";
        document.getElementById("createpdf").appendChild(i);
    };

    // Check for browser support of event handling capability
    if (window.addEventListener)
        window.addEventListener("load", createIframe, false);
    else if (window.attachEvent)
        window.attachEvent("onload", createIframe);
    else 
        window.onload = createIframe;
    </script>

</HEAD>

<BODY BGCOLOR="#DFD9D0" TEXT="#000066" onLoad="doAlert('')">
    <FORM METHOD="POST" TARGET="main_window" ACTION="ControllerServlet">            
    <P ALIGN="LEFT">
        <INPUT TYPE="BUTTON" NAME="CLOSE" VALUE="Close" 
         onClick="this.form.submit();window.close();window.opener.focus();window=null;">
        <br />
        <H3 id="print_message">A print dialog box will show momentarily</H3>
    </P>
    <div id="createpdf"></div>
    </FORM>
</BODY>
</HTML>

【问题讨论】:

  • window=null;window.opener.focus(); -- 这似乎不是一个好主意 :-)
  • 2 想法... 1.) 您说您在 SSL 上提供此服务...如果您有 Internet Explorer 用户,请务必NOT明确拒绝在您的HTTP 标头 - 在某些情况下,IE 会在文件加载之前将其删除。 2.) 再次为 IE(这次是 IE9 及更高版本)IE 将其行为更改为 NOT 等到弹出窗口完全加载后再继续执行脚本内容...如果您的代码在启动弹出窗口后 需要与之交互,一定要添加足够的延迟以确保它存在并准备好。
  • window 设置为null 之前 调用window.opener.focus() 只会导致JavaScript 错误,所以是的:-)
  • 你在不同的浏览器上得到不同的结果吗?你说它是零星的——Chrome/FF/IE/Safari 上的情况是否同样如此?
  • 刚刚更新的问题表明这是针对 IE8 的

标签: javascript internet-explorer pdf


【解决方案1】:

您是否可以假设查看您文件的人正在使用 Acrobat Reader 或其他“支持 JavaScript”的 PDF 阅读器?

如果是这种情况,您可以修改您的文件和generate a PDF that automatically prints instead.

【讨论】:

  • 该问题已接受答案的第二部分对我来说很有趣 - 我想我会尝试一下。我正在使用 iText 创建 PDF。就我而言,它被渲染为字节流,根本没有保存(据我所知)。我目前正在使用该答案的第一种方法 - writer.setOpenAction(action); 使用第二种方法可能更可靠。
猜你喜欢
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2013-09-08
  • 1970-01-01
相关资源
最近更新 更多