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

问题描述

使用iText7生成的pdf文件时,我遇到了一个奇怪的问题。生成的pdf在Adobe readerChrome browser中正确打开。但是同一PDF会在Firefox浏览器中部分打开。我在Firefox中收到以下消息。奇怪的是,其他不是通过iText生成的pdf也可以在firefox中正确渲染。

enter image description here

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: 您可以找到用于复制问题here的pdf和html / css。

解决方法

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

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

在Firefox上:

screenshot

在Acrobat Reader上:

screenshot

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...