servlet中的Chrome PDF打印预览错误

时间:2012-05-28 09:42:27

标签: java google-chrome pdf crystal-reports

当我尝试打印从servlet生成的pdf时,我在google-chrome中遇到打印预览问题。错误仅出现在默认的pdf插件中,它适用于Adobe pdf插件。 servlet中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();

当我尝试预览生成的pdf时,在Chrome错误日志中: 忽略具有意外MIME类型application / pdf的插件(预期应用程序/ x-google-chrome-print-preview-pdf)

但如果我使用Chrome页面右下角的默认保存按钮保存此pdf并从本地计算机打开它,则预览有效。

我尝试了googleit但是在关于chrome pdf插件的大量问题中找不到任何有用的信息。有什么建议可以修复吗?

2 个答案:

答案 0 :(得分: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();

导致错误的原因:可能在两个插件的不同资源使用情况下表现不同。

答案 1 :(得分:0)

最后,我弄清楚了我的主要问题是什么。我试图使用eclipse插件的水晶报告生成pdf报告。似乎CR4E生成的byteArrayInputStream以某种方式被破坏,以至于它不能仅在Chrome默认的pdf插件中工作。它可以与iText库一起解决。使用基于CR4E byteArrayInputStream的iText组装的PDF可以正常预览和打印。