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

Word、PDF转换为图片Java

Word、PDF转换为图片Java

需求要在小程序端展示文档内容,所以将文档每页转换为图片后显示

参考和其他等方案:
https://blog.csdn.net/strggle_bin/article/details/140599514

https://www.modb.pro/db/566986

https://blog.csdn.net/spring_is_coming/article/details/136969669

Word转换为图片

<!-- word转图工具 -->
<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.8.0</version>
</dependency>
<dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-words</artifactId><version>23.1</version>
</dependency>
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import lombok.extern.slf4j.Slf4j;import java.io.File;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;@Slf4j
public class WordToImageUtil {public static void main(String[] args) {wordToImage("C:\\Users\\Administrator\\Documents\\录入脚本\\324\\", "xxxx.doc");}public static List<String> wordToImage(String filePath, String fileName) {log.info("开始word转换为图片");List<String> resultList = new ArrayList<String>();// 获取文件路径分隔符String separator = File.separator;try {// 填充数据完毕的test.docx,在转换成图片File file1 = new File(filePath + separator + fileName); // 使用系统的路径分隔符// 打开生成的 Word 文件Document doc = new Document(Files.newInputStream(file1.toPath()));// 逐页将 Word 文件保存为图片(PNG格式)for (int i = 0; i < doc.getPageCount(); i++) {Document extractedPage = doc.extractPages(i, 1);// 拼接上文件名String path = filePath + separator + "tmpImg" + separator + removeFileExtension(fileName) + separator +"img" + System.currentTimeMillis() + "_" + i + ".png"; // 使用系统的路径分隔符// 创建目录(如果不存在的话)File tmpDir = new File(filePath + separator + "tmpImg" + separator + removeFileExtension(fileName));if (!tmpDir.exists()) {tmpDir.mkdirs(); // 创建目录}// 将 Word 文件保存为图片PNG格式extractedPage.save(path, SaveFormat.PNG);resultList.add(path);}} catch (Exception e) {e.printStackTrace();return new ArrayList<>();}log.info("结束word转换为图片");return resultList;}/*** 去掉后缀名* @param fileName* @return*/public static String removeFileExtension(String fileName) {int dotIndex = fileName.lastIndexOf(".");if (dotIndex == -1) {return fileName; // 如果没有找到点,则返回原始文件名}return fileName.substring(0, dotIndex); // 返回去掉后缀名的文件名}
}

PDF转换为图片

<!--PDF转换为图片-->
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version>
</dependency>
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class PdfToImage {/*** 使用pdfbox将整个pdf转换成图片** @param fileAddress 文件地址 如:C:\\Users\\user\\Desktop\\test* @param filename    PDF文件名不带后缀名* @param type        图片类型 png 和jpg*/public static void pdf2png(String fileAddress, String filename, String type) {long startTime = System.currentTimeMillis();// 将文件地址和文件名拼接成路径 注意:线上环境不能使用\\拼接File file = new File(fileAddress + "\\" + filename + ".pdf");try {// 写入文件PDDocument doc = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();for (int i = 0; i < pageCount; i++) {// dpi为144,越高越清晰,转换越慢BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI// 将图片写出到该路径下ImageIO.write(image, type, new File(fileAddress + "\\" + filename + "_" + (i + 1) + "." + type));}long endTime = System.currentTimeMillis();System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒");  //转化用时} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {pdf2png("C:\\Users\\Administrator\\Documents\\xxx\\pdf", "文件名", "png");}
}

乱码问题

如果在linux运行遇到中文乱码,可尝试安装字体然后重启程序运行

参考:https://blog.csdn.net/lljddddd/article/details/137958297

1、从本地找到字体:C:\Windows\Fonts

2、复制到Linux,我这里用的centos,复制字体到 /usr/share/fonts

3、安装fontconfig工具 yum -y install fontconfig

4、刷新字体缓存 fc-cache

5、查看字体列表是否完成安装 fc-list

相关文章:

Word、PDF转换为图片Java

Word、PDF转换为图片Java 需求要在小程序端展示文档内容&#xff0c;所以将文档每页转换为图片后显示 参考和其他等方案&#xff1a; https://blog.csdn.net/strggle_bin/article/details/140599514 https://www.modb.pro/db/566986 https://blog.csdn.net/spring_is_comin…...

iOS IPA上传到App Store Connect的三种方案详解

引言 在iOS应用开发中&#xff0c;完成开发后的重要一步就是将IPA文件上传到App Store Connect以便进行测试或发布到App Store。无论是使用Xcode进行原生开发&#xff0c;还是通过uni-app、Flutter等跨平台工具生成的IPA文件&#xff0c;上传到App Store的流程都是类似的。苹果…...

Java中的Arrays类

java.util.Arrays是一个非常实用的类&#xff0c;提供了许多静态方法来操作数组&#xff0c;如排序、查找、复制和填充等。 1. toString - 将数组转换为字符串 // 导入java.util.Arrays类 import java.util.Arrays;public class ArraysExample {public static void main(Stri…...

GUI编程

GUI编程 【Java从0到架构师课程】笔记 GUI简介 GUI&#xff1a;图形用户界面&#xff0c;在计算机中采用图形的方式显示用户界面 java的GUI开发 AWT&#xff1a;java最早推出的GUI编程开发包&#xff0c;界面风格跟随操作系统SWT&#xff1a;eclipse就是java使用SWT开发的Sw…...

(multi)map和set--C++

文章目录 一、序列式容器和关联式容器二、set系列的使用1、set和multiset参考文档2、set类的介绍3、set的构造和迭代器4、set的增删查5、insert和迭代器遍历使用样例&#xff1a;6、find和erase使用样例&#xff1a;7、multiset和set的差异 三、map系列的使用1、map和multimap参…...

jmeter响应断言放进csv文件遇到的问题

用Jmeter的json 断言去测试http请求响应结果&#xff0c;发现遇到中文时出现乱码&#xff0c;导致无法正常进行响应断言&#xff0c;很影响工作。于是&#xff0c;察看了其他测试人员的解决方案&#xff0c;发现是jmeter本身对编码格式的设置导致了这一问题。解决方案是在jmete…...

复旦大学全球供应链研究中心揭牌,合合信息共话大数据赋能

10月13日&#xff0c;复旦大学全球供应链研究中心&#xff08;以下简称“中心”&#xff09;揭牌仪式在复旦大学管理学院政立院区隆重举行。我国的供应链体系庞大复杂&#xff0c;在百年未有之大变局下&#xff0c;保障产业链供应链安全已成为我国的重要战略目标。中心的设立旨…...

达那福发布新品音致系列:以顶尖降噪技术,开启清晰聆听新篇章

近日&#xff0c;国际知名助听器品牌达那福推出其最新研发的音致系列助听器。该系列产品旨在通过顶尖的声音处理技术&#xff0c;直面助听器市场中普遍存在的挑战——如何在噪声环境中提供清晰的语音辨识。 根据助听器行业协会2022年的调查数据&#xff0c;高达86%的佩戴者认为…...

当物理学奖遇上机器学习:创新融合的里程碑

作为一名程序员&#xff0c;看到 2024 年诺贝尔物理学奖颁发给机器学习与神经网络领域研究者&#xff0c;心中满是感慨与思考。 从编程技术角度出发&#xff0c;这意味着传统编程理念与物理思维有了更紧密的结合。在以往的编程中&#xff0c;算法优化多侧重于数据结构和计算效率…...

模拟电路2

BJT双极性晶体管 1.1 BJT共射特性曲线 输入特性&#xff1a; iB f(uBE)|UceC 定量分析&#xff0c;确定只有一个变量 输出特性 放大区&#xff1a;发射结正偏&#xff0c;集电结反偏 截至区&#xff1a;双结反偏 CE断路 饱和区&#xff1a;双结正偏 UCEs0.3 CE类似于开关闭…...

大数据面试题整理——MapReduce

系列文章目录 第一章 HDFS面试题 第二章 MapReduce面试题 文章目录 系列文章目录一、请简要解释一下 MapReduce 的工作原理。二、什么是 map 函数和 reduce 函数&#xff1f;它们的作用分别是什么&#xff1f;三、如何处理数据倾斜问题在 MapReduce 中&#xff1f;四、在 MapR…...

【景观生态学实验】实验一 ArcGIS地理数据处理及制图基础

实验目的 1.掌握ArcGIS软件基本操作&#xff1a;通过实验操作与学习&#xff0c;熟练掌握ArcGIS软件相关的基本操作&#xff0c;包括界面熟悉、工具栏使用、数据的加载和保存、基本数据处理操作等; 2.掌握如何使用ArcGIS进行影像拼接及裁剪&#xff1a;通过实验操作与学习&am…...

今年双十一最值得入手的好物有哪些?双十一值得选购的好物盘点!

在这个全民狂欢的购物盛宴——双十一&#xff0c;每一个角落都弥漫着诱人的优惠与不可错过的精品。从科技潮品到生活必需品&#xff0c;从时尚尖货到家居好物&#xff0c;无数精选商品在这一季集中绽放&#xff0c;等待着慧眼识珠的你将它们带回家&#xff0c;今年的双十一&…...

【OpenCV】人脸识别方法

代码已上传GitHub&#xff1a;plumqm/OpenCV-Projects at master EigenFace、FisherFace、LBPHFace 这三种方法的代码区别不大所以就一段代码示例。 EigenFace与FisherFace 1. 将人脸图像展开为一维向量&#xff0c;组成训练数据集 2. PCA&#xff08;EigenFace&#xff09;或…...

xxl-job定时任务

学习中心 清理Redis中的历史榜单&#xff1a; 持久化榜单数据&#xff1a; 创建历史榜单表&#xff1a; 支付服务 待退款订单检查&#xff1a; 未支付订单检查&#xff1a; 交易服务 退款单处理&#xff1a; 促销中心 优惠券发放状态处理&#xff1a;...

C#从零开始学习(如何构建应用)(1)

开始使用 C# 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp 创建一个控制台应用 打开Visual Studio 2019 创建项目 选择控制台应用程序 创建后点击运行,就可以在控制台打印Hello World 构建一个游戏(创建WPF项目) 构建游戏的步骤 首先创建WPF项…...

OpenCV高级图形用户界面(7)获取指定窗口的属性值函数getWindowProperty()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 提供窗口的参数。 函数 getWindowProperty 返回窗口的属性。 cv::getWindowProperty() 函数用于获取指定窗口的属性值。这个函数允许你查询窗口…...

Java实现文件上传功能

目录 1、准备工作 2、注意事项 3、jsp页面代码 4、Servlet 5、注册Servlet 1、准备工作 导入依赖&#xff1a;commons-fileupload和commons-io 2、注意事项 ①为保证服务器安全&#xff0c;上传文件应该放在外界无法直接访问的目录下&#xff0c;比如WEB-INF目录下 ②为…...

Leetcode|24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II

24. 注意&#xff1a;涉及头节点的修改或者删除时&#xff0c;最好设置一个虚拟的头结点&#xff0c;方便简化代码&#xff0c;不必进行是否为头节点的的判断&#xff0c;简化code class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead new Li…...

OpenCV学习笔记5——图像的数值计算

目录 一、简单数值计算 二、opencv中提供函数进行计算 三、cv2.addWeighted 一、简单数值计算 在opencv中&#xff0c;我们有许多可以获取图像各类数值的办法&#xff0c;许多函数能获得各种方面的数据。但如果我们什么都不用&#xff0c;仅仅对图像上每一个点做加法运算会…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...