Java 通过页码范围提取新的文档(docx、pdf)

客户有一个新的需求。控制用户下载文档的页数。比如。我设置只开放10页。那就要我们去做截取文档。pdf自带有实现的方式。docx暂时没找到开源的。我这边处理的docx。是通过转换成pdf。通过截取pdf后再转成docx去实现的

工具类如下:

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;PdfCopy pdfCopy = null;try {// 读取源文件reader = new PdfReader(sourceFile);// 创建新的文档document = new Document();// 创建目标PDF文件outputStream = new FileOutputStream(targetFile);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();}}if(pdfCopy != null){pdfCopy.flush();pdfCopy.close();}}}
}

如果想实现docx和pdf互转格式不变。请参考另一篇文章

java 实现docx和pdf互转并保留格式_王威振的csdn的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git及dbc的学习

&#xff11;&#xff09;git的使用方法 Command line instructions You can also upload existing files from your computer using the instructions below. Git global setup git config --global user.name "username" git config --global user.email "xx…

SpringMvc高级(拦截器和文件上传下载)

拦截器&#xff08;Interceptor&#xff09;是一种常用的设计模式&#xff0c;在软件工程领域被广泛应用。拦截器通常被用来处理各种请求和响应&#xff0c;可以在请求发送前或响应返回后进行一系列的操作和处理。拦截器可以用于请求身份认证、日志记录、性能优化、权限控制、数…

vue3 - 使用reactive定义响应式数据进行赋值时,视图没有改变,值已经改变的解决方案

问题&#xff1a; 在Vue 3.0 中我们使用 reactive() 定义的响应式数据的时候&#xff0c;当是一个数组或对象时&#xff0c;我们直接进行赋值&#xff0c;发现数据已经修改成功&#xff0c;但是页⾯并没有自动渲染成最新的数据&#xff1b;这是为什么呢&#xff1f; 就如同官网…

线性代数的本质(二)——线性变换与矩阵

文章目录 线性变换与矩阵线性变换与二阶方阵常见的线性变换复合变换与矩阵乘法矩阵的定义列空间与基矩阵的秩逆变换与逆矩阵 线性变换与矩阵 线性变换与二阶方阵 本节从二维平面出发学习线性代数。通常选用平面坐标系 O x y Oxy Oxy &#xff0c;基向量为 i , j \mathbf i,…

数据结构-时间复杂度/空间复杂度

Hello&#xff0c;好久没有更新了哦&#xff0c;已经开始学习数据结构了&#xff0c;这篇文章呢就是对刚学数据结构所接触到的时间复杂度进行一个分享哦&#xff0c;如果有错误之处&#xff0c;大家记得拍拍我哦~ 既然要讨论时间/空间复杂度&#xff0c;那我们就得知道时间/空…

SpringBoot国际化配置组件支持本地配置和数据库配置

文章目录 0. 前言i18n-spring-boot-starter1. 使用方式0.引入依赖1.配置项2.初始化国际化配置表3.如何使用 2. 核心源码实现一个拦截器I18nInterceptorI18nMessageResource 加载国际化配置 3.源码地址 0. 前言 写个了原生的SpringBoot国际化配置组件支持本地配置和数据库配置 背…

tdesign的文件上传(微信小程序+idea的springboot)

目录 1. springboot后端 1.1 FileController.java 1.2 listener文件的ErpApplicationListener.java 1.3 【重点&#xff01;】FileServiceImpl层 1.4 IFileService 1.5 StringUtil通用类 1.6 主程序加一个监听器 1.7 application.yml文件 2. 微信小程序端 2.1 TDesign的…

latex如何保证图片和文字的相对位置不变

文章目录 latex如何保证图片与文字的相对位置不变&#xff1f;解决方法&#xff1a; latex如何保证图片与文字的相对位置不变&#xff1f; 解决方法&#xff1a; 加入宏包\usepackage{float} 在figure环境后面加入参数H \begin{figure}[H]\centering\includegraphics[width…

随机产生两个数在屏幕上打印,例如6*7=? 让学生输入答案,若正确打印答对了,否则提示学生重做,直到答对为止(小游戏)

#include<stdio.h> #include<stdlib.h> #include<time.h>//时间的库函数 int main() {int i 0;srand(time(0));//随机种子初始化int num1 rand() %10;//随机数int num2 rand() %10;printf("%d * %d ?\n", num1, num2);printf("请输入答案…

阿里云无影电脑:免费体验无影云电脑3个月

阿里云无影云电脑免费领取流程&#xff0c;免费无影云电脑配置为4核8G&#xff0c;可以免费使用3个月&#xff0c;阿里云百科分享阿里云无影云电脑&#xff08;云桌面&#xff09;免费申请入口、申请流程及免费使用限制条件说明&#xff1a; 目录 阿里云无影云电脑免费申请入…

【C++初阶】动态内存管理

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C/C内存分布、C语言动态内存管理、C动态内存管理、operator new与operator delete函数、new和delete的实现原理、定位new表达式、常见面试问题等。 &#x1f43c;本文作者&#xff1a; 阿四啊 …

SQL2 查询多列

描述 题目&#xff1a;现在运营同学想要用户的设备id对应的性别、年龄和学校的数据&#xff0c;请你取出相应数据 示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing42…

CSRF和SSRF有什么不同?

文章目录 CSRF复现SSRF复现启动环境漏洞复现探测存活IP和端口服务计划任务反弹shell 区别 CSRF复现 打开dvwa&#xff0c;将难度调为low&#xff0c;点击CSRF&#xff0c;打开后发现有一个修改密码的输入框&#xff1a; 在这里修改密码&#xff0c;并用bp抓包&#xff0c;在…

C++实现观察者模式(包含源码)

文章目录 观察者模式一、基本概念二、实现方式三、角色四、过程五、结构图六、构建思路七、完整代码 观察者模式 一、基本概念 观察者模式&#xff08;又被称为模型&#xff08;Model&#xff09;-视图&#xff08;View&#xff09;模式&#xff09;是软件设计模式的一种。在…

开启编程之门

自我介绍 目前已经大二了&#xff0c;计算机专业在读&#xff0c;是一个热爱编程&#xff0c;做事踏实专注的人。转眼间一年已经过去了&#xff0c;也接触编程一年了&#xff0c;但开始并没有对所学所想进行很好的总结和输出&#xff0c;这一年也有了新的很多感悟与心得&#x…

浅谈双十一背后的支付宝LDC架构和其CAP分析

本人汤波&#xff0c;superthem.com 圆领超级个体创始人&#xff0c;Github page地址&#xff1a;https://tbwork.github.io/ 看到很多人在盗用我的文章&#xff0c;还标记成原创&#xff0c;进行收费&#xff0c;非常令人作呕。 我的所有技术文章全部免费阅读&#xff0c;大家…

PCB走线规则

1、线间距。 这里应该遵循3W规则&#xff0c;所谓3W就是为了减少线间串扰&#xff0c;应保证线间距足够大&#xff0c;当线中心不少于3倍线宽&#xff0c;则可 保持70%的电场不互相干扰。如要达到98%的电场不互相干扰&#xff0c;可使用10W的间距。——这是查阅华为PCB布线规则…

npm 清缓存(重新安装node-modules)

安装node依赖包的会出现失败的情况&#xff0c;如下图所示&#xff1a; 此时 提示有些依赖树有冲突&#xff0c;根据提示 “ this command with --force or --legacy-peer-deps” 执行命令即可。 具体步骤如下&#xff1a; 1、先删除本地node-modules包 2、删掉page-loacl…

面试算法1:整数除法

题目 输入2个int型整数&#xff0c;它们进行除法计算并返回商&#xff0c;要求不得使用乘号’*‘、除号’/‘及求余符号’%。当发生溢出时&#xff0c;返回最大的整数值。假设除数不为0。例如&#xff0c;输入15和2&#xff0c;输出15/2的结果&#xff0c;即7。 分析 下面以…

el-upload 上传附件(拆解步骤)

目录 1. 看elementui /element-plus 官网案例 2. html部分&#xff1a; 把官网上的搬下来&#xff0c;最好加一个按钮&#xff0c;上传到服务器&#xff08;后端&#xff09; 3. js 部分&#xff1a; 3.1 首先&#xff0c;先定义一个变量&#xff0c;files 3.2 当上传图片…