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

Java iText多页TIFF转PDF时ByteArrayOutputStream输出异常问题

iText多页TIFF转PDF使用ByteArrayOutputStream输出异常修复方案

问题核心原因

  • PdfDocument未关闭导致内容未完整写入输出流:iText的PDF生成逻辑会将交叉引用表、页索引、文件尾等关键内容延迟到文档关闭时才写入输出流,你在循环结束后直接读取ByteArrayOutputStream的字节,此时仅写入了PDF头信息,主体内容和尾部标记都未刷入输出流。你使用FileOutputStream时正常大概率是测试代码中后续有关闭资源的操作,替换为ByteArrayOutputStream后遗漏了该步骤。
  • TIFF数据解码逻辑错误:两次Base64解码中间的字节转String操作会破坏二进制数据,TIFF是二进制文件,通过String存储字节会触发字符集编码转换,导致原始TIFF数据损坏,该步骤完全冗余。

修复后代码

final ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] tiffByteArray = Base64.getMimeDecoder().decode(base64String);

// 使用try-with-resources自动关闭PdfDocument,确保内容完整写入
try (PdfDocument pdfDocument = new PdfDocument(new PdfWriter(baos))) {
    int numberOfPages = TiffImageData.getNumberOfPages(tiffByteArray);
    System.out.println("number of pages: " + numberOfPages);

    ImageData tiffImage = null;
    PageSize pageSize = null;
    PdfCanvas pdfCanvas = null;
    PdfPage page = null;

    for (int i = 1; i <= numberOfPages; i++) {
        tiffImage = ImageDataFactory.createTiff(tiffByteArray, false, i, false);
        pageSize = new PageSize(new Rectangle(tiffImage.getWidth(), tiffImage.getHeight()));
        page = pdfDocument.addNewPage(pageSize);
        pdfCanvas = new PdfCanvas(page);
        pdfCanvas.addImageAt(tiffImage, 0, 0, true);
    }
}

// 资源关闭后再读取字节数组,此时内容完整
byte[] pdfBytes = baos.toByteArray();

关键修改说明

  • 采用try-with-resources语法自动管理PdfDocument生命周期,文档关闭时会自动将所有待写入内容刷入ByteArrayOutputStream
  • 删除了冗余的字节转String、二次解码逻辑,直接一次解码得到正确的TIFF二进制数据
  • 调整读取字节数组的时机到PdfDocument关闭之后,确保获取到完整的PDF文件内容

内容的提问来源于stack exchange,提问作者kyle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:15:04