2012-05-28 176 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