2

我在生成 pdf 文件时遇到了奇怪的问题iText7。生成的 pdf 在Adobe reader和中正确打开Chrome browser。但是相同的 pdf 在Firefox浏览器中部分打开。我在 Firefox 中收到以下消息。奇怪的是其他pdf,不是通过iText在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 。

4

1 回答 1

3

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

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

在火狐上:

截屏

在 Acrobat Reader 上:

截屏

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

于 2020-08-20T17:56:12.513 回答