java实现word转html(支持docx及doc文件)
private final static String tempPath = "C:\\Users\\xxx\\Desktop\\Word2Html\\src\\test\\";//图片及相关文件保存的路径public static void main(String argv[]) {try {JFileChooser fileChooser = new JFileChooser();fileChooser.setDialogTitle("Select a Word Document");fileChooser.setAcceptAllFileFilterUsed(false);fileChooser.addChoosableFileFilter(new javax.swing.filechooser.FileNameExtensionFilter("Word Documents", "doc", "docx"));int returnValue = fileChooser.showOpenDialog(null);if (returnValue == JFileChooser.APPROVE_OPTION) {File inputFile = fileChooser.getSelectedFile();String fileName = inputFile.getAbsolutePath();String defaultOutputDir = System.getProperty("user.home") + "\\Desktop\\";String outputFileName = defaultOutputDir + inputFile.getName().replaceFirst("[.][^.]+$", "") + ".html";if (fileName.endsWith(".doc")) {doc2Html(fileName, outputFileName);} else if (fileName.endsWith(".docx")) {docx2Html(fileName, outputFileName);}}} catch (Exception e) {e.printStackTrace();}}/*** doc转换为html** @param fileName* @param outPutFile* @throws TransformerException* @throws IOException* @throws ParserConfigurationException*/public static void doc2Html(String fileName, String outPutFile) throws TransformerException, IOException, ParserConfigurationException {long startTime = System.currentTimeMillis();HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(fileName));WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());// 图片保存路径设置wordToHtmlConverter.setPicturesManager(new PicturesManager() {public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) {String picturePath = "images" + File.separator + suggestedName;// 检查并创建图片文件夹File imageFolder = new File(tempPath + "images");if (!imageFolder.exists()) {boolean created = imageFolder.mkdirs(); // 创建文件夹if (created) {System.out.println("Images folder created at: " + imageFolder.getAbsolutePath());} else {System.out.println("Failed to create images folder.");}}// 写入图片数据,确保每次写入try {File pictureFile = new File(tempPath + picturePath);try (FileOutputStream fos = new FileOutputStream(pictureFile)) {fos.write(content); // 写入图片数据System.out.println("Image saved to: " + pictureFile.getAbsolutePath());}} catch (IOException e) {e.printStackTrace();}return picturePath; // 返回相对路径}});wordToHtmlConverter.processDocument(wordDocument);Document htmlDocument = wordToHtmlConverter.getDocument();ByteArrayOutputStream out = new ByteArrayOutputStream();DOMSource domSource = new DOMSource(htmlDocument);StreamResult streamResult = new StreamResult(out);TransformerFactory tf = TransformerFactory.newInstance();Transformer serializer = tf.newTransformer();serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");serializer.setOutputProperty(OutputKeys.INDENT, "yes");serializer.setOutputProperty(OutputKeys.METHOD, "html");serializer.transform(domSource, streamResult);out.close();String htmlContent = new String(out.toByteArray());htmlContent = htmlContent.replaceAll("TOC \\\\o \"1-3\" \\\\h \\\\z \\\\u", "");writeFile(htmlContent, outPutFile);System.out.println("Generate " + outPutFile + " with " + (System.currentTimeMillis() - startTime) + " ms.");}/*** 写文件** @param content* @param path*/public static void writeFile(String content, String path) {FileOutputStream fos = null;BufferedWriter bw = null;try {File file = new File(path);fos = new FileOutputStream(file);bw = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"));bw.write(content);} catch (FileNotFoundException fnfe) {fnfe.printStackTrace();} catch (IOException ioe) {ioe.printStackTrace();} finally {try {if (bw != null) bw.close();if (fos != null) fos.close();} catch (IOException e) {}}}/*** docx格式word转换为html** @param fileName* @param outPutFile* @throws TransformerException* @throws IOException* @throws ParserConfigurationException*/public static void docx2Html(String fileName, String outPutFile) throws TransformerException, IOException, ParserConfigurationException {long startTime = System.currentTimeMillis();XWPFDocument document = new XWPFDocument(new FileInputStream(fileName));// 提取目录StringBuilder toc = new StringBuilder();toc.append("<div id='toc'>\n<h2>Table of Contents</h2>\n<ul>\n");// 遍历文档中的段落,查找标题并构建目录List<XWPFParagraph> paragraphs = document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {String style = paragraph.getStyle(); // 获取段落样式if (style != null && (style.equals("Heading 1") || style.equals("Heading 2") || style.equals("Heading 3"))) {String text = paragraph.getText();// 根据标题级别构建目录项toc.append("<li><a href='#" + text.hashCode() + "'>" + text + "</a></li>\n");}}toc.append("</ul>\n</div>\n");// 设置XHTMLOptionsXHTMLOptions options = XHTMLOptions.create().indent(4);File imageFolder = new File(tempPath);options.setExtractor(new FileImageExtractor(imageFolder));options.URIResolver(new FileURIResolver(imageFolder));File outFile = new File(outPutFile);outFile.getParentFile().mkdirs();OutputStream out = new FileOutputStream(outFile);// Convert docx to XHTMLXHTMLConverter.getInstance().convert(document, out, options);System.out.println("Generate " + outPutFile + " with " + (System.currentTimeMillis() - startTime) + " ms.");// 获取转换后的HTML内容String htmlContent = new String(((ByteArrayOutputStream) out).toByteArray(), "UTF-8");// 将TOC插入到HTML的开头htmlContent = toc + htmlContent;// 手动添加表格样式(边框)htmlContent = htmlContent.replaceAll("<table>", "<table style='border: 1px solid black; border-collapse: collapse;'>");htmlContent = htmlContent.replaceAll("<td>", "<td style='border: 1px solid black; padding: 5px;'>");htmlContent = htmlContent.replaceAll("<th>", "<th style='border: 1px solid black; padding: 5px;'>");// 写入到输出文件writeFile(htmlContent, outPutFile);}
pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>fxma</groupId><artifactId>Word2Html</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>Word2Html</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.8</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>xdocreport</artifactId><version>1.0.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.1</version></dependency></dependencies>
</project>
相关文章:
java实现word转html(支持docx及doc文件)
private final static String tempPath "C:\\Users\\xxx\\Desktop\\Word2Html\\src\\test\\";//图片及相关文件保存的路径public static void main(String argv[]) {try {JFileChooser fileChooser new JFileChooser();fileChooser.setDialogTitle("Select a …...

搜维尔科技:Xsens人形机器人解决方案的优势
Xsens 致力于推动人形机器人技术的发展,塑造机器人与人类环境无缝融合的未来,通过创新精确和协作,协助生产和服务,改善人类生活和产业。 Xsens通过人形跟随捕捉详细的人体运动数据,使机器人能够学习类人的动作&#x…...

【王树森搜索引擎技术】概要01:搜索引擎的基本概念
1. 基本名词 query:查询词SUG:搜索建议文档:搜索结果标签/筛选项 文档单列曝光 文档双列曝光 2. 曝光与点击 曝光:用户在搜索结果页上看到文档,就算曝光文档点击:在曝光后,用户点击文档&…...

《Java核心技术II》可中断套接字
4.2.4 可中断套接字 SocketChannel可以中断套接字 SocketChannel channel.open(new InetSocketAddress(host,port)); 通道(channel)并没有与之相关联的流,实际上,所拥有的read和write方法都是通过Buffer对象实现的。 如果不想处理缓冲区,…...

基于 Python 的深度学习的车俩特征分析系统,附源码
博主介绍:✌stormjun、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

C#读写ini配置文件保存设置参数
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b5P5rkA&ftt&id22173428704 [DllImport("kernel32", CharSet CharSet.Unicode)] public static extern uint GetPrivateProfileString(string lpAppName, stri…...
SwanLab环境变量列表
文章目录 环境变量全局配置服务配置登录认证其他 环境变量 ⚙️完整环境变量1 -> Github、⚙️完整环境变量2 -> Github 全局配置 环境变量描述默认值SWANLAB_SAVE_DIRSwanLab 全局文件夹保存的路径用户主目录下的 .swanlab 文件夹SWANLAB_LOG_DIRSwanLab 解析日志文件…...
深度学习入门-CNN
一、CNN是什么 CNN,即卷积神经网络(convolutional neural network),是用于预测的标准神经网络架构。在人工智能的广阔领域中,CNN被用于图像识别、语音识别等各种场合,CNN通过模拟人类视觉皮层的神经元连接方…...

微服务网关,如何选择?
什么是API网关 API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互&a…...
SpringBoot集成Mqtt服务实现消费发布和接收消费
该项目介绍了docker环境下如何安装mqtt和springboot集成mqtt服务 前述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,设计用于在资源受限的设备和低带宽、不可靠的网络连接中高效地传输数据。主要用于物联网设备传输,设备之间可以高效地交换数据…...

在Mac mini上实现本地话部署AI和知识库
在Mac mini上实现本地话部署AI和知识库 硬件要求:大模型AI,也叫LLM,需要硬件支持,常见的方式有2种:一种是采用英伟达之类支持CUDA库的GPU芯片或者专用AI芯片;第二种是采用苹果M系列芯片架构的支持统一内存架…...
一个方法被多个线程同时调用,确保同样参数的调用只能有一个线程执行,不同参数的调用则可以多个线程同时执行
我们知道通过lock一个固定静态object给代码段加同步锁,可以让多个线程的同时调用以同步执行,因此可以利用字典来给不同参数分配不同的静态对象,方法中不同的参数调用锁住各自不同的静态对象即可实现不同参数不加锁,相同参数才加锁…...

3. MySQL事务并发的问题与解决方法
一. 并发事务带来的问题 并发会造成事务间出现脏读,不可重复读,幻读现象。 1. 脏读 一个事务在处理过程中读取了另外一个事务未提交的数据。若另外一个事务回滚,则读取到的数据是无效的,又称为脏读。 2. 不可重复读 在一个事务…...

25/1/15 嵌入式笔记 初学STM32F108
GPIO初始化函数 GPIO_Ini:初始化GPIO引脚的模式,速度和引脚号 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0 GPIO输出控制函数 GPIO_SetBits:将指定的GPIO引脚设置为高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIO…...
MySQL的不同SQL模式导致行为不同?
现象: 我在两个mysql库都有相同定义的表,其中一个字段是varchar(1200)。当我都对这个表进行insert操作,而且超过此字段的规定长度(此处是1200),这两库的行为是不一样的:库B是直接报错too long&…...
Flink 使用 Kafka 作为数据源时遇到了偏移量提交失败的问题
具体的错误日志 21:43:57.069 [Kafka Fetcher for Source: Custom Source -> Map -> Filter (1/1)#2] ERROR org.apache.kafka.clients.consumer.internals.ConsumerCoordinator - [Consumer clientIdconsumer-my-group-6, groupIdmy-group] Offset commit failed on pa…...

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析
【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础,提供集中日志记录和分析,以及端到端可见性。因此,分析师可以更有效地管理安全状态,将安全流程自动化,并快速响应威胁。具有分析和自动化功能的集成…...

LSA更新、撤销
LSA的新旧判断: 1.seq,值越大越优先 2.chksum,值越大越优先 3.age,本地的LSA age和收到的LSA age作比较 如果差值<900s,认为age一致,保留本地的:我本地有一条LSA是100 你给的是400 差值小于…...

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图
在当今数字化飞速发展的时代,开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员,其发展历程与成果备受关注。值此之际,GitCode 精心整理了 DevUI 年度运营报告,为您全面呈现 DevUI 社区在过去一年里的开源之…...

centos 7 Mysql服务
将此服务器配置为 MySQL 服务器,创建数据库为 hubeidatabase,将登录的root密码设置为Qwer1234。在库中创建表为 mytable,在表中创建 2 个用户,分别为(xiaoming,2010-4-1,女,male&…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...