【问题标题】:Chrome PDF print preview error in servletservlet 中的 Chrome PDF 打印预览错误
【发布时间】:2012-06-02 16:37:46
【问题描述】:

当我尝试打印从 servlet 生成的 pdf 时,我在 google-chrome 中的打印预览出现问题。错误仅出现在默认的 pdf 插件中,它适用于 Adob​​e 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 (expected application/x-google-chrome-print-preview-pdf)

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

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

【问题讨论】:

    标签: java google-chrome pdf crystal-reports


    【解决方案1】:

    使用available as 文件长度是错误的;根据定义,它是可以立即读取而不会阻塞的部分(= 等待读取下一部分)。它可能经常给出长度。不应关闭响应的输出流。

        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();
    

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

    【讨论】:

    • 我更正了您标记的代码中的错误。感谢您的评论,但它并没有解决 chrome 打印预览的主要问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多