Itext 7.1.16 添加两个段落仅显示第一个该如何解决?
问题原因
问题核心是二进制文件存储逻辑错误:PDF属于二进制格式文件,使用ByteArrayOutputStream.toString()将PDF字节流转为字符串存储的操作,会导致大量不可见二进制字节因编码转换丢失、损坏,最终PDF后半段内容失效,因此只能显示第一个段落。添加分页符后两段内容分属不同页面,内容结构变化后损坏部分刚好未影响前两页的解析,才会出现分页后就能显示的特殊现象。
解决方案
- 将存储文件时的
outputStream.toString()改为outputStream.toByteArray(),直接传输字节数组存储PDF,避免编码转换导致的内容损坏。如果你的fileAccess.storeFile方法当前仅支持字符串输入,需要先调整该方法,新增支持字节数组入参的重载,二进制文件禁止使用字符串格式存储。 - 可以移除冗余的关闭操作:iText中调用
document.close()时会自动关闭关联的PdfDocument和PdfWriter,不需要手动重复关闭。
修正后可正常运行的代码
public void createBillingDocument(List<PDFData> datas) { datas.forEach(data -> { try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PdfWriter writer = new PdfWriter(outputStream); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf, PageSize.A4); document.add(new Paragraph("Muh")); document.add(new Paragraph("Kuh")); // 关闭文档时自动完成内容刷入、关联资源关闭 document.close(); // 直接取字节数组存储,不要转字符串 byte[] pdfContent = outputStream.toByteArray(); outputStream.close(); fileAccess.storeFile(pdfContent, "test/" + "Name.pdf"); } catch (IOException e) { throw new RuntimeException(e); } }); }
内容的提问来源于stack exchange,提问作者Devian88
相关产品推荐
相关产品推荐

