当前位置: 首页 > news >正文

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();}}}}

相关文章:

pdf使用pdfbox切割pdf文件MultipartFile

引入依赖&#xff1a; <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.25</version></dependency>测试代码&#xff1a; import io.choerodon.core.iam.ResourceLevel; impo…...

力扣HOT100 - 31. 下一个排列

解题思路&#xff1a; 数字是逐步增大的 步骤如下&#xff1a; class Solution {public void nextPermutation(int[] nums) {int i nums.length - 2;while (i > 0 && nums[i] > nums[i 1]) i--;if (i > 0) {int j nums.length - 1;while (j > 0 &&…...

设计模式 20 中介者模式 Mediator Pattern

设计模式 20 中介者模式 Mediator Pattern 1.定义 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过封装对象之间的交互&#xff0c;促进对象之间的解耦合。中介者模式的核心思想是引入一个中介者对象&#xff0c;将系统中对象之间…...

在 C++ 中,p->name 和 p.name 的效果并不相同。它们用于不同的情况,取决于你是否通过指针访问结构体成员。

p->name&#xff1a;这是指针访问运算符&#xff08;箭头运算符&#xff09;。当 p 是一个指向结构体的指针时&#xff0c;用 p->name 来访问结构体的成员。 student* p &stu; // p 是一个指向 student 类型的指针 cout << p->name << endl; // 通过…...

C++基础:多态

多态相关 多态继承重写父类的虚函数多态的体现,父类的引用指向子类对象的空间虚函数可以实现,也可以不实现,不实现必须要有初始值存在未定义的虚函数的类为抽象类.抽象类不能实例化对象;(animal父类不能实例化对象)如果父类中的函数非虚函数,则会调用父类中的函数//多态的体现…...

移除元素(算法题)

文章目录 移除元素解题思路 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。…...

电商场景的视频动效

AtomoVideo:AIGC赋能下的电商视频动效生成本文分享阿里妈妈视频 AIGC(AtomoVideo等) 赋能视频广告创意的探索和实践。通过基于扩散模型的视频生成技术,结合可控生成技术,使静态电商图片能够栩栩如生地“动”起来,实现了在电商领域的视频 AIGC 应用落地。https://mp.weixi…...

Windows操作系统基本知识整理

目录 引言 一、Windows操作系统的发展历史 1.1 Windows 1.0到Windows 3.0 1.2 Windows 95到Windows Me 1.3 Windows NT到Windows 2000 1.4 Windows XP到Windows 7 1.5 Windows 8到Windows 10 二、Windows操作系统的核心组件 2.1 内核 2.2 文件系统 2.3 图形用户界面&…...

Vue 状态管理深入研究:Vuex 和 Pinia 的原理与实践对比

推荐一个AI网站&#xff0c;免费使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鲸AI &#x1f44b; 引言 在 Vue.js 应用程序中&#xff0c;状态管理是一个至关重要的方面。它有助于集中管理应用的状态&#xff0c;使组件之间的数据共享更加高效和可维护。Vuex 和 Pinia …...

【三数之和】python,排序+双指针

暴力搜索3次方的时间复杂度&#xff0c;大抵超时 遇到不会先排序 排序双指针 上题解 照做 class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:res[]nlen(nums)#排序降低复杂度nums.sort()k0#留两个位置给双指针i,jfor k in range(n-2):if nums[k]…...

TCP通信实现(服务端与客户端)

TCP通信实现&#xff08;服务器端) 案例 // TCP 通信的服务器端#include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h>int main() {// 1.创建socket(用于监听的套接字)int lfd socket(AF_…...

安装appium自动化测试环境,我自己的版本信息

教程来自&#xff1a;Appium原理与安装 - 白月黑羽 我的软件的版本&#xff1a; 安装是选择为自己安装而不是选all user pip install appium-python-client命令在项目根目录下安装appium-python-client sdk的话最简单的安装方式就是去Android官网下一个android studio然后在…...

【讲解下Web前端三大主流的框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

视频监控平台AS-V1000产品介绍:账户或用户数据的导入和导出功能介绍

目录 一、功能描述 &#xff08;一&#xff09;导入功能定义 &#xff08;二&#xff09;导出功能定义 二、用户数据的导入导出的作用 三、AS-V1000新版本的导出和导入功能介绍 &#xff08;一&#xff09;功能主界面 &#xff08;二&#xff09;导出功能 1、导出操作 …...

markdown画时序图的时候,如何自动显示每一条时序的序号

1: 现象描述 今天画时序图的时候&#xff0c;发现时序上面没有显示序号&#xff0c;看起来不够清晰&#xff0c;只有单纯的说明; 如下图所示 刚测试CSDN的时序图&#xff0c;默认是带序号的&#xff0c;看起来和实际使用的markdown工具有关系&#xff1b; 2&#xff1a;解决办…...

朴素贝叶斯

经典三门问题 问题 一种说法(直觉派) 另一种说法(贝叶斯派) 注意P(B)1, 已经知道路人抽中的就是绿豆 三门问题在网上争端比较大,分为直觉派和贝叶斯派,最后一个程序员出来写程序跑了一遍,发现就是贝叶斯派 朴素贝叶斯的直观理解 在X的条件下分别等于0~9的概率 注意之前我们讲的…...

【软件设计师】——10.面向对象技术

目录 10.1 基本概念 10.2设计原则 10.3 设计模式的概念与分类 10.4 创建型模式 10.4.1 Singleton 单例模式 10.4.2 Builder 构建器模式 10.4.3 Abstract Factory 抽象工厂模式 10.4.4 Prototype原型模式 10.4.5 Factory Method工厂方法模式 10.5 结构型模式 10.5.1 A…...

唐山无人机航拍,唐山无人机建模,唐山数据孪生

随着数字经济发展&#xff0c;各地逐渐兴起了无人机低空经济&#xff1b;尤其是无人机航拍&#xff0c;无人机建模&#xff1b;目前技术很成熟&#xff1b;比如水利部提出的数字孪生&#xff0c;四预的实现&#xff0c;都要通过无人机采集底层数据&#xff1b; 目前无人机建模…...

vue中分页查询的实现

在 Vue 中实现分页查询可以提升大型数据集的加载和显示效率。本文将逐步介绍如何使用 Vuex 状态管理和 axios HTTP 请求库来实现 Vue 分页查询。 1. 在 Vuex 中创建分页状态 首先&#xff0c;在 Vuex 状态管理中创建分页状态&#xff0c;该状态将存储每页的记录数、当前页码和…...

类 和 对象(二)

构造方法 接上篇&#xff0c;若每次都想下面的setDate方法给对象初始化&#xff0c;未免比较麻烦&#xff0c;那有什么方法可以让初始化更加简便呢&#xff1f; public void setDate(int year, int month, int day){this.year year;this.month month;this.day day;}答&#…...

颠覆式开源工具OpCore-Simplify:自动化配置提升Hackintosh效率的完整指南

颠覆式开源工具OpCore-Simplify&#xff1a;自动化配置提升Hackintosh效率的完整指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾为黑苹果…...

别再手写 CRUD 了!DeepSeek + 速达荣耀,AI 一把生成整套 ERP 前后端

还在日复一日写 ERP 表单、列表、分页、审核逻辑&#xff1f;同样的单据结构、同样的状态流转、同样的权限校验&#xff0c;手写一遍又一遍。今天直接上实战&#xff1a;DeepSeek AI 编程 速达荣耀开源架构自然语言一句话&#xff0c;自动生成 Vue3 前端 Java 后端整套代码&a…...

ComfyUI-Manager下载加速终极指南:3倍性能提升实战解析

ComfyUI-Manager下载加速终极指南&#xff1a;3倍性能提升实战解析 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cust…...

利用快马平台快速生成基于jdk17的spring boot应用原型

最近在尝试用JDK17搭建一个Spring Boot项目原型时&#xff0c;发现从环境配置到基础代码编写要花不少时间。正好试用了InsCode(快马)平台&#xff0c;发现它能快速生成可运行的项目骨架&#xff0c;特别适合需要快速验证想法的场景。这里记录下具体操作和体验&#xff1a; 项目…...

3大核心功能解决B站资源保存难题:BiliTools跨平台工具箱深度评测

3大核心功能解决B站资源保存难题&#xff1a;BiliTools跨平台工具箱深度评测 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTo…...

网站SEO排名优化有哪些最佳实践

网站SEO排名优化有哪些最佳实践 在当今数字化时代&#xff0c;网站SEO排名优化成为了每个网站运营者必须面对的重要挑战。在百度等搜索引擎中&#xff0c;高排名不仅能够提升网站的曝光率&#xff0c;还能带来更多的流量和潜在客户。具体有哪些最佳实践可以帮助你提升网站在搜…...

3大阶段×50个项目:Android Kotlin实战的能力跃迁指南

3大阶段50个项目&#xff1a;Android Kotlin实战的能力跃迁指南 【免费下载链接】50-android-kotlin-projects-in-100-days My everyday Android practice demos with Kotlin in 100 days. 项目地址: https://gitcode.com/gh_mirrors/50/50-android-kotlin-projects-in-100-d…...

HS2-HF Patch汉化补丁:3分钟实现Honey Select 2游戏完全汉化

HS2-HF Patch汉化补丁&#xff1a;3分钟实现Honey Select 2游戏完全汉化 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 如果你正在寻找一款能够彻底解决Honey …...

CMake: target_include_directories、target_compile_definitions、target_link_libraries 详解

CMake&#xff1a;target_include_directories、target_compile_definitions、target_link_libraries 详解 目录 概述一、PRIVATE / PUBLIC / INTERFACE 作用域二、传递机制与依赖方向&#xff08;示意&#xff09;三、target_include_directories四、target_compile_definit…...

你的QQ空间记忆会消失吗?GetQzonehistory终极备份方案让你完整珍藏青春印记

你的QQ空间记忆会消失吗&#xff1f;GetQzonehistory终极备份方案让你完整珍藏青春印记 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代&#xff0c;我们的青春记忆大多散落在…...