2011-09-12 52 views
7

我在我的應用程序中有pdf文件。我需要在瀏覽器中顯示PDF。我正在讀取文件作爲fileInputStream,我需要在瀏覽器中顯示PDF在我的應用程序。但我沒有pdf路徑,我有文件流。使用java servlet在瀏覽器中顯示PDF

請給我一些建議和例子


我已經使用AJAX來顯示PDF,我現在用的是call_method()JavaScript的Ajax請求方法調用showPdf行動,在showpdf行動只是轉換pdf文件作爲ByteArrayOutputStream並將結果寫入輸出流。但它顯示了以下提到的結果。

結果在JSP

%PDF-1.4%1個endstream endobj 4 0 OBJ < >>> /多媒體[0 0 595 842] >> endobj 1 0 OBJ <> endobj 3 0 OBJ <> endobj 5 0 OBJ <> endobj 6 0 OBJ <> endobj外部參照0 7 0000000000 65535˚F0000000389 00000ñ0000000015 00000ñ0000000477 00000ñ0000000232 00000ñ0000000540 00000ñ0000000585 00000ñ拖車< < 142354f5ebefd65d6aacd33a7cb2b4ab>] /信息6 0 R /大小7 >> startxref 707 %% EOF

P租約給一些建議。

的Javascript AJAX:

call_method(); <br/> 
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; 
} 
+0

我有同樣的問題,但沒有得到解決。 Plz,幫助我。我應該在jsp頁面中更改什麼。需要幫忙。!! – 2012-03-27 20:25:51

+0

我有同樣的問題......但對我來說,這是因爲我沒有包括response.setHeader(「Content-disposition」,「inline; filename = automatic_start.pdf」);由於我沒有下載的實際文件名(因爲pdf是由內存中的內容提供的),那麼我認爲我不需要在那裏有文件名。IE似乎需要它,否則它顯示你在瀏覽器中提到'%PDF-1.4%...'的亂碼。加上它的有用,所以如果它的內聯,並且用戶決定保存,它默認以我相信的名字。 PS也可以使用「attachment; ...」而不是「inline; ...」。 – armyofda12mnkeys

回答

9

你必須寫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(); 
    } 
} 
相關問題