Java Word转PDF(直接转和以图片形式转)、PDF转图片、图片转PDF
在淘宝上找了一家写代码的店铺写了一个工具类,再参考网上的代码,改了改
用到的类库:
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox --><!--word转pdf--><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.1.12</version></dependency><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-transformer-msoffice-word</artifactId><version>1.1.12</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><!-- pdf转图片和图片转pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.29</version></dependency>
工具类代码:
import com.documents4j.api.DocumentType;
import com.documents4j.job.LocalConverter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class FileConvertor {/*** 根据word每页生成图片,再根据得到的图片,合并生成PDF*/public static void wordToImagePDF(String wordPath,String imageDirectory, String targetPDF) throws IOException {//生成临时pdf文件File tempFile = File.createTempFile("temp", ".pdf");String temporaryPDF = tempFile.getAbsolutePath();//将word转换为pdf,并写入临时pdfwordToPDF(wordPath, temporaryPDF);//将临时pdf转换为图片List<String> images = pdfToImages(temporaryPDF,imageDirectory,300,"png");//将转换出来的图片合并为pdftry (PDDocument pdDocument = new PDDocument()) {for (String imagePath : images) {imageToPDF(imagePath, pdDocument);}pdDocument.save(targetPDF);}//删除临时pdfFiles.delete(Paths.get(temporaryPDF));}/*** Word文档转换为PDF文档* @param wordPath Word文档路径* @param pdfPath 生成的PDF路径*/public static void wordToPDF(String wordPath, String pdfPath) throws IOException {File inputWord = new File(wordPath);File outputFile = new File(pdfPath);InputStream docxInputStream = Files.newInputStream(inputWord.toPath());OutputStream outputStream = Files.newOutputStream(outputFile.toPath());LocalConverter.builder().build().convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();outputStream.close();docxInputStream.close();}/*** PDF文件转图片(word一页对应一个图像)* 图片将保存文件夹下,根据页数命名* @param pdfPath PDF文件路径* @param imageDirectory 生成的图片保存的文件夹* @param dpi 生成图片dpi* @param formatName 生成图片的格式*/public static List<String> pdfToImages(String pdfPath,String imageDirectory,float dpi, String formatName) throws IOException {File file = new File(pdfPath);ArrayList<String> list = new ArrayList<>();try (PDDocument doc = PDDocument.load(file)) {PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();for (int i = 0; i < pageCount; i++) {BufferedImage image = renderer.renderImageWithDPI(i, dpi);int pageIndex = i + 1;String imagePath = imageDirectory +File.separator + pageIndex + "."+formatName;ImageIO.write(image, formatName, new File(imagePath));list.add(imagePath);}}return list;}/*** 图片转PDF*/public static void imageToPDF(String imagePath, PDDocument document) throws IOException {//获取图片长宽File file = new File(imagePath);String fileSuffix = imagePath.substring(imagePath.lastIndexOf(".") + 1);Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(fileSuffix);ImageReader reader = readers.next();ImageInputStream input = ImageIO.createImageInputStream(Files.newInputStream(file.toPath()));reader.setInput(input, true);int width = reader.getWidth(0);int height = reader.getHeight(0);//根据图片大小动态生成pdf页面PDPage pdPage = new PDPage(new PDRectangle(width, height));document.addPage(pdPage);PDImageXObject pdImageXObject = PDImageXObject.createFromFile(imagePath, document);PDPageContentStream contentStream = new PDPageContentStream(document, pdPage);//写入图片contentStream.drawImage(pdImageXObject, 0, 0);contentStream.close();input.close();}
}
相关文章:
Java Word转PDF(直接转和以图片形式转)、PDF转图片、图片转PDF
在淘宝上找了一家写代码的店铺写了一个工具类,再参考网上的代码,改了改 用到的类库: <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox --><!--word转pdf--><dependency><groupId>com.documents4…...
dockerfile编写LNMP
目录 1. 项目环境 2. 服务器环境 二、部署nginx(容器IP为192.168.158.26) 1、整个Dockerfile文件内容 编辑 2、配置nginx.conf文件 3、构建镜像 三、部署mysql 1、整个Docker文件内容 3、生成镜像 4、启动镜像容器 5、验证mysql 四、PHP部署 1…...
websocket + stomp + sockjs学习
文章目录 学习链接后台代码引入依赖application.ymlWebSocketConfigPrivateControllerWebSocketService WebSocketEventListenerCorsFilter 前端代码Room.vue 学习链接 WebSocket入门教程示例代码,代码地址已fork至本地gitee,原github代码地址ÿ…...
ApplicationListener , @EventListener 和 CommandLineRunner 启动顺序验证
一. 背景 排查线上问题, 发现一个重要功能的全局锁线程启动延迟很高. 服务启动40分钟之后, 才能拿到锁. 排查之后发现原因是因为代码引入了高优先级的ApplicationListener代码, 导致全局锁线程启动延迟. 二. 结论 启动顺序从高到底依次为: ApplicationListener , EventListe…...
网络编程基础(1)
目录 网络编程解决是跨主机的进程间通讯 1、网络 2、互联网 3、ip地址 (1)ipv4: (2)ipV6:1 (3)IP地址的组成: (4)Linux查看IP地址:ifconfig 4、mac地址 5、ping Ip地址 6…...
Linux驱动开发(Day4)
思维导图: 字符设备驱动分步注册:...
LVS负载均衡群集部署(LVS-NAT模型实例)
一、集群 1.1集群的含义 Cluster,集群、群集,为解决某个特定问题将多台计算机组合起来形成的单个系统。 由多台主机构成,但对外只表现为一个整体。 1.2群集的三种类型 1.2.1负载均衡群集 LB: Load Balancing,负载均衡&#x…...
【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进
访问html页面 如果我们想访问html页面其实就是将本地的html文件以流的方式响应给前端即可,下面我们对HttpResponseServlet这个类做一些改造 package com.tomcatServer.domain;import com.tomcatServer.utils.ScanUtil;import java.io.IOException; import java.io…...
stm32单片机/51单片机蜂鸣器不响(proteus模拟)
蜂鸣器不发生原因就1个:电压不够 所以需要提高蜂鸣器2端的电压:可以采用的方法有: 1提高蜂鸣器电阻,这样根据分压原理,可以提升蜂鸣器2段电压 2更改蜂鸣器的工作电压为更小的值,这个可以通过在proteus内…...
BERT、ERNIE、Grover、XLNet、GPT、MASS、UniLM、ELECTRA、RoBERTa、T5、C4
BERT、ERNIE、Grover、XLNet、GPT、MASS、UniLM、ELECTRA、RoBERTa、T5、C4 ELMOBERTERNIEGroverXLNetGPTMASSUniLMELECTRARoBERTaT5C4ELMO BERT...
主机防护的重要性和方式
01 主机防护的重要性 主机防护是网络安全的重要组成部分。在互联网时代,网络攻击成为了一种常见的威胁,而主机防护则是保护计算机系统免受网络攻击的重要手段。 主机防护可以防范各种网络攻击,如病毒、木马、黑客攻击等,从而保…...
聚观早报 | 抢先体验阿维塔11座舱;本田和讴歌采用NACS充电标准
【聚观365】8月21日消息 抢先体验阿维塔11鸿蒙座舱 本田和讴歌采用特斯拉NACS充电标准 华为秋季新品发布会将于9月12日举行 iQOO Z8即将到来 三星Galaxy S24系列外观或更改 抢先体验阿维塔11鸿蒙座舱 当前,智能座舱成了各大巨头跑马圈地的重要领域。根据毕马威…...
思科计算机网络答案(包含第1~11章节)
第一章 1.在以下哪个场景中推荐使用 WISP? 选择一项: A.城市里的网吧 B.没有有线宽带接入的农村地区的农场 C.任何有多个无线设备的家庭 D.通过有线连接访问 Internet 的大厦公寓 2.一位员工希望以尽可能最安全的方式远程访问公司网络。 下列哪种网络特征将允许员工获得对…...
所见即所得,「Paraverse平行云」助力万间打造智能建造新图景
在城市建设行业中,数字化逐渐成为其主导力量。 新一代信息基础设施建设也迎来了新的里程碑。数据显示,截至今年,我国已全面推进城市信息模型(CIM)基础平台建设,为城市规划、建设管理提供了多场景应用的强大…...
AI图片处理功能演示
例如,这是一张不错的图片,但是有3只手。 我们可以选择有问题的区域,然后要求 niji 进行重新绘制。 根据我们选择的区域,我们可以以不同的方式修复结果。 创意修复 修复并不仅限于纠正错误。我们可以要求 niji 添加额外的元素&…...
CentOS系统环境搭建(六)——使用docker-compose安装redis
centos系统环境搭建专栏🔗点击跳转 关于Docker-compose安装请看CentOS系统环境搭建(三)——Centos7安装Docker&Docker Compose,该文章同样收录于centos系统环境搭建专栏。 Docker-compose安装redis 文章目录 Docker-compose安…...
个人论坛项目测试报告
目录 0.项目概述及部分测试用例展示 以下是部分测试用例: 进行一般的性能测试性能测试 1.摘要及版本修订记录 2.功能介绍 3.测试范围 3.1.功能性 3.2.可靠性 3.3.易用性 4.测试资源 4.1.人员介绍 4.2.测试环境 4.2.测试工具 5.测试策略 5.2.功能测试…...
一起来学shiny把(4)—调控控件进行输出
什么是shiny?Shiny是一个R包,可让您轻松地直接从 R 构建交互式 Web 应用程序(应用程序)。本系列是个长教程,带你由浅入深学习shiny。 上一节我们在文章《R语言系列教程—–一起来学shiny吧(3)》…...
VBIC卡管理系统设计与实现
摘要 IC卡管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。 经过分析,我们使用 MICROSOFT公司的 …...
八种架构演进
日升时奋斗,日落时自省 目录 1、单机架构 2、应用数据分离架构 3、应用服务集群架构 4、读写分离/主从分离架构 5、冷热分离架构 6、垂直分库架构 7、微服务架构 8、容器编排架构 9、小结 1、单机架构 特征:应用服务和数据库服务器公用一台服务…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
