itextpdf提取PDF文件中的任意页码实现示例

 更新时间:2023年08月10日 14:16:47   作者:十方  
这篇文章主要为大家介绍了itextpdf提取PDF文件中的任意页码实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

需求

有一个几十页的PDF文件,现在需要从中拆分出指定的页码,然后生成一个新的PDF文件。

这个时候,可以使用开源的 itextpdf 库来实现,itextpdf 的官方 github 地址为:https://github.com/itext/itextpdf.

下面通过具体的代码来演示。

引入依赖

目前 itextpdf 最新版本为 5.5.13.3,可以在 https://search.maven.org/ 网站进行搜索。

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>

代码实现

指定页码抽取

package com.magic.itextpdf;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSmartCopy;
/**
 * PDF工具类
 */
public class PdfUtils {
    /**
     * 抽取PDF文件
     * @param sourceFile 源PDF文件路径
     * @param targetFile 目标PDF文件路径
     * @param extractedPageNums 需要抽取的页码
     */
    public static void extract(String sourceFile, String targetFile, List<Integer> extractedPageNums) {
        Objects.requireNonNull(sourceFile);
        Objects.requireNonNull(targetFile);
        PdfReader reader = null;
        Document document = null;
        FileOutputStream outputStream = null;
        try {
            // 读取源文件
            reader = new PdfReader(sourceFile);
            // 创建新的文档
            document = new Document();
            // 创建目标PDF文件
            outputStream = new FileOutputStream(targetFile);
            PdfCopy pdfCopy = new PdfSmartCopy(document, outputStream);
            // 获取源文件的页数
            int pages = reader.getNumberOfPages();
            document.open();
            // 注意此处的页码是从1开始
            for (int page = 1; page <= pages; page++) {
                // 如果是指定的页码,则进行复制
                if (extractedPageNums.contains(page)) {
                    pdfCopy.addPage(pdfCopy.getImportedPage(reader, page));
                }
            }
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                reader.close();
            }
            if (document != null) {
                document.close();
            }
            if (outputStream != null) {
                try {
                    outputStream.flush();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

extract() 方法有三个参数,分包是源PDF文件路径、目标PDF文件路径和指定页码,其中指定页码采用List集合进行传递,比如需要抽取第1页,可以像下面这样调用

PdfUtils.extract("D:\\Test\\test.pdf", "D:\\Test\\test_out.pdf", Collections.singletonList(1));

如果同时需要抽取多页,比如1、3、5页,那么可以这样调用

PdfUtils.extract("D:\\Test\\test.pdf", "D:\\Test\\test_out.pdf", Arrays.asList(1, 3, 5));

当然,如果一个PDF有一百多页,现在需要抽取10-60页,如果还是像上面一样传递参数,则会非常麻烦,此时就可以重载一个方法,实现传递起始页码和结束页码来抽取了。

起始结束页码抽取

重载 extract 方法,具体的代码如下:

/**
 * 抽取PDF文件
 * @param sourceFile 源PDF文件路径
 * @param targetFile 目标PDF文件路径
 * @param fromPageNum 起始页码
 * @param toPageNum 结束页码
 */
public static void extract(String sourceFile, String targetFile, int fromPageNum, int toPageNum) {
    Objects.requireNonNull(sourceFile);
    Objects.requireNonNull(targetFile);
    PdfReader reader = null;
    Document document = null;
    FileOutputStream outputStream = null;
    try {
        // 读取源文件
        reader = new PdfReader(sourceFile);
        // 创建新的文档
        document = new Document();
        // 创建目标PDF文件
        outputStream = new FileOutputStream(targetFile);
        PdfCopy pdfCopy = new PdfSmartCopy(document, outputStream);
        // 获取源文件的页数
        int pages = reader.getNumberOfPages();
        document.open();
        // 注意此处的页码是从1开始
        for (int page = 1; page <= pages; page++) {
            if (page >= fromPageNum && page <= toPageNum) {
                pdfCopy.addPage(pdfCopy.getImportedPage(reader, page));
            }
        }
    } catch (IOException | DocumentException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            reader.close();
        }
        if (document != null) {
            document.close();
        }
        if (outputStream != null) {
            try {
                outputStream.flush();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

对于连续页码而言,这个方式更加简单,比如要抽取 10-60页,那么可以这样调用

PdfUtils.extract("D:\\Test\\test.pdf", "D:\\Test\\test_out.pdf", 10, 60);

测试验证

现在有一个总共2页的PDF文件,分别使用上面的方法进行抽取拆分第1页,代码如下:

package com.magic.itextpdf;
import java.util.Collections;
public class Test {
    public static void main(String[] args) {
        PdfUtils.extract("D:\\Test\\test.pdf", "D:\\Test\\test_out_1.pdf", Collections.singletonList(1));
        PdfUtils.extract("D:\\Test\\test.pdf", "D:\\Test\\test_out_2.pdf", 1, 1);
    }
}

运行后,分别生成了 test_out_1.pdf 和 test_out_2.pdf 两个新文件,新文件都是源文件的第一页。

其他方法

如果只是处理单个PDF文件的话,那么可以使用WPS的打印功能,或者Chrome浏览器的打印功能都可以实现,非常方便。

WPS打印拆分

Chrome打印拆分

以上就是itextpdf提取PDF文件中的任意页码实现示例的详细内容,更多关于itextpdf提取PDF文件的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis批量插入Oracle数据的方法实例

    Mybatis批量插入Oracle数据的方法实例

    在开发中或多或少都会遇到数据批量插入的功能,最近我在做项目的过程中就遇到了这样一个问题,下面这篇文章主要给大家介绍了关于Mybatis批量插入Oracle数据的相关资料,需要的朋友可以参考下
    2022-01-01
  • SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示

    SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示

    这篇文章主要介绍了SSH框架网上商城项目第16战之Hibernate的二级缓存处理首页的热门显示,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java集合类ArrayList和Vector的区别面试精讲

    java集合类ArrayList和Vector的区别面试精讲

    这篇文章主要为大家介绍了java集合类ArrayList和Vector的区别面试全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • mybatis的插件机制示例详解

    mybatis的插件机制示例详解

    这篇文章主要给大家介绍了关于mybatis插件机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Java SSM配置文件案例详解

    Java SSM配置文件案例详解

    这篇文章主要介绍了Java SSM配置文件案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot快速入门详解

    SpringBoot快速入门详解

    springboot提供了一种快速使用spring的方式,基于coc的思想,即约定大于配置,通过本文学习快速掌握springboot入门知识,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • SpringBoot整合Swagger和Actuator的使用教程详解

    SpringBoot整合Swagger和Actuator的使用教程详解

    Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助我们设计、构建、记录以及使用 Rest API。本篇文章主要介绍的是SpringBoot整合Swagger(API文档生成框架)和SpringBoot整合Actuator(项目监控)使用教程。感兴趣的朋友一起看看吧
    2019-06-06
  • java学习笔记之eclipse+tomcat 配置

    java学习笔记之eclipse+tomcat 配置

    俗话说:工欲善其事必先利其器,既然要学习java,首先把java的开发环境捣鼓一下吧,这里我们来谈谈eclipse+tomcat的配置方法。
    2014-11-11
  • Java NumberFormat格式化float类型的bug

    Java NumberFormat格式化float类型的bug

    今天小编就为大家分享一篇关于Java NumberFormat格式化float类型的bug,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 解析Spring框架中的XmlBeanDefinitionStoreException异常情况

    解析Spring框架中的XmlBeanDefinitionStoreException异常情况

    这篇文章主要介绍了解析Spring框架中的XmlBeanDefinitionStoreException异常情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论