Chrome PDF 打印预览 servlet 中的错误



当我尝试打印从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();

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

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

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

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

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

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

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

最新更新