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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:57:43