# Itext Pdf 合并拆分

Posted 爱码代码的喵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# 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();

示例源码

以上是关于# Itext Pdf 合并拆分的主要内容,如果未能解决你的问题,请参考以下文章

Java 合并拆分PDF文档

Java 合并拆分PDF文档

C# iText split PDF C# 拆分PDF

itext7 pdf与书签合并

PDF 表单与 itext 合并。 C#

使用 iText 合并不同宽度的 pdf 文档