使用servlet在新窗口中打开pdf文件

4

我正在通过servlet从我的Web应用程序生成门禁通行证的PDF文件。 我希望在新窗口/选项卡中打开这个新生成的PDF,并且用户应该从servlet返回到应用程序。 如何在新窗口/选项卡中打开PDF? 我正在使用itext api生成pdf。 我的servlet代码片段如下:

        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control","must-revalidate, post-check=0,precheck=0");
        response.setHeader("Pragma", "public");
        response.setContentType("application/pdf");
        response.setContentLength(baos.size());
        OutputStream os = response.getOutputStream();
        baos.writeTo(os);
        os.flush();
        os.close(); 
2个回答

10

如果您使用GET请求进行Servlet调用

GET将链接的目标设置为target="_blank"

<a href="/url/to/servlet" target="_blank"/>

提交

<form method="post" action="url/to/servlet"
  target="_blank">

因此,浏览器将在新的窗口/标签页中发出新的GET / POST请求,然后将标题Content-disposition设置为inline,以内联方式呈现PDF,而不是提示下载窗口。


嗨,我有一个与此相关的问题。假设请求的资源不可用,我必须显示错误消息,而不进行对后端的两次调用(一次用于检查资源的可用性,另一次用于获取资源),我该如何实现这一点? - NITHIN RAJ T

7
/*create jsp page*/   
<form action="OpenPdfDemo" method="post" target="_blank">
        <input type="submit" value="post">
    </form>
/* create servlet (servlet name = OpenPdfDemo)*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");



        ServletOutputStream  outs =  response.getOutputStream ();
//---------------------------------------------------------------
// Set the output data's mime type
//---------------------------------------------------------------
response.setContentType( "application/pdf" );  // MIME type for pdf doc
//---------------------------------------------------------------
// create an input stream from fileURL
//---------------------------------------------------------------

File file=new File("X://Books/struts book/sturts_Books/struts-tutorial.pdf");


//------------------------------------------------------------
// Content-disposition header - don't open in browser and
// set the "Save As..." filename.
// *There is reportedly a bug in IE4.0 which  ignores this...
//------------------------------------------------------------
response.setHeader("Content-disposition","inline; filename=" +"Example.pdf" );

BufferedInputStream  bis = null; 
BufferedOutputStream bos = null;
try {

    InputStream isr=new FileInputStream(file);
    bis = new BufferedInputStream(isr);
    bos = new BufferedOutputStream(outs);
    byte[] buff = new byte[2048];
    int bytesRead;
    // Simple read/write loop.
    while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
        bos.write(buff, 0, bytesRead);
    }
} 
catch(Exception e)
{
    System.out.println("Exception ----- Message ---"+e);
} finally {
    if (bis != null)
        bis.close();
    if (bos != null)
        bos.close();
}


    }

1
为什么你要两次设置响应的内容类型?哪一个是正确的? - Stealth Rabbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接