如何使用iText在Java中合并多字节数组生成单个PDF文件
问题原因
直接拼接多个PDF字节数组生成的文件无法正常显示,核心原因是你手中的page1、page2、page3并非单纯的页面内容字节流,而是完整的独立PDF文件。PDF有严格的格式规范,每个完整PDF都包含文件头、对象定义、交叉引用表、文件尾等结构,直接拼接会让最终文件包含多套独立的PDF结构,阅读器无法解析这种混乱的格式,因此显示空白。
解决方案
必须使用专业的PDF处理库来解析每个PDF的页面内容,再重新合并生成一个结构合法的PDF文件。以下是两种常用Java库的实现示例:
方案一:使用Apache PDFBox
1. 引入依赖(Maven)
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.32</version> <!-- 建议使用最新稳定版 --> </dependency>
2. 合并代码
import org.apache.pdfbox.multipdf.PDFMergerUtility; import java.io.ByteArrayInputStream; import java.io.IOException; public class PdfMergeTool { public static void mergePdfPages(byte[] page1, byte[] page2, byte[] page3, String outputPath) throws IOException { PDFMergerUtility merger = new PDFMergerUtility(); // 将每个PDF字节数组转为输入流,添加到合并工具 merger.addSource(new ByteArrayInputStream(page1)); merger.addSource(new ByteArrayInputStream(page2)); merger.addSource(new ByteArrayInputStream(page3)); merger.setDestinationFileName(outputPath); merger.mergeDocuments(null); // 使用默认内存配置 } public static void main(String[] args) { byte[] page1; // 假设已完成初始化 byte[] page2; byte[] page3; String outputFilePath = "merged_result.pdf"; try { mergePdfPages(page1, page2, page3, outputFilePath); } catch (IOException e) { e.printStackTrace(); } } }
方案二:使用iText 7
1. 引入依赖(Maven)
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.2.5</version> <!-- 建议使用最新稳定版 --> </dependency>
2. 合并代码
import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.utils.PdfMerger; import java.io.ByteArrayInputStream; import java.io.IOException; public class ItextPdfMerge { public static void mergePdfBytes(byte[] page1, byte[] page2, byte[] page3, String outputPath) throws IOException { // 创建目标PDF文档 try (PdfWriter writer = new PdfWriter(outputPath); PdfDocument mergedDoc = new PdfDocument(writer)) { PdfMerger merger = new PdfMerger(mergedDoc); // 逐个合并每个PDF的页面 try (PdfDocument doc1 = new PdfDocument(new PdfReader(new ByteArrayInputStream(page1)))) { merger.merge(doc1, 1, doc1.getNumberOfPages()); } try (PdfDocument doc2 = new PdfDocument(new PdfReader(new ByteArrayInputStream(page2)))) { merger.merge(doc2, 1, doc2.getNumberOfPages()); } try (PdfDocument doc3 = new PdfDocument(new PdfReader(new ByteArrayInputStream(page3)))) { merger.merge(doc3, 1, doc3.getNumberOfPages()); } } } public static void main(String[] args) { byte[] page1; // 假设已完成初始化 byte[] page2; byte[] page3; String outputFilePath = "merged_result.pdf"; try { mergePdfBytes(page1, page2, page3, outputFilePath); } catch (IOException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Shiladittya Chakraborty
相关产品推荐
相关产品推荐

