Javascript 可靠地呈现PDF,当加载到网页上时会打开打印对话框

Javascript 可靠地呈现PDF,当加载到网页上时会打开打印对话框,javascript,internet-explorer,pdf,Javascript,Internet Explorer,Pdf,我有一个web页面(SSL),其中包含一个几乎不可见的iframe,其源是来自javaservlet的PDF流。几乎看不见的iframe的目的是呈现PDF,当页面加载时,它会立即打开一个打印对话框 这一过程是以零星的方式进行的。加载页面时,通常会正确显示PDF打印对话框。不过,有时,页面加载时不会呈现“PDF打印”对话框。我知道这在Javaservlet中不是问题,因为我可以从日志中验证PDF是否正确地流到调用页面。我需要找到一种方法,使其99.9999……%可靠,如果有可能的话,PDF打印对话

我有一个web页面(SSL),其中包含一个几乎不可见的iframe,其源是来自javaservlet的PDF流。几乎看不见的iframe的目的是呈现PDF,当页面加载时,它会立即打开一个打印对话框

这一过程是以零星的方式进行的。加载页面时,通常会正确显示PDF打印对话框。不过,有时,页面加载时不会呈现“PDF打印”对话框。我知道这在Javaservlet中不是问题,因为我可以从日志中验证PDF是否正确地流到调用页面。我需要找到一种方法,使其99.9999……%可靠,如果有可能的话,PDF打印对话框总是在页面加载时打开。所以,我正在寻找如何确保这一点的任何提示

这需要适用于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);
}
<!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>
以下是包含PDF iframe的页面的源代码:

function openPrintCheckWindow(){
    pc=window.open("/print_check.jsp", "pc", "toolbar=no,scrollbars=no,resizable=no");
    pc.resizeTo(1000,700);
    pc.moveTo(80,80);
}
<!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>

#创建PDF{
位置:绝对位置;
排名:0;
右:0;
}
米克尔先生{
字体系列:“MICR编码”,无衬线;
字体大小:0.2英寸;
}
函数doAlert(msg){
如果(消息长度>0){
警报(msg);
}
}
//不阻止加载事件
函数createIframe(){
var i=document.createElement(“iframe”);
i、 src=“/PrintCheckServlet”;
i、 宽度=“2px”;
i、 高度=“2px”;
document.getElementById(“createpdf”).appendChild(i);
};
//检查浏览器是否支持事件处理功能
if(window.addEventListener)
addEventListener(“加载”,createIframe,false);
else if(窗口附件)
attachEvent(“onload”,createIframe);
其他的
window.onload=createIframe;


将立即显示打印对话框


假设查看您文件的人使用的是Acrobat Reader或其他“支持javascript”的PDF阅读器,您同意吗


如果是这种情况,您可以修改您的文件并

window=null;window.opener.focus()--这似乎不是个好主意:-)2个想法。。。1.)你说你在SSL上提供这个。。。如果您有Internet Explorer用户,请确保不要明确拒绝HTTP头中的缓存—在某些情况下,IE会在加载文件之前删除该文件。2.)同样对于IE(这次是IE9及以上版本),IE改变了它的行为,在继续执行脚本内容之前,不等待弹出窗口完全加载。。。如果您的代码在启动弹出窗口后需要与之交互,请确保添加足够的延迟,以确保其存在并准备就绪。在调用
window.opener.focus()
之前,将
window
设置为
null
,只会导致JavaScript错误,因此是:-)在不同的浏览器上会得到不同的结果吗?你说这是零星的-Chrome/FF/IE/Safari上的情况也是这样吗?刚刚更新的问题表明这是针对IE8的。我对这个问题的公认答案的第二部分很感兴趣-我想我会尝试一下。我正在使用iText创建PDF。在我的例子中,它被呈现为字节流,而根本没有保存(据我所知)。我目前正在使用该答案的第一种方法--
writer.setOpenAction(action)使用第二种方法可能更可靠。