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

Java iText 7:此pdf文档可能无法正确显示,java,pdf-generation,itext7,pd,Java,Pdf Generation,Itext7,Pd,我在从iText7生成pdf时遇到了一个奇怪的问题。生成的pdf在Adobe reader和Chrome浏览器中正确打开。但是同一个pdf文件在Firefox浏览器中部分打开。我在Firefox中收到以下消息。奇怪的是,其他pdf文件不是通过iText生成的,而是在firefox中正确呈现的 Java代码 public static byte[] createPdf(List<String> htmlPages, PageSize pageSize, boolean rotate)

我在从
iText7
生成pdf时遇到了一个奇怪的问题。生成的pdf在
Adobe reader
Chrome浏览器中正确打开。但是同一个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;
}
publicstaticbyte[]createPdf(列出htmlpage、PageSize PageSize、boolean rotate)引发IOException{
ConverterProperties属性=新ConverterProperties();
//注册类路径协议处理程序,以便能够从类补丁加载HTML资源
org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.register();
setBaseUri(“类路径:/”);
//setBaseUri(baseUri);
FontProvider FontProvider=新的DefaultFontProvider(真、假、假);
属性。setFontProvider(fontProvider);
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
PdfDocument pdf=新PdfDocument(新PdfWriter(byteArrayOutputStream));
PdfMerger合并=新PdfMerger(pdf);
for(字符串htmlPage:htmlPage){
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
PdfDocument temp=新PdfDocument(新PDF编写器(BAS));
如果(旋转){
temp.setDefaultPageSize(pageSize.rotate());/**页面大小和方向*/
}否则{
临时设置DefaultPageSize(pageSize);/**页面大小和方向*/
}
HtmlConverter.convertToPdf(htmlPage、temp、properties);
temp=新的PdfDocument(新的PDF阅读器(新的ByteArrayInputStream(baos.toByteArray()));
merge.merge(temp,1,temp.getNumberOfPages());
温度关闭();
}
pdf.close();
byteArrayOutputStream.flush();//尝试了此操作
byteArrayOutputStream.close();//尝试了此操作
字节[]byteArray=byteArrayOutputStream.toByteArray();
Timestamp Timestamp=新的时间戳(System.currentTimeMillis());
试试(FileOutputStream FileOutputStream=newfileoutputstream(“D:\\Labels\\Label\\\”+timestamp.getTime()+“.pdf”)){
write(byteArray);
}
乘火车返回;
}
提前谢谢

编辑1:
您可以找到pdf和html/css用于复制问题。

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

iText
HtmlConverter
很好地嵌入了该图像,但显然Firefox在显示具有这些尺寸的图像时遇到了问题,即使(或者可能是因为?)它被转换为标签上所需的尺寸(大约比高宽四倍)。至少我的Firefox安装停止在这里绘制标签内容。(注意,PDF内容中的绘制顺序与HTML元素的绘制顺序不同;尤其是在PDF中,编号
3232000…
绘制在条形码之前,而不是之后!)

在Firefox上:

关于Acrobat Reader:


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

请共享一个带有该行为的示例结果PDF,以便进行分析。事实上,问题在于条形码的尺寸,我降低了代码的高度和宽度,效果非常好。:-。谢谢