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
相关产品推荐
相关产品推荐

