使用servlet在新窗口中打开pdf文件
Posted
技术标签:
【中文标题】使用servlet在新窗口中打开pdf文件【英文标题】:open pdf file in new window using servlet 【发布时间】: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();
【问题讨论】:
【参考方案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();
【讨论】:
为什么要设置两次响应的内容类型?哪个是正确的?以上是关于使用servlet在新窗口中打开pdf文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在新选项卡或窗口中打开 PDF 文件而不是下载它(使用 asp.net)?