You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:45:04