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 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: 您可以找到 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的主要内容,如果未能解决你的问题,请参考以下文章