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

pdf内容三张以上转图片,使用spire.pdf.free

一、依赖

   <spire.pdf.free.version>9.13.0</spire.pdf.free.version><itextpdf.version>5.5.13</itextpdf.version><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>${spire.pdf.free.version}</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>${itextpdf.version}</version></dependency>

二、思路:

①问题:

1、spire.pdf.free只能免费转换每个PDF的前三页

2、转换速度慢

3、多线程合并后页数顺序问题

②解决

1、将PDF文档根据页数截断为多个PDF,每个PDF最多三页

2、使用线程池多线程异步处理

3、map里的索引

三、代码:

1、 转换的类

package com.shiqiao.nev.business.infra.adapter.pdftoPic;import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.graphics.PdfImageType;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;public class PdfToPicConverter {private final byte[] pdfFileByteStream;private final Integer pageCount;private List<InputStream> picResult;public PdfToPicConverter(InputStream pdfFile) {try {pdfFileByteStream = inputStreamToByteArray(pdfFile);} catch (Exception e) {throw new RuntimeException("pdf文件转换为字节流失败", e);}PdfDocument pdf = new PdfDocument();pdf.loadFromStream(new ByteArrayInputStream(pdfFileByteStream));pageCount = pdf.getPages().getCount();}public PdfToPicConverter(byte[] pdfFile) {pdfFileByteStream = pdfFile;PdfDocument pdf = new PdfDocument();pdf.loadFromStream(new ByteArrayInputStream(pdfFileByteStream));pageCount = pdf.getPages().getCount();}public List<InputStream> convertToPictures(ExecutorService executorService) {picResult = new ArrayList<>();// 每三页为一组int groupSize = 3;int numGroups = (pageCount + groupSize - 1) / groupSize;List<Future<List<InputStream>>> futures = new ArrayList<>();for (int i = 0; i < numGroups; i++) {int startPage = i * groupSize;int endPage = Math.min(startPage + groupSize, pageCount);if (executorService != null) {futures.add(executorService.submit(() -> convertGroup(startPage, endPage)));}}// 等待所有任务完成并合并结果for (Future<List<InputStream>> future : futures) {try {picResult.addAll(future.get());} catch (Exception e) {throw new RuntimeException("图片转换失败", e);}}return picResult;}private InputStream splitPDFFile(byte[] pdfFileByteStream, int from, int end) {Document document = null;PdfCopy copy = null;try (ByteArrayInputStream bais = new ByteArrayInputStream(pdfFileByteStream);ByteArrayOutputStream baos = new ByteArrayOutputStream()) {PdfReader reader = new PdfReader(bais);int n = reader.getNumberOfPages();if (end == 0 || end > n) {end = n;}document = new Document(reader.getPageSize(1));copy = new PdfCopy(document, baos);document.open();for (int j = from + 1; j <= end; j++) {  // 注意这里j从from+1开始document.newPage();PdfImportedPage page = copy.getImportedPage(reader, j);copy.addPage(page);}document.close();return new ByteArrayInputStream(baos.toByteArray());} catch (IOException | DocumentException e) {throw new RuntimeException("PDF文件拆分失败", e);}}private List<InputStream> convertGroup(int startPage, int endPage) {InputStream inputStream = splitPDFFile(pdfFileByteStream, startPage, endPage);PdfDocument pdf = new PdfDocument();pdf.loadFromStream(inputStream);int end = endPage - startPage;List<InputStream> groupResult = new ArrayList<>();for (int i = 0; i < end; i++) {BufferedImage image = pdf.saveAsImage(i, PdfImageType.Bitmap, 500, 500);try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {ImageIO.write(image, "PNG", baos);groupResult.add(new ByteArrayInputStream(baos.toByteArray()));} catch (IOException e) {throw new RuntimeException("图片保存失败", e);}}pdf.close();return groupResult;return new ArrayList<>();}protected byte[] inputStreamToByteArray(InputStream inputStream) throws IOException {int bufferSize = 4096;byte[] buffer = new byte[bufferSize];int bytesRead;ByteArrayOutputStream baos = new ByteArrayOutputStream();while ((bytesRead = inputStream.read(buffer)) != -1) {baos.write(buffer, 0, bytesRead);}return baos.toByteArray();}
}

2、使用的地方

  public List<FileDTO> pdfToPng(byte[] filebyte, String fileName) {List<FileDTO> fileDTOS = new ArrayList<>();PdfToPicConverter pdfToPicConverter = new PdfToPicConverter(filebyte);List<InputStream> inputStreams = pdfToPicConverter.convertToPictures(pdfCovertPicExectorPool);inputStreams.forEach((e) -> {// 生成文件名String pgnNames = "fileName"+inputStreams.indexOf(e) + ".png";FileDTO fileDTO = new FileDTO(e, pgnNames);fileDTOS.add(fileDTO);});return fileDTOS;}

四、spire.pdf.free 的下载:maven仓库里进去然后点官网就能下jar包了

相关文章:

pdf内容三张以上转图片,使用spire.pdf.free

一、依赖 <spire.pdf.free.version>9.13.0</spire.pdf.free.version><itextpdf.version>5.5.13</itextpdf.version><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>$…...

游戏、软件、开源项目和资讯

游戏 标题链接【白嫖正版游戏】IT之家喜加一website 软件 标题链接【白嫖正版软件】反斗限免website 开源项目 标题链接【Luxirty Search】基于Google搜索结果&#xff0c;屏蔽内容农场Github【Video2X】图片/视频超分工具Github 新闻资讯 标题链接分享10个 Claude 3.5 …...

Acrel-1000变电站综合自动化系统及微机在化工企业中的应用方案

文&#xff1a;安科瑞郑桐 摘要&#xff1a;大型化工企业供配电具有的集约型特点&#xff0c;化工企业内35kV变电站和10kV变电所数量大、分布广&#xff0c;对于老的大多大型及中型化工企业而言&#xff0c;其变电站或变电所内高压电气设备为旧式继电保护装置&#xff0c;可靠…...

[Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)

前言 CentOS7替换yum源为阿里云 yum是CentOS中的一种软件管理器&#xff0c;通过yum安装软件&#xff0c;可以自动解决包依赖的问题&#xff0c;免去手工安装依赖包的麻烦。 yum使用了一个中心仓库来记录和管理软件的依赖关系&#xff0c;默认为mirrorlist.centos.org&#xf…...

在Java中创建多线程的三种方式

多线程的创建和启动方式 在Java中&#xff0c;创建多线程主要有以下三种方式&#xff1a; 继承Thread类实现Runnable接口使用Callable接口与Future 下面是这三种方式的简单示例&#xff0c;以及如何在主类中启动它们。 1. 继承Thread类 class MyThread extends Thread {Ov…...

洛谷 AT_abc374_c [ABC374C] Separated Lunch 题解

题目大意 KEYENCE 总部有 N N N 个部门&#xff0c;第 i i i 个部门有 K i K_i Ki​ 个人。 现在要把所有部门分为 AB 两组&#xff0c;求这两组中人数多的那一组的人数最少为多少。 题目分析 设这些部门共有 x x x 个人&#xff0c;则较多的组的人数肯定大于等于 ⌈ …...

力扣2528.最大化城市的最小电量

力扣2528.最大化城市的最小电量 题目解析及思路 题目要求找到所有城市电量最小值的最大 电量为给城市供电的发电站数量 因此每座城市的电量可以用一段区间和表示&#xff0c;即前缀和 二分最低电量时 如果当前城市电量不够,贪心的想发电站建立的位置&#xff0c;应该是在mi…...

【zookeeper】集群配置

zookeeper 数据结构 zookeeper数据模型结构&#xff0c;就和Linux的文件系统类型&#xff0c;看起来是一颗树&#xff0c;每个节点称为一个znode.每一个Znode默认的存储1MB的数据&#xff0c;每个Znode都有唯一标识&#xff0c;可以通过命令显示节点的信息每当节点有数据变化…...

YOLO11 目标检测 | 导出ONNX模型 | ONNX模型推理

本文分享YOLO11中&#xff0c;从xxx.pt权重文件转为.onnx文件&#xff0c;然后使用.onnx文件&#xff0c;进行目标检测任务的模型推理。 用ONNX模型推理&#xff0c;便于算法到开发板或芯片的部署。 备注&#xff1a;本文是使用Python&#xff0c;编写ONNX模型推理代码的 目…...

PostgreSQL DBA月度检查列表

为了确保数据库系统能够稳定高效运行&#xff0c;DBA 需要定期对数据库进行检查和维护&#xff0c;这是一项非常具有挑战性的工作。 本文给大家推荐一个 PostgreSQL DBA 月度性能检查列表&#xff0c;遵循以下指导原则可以帮助我们实现一个高可用、高性能、低成本、可扩展的数…...

驱动开发系列12 - Linux 编译内核模块的Makefile解释

一:内核模块Makefile #这一行定义了要编译的内核模块目标文件。obj-m表示目标模块对象文件(.o文件), #并指定了两个模块源文件:helloworld-params.c 和 helloworld.c。最终会生成这 #这两个.c文件的.o对象文件。 obj-m := helloworld-params.o helloworld.o#这行定义了内核…...

用js+css实现圆环型的进度条——js+css基础积累

如果用jscss实现圆环型的进度条&#xff1a; 直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><met…...

TDengine 与北微传感达成合作,解决传统数据库性能瓶颈

在当今物联网&#xff08;IoT&#xff09;快速发展的背景下&#xff0c;传感器技术已成为各个行业数字化转型的关键组成部分。随着设备数量的激增和数据生成速度的加快&#xff0c;如何高效地管理和分析这些数据&#xff0c;成为企业实现智能化运营的重要挑战。尤其是在惯性传感…...

通过Python爬虫获取商品销量数据,轻松掌握市场动态

为什么选择Python爬虫&#xff1f; 简洁易用&#xff1a;Python语言具有简洁的语法和丰富的库&#xff0c;使得编写爬虫变得简单高效。强大的库支持&#xff1a;Python拥有强大的爬虫框架&#xff08;如Scrapy、BeautifulSoup、Requests等&#xff09;&#xff0c;可以快速实现…...

学习虚幻C++开发日志——TSet

TSet 官方文档&#xff1a;虚幻引擎中的Set容器 | 虚幻引擎 5.5 文档 | Epic Developer Community (epicgames.com) TSet 是通过对元素求值的可覆盖函数&#xff0c;使用数据值本身作为键&#xff0c;而不是将数据值与独立的键相关联。 默认情况下&#xff0c;TSet 不支持重…...

面向对象进阶(下)(JAVA笔记第二十二期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 抽象方法和抽象类抽象方法定义格式抽象类定义格式抽象方法和抽象类注意事项 接口接口的定义接口中成员变量的特点接口中没有构造方法接口中成员方法的特点在接口中定义具有方法体…...

通信协议——UART

目录 基础概念串行&并行串行的优缺点 单工&双工 UART基本概念时序图思考&#xff1a;接收方如何确定01和0011 基础概念 串行&并行 串行为8车道&#xff0c;并行为1车道 串行的优缺点 通行速度快浪费资源布线复杂线与线之间存在干扰 单工&双工 单工&#xf…...

最优阵列处理技术(七)-谱加权

阵列的加权技术等价于时间序列谱分析中的加窗或锐化技术。在加权过程中,需要考虑的是如何降低旁瓣并使主波束宽度的增长最小。 首先需要明确的是,在 u u u空间下的波束方向图为 B u ( u ) =...

Java | Leetcode Java题解之第486题预测赢家

题目&#xff1a; 题解&#xff1a; class Solution {public boolean PredictTheWinner(int[] nums) {int length nums.length;int[] dp new int[length];for (int i 0; i < length; i) {dp[i] nums[i];}for (int i length - 2; i > 0; i--) {for (int j i 1; j …...

leetcode动态规划(十五)-完全背包

题目 leetcode上没有纯完全背包题目&#xff0c;可以看卡码网上的题目 完全背包 思路 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff…...

AI视听新体验!浙大阿里提出视频到音乐生成模型MuVi:可解决语义对齐和节奏同步问题

MuVi旨在解决视频到音乐生成(V2M)中的语义对齐和节奏同步问题。 MuVi通过专门设计的视觉适配器分析视频内容,以提取上下文 和时间相关的特征,这些特征用于生成与视频的情感、主题及其节奏和节拍相匹配的音乐。MuVi在音频质量和时间同步方面表现优于现有基线方法,并展示了其在风…...

对比两个el-table,差异数据突显标记

前言 在数据分析和数据处理的过程中&#xff0c;经常需要对比两个数据集&#xff0c;以便发现其中的差异和变化。本文将介绍如何使用 el-table 组件来对比两个数据集&#xff0c;并通过差异数据的突显标记&#xff0c;帮助用户更直观地理解数据的变化。 cell-style 属性 其实利…...

调研funasr时间戳返回时间坐标效果可用性

# 背景 : 分析funasr识别结果中每个中文字的时间戳偏差情况 1.评价指标: ①偏差公式: A=标注字的时间戳(帧长区间) B=识别字的时间戳(帧长区间) 偏差=(AB的区间并集-AB的区间交际) 偏差百分比=(AB的区间并集-AB的区间交际)/(A的帧长) def calculate_bias(la…...

Tomcat默认配置整理

Connector: 处理请求的具体配置 Tomcat的连接等待队列长度&#xff0c;默认是100 Tomcat的最大连接数&#xff0c;默认是8192 Tomcat的最小工作线程数&#xff0c;默认是10 Tomcat的最大线程数&#xff0c;默认是200 Tomcat的连接超时时间&#xff0c;默认是20s Server port…...

深入理解Rust中的指针:裸指针 智能指针

Rust是一种注重安全性的系统编程语言&#xff0c;它通过所有权、借用和生命周期等机制来保证内存安全。在Rust中&#xff0c;指针的使用是小心翼翼的&#xff0c;因为指针操作是导致内存错误的主要原因之一。然而&#xff0c;指针在处理底层数据和性能优化时又是必不可少的。本…...

物联网实训项目:绿色家居套件

1、基本介绍 绿色家居通过物联网技术将家中的各种设备连接到一起&#xff0c;提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。绿色家居提供全方位的信息交互功能&#xff0c;甚至为各种能源费…...

缓存雪崩是什么

背景 Redis的缓存雪崩是指在某一时间段内&#xff0c;大量缓存数据同时失效&#xff0c;导致大量请求直接打到数据库上&#xff0c;造成数据库压力激增&#xff0c;甚至可能导致数据库宕机。这种情况类似于雪崩效应&#xff0c;突然的大量请求涌入数据库&#xff0c;系统无法承…...

【格物刊】龙信刊物已上新

文章关键词&#xff1a;电子数据取证、电子物证、手机取证、介质取证 深藏注册表的秘密&#xff1a;一次揭开金融阴谋的成功取证 一场看似无懈可击的金融操作&#xff0c;背后是否隐藏着阴谋&#xff1f;执法部门接到举报&#xff0c;指控几名金融机构的高层管理人员涉嫌利用…...

DNA存储介绍

1. DNA存储的基本原理 DNA存储技术基于DNA分子的双螺旋结构&#xff0c;利用其四种碱基&#xff08;A、T、C、G&#xff09;来编码信息。每个碱基可以代表一个二进制位&#xff08;bit&#xff09;&#xff0c;其中A和C可以代表0&#xff0c;G和T可以代表1&#xff0c;或者使用…...

如何修改MAC地址破解网络无线网络限制-担心别人蹭网,路由器设置MAC地址过滤,限定了能访问无线网络的网卡地址-供大家学习参考

路由器都设置了MAC地址过滤&#xff0c;也就是限定了能访问无线网络的网卡的MAC地址。因为无线路由器不一定由自己控制&#xff0c;所以当更换了笔记本或者更换了无线网卡的时候&#xff0c;也许就上不了网了。我们可以修改网卡的MAC地址实现上网。 下载&#xff1a;https://do…...

跨境电子商务网页制作与网站建设/网站关键词推广优化

文章目录常见的解决方案&#xff1a;常见问题1&#xff1a;常见问题2&#xff1a;问题描述:方案1:(本人平时遇到这问题的常规操作)方案2:方案3:方案4:方案5:方案6:脚本解决方案&#xff1a;原博客&#xff0c;点击这里IDEA中download源码失败的解决方法&#xff0c;亲测可行常见…...

酉阳网站制作/网站软文推广网站

今天我们来详解一下git的各种命令,此为git的第一篇&#xff0c;后续还会有好几篇&#xff0c;希望大家看了能有所进步 第一篇的命令 1.git commit 2.git branch 3.git merge 4.git rebase Git Commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照&#xff0c;就像是…...

西安政府做网站/广州推广seo

调试环境&#xff1a;ASIHTTPRequest版本1.8.1-61 2011-9-19修复版Xcode版本4.2.1iOS5.0Mac OS X10.7.1在此代码仅仅捣鼓异步的初步处理1、需要实现协议接口 ASIHTTPRequestDelegate 主要requestFailed,requestFinished之类的接口2、调用的时候&#xff0c;建议启动异步request…...

搭建网站首页/代写企业软文

上汽董事长称不能接受与华为合作自动驾驶&#xff0c;这应该属于正常的商业抉择&#xff0c;同时同业竞争者不会合作是正常的商业共识&#xff0c;韩国两大电视企业三星和LG就长期不曾合作&#xff0c;三星和苹果作为手机行业的竞争对手互相提防&#xff0c;上汽集团董事长也说…...

可以免费浏览的网站/东莞seo外包公司哪家好

event安装包链接 PECL :: Package :: event 使用特定平台可用的最佳 I/O 通知机制有效调度基于 I/O、时间和信号的事件的扩展。 通过I/O调度&#xff0c;提高并发&#xff0c;更高效的利用服务器资源。 wget https://pecl.php.net/get/event-3.0.6.tgz tar -zxvf event-3.0.…...

外国做美食视频网站/三叶草gw9356

对象数组 数组可以将对象应用作为元素保存。仅仅使用数组和其它类型的对象就可以建立相当复杂度的信息管理结构。例如&#xff0c;一个数组可以包含有多个对象&#xff0c;每个对象又由一组变量和使用这些变量的方法组成&#xff0c;而对象中的变量可能本身又是数组。 当用数组…...