pdf使用pdfbox切割pdf文件MultipartFile

引入依赖:

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.25</version></dependency>

测试代码:


import io.choerodon.core.iam.ResourceLevel;
import io.choerodon.swagger.annotation.Permission;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** <p>* description xxxx* </p>** @author liqin 2024/4/15 14:53*/
@RestController("TestOcrController.v1")
@RequestMapping("/v1/{organizationId}/ocr-test")
public class TestOcrController {@Permission(level = ResourceLevel.ORGANIZATION)@PostMappingpublic void ocrMain(@RequestParam("file") MultipartFile file) {String fileName = file.getOriginalFilename();System.out.println("文件类型:{}"+ fileName);String contentType = file.getContentType();System.out.println("contentType:{}"+ contentType);int dotIndex = fileName.lastIndexOf('.');String filePrefixName = "";String fileType = "";if (dotIndex != -1) {fileType = fileName.substring(dotIndex + 1).toLowerCase();filePrefixName = fileName.substring(0, fileName.lastIndexOf("."));}System.out.println("文件类型:{}"+ fileType);PDDocument doc = null;try (InputStream is = file.getInputStream()) {doc = PDDocument.load(is);int pageCount = doc.getNumberOfPages();System.out.println("pageCount:"+ pageCount);for (int i = 0; i < pageCount; i++) {// PDF 按页切割 还是生成pdf  ======================================================PDDocument outputDocument = new PDDocument();PDPage page = doc.getPage(i);outputDocument.addPage(page);try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {outputDocument.save(outputStream);byte[] bytes = outputStream.toByteArray();// 使用MockMultipartFile将byte[]转换为MultipartFileString newOriginalFilename = filePrefixName+"-"+(i+1)+"."+fileType;MockMultipartFile multipartFile = new MockMultipartFile("file",newOriginalFilename,"application/pdf",bytes);// 处理multipartFile,例如保存到磁盘或上传String path = "C:\\Users\\Administrator\\Desktop\\fileTest"+ File.separator +newOriginalFilename;multipartFile.transferTo(new File(path));}finally {try {if(outputDocument != null) {// 这里需要关闭PDDocument,不然如果想要删除pdf文件时会提示文件正在使用,无法删除的情况outputDocument.close();}} catch (IOException e) {e.printStackTrace();}}// PDF 每一页转图片 ======================================================
//                ByteArrayOutputStream opStream = new ByteArrayOutputStream();
//                PDFRenderer renderer = new PDFRenderer(doc);
//                BufferedImage image = renderer.renderImageWithDPI(i, 200, ImageType.ARGB);
//                ImageIO.write(image, "JPG", opStream);
//                String newOriginalFilename = filePrefixName+"-"+(i+1)+".jpg";
//                MultipartFile multipartFile = new MockMultipartFile("file",
//                        newOriginalFilename,
//                        "image/jpg", opStream.toByteArray());
//                System.out.println("新文件大小:{}"+ multipartFile.getSize());
//
//                // 处理multipartFile,例如保存到磁盘或上传
//                // 目标文件路径
//                String path = "C:\\Users\\Administrator\\Desktop\\fileTest"+ File.separator +newOriginalFilename;
//                System.out.println("地址:{}"+ path);
//                Path filePath = Paths.get(path);
//                // 将MultipartFile内容写入到目标文件
//                Files.copy(multipartFile.getInputStream(), filePath);}}catch (Exception e){e.printStackTrace();}finally {try {if(doc != null) {// 这里需要关闭PDDocument,不然如果想要删除pdf文件时会提示文件正在使用,无法删除的情况doc.close();}} catch (IOException e) {e.printStackTrace();}}}}

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

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

相关文章

百度智能云参与信通院多项边缘计算标准编制,「大模型时代下云边端协同 AI 发展研讨会」成功召开

1 中国信通院联合业界制定、发布多项标准化成果&#xff0c;推动产业发展 大模型开启了 AI 原生时代&#xff0c;云边端协同 AI 构建了「集中式大规模训练」、「边缘分布式协同推理」新范式&#xff0c;有效降低推理时延和成本&#xff0c;提升数据安全和隐私性&#xff0c;也…

微服务技术框架-注册中心-能解决的问题

在微服务架构中&#xff0c;注册中心是一个关键组件&#xff0c;它解决了许多微服务通信和管理中的问题。以下是注册中心能够解决的主要问题&#xff1a; 1. 动态服务发现 问题&#xff1a;微服务实例动态增加或减少&#xff0c;手动配置服务地址非常繁琐且容易出错。 解决方案…

python的Serial 串口缓存区数据处理

没头脑很久没有处理串口数据&#xff0c;今日测试一个测距传感模块&#xff0c;用简单的serial.read没十几秒就屏幕冻住了&#xff0c;不往下print了。后来反应过来是不停访问串口&#xff0c;导致串口数据缓存区溢出了。有一个比较保险的方式如下&#xff0c;简单而言是成块读…

【C++面试100问】第八十五问:有了const,C++11为什么还要引入constexpr

B站讲解视频 在大部分实际场景中&#xff0c;const 和 constexpr 是可以混用的&#xff1b;但是在创建数组用修饰的变量指定size的时候&#xff0c;只能用constexpr&#xff1b;总的来说&#xff0c;在 C 11 标准中&#xff0c;const 用于为修饰的变量添加“只读”属性&#xf…

AtCoder ABC352 A-D题解

比赛链接:ABC352 Problem A: 签到题。 #include <bits/stdc.h> using namespace std; int main(){int N,X,Y,Z;cin>>N>>X>>Y>>Z;if((X<Z && Z<Y) || (Y<Z && Z<X))cout<<"YES"<<endl;else…

数据采集与AI分析,亮数据+通义千问助力跨境电商前行

文章目录 前言工具介绍数据采集工具亮数据Web Scraper IDE亮点 AI数据分析工具 实战电商数据采集与AI分析电商平台选取数据采集完全托管数据集自定义数据集 AI分析 价格总结 前言 随着信息技术的飞速发展&#xff0c;数据采集与AI分析在跨境电商中扮演着越来越重要的角色。通过…

用ControlNet+Inpaint实现stable diffusion模特换衣

用ControlNetInpaint实现stable diffusion模特换衣 ControlNet 训练与架构详解ControlNet 的架构用于文本到图像扩散的 ControlNet训练过程Zero卷积层的作用解释 inpaintInpaint Anything 的重要性Inpaint Anything 的功能概述 在现代计算机视觉领域&#xff0c;稳定扩散&#…

微信小程序开发 tabbar组件常见问题

一、 tabbar不显示问题 问题 刚开始我在app.json中配置了下面的代码&#xff0c;但tabbar并没有显示。代码如下&#xff1a; "tabBar": {"custom": true,"color": "#7A7E83","selectedColor": "#3cc51f","…

【机器学习-08】 | Scikit-Learn工具包进阶指南:Scikit-Learn工具包之决策树算法实战分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

微信H5跳小程序 wx-open-launch-weapp ios显示且正常跳转,安卓不显示不报错解决方案

前提&#xff1a;在一切都正常(无报错&#xff0c;没有写法错误等)的情况下&#xff0c;出现这个问题: 去你的h5项目&#xff0c;用浏览器打开&#xff0c;在network随便找一个静态文件&#xff0c;在response响应标头中找找&#xff0c;是否有Content-Security-Policy这个头&…

线程池相关故障梳理总结

下面贴一些典型的常见 Case&#xff0c;开发同学基本一看就懂并不神奇。 数据库相关 热更新 在事务里热更新同一条数据容易引发锁等待造成慢 SQL&#xff0c;常见于一些 update count&#xff0c;update quota 类的业务场景。 故障案例1&#xff1a;某次压测对 DB 产生瞬时 6…

服务高峰期gc,导致服务不可用

随着应用程序的复杂性和负载的不断增加&#xff0c;对JVM进行调优&#xff0c;也是保障系统稳定性的一个重要方向。 需要注意&#xff0c;调优并非首选方案&#xff0c;一般来说解决性能问题还是要从应用程序本身入手&#xff08;业务日志&#xff0c;慢请求等&#xff09;&am…

struct.unpack_from()学习笔记

struct.unpack_from(fmt,b_data,offset) 按照指定的格式fmt&#xff0c;从偏移位置offset&#xff0c;对b_data开始解包&#xff0c;返回数据格式是一个元组(v1,v2…) fmt可以有&#xff1a; _struct.py: The remaining chars indicate types of args and must match exactly;…

基于Vue的验证码实现

一、验证码核心实现 创建slide-verify.vue&#xff0c;代码如下&#xff1a; <template><divclass"slide-verify":style"{ width: w px }"id"slideVerify"onselectstart"return false;"><!-- 图片加载遮蔽罩 -->&…

网络编程 —— Http设置请求头

概念 请求报文: 在发送请求时候&#xff0c;把数据封装成一个包&#xff0c;这个包就是请求报文&#xff0c; 请求头: 键值对&#xff0c;发请求需要配置的信息&#xff0c;例如请求长度的配置 请求行: 请求方式路径 请求协议的版本 如果每个请求都需要把通信证token…

java项目之图书管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 系统主要分为管理员角色和用…

水果成篮-力扣

这道题目一开始的思路是利用水果的种类大于等于三&#xff0c;来作为滑动窗口的维护条件&#xff0c;使用两个key值来记录两种水果的值&#xff0c;当遇到第三种水果时&#xff0c;则将slowindex设置为slowindex-1&#xff0c;然后将slowindex逐渐缩小&#xff0c;来查找前x个相…

【Redis7】Redis持久化机制之RDB

文章目录 1.RDB简介2.RDB配置触发设置3.RDB的优缺点4.如何检查修复RDB文件5.如何禁用RDB6.RDB参数优化7.总结 1.RDB简介 Redis持久化机制中的RDB&#xff08;Redis Database&#xff09;是一种将Redis在某个时间点的数据以快照形式保存到磁盘上的方法。 原理&#xff1a;RDB通…

Node.js版本管理与npm镜像源管理

一、nvm —— node的版本管理工具 1.安装 nvm Windows 使用 nvm-windows点击跳转下载网站。 按照图示操作步骤下一步即可&#xff0c;对于下载位置推荐不要C盘任意即可 2.查看可用的 Node.js 版本&#xff1a; nvm list available #显示所有可以下载的版本3.安装特定的…

自动化证书管理|如何通过可管理的ACME为“90天SSL证书”做好准备?

SSL证书在保护组织的Web通信安全方面发挥着至关重要的作用。最近的趋势表明&#xff0c;在增强安全性诉求的推动下&#xff0c;SSL证书有效期逐渐缩短。这一变化需要组织耗费更多的时间和资源来进行证书更新工作&#xff0c;为了降低潜在风险并简化流程&#xff0c;自动化证书管…