问题描述
使用iText7
生成的pdf文件时,我遇到了一个奇怪的问题。生成的pdf在Adobe reader
和Chrome 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: 您可以找到用于复制问题here的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的转换。