# Itext Pdf 合并拆分

Itext Pdf 合并拆分

Itext Pdf 生成

生成 Pdf 详细见:https://blog.csdn.net/qq_37248504/article/details/124224968

需求

  • 将多个 Pdf 合并成一个Pdf 文件
  • 将一个Pdf文件拆分成多个 Pdf文件

涉及知识点

  • FeignClient 流的获取

  • ItextPdf文件合并操作

  • ItextPdf文件拆分操作

  • 相关依赖

<!-- itextpdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>
<!-- pdf 中文支持 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>layout</artifactId>
    <version>7.2.3</version>
</dependency>

通过 FeignClient 获取 Response 流

  • 从不同的服务拿到 Pdf
@PostMapping("/test")
Response getPdfResponse(@RequestBody Param param);

合并Pdf

  • copyPagesTo()
/**
  * 使用 copyPagesTo 合并
  *
  * @throws IOException ioexception
  */
@Test
public void test1() throws IOException {
    PdfWriter pdfWriter = new PdfWriter(DEST);
    // 最终合并的 dpf
    PdfDocument pdfDocument = new PdfDocument(pdfWriter);

    PdfReader pdfReader1 = new PdfReader(FILE_NAME1);
    PdfDocument pdfDocument1 = new PdfDocument(pdfReader1);
    pdfDocument1.copyPagesTo(1, pdfDocument1.getNumberOfPages(), pdfDocument);

    PdfReader pdfReader2 = new PdfReader(FILE_NAME2);
    PdfDocument pdfDocument2 = new PdfDocument(pdfReader2);
    pdfDocument2.copyPagesTo(1, pdfDocument2.getNumberOfPages(), pdfDocument);

    pdfReader1.close();
    pdfDocument1.close();
    pdfReader2.close();
    pdfDocument2.close();
    pdfDocument.close();
}
  • pdfMerger.merge()
/**
  * 使用  pdfMerger.merge
  *
  * @throws IOException ioexception
  */
@Test
public void test2() throws IOException {
    PdfWriter pdfWriter = new PdfWriter(DEST);
    // 最终合并的 dpf
    PdfDocument pdfDocument = new PdfDocument(pdfWriter);
    PdfMerger pdfMerger = new PdfMerger(pdfDocument);

    PdfReader pdfReader1 = new PdfReader(FILE_NAME1);
    PdfDocument pdfDocument1 = new PdfDocument(pdfReader1);
    pdfMerger.merge(pdfDocument1, 1, pdfDocument1.getNumberOfPages());

    PdfReader pdfReader2 = new PdfReader(FILE_NAME2);
    PdfDocument pdfDocument2 = new PdfDocument(pdfReader2);
    pdfMerger.merge(pdfDocument2, 1, pdfDocument2.getNumberOfPages());

    pdfReader1.close();
    pdfDocument1.close();
    pdfReader2.close();
    pdfDocument2.close();
    pdfDocument.close();
}

拆分 Pdf

/**
  * 每个文件 1 页 分割
  *
  * @throws IOException ioexception
  */
@Test
public void test3() throws IOException {
    pdfSplitter(DEST, 1, DEST_FOLDER);
}

/**
  * 在指定目录等分pdf
  *
  * @param fileName 要分割的文档
  * @param pageNum  分割尺寸
  * @param desDir   分割后存储路径
  * @throws IOException ioexception
  */
private void pdfSplitter(String fileName, Integer pageNum, String desDir) throws IOException {
    PdfReader pdfReader = new PdfReader(fileName);
    PdfDocument pdf = new PdfDocument(pdfReader);
    String name;
    PdfWriter pdfWriter;
    PdfDocument pdfWriterDoc;
    int numberOfPages = pdf.getNumberOfPages();
    for (int i = 1; i <= numberOfPages; i += pageNum) {
        name = desDir + "/" + i + ".pdf";
        File file = new File(name);
        if (!file.exists()) {
            file.createNewFile();
        }
        pdfWriter = new PdfWriter(name);
        pdfWriterDoc = new PdfDocument(pdfWriter);
        int end = Math.min((i + pageNum - 1), pdf.getNumberOfPages());
        //从页数第一页开始,
        pdf.copyPagesTo(i, end, pdfWriterDoc);
        pdfWriterDoc.close();
        pdfWriter.close();
    }
    //关闭
    pdf.close();
    pdfReader.close();

}

/**
  * 分割文档,分割后文仔默认存储在原来的文档路径下。
  *
  * @param fileName
  * @param pageNum
  * @throws IOException
  */
private void pdfSplitter(String fileName, Integer pageNum) throws IOException {
    String desDir = new File(fileName).getParentFile().getAbsolutePath();
    pdfSplitter(fileName, pageNum, desDir);
}

/**
  * 返回自定义片段大小的文件,UUID名称命名。
  *
  * @param fileName
  * @param startPage
  * @param endPage
  * @throws IOException
  */
public void pdfSplitter(String fileName, int startPage, int endPage) throws IOException {
    //源文档
    PdfReader pdfReader = new PdfReader(fileName);
    PdfDocument pdf = new PdfDocument(pdfReader);
    //目标文档名
    String desDir = new File(fileName).getParentFile().getAbsolutePath() + "/" + UUID.randomUUID() + ".pdf";
    //生成目标文档
    PdfWriter pdfWriter = new PdfWriter(desDir);
    PdfDocument outPdfDocument = new PdfDocument(pdfWriter);
    //从页数第一页开始,
    pdf.copyPagesTo(startPage, endPage, outPdfDocument);
    //关闭
    outPdfDocument.close();
    pdfWriter.close();
    pdf.close();
    pdfReader.close();
}

示例源码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值