# Itext Pdf 合并拆分

Itext Pdf 合并拆分

文章目录

  • Itext Pdf 合并拆分
    • Itext Pdf 生成
    • 需求
    • 涉及知识点
    • 通过 FeignClient 获取 Response 流
    • 合并Pdf
    • 拆分 Pdf
    • 示例源码

Itext Pdf 生成

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

需求

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

涉及知识点

  • FeignClient 流的获取

  • ItextPdf文件合并操作

  • ItextPdf文件拆分操作

  • 相关依赖


<dependency>
    <groupId>com.itextpdfgroupId>
    <artifactId>itextpdfartifactId>
    <version>5.5.13.3version>
dependency>

<dependency>
    <groupId>com.itextpdfgroupId>
    <artifactId>itext-asianartifactId>
    <version>5.2.0version>
dependency>
<dependency>
    <groupId>com.itextpdfgroupId>
    <artifactId>layoutartifactId>
    <version>7.2.3version>
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();
}

示例源码

  • 码云地址:https://gitee.com/Marlon_Brando/JavaTest/tree/develop/src/main/java/otherapi/itext/pdf

你可能感兴趣的:(第三方API使用,Itext,Pdf,pdf,合并,pdf,拆分)