PDF转成图片
使用开源库Apache PDFBox将PDF转换为图片
依赖
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.4</version>
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.4</version>
</dependency>
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import javax.imageio.ImageIO;import cn.hutool.core.lang.UUID;
import com.zxzx.ssm.common.constant.SsmConstant;
import org.apache.commons.io.IOUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;/*** @author admin*/
public class PDFToImageConverter {/*** 按照页数返回图片-转成BASE64*/public static List<String> pdfToPng(File pdfFile) {List<String> list = new ArrayList<>();try (PDDocument doc = PDDocument.load(pdfFile)) {PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();for (int i = 0; i < pageCount; i++) {BufferedImage image = renderer.renderImageWithDPI(i, 144);File file = new File(SsmConstant.TEMP_PIC + "/" + pdfFile.getName() + "_" + (i + 1) + ".png");ImageIO.write(image, "png", file);InputStream inputStream = Files.newInputStream(file.toPath());byte[] byteArray = IOUtils.toByteArray(inputStream);String s = Base64.getEncoder().encodeToString(byteArray);list.add(s);}} catch (IOException e) {e.printStackTrace();}return list;}/*** 转换到同一张图片*/public static String pdfToPngCollect(File file) {String outPicPath = SsmConstant.TEMP_PIC + UUID.fastUUID() + ".png";try (PDDocument doc = PDDocument.load(file)) {PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();List<BufferedImage> imageList = new ArrayList<>();int height = 0;int weight = 0;for (int i = 0; i < pageCount; i++) {BufferedImage image = renderer.renderImageWithDPI(i, 144);height += image.getHeight();weight = Math.max(weight, image.getWidth());imageList.add(image);}BufferedImage mergedImage = new BufferedImage(weight, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = mergedImage.createGraphics();int accHeight = 0;for (BufferedImage image : imageList) {g.drawImage(image, 0, accHeight, null);accHeight += image.getHeight();}g.dispose();File outputfile = new File(outPicPath);ImageIO.write(mergedImage, "jpg", outputfile);} catch (IOException e) {e.printStackTrace();}return outPicPath;}}
相关文章:
PDF转成图片
使用开源库Apache PDFBox将PDF转换为图片 依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.4</version> </dependency> <dependency><groupId>org.apache…...
Qt无边框设计
//指定窗口为无边框 this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);重写鼠标事件: void mousePressEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override;定义位置: QPoint dif…...
规则引擎Drools使用,0基础入门规则引擎Drools(二)高级语法
文章目录 系列文章索引五、规则属性1、enabled属性2、dialect属性3、salience属性4、no-loop属性5、activation-group属性6、agenda-group属性7、auto-focus属性8、timer属性9、date-effective属性10、date-expires属性 六、Drools高级语法1、global全局变量2、query查询3、fun…...
C语言二十三弹---求第N项斐波那契数列的值
C语言求第N项斐波那契数列的值 定义:斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89…自然中的斐波那契数列࿰…...
Pickcode:教孩子们编码的新视觉语言
Pickcode 通过视觉课程、聊天机器人、游戏和绘图来教授编程。 Pickcode 是一种新的语言和编辑器,可以直观地指导用户编写代码来制作聊天机器人、动画图画和游戏。Pickcode 旨在让用户在学习更高级的语言之前能够充满信心地开始学习编码。 Pickcode 可视化编程语言…...
乐划锁屏插画大赏热度持续,进一步促进价值内容的创造与传播
锁屏,原本只是为了防止手机在口袋里“误触”而打造的功能,现如今逐渐成为文化传播领域的热门入口。乐划锁屏不断丰富锁屏内容和场景玩法,通过打造“乐划锁屏插画大赏”系列活动为广大内容创作者提供了更多展示自我的机会,丰富平台内容。 从2020年到2023年,乐划锁屏插画大赏已连…...
【ArcGIS Pro微课1000例】0034:矢量数据几何校正案例(Spatial Adjustment)
本案例讲解矢量数据几何校正,根据一个矢量数据去校正另外一个矢量数据。 文章目录 一、加载实验数据二、空间校正三、注意事项一、加载实验数据 在ArcGIS Pro中加载数据效果如下: design:需要校正的数据图层plan+roadcenter:目标图层可以看到,design图层没有在正确的位置…...
2023亚太杯数学建模B题:玻璃温室中的微气候法规,思路模型代码论文
问题B 玻璃温室中的微气候法规 赛题思路:思路获取见文末名片,第一时间更新 温室作物的产量受到各种气候因素的影响,包括温度、湿度和风速[1]。其中,适 宜的温度和风速是植物生长[2]的关键。为了调节玻璃温室内的温度、风速等气…...
Eclipse常用设置-乱码
在用Eclipse进行Java代码开发时,经常会遇到一些问题,记录下来,方便查看。 一、properties文件乱码 常用的配置文件properties里中文的乱码,不利于识别。 处理流程:Window -> Preferences -> General -> Ja…...
MySQL面试,MySQL事务,MySQL锁,MySQL集群,主从,MySQL分区,分表,InnoDB
文章目录 数据库-MySQLMySQL主从、集群模式简单介绍1、主从模式 Replication2、集群模式3、主从模式部署注意事项 UNION 和 UNION ALL 区别分库分表1.垂直拆分2、水平拆分 MySQL有哪些数据类型1、整数类型**,2、实数类型**,3、字符串类型**,4…...
HarmonyOS应用开发者认证题目满分指南
为了帮助大家快速的上手HarmonyOS应用程序开发,官方制作了一些免费的课程:HarmonyOS第一课。每个课程后面都有一些练习题,下面就是这些题目的满分答案。 【习题】运行Hello World工程 判断题 1.DevEco Studio是开发HarmonyOS应用的一站式集…...
openssl+ SM2 + linux 签名校验开发实例(C++)
文章目录 一、SM2校验理论基础二、SM2签名校验开发实例(C) 一、SM2校验理论基础 SM2的校验过程是使用椭圆曲线上的公钥验证签名的有效性。以下是SM2校验的理论基础相关知识点: SM2签名算法: SM2的校验基于椭圆曲线数字签名算法&a…...
有关Vue、微信小程序、UniApp中的CSS中的宽度width单位、自适应
在Vue中,可以使用以下单位来设置宽度(width) 像素(px):最常用的单位,表示一个绝对长度单位。例如,width: 200px; 表示宽度为200像素。百分比(%):…...
黑马React18: ReactRouter
黑马React: ReactRouter Date: November 21, 2023 Sum: React路由基础、路由导航、导航传参、嵌套路由配置 路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 2. …...
算法刷题-动态规划-1
算法刷题-动态规划-1 不同路径不同路径||方法一:方法二 第N个泰波那契数递归写法滚动数组 三步问题递归操作滚动数组 使用最小画法爬楼梯递归 解码方法方法一方法二:(大佬讲解) 不同路径 //机器人不同的路径进入到指定的地点 publ…...
分享一篇很就以前的文档-VMware Vsphere菜鸟篇
PS:由于内容是很久以前做的记录,在整理过程中发现了一些问题,简单修改后分享给大家。首先ESXI节点和win7均运行在VMware Workstation上面,属于是最底层,而新创建的CentOS则是嵌套后创建的操作系统,这点希望…...
QT中的lambda表达式
面是对Qt中在QObject::connect()中的lambda表达式常用用法 QString str("I am a string!"); devicestr; connect(ui- connect(m_imgshowUI, &ImgShow::GetImgPath, m_visionplatform, [](const std::string filename){m_visionplatform->ReadImg(filename);}…...
linux文件I/O:文件锁的概念、函数以及代码实现
文件锁是一种用来保证多个进程对同一个文件的安全访问的机制。文件锁可以分为两种类型:建议性锁和强制性锁。建议性锁是一种协作式的锁,它只有在所有参与的进程都遵守锁的规则时才有效。强制性锁是一种强制式的锁,它由内核或文件系统来强制执…...
MySQL数据库系统教程
目录 基础篇 通用语法及分类 DDL(数据定义语言) 数据库操作 表操作 DML(数据操作语言) 添加数据 更新和删除数据 DQL(数据查询语言) 基础查询 条件查询 聚合查询(聚合函数࿰…...
这样写postman实现参数化,阿里p8都直呼牛逼
什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数…...
JFrog Helm Charts 仓库深度解析:云原生制品管理一键部署指南
1. 项目概述:JFrog Helm Charts 仓库深度解析 在云原生和容器化部署成为主流的今天,如何高效、稳定地将复杂的企业级应用部署到 Kubernetes 集群中,是每个 DevOps 工程师和平台架构师必须面对的课题。如果你正在或计划使用 JFrog 旗下的 Art…...
DSG-22.6 GHz开源射频信号发生器解析与应用
1. 项目概述:DSG-22.6 GHz开源射频信号发生器作为一名在射频测试领域摸爬滚打多年的工程师,当我第一次看到Atek Midas推出的这款DSG-22.6 GHz信号发生器时,确实被它的参数和价格组合惊艳到了。这款设备填补了专业实验室设备与爱好者预算之间的…...
51单片机内存不够用?除了改Target选项,KEIL5里这几个冷门但好用的存储类型关键字(xdata, pdata, code)你得知道
51单片机内存优化实战:KEIL5存储类型深度解析与高效应用 引言 在51单片机开发中,内存资源总是捉襟见肘。当你的项目逐渐复杂,变量和函数不断增加,编译时突然跳出的"Target not created"或"PUBLIC REFERS TO IGNORE…...
你知道吗?其实这些都是AI——无人驾驶技术
无人驾驶技术 背景介绍 随着科技的进步和城市化进程的加速,交通运输系统正面临着前所未有的挑战。交通拥堵、事故频发以及环境污染等问题日益严重。无人驾驶技术的出现为解决这些问题带来了新的希望。通过先进的传感器、数据处理和控制技术,无人驾驶技术能够实现车辆的自动…...
从0到百万级长连接:PHP+Swoole+LLM生产环境落地手册(含TLS双向认证+JWT续期+断线语义恢复)
更多请点击: https://intelliparadigm.com 第一章:PHPSwooleLLM长连接方案对比评测报告全景概览 在构建面向大语言模型(LLM)的实时交互服务时,PHP 传统 FPM 模式已难以满足低延迟、高并发、全双工通信的需求。本章聚焦…...
别再手动一篇篇找了!用Python+Sci-Hub批量下载论文,附最新可用域名获取方法
科研效率革命:Python自动化文献获取系统搭建指南 在深夜的实验室里,面对数百篇待下载的文献,你是否也曾感到绝望?每个科研工作者都经历过手动逐篇搜索、点击、保存的繁琐过程,这不仅消耗宝贵的研究时间,更打…...
保姆级教程:用ECharts for Weixin在小程序里画个家庭旅行足迹地图
家庭旅行足迹地图:用ECharts打造微信小程序的互动记忆 记得去年夏天,我们一家三口自驾环游西北,孩子每到一处就在地图上贴个小星星。现在,通过微信小程序和ECharts,我们可以把这种温馨的家庭互动搬到手机上——不仅能记…...
SAP ABAP开发避坑指南:COMMIT WORK和COMMIT WORK AND WAIT到底怎么选?
SAP ABAP开发实战:COMMIT WORK与COMMIT WORK AND WAIT的智能决策框架 在SAP ABAP开发中,数据提交操作的选择往往决定了系统的稳定性和业务数据的可靠性。许多开发者在面对COMMIT WORK和COMMIT WORK AND WAIT时,常常陷入两难:是追求…...
2小时视频5分钟学完?2026年值得一试的AI视频总结工具
长视频→图文讲义,不是转写,是真正帮你学完 先算一笔账 你B站收藏夹里有多少干货视频? 我数了一下,237个视频,平均时长28分钟。算下来就是110小时的内容量——不吃不睡看5天才能看完。 为什么收藏了再也没看过呢&am…...
R语言+PHM工业实践:3天快速复现NASA涡轮引擎剩余寿命预测(附可运行GitHub仓库)
更多请点击: https://intelliparadigm.com 第一章:R语言PHM工业实践:3天快速复现NASA涡轮引擎剩余寿命预测(附可运行GitHub仓库) 本章基于NASA公开的C-MAPSS数据集,使用R语言构建端到端的预测性健康管理&…...
