使用java servlet在浏览器中显示Pdf

我的应用程序中有pdf文件。 我需要在浏览器中显示pdf。 我正在将文件作为fileInputStream读取,我需要在我的应用程序中使用浏览器显示pdf。 但我没有pdf路径,我有文件流。

请给我一些建议和例子


我用ajax来显示pdf,我使用call_method()javascript ajax请求方法来调用showPdf动作,在showpdf动作中只是将pdf文件转换为ByteArrayOutputStream并将结果写在out put流中。 但它显示了下面提到的结果。

JSP中的结果

%PDF-1.4% 1endstream endobj 4 0 obj >> / MediaBox [0 0 595 842] >> endobj 1 0 obj endobj 3 0 obj endobj 5 0 obj endobj 6 0 obj endobj xref 0 7 0000000000 65535 f 0000000389 00000 n 0000000015 00000 n 0000000477 00000 n 0000000232 00000 n 0000000540 00000 n 0000000585 00000 n trailer <] / Info 6 0 R / Size 7 >> startxref 707 %% EOF

请给出一些建议。

Javascript ajax:

call_method(); 
function call_method(){ Ext.Ajax.request({ waitMsg: 'Saving changes...', url:'test.action?method=showPdf', params : { }, failure:function(response,options){ }, success:function(response,options){ $("#pdf_content").show(); $("#pdf_content").html(response.responseText); $("#pdf_content").show('slow'); } }); }

Java方法:

 public String showPdf() throws IOException { getResponse().setContentType("application/pdf"); getResponse().setHeader("Content-disposition","inline; filename=automatic_start.pdf" ); ByteArrayOutputStream baos = getByteArrayOutputStream(); getResponse().setContentLength(baos.size()); ServletOutputStream sos; sos = getResponse().getOutputStream(); baos.writeTo(sos); sos.flush(); return null; } private ByteArrayOutputStream getByteArrayOutputStream() throws IOException { String filePath = "/homefolder/"; String folderPath=filePath+"1122/automatic_start.pdf"; File file = new File(folderPath); FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buf = new byte[256]; try { for (int readNum; (readNum = fis.read(buf)) != -1;) { bos.write(buf, 0, readNum); //no doubt here is 0 //Writes len bytes from the specified byte array starting at offset off to this byte array output stream. System.out.println("read " + readNum + " bytes,"); } } catch (IOException ex) { ex.printStackTrace(); } return bos; } 

在servlet中,将MIME类型设置为PDF的正确类型: application/pdf

见http://www.iana.org/assignments/media-types/

您必须将InputStream写入响应OutputStream ,如下所示:

  • 您的Content-Disposition必须是inline
  • 您的Content-Type必须是application/pdf
  • 您的Content-Length将是InputStream总数据的长度(以字节为单位)。

设置后,将输入流数据写入响应的输出流。

这种效果的东西:

 /* (non-Javadoc) * @see org.bfs.bayweb.util.renderer.ServletViewRenderer#render(javax.servlet.ServletRequest, javax.servlet.ServletResponse) */ public void render(ServletRequest request, ServletResponse response) throws IOException { // TODO Auto-generated method stub try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; int inputStreamLength = 0; int length = 0; while ((length = getInputStream().read(buffer)) > 0) { inputStreamLength += length; baos.write(buffer, 0, length); } if (inputStreamLength > getContentLength()) { setContentLength(inputStreamLength); } if (response instanceof HttpServletResponse) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.reset(); httpResponse.setHeader("Content-Type", getContentType()); httpResponse.setHeader("Content-Length", String.valueOf(getContentLength())); httpResponse.setHeader("Content-Disposition", "\"" + getContentDisposition() + "\"" + ((getFileName() != null && !getFileName().isEmpty()) ? "; filename=\"" + getFileName() + "\"": "")); } response.getOutputStream().write(baos.toByteArray(), 0, (int)getContentLength()); //finally response.getOutputStream().flush(); //clear baos = null; } finally { // TODO Auto-generated catch block close(response.getOutputStream()); close(getInputStream()); } } private void close(Closeable resource) throws IOException { if (resource != null) { resource.close(); } }