2012-05-28 175 views
0

當我試圖打印從servlet生成的pdf時,我在google-chrome中的打印預覽有問題。錯誤只出現在默認的pdf插件中,它適用於Adobe pdf插件。在servlet代碼的PDF輸出:Chrome瀏覽器中的PDF打印預覽錯誤

response.setContentType("application/pdf"); 
     response.setHeader("Cache-Control","public"); 
     response.setHeader("Content-Disposition", "inline; filename=\"crreport.pdf\""); 

     /*if (byteArrayInputStream != null){ 
      byteArray = new byte[1024]; 
      while((bytesRead = byteArrayInputStream.read(byteArray)) != -1) { 
       response.getOutputStream().write(byteArray, 0, bytesRead); 
      } 
     }else { 
      throw new Exception("byteArrayInputStream is null!"); 
     }*/ 

     if (byteArrayInputStream != null){ 
      byteArray = new byte[byteArrayInputStream.available()]; 
      byteArrayInputStream.read(byteArray); 
      response.setContentLength(byteArray.length); 

      response.getOutputStream().write(byteArray); 

     }else { 
      throw new Exception("byteArrayInputStream is null!"); 
     } 

     System.out.println("End"); 
     response.getOutputStream().flush(); 
     response.getOutputStream().close(); 

在Chrome中的錯誤日誌,當我嘗試預覽生成的PDF: 意想不到的MIME類型application/PDF(預期應用程序/ x-谷歌 - 鉻 - 打印預覽 - 忽略插件pdf)

但是預覽工程,如果我保存這個pdf與默認保存按鈕在鉻頁面的右下角並從本地機器打開它。

我試過googleit,但在大量的關於鉻pdf插件不能找到任何有用的信息的問題。任何建議如何解決這個問題?

回答

0

最後,我想出了我的情況中主要的問題。我試着用eclipse插件的水晶報表生成pdf報告。看起來,由CR4E生成的byteArrayInputStream以某種方式損壞,使得它只在Chrome默認的pdf插件中不起作用。它可以解決iText庫的問題。使用基於CR4E byteArrayInputStream的iText彙編的PDF可以正常預覽和打印。

0

使用可用的文件長度是錯誤的;根據定義,它是可以立即讀取而沒有阻塞的部分(=等待下一部分被讀取)。它可能經常給出長度。響應的輸出流不應該關閉。

if (byteArrayInputStream == null){ 
     throw new Exception("byteArrayInputStream is null!"); 
    } 
    ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); 
    org.apache.commons.io.IOUtils.copy(byteArrayInputStream, byteArrayOS); 

    byteArray = byteArrayOS.toByteArray(); 
    response.setContentLength(byteArray.length); 
    response.getOutputStream().write(byteArray); 

    System.out.println("End"); 
    response.getOutputStream().flush(); 
    //response.getOutputStream().close(); 

什麼導致了錯誤:可能可用在兩個插件的不同資源使用情況下表現不同。

+0

我更正了您標記的代碼中的錯誤。感謝您的評論,但它並未解決Chrome打印預覽的主要問題。 – Konstantin