• # Itext Pdf 合并拆分


    Itext 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    通过 FeignClient 获取 Response 流

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

    合并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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    拆分 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    示例源码

  • 相关阅读:
    春秋云镜 CVE-2013-2134
    神经网络滚动预测(相关搜索:预测模型|matlab代码)
    【力扣每日一题】2023.9.28 花期内花的数目
    【Go语言入门】一文搞懂Go语言的最新依赖管理:go mod的使用
    LVGL 模拟仿真(Windows+CodeBlocks)
    pikachu---暴力破解(burpsuite)
    Git命令
    【前端知识】Three 学习日志(五)—— 点光源辅助观察
    DVWA 之 SQL注入(非盲注)
    visualization_msgs::Marker 的pose设置,map坐标系的3d box显示问题
  • 原文地址:https://blog.csdn.net/qq_37248504/article/details/127762717