iText 7:此 pdf 文档可能无法正确显示 Firefox

Posted

技术标签:

【中文标题】iText 7:此 pdf 文档可能无法正确显示 Firefox【英文标题】:iText 7 : This pdf document might not be displayed correctly Firefox 【发布时间】:2020-12-09 21:55:34 【问题描述】:

我遇到了从iText7 生成的 pdf 的奇怪问题。生成的 pdf 在 Adobe readerChrome browser 中正确打开。但是相同的 pdf 在Firefox 浏览器中部分打开。我在 Firefox 中收到以下消息。奇怪的是其他不是通过iText生成的pdf在firefox中正确呈现。

Java 代码

public static byte[] createPdf(List<String> htmlPages, PageSize pageSize, boolean rotate) throws IOException 

    ConverterProperties properties = new ConverterProperties();

    // Register classpath protocol handler to be able to load HTML resources from class patch
    org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.register();
    properties.setBaseUri("classpath:/");
    // properties.setBaseUri(baseUri);

    FontProvider fontProvider = new DefaultFontProvider(true,false,false);
    properties.setFontProvider(fontProvider);

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    PdfDocument pdf = new PdfDocument(new PdfWriter(byteArrayOutputStream));
    PdfMerger merger = new PdfMerger(pdf);

    for (String htmlPage : htmlPages) 
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfDocument temp = new PdfDocument(new PdfWriter(baos));
        if(rotate) 
            temp.setDefaultPageSize(pageSize.rotate()); /** Page Size and Orientation */
         else 
            temp.setDefaultPageSize(pageSize); /** Page Size and Orientation */
        
         HtmlConverter.convertToPdf(htmlPage, temp, properties);
        temp = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())));
        merger.merge(temp, 1, temp.getNumberOfPages());
        temp.close();
    
    pdf.close();

    byteArrayOutputStream.flush(); // Tried this

    byteArrayOutputStream.close(); // Tried this

    byte[] byteArray = byteArrayOutputStream.toByteArray();

    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
    try (FileOutputStream fileOuputStream = new FileOutputStream("D:\\Labels\\Label_"+timestamp.getTime()+".pdf"))
        fileOuputStream.write(byteArray);
    
    return byteArray;

提前致谢。

编辑 1: 您可以找到 pdf 和 html/css 来重现问题 here。

【问题讨论】:

请分享一个包含该行为的示例结果 PDF 以供分析。 【参考方案1】:

当您使用 base64 URI 将图像嵌入到 html 中时,条形码图像发生了一些奇怪的事情:您嵌入了 39578×44 图像,而不是 labelData/barcode.png 中的 205×59 位图图像! (是的,比高度宽近一千倍的图像......)

iText HtmlConverter 很好地嵌入了该图像,但显然 Firefox 在显示具有这些尺寸的图像时存在问题,即使(或可能是因为?)它已转换为标签上所需的尺寸(大约是高度的四倍宽) .至少我的 Firefox 安装在此处停止绘制标签内容。 (请注意,PDF 内容中的绘制顺序与 HTML 元素的顺序相同;特别是在 PDF 中,数字 3232000... 绘制在条形码之前,而不是之后!)

在 Firefox 上:

在 Acrobat Reader 上:

因此,您可能需要在 HTML 文件中检查条形码图像到 base64 图像 URI 的转换。

【讨论】:

确实,问题在于条形码的尺寸,我从代码中减少了高度和宽度,它就像一个魅力。 :-) 。非常感谢

以上是关于iText 7:此 pdf 文档可能无法正确显示 Firefox的主要内容,如果未能解决你的问题,请参考以下文章

使用 itext 7 在 PDF 中添加新页面

打开PDF修改文字的时候,显示本页面存在错误,Acrobat 可能无法正确显示页面,请联系PDF文档创建者

itext7 pdf与书签合并

合并表单后,iText字段将无法计算

如何使用 iText 7 使下划线文本可访问

iText - 将内容添加到现有的 PDF 文件