【问题标题】:open pdf file in new window using servlet使用servlet在新窗口中打开pdf文件
【发布时间】:2014-05-01 09:08:57
【问题描述】:

我正在通过 servlet 从我的 Web 应用程序生成一个用于网关传递的 pdf 文件。我想在新窗口/选项卡中打开这个新生成的 pdf,用户应该从 servlet 回到应用程序。如何在新窗口/标签中打开 pdf?我正在从 itext api 生成 pdf。我的 servlet 代码 sn-p 是:

        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(); 

【问题讨论】:

    标签: java html servlets pdf web-applications


    【解决方案1】:

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

    获取 将链接目标设置为target="_blank"

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

    发布

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

    因此浏览器将在新窗口/选项卡中发出新的 GET/POST 请求,然后将标头 Content-disposition 设置为 inline 以内联呈现 pdf 而不是提示下载窗口

    【讨论】:

    • 嗨,我有一个与此相关的问题。假设请求的资源不可用,我必须显示一条错误消息,而不调用后端(一个用于检查资源可用性,另一个用于获取资源),我该如何实现?
    【解决方案2】:
    /*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();
    }
    
    
        }
    

    【讨论】:

    • 为什么要设置两次响应的内容类型?哪个是正确的?
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2013-04-24
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多