Java处理doc类型的Word文档转换成html(按顺序保留格式+图片)

最新有个新需求,就是doc文档转换html内容倒不是很难,给大家分享一下,总体思路就是按doc转html的思路来走,唯一缺点是不会自动转换图片,图片是要手动转成base64,默认是有html、body、head、meta等等标签,我这里都用正则处理掉了。

需要注意的是:

.docx 格式的 Word 文档是一种基于 XML 和 ZIP 压缩技术的文件格式,其文件结构相对固定并且较为简单,可以通过一些开源的 JavaScript 库进行解析和转换(推荐使用mammoth.js在前端即可完成Word转换html的操作,但是目前的mammoth版本只支持docx,后续可能会支持解析doc的功能)。
·
.doc 格式的 Word 文档是一种相对来说版本比较老一点并且是二进制格式的文件,文件结构比较复杂,具有较高的私有性和细节,需要专用微软 Office 应用程序才能完整读取,所以一般如果要对doc文档进行转换内容时,最好是使用java处理,比较容易一些。

具体引用jar包如下,一共6个:
1、poi-4.1.2.jar
2、poi-ooxml-4.1.2.jar
3、poi-scratchpad-4.1.2.jar

poi的版本必须一致,不然会有问题,一般情况下如果用到poi互相依赖,最好是要做到poi版本一致,不仅针对这个转换html中,其他地方也是一样。

4、fr.opensagres.poi.xwpf.converter.xhtml-2.0.2.jar
5、commons-math3-3.6.1.jar
6、commons-collections4-4.4.jar

jar包下载如果本地没有可以去中央仓库下载,直接搜索就行,比较方便,有pom也有jar

在这里插入图片描述

总体流程和思路:

1、创建 File 对象,将要转换的 Word 文档的路径传入文件对象中。2、使用 FileInputStream 对象读取 Word 文档文件。3、构建 HWPFDocument 对象,该对象是 Apache POI 库中的类,用于读取 .doc 格式的 Word 文档。4、构建 WordToHtmlConverter 对象,并将 DocumentBuilderFactory、DocumentBuilder 和 Document 对象传递给构造函数。5、解析 Word 文档并将解析结果存储到 Document 对象中。6、创建 Transformer 对象,用于将 Document 对象转换为 HTML 格式,并设置输出格式、字符编码等。7、使用 DOMSource 对象将 Document 对象中的内容提供给 Transformer 对象。8、创建 ByteArrayOutputStream 对象,并将结果存储到该流中。9、使用 StreamResult 指定输出流,将转换后的结果写入到 ByteArrayOutputStream 中。10、将 ByteArrayOutputStream 对象转换为字符串并输出。需要注意的是,此示例中使用的是 HWPFDocument 类,而不是 XWPFDocument 类
这意味着该示例只能处理 .doc 格式的 Word 文档。如果需要处理 .docx 格式的 Word 文档,则需要使用 XWPFDocument 类。

java代码如下:

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.w3c.dom.Document;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;public class DocToHtml {/*** 传递文件路径* @param filePath 文件路径* @return 返回html标签*/public static String inputDocPath(String filePath) {File file = new File(filePath);try {FileInputStream inputStream = new FileInputStream(file);HWPFDocument hwpfDocument = new HWPFDocument(inputStream);// 提取图像数据并转换为 BASE64 编码字符串List<Picture> pictures = hwpfDocument.getPicturesTable().getAllPictures();List<String> base64ImageStrings = new ArrayList<>();for (Picture picture : pictures) {byte[] imageData = picture.getContent();String base64ImageString = "data:image/png;base64," + Base64.getEncoder().encodeToString(imageData);base64ImageStrings.add(base64ImageString);}// 转换为 HTML 文本WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());wordToHtmlConverter.processDocument(hwpfDocument);Document document = wordToHtmlConverter.getDocument();ByteArrayOutputStream outputStream = new ByteArrayOutputStream();Transformer transformer = TransformerFactory.newInstance().newTransformer();transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transformer.setOutputProperty(OutputKeys.INDENT, "yes");transformer.setOutputProperty(OutputKeys.METHOD, "html");transformer.transform(new DOMSource(document), new StreamResult(outputStream));String html = outputStream.toString("UTF-8");//查找所有图片List<String> matches = findMatchesToPic(html);//查找无用标签并替换成空,用自己写入的标签html = findMatchesToLable(html);// 在 HTML 中插入图像// 替换图片链接为 base64 编码for (int i = 0; i < base64ImageStrings.size(); i++) {html = html.replace(matches.get(i), "<img src=\"" + base64ImageStrings.get(i) + "\">");}return html;} catch (Exception e) {throw new RuntimeException(e);}}//查找所有图片集合private static List<String> findMatchesToPic(String input) {List<String> matches = new ArrayList<>();Pattern pattern = Pattern.compile("<!--.*?-->");Matcher matcher = pattern.matcher(input);while (matcher.find()) {String match = matcher.group();matches.add(match);}return matches;}//查找没用的标签,并替换private static String findMatchesToLable(String html) {Pattern pattern = Pattern.compile("<META.*?>", Pattern.DOTALL);Matcher matcher = pattern.matcher(html);if (matcher.find()) {html = html.replace(matcher.group(), "");}Pattern patternMeta = Pattern.compile("<meta.*?>", Pattern.DOTALL);Matcher matcherMeta = patternMeta.matcher(html);if (matcherMeta.find()) {html = html.replace(matcherMeta.group(), "");}Pattern patternBody = Pattern.compile("<body.*?>", Pattern.DOTALL);Matcher matcherBody = patternBody.matcher(html);if (matcherBody.find()) {html = html.replace(matcherBody.group(), "");}Pattern patternStyle = Pattern.compile("<style.*?</style>", Pattern.DOTALL);Matcher matcherStyle = patternStyle.matcher(html);if (matcherStyle.find()) {html = html.replace(matcherStyle.group(), "");}html = html.replace("<html>", "");html = html.replace("<head>", "");html = html.replace("</head>", "");html = html.replace("</body>", "");html = html.replace("</html>", "");return html;}}

将Word文档转换为HTML有许多方法,其中基于Apache POI和HSSF的方式就是其中一种。

优点:

1、准确度高:使用java的Apache POI和HSSF,可以更准确地提取一份 Microsoft Word
·
2、文档的内容。这种方式的特点是能够完美保留 Word 文档的大部分格式,包括样式、标题、字体、表格、图像等等。
·
3、可定制性强:将 Word 文档转换为 HTML 可以实现高度的可定制化,特别是针对文字内容的处理。使用此方法,开发人员可以从文档中提取仅所需的部分,并将其转换为 HTML。
·
4、应用场景广泛:可以将 Word 文档转换为 HTML 以便于在线发布、在线查看或轻松共享。

缺点:

1、格式兼容性问题:某些 Word 版本中的内容无法精确保留,因为 Apache POIC 的一些功能可能在某些版本的 Word 中不支持。
·
2、转换时间长:对于大型文件来说,这种转换可能需要花费更长的时间以完成其处理。较大的文档可能会导致性能问题,并且需要更多的计算资源来完成其转换。

总之,将 Word 文档转换为 HTML 有其一些优点和缺点。 这种转换方法是一种可行的方式,但在处理一些格式或较大的文档方面可能存在局限性或成本问题。如果对文档的格式和内容要求较高,建议考虑使用高级的第三方工具或者云服务来处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28141.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023四大进销存软件推荐,第一款适合中小商户使用!

在当今竞争激烈的商业环境中&#xff0c;企业或商户迫切需要使用进销存管理软件&#xff0c;来优化库存控制、提高运营效率、降低成本&#xff0c;并加强与供应链合作伙伴之间的协作和沟通。 为了帮助企业选择适合自己需求的进销存软件&#xff0c;我们特别整理了2023年市面上比…

【Java虚拟机学习1】JVM运行时数据区

JVM运行时数据区 一、前言 我们知道Java程序是运行在JVM&#xff08;Java虚拟机&#xff09;上的&#xff0c;Java程序运行时会占用一定的内存&#xff0c;在虚拟机自动管理机制的帮助下&#xff0c;不再需要为每一个new操作去写配对的delete/free代码&#xff0c;不容易出现…

第一次用用Opencv进行图像处理

2023.7.06更新 codeblocks安装opencv 直接放参考链接&#xff0c;完成安装该步骤来&#xff0c;简单高效&#xff01; 安装教程链接 有一个问题就是第一次安装完成后运行时会报确实某些ddl的错误&#xff0c;关机重启就好啦&#xff01; 尝试运行 ddl的错误解决后可以用以…

行业追踪,2023-07-18,减速器,汽车零部件是重点关注板块,随时开启

自动复盘 2023-07-18 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

异步复位同步释放

1、概念 异步复位同步释放就是在复位信号到来的时候不受时钟信号的同步&#xff0c;在复位信号释放的时候受到时钟信号的同步&#xff1b; 优点是可以避免电路出现瞬态错误或者亚稳态。 2、原理图 3、代码实现 /***********************************************/ /**…

【unity之IMGUI实践】单例模式管理面板对象【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

你知道Apache 软件基金会如何选择开源项目吗

Apache软件基金会&#xff08;Apache Software Foundation&#xff0c;简称ASF&#xff09;是一个致力于开源软件发展的慈善组织&#xff0c;因其广泛的项目和开放的治理模式而备受社区赞誉。作为全球最大的开源基金会之一&#xff0c;ASF如何选择开源项目成为人们关注的焦点。…

哇~真的是你呀!今天是LIUNX中的SAMBA。

目录 前言 一、概述 二、安装 三、在SAMBA服务器中设置共享目录 四、客户端查看共享目录及登录 五、本地映射 六、客户端自动挂载 七、用户别名 八、访问控制 总结 前言 SAMBA是一个开源的软件套件&#xff0c;用于在Linux和UNIX系统上实现SMB/CIFS网络协议。SMB&#xff08;S…

大语言模型(LLM)评估综述

论文地址&#xff1a;https://arxiv.org/abs/2307.03109 Github地址&#xff1a;https://github.com/MLGroupJLU/LLM-eval-survey 一 、背景 随着ChatGPT和GPT-4的推出&#xff0c;大型语言模型&#xff08;LLM&#xff09;在学术界和工业界的热度日益升高&#xff0c;这主要…

物联网(IoT):连接未来的万物之网

引言&#xff1a; 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过各种智能设备和传感器&#xff0c;使物体能够互联互通、收集和共享数据的网络。随着科技的不断进步和智能设备的普及&#xff0c;物联网的应用呈现出爆发式增长&#xff0c;对各…

【网关】ShenYu Gateway入门Demo体验,ShenYu网关2.6.0直接调用Dubbo服务

本次为新开源框架接入ShenYu网关做基础学习指导&#xff0c;特地来下载官网的demo体验一把&#xff0c;具体是想通过网关泛化调用dubbo服务。本次使用的是最新版本2.6.0。 官网文档&#xff1a; 如何通过 Apache ShenYu 网关代理 Dubbo 服务 | Apache Dubbo 环境准备 第一步&a…

React(2)

题外话&#xff1a;vscode有个插件可以很方便的快速写代码 输入rcc回车 1.组件嵌套 import React, { Component } from reactclass Navbar extends Component{render(){return <div>Navbar</div>} }const Swiper()>{return <div>Swiper</div> }cons…