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

news2024/11/27 0:31:09

最新有个新需求,就是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.coloradmin.cn/o/764442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度学习的高精度农作物机器与行人目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度农作物机器与行人目标检测系统可用于日常生活中或野外来检测与定位农作物机器与行人目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的农作物机器与行人目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果…

查询自己档案存在哪里

查询自己档案存在哪里 百度搜索“全国人力资源和社会保障政务服务平台” 或者点击下方的官网链接登陆后点击“个人服务”&#xff0c;选择“档案存档情况查看”就可以看到自己的存档情况了。 全国人力资源和社会保障政务服务平台 http://zwfw.mohrss.gov.cn/portal/index

【Linux】生产者消费者模型 -- RingQueue

文章目录 1. 生产者消费者模型的理解1.1 生产者消费者模型的概念1.2 生产者消费者模型的特点1.3 生产者消费者模型的优点 2. 基于BlockQueue的生产者消费者模型 1. 生产者消费者模型的理解 1.1 生产者消费者模型的概念 生产者消费者模型就是通过一个容器来解决生产者和消费者的…

从iPhone恢复已删除音视频的5种主要方法

“我需要从iPhone恢复已删除的音视频。我真的很喜欢我的音视频文件。我玩了很多封面&#xff0c;并检查听我可以改进的地方和不可以改进的地方。 iPhone是我完成这项任务的首选手机&#xff0c;因为我喜欢保持非常简单&#xff0c;我喜欢听我的iPhone。但是&#xff0c;我确实删…

4.Cesium中实体Entity的增删改查及性能优化(超详细)

前言 Cesium 作为一个功能强大的 WebGL 三维地球仪库,内置了丰富的三维地图展示能力。在 Cesium 中,我们可以通过 Entity(实体)在三维场景中添加和控制各种三维对象,如点、线、面、模型等。本文将介绍 Cesium 中实体的增删改查操作。 概述 添加到场景中的实体都保存在 viewer.…

【AI绘画】Stable-Diffusion-Webui本地部署-简单绘画图片

这里写目录标题 前言一、Stable Diffusion是什么&#xff1f;二、安装stable-diffusion-webui1. python安装2. 下载模型3. 开始安装&#xff1a;4. 汉化&#xff1a;5. 模型使用&#xff1a;6. 下载新模型&#xff1a;7. 基础玩法 三、总结 前言 本文将借助stable-diffusion-w…

【idea】的一些使用指南

一、serializable自动生成id 1.打开File菜单&#xff0c;选择Settings选项 2.打开Editor->Inspections 3.在右边的搜索框中输入serialVersionUID关键字&#xff0c;出现以下选项&#xff0c;勾选"Serializable class without serialVersionUID"&#xff0c;然后别…

攻不下dfs不参加比赛(十)

标题 为什么练dfs题目总结为什么练dfs 相信学过数据结构的朋友都知道dfs(深度优先搜索)是里面相当重要的一种搜索算法,可能直接说大家感受不到有条件的大家可以去看看一些算法比赛。这些比赛中每一届或多或少都会牵扯到dfs,可能提到dfs大家都知道但是我们为了避免眼高手低有…

非监督学习-K均值聚类-知识点扫盲

前言 在实际工作中&#xff0c;我们经常会遇到这样一类问题&#xff1a;给机器输入大量的特征数据&#xff0c;并期望机器通过学习找到数据中存在的某种共性特征或者结构&#xff0c;亦或是数据之间存在的某种关联。 例如&#xff0c;视频网站根据用户的观看行为对用户进行分组…

【MongoDB】SpringBoot整合MongoDB

【MongoDB】SpringBoot整合MongoDB 文章目录 【MongoDB】SpringBoot整合MongoDB0. 准备工作1. 集合操作1.1 创建集合1.2 删除集合 2. 相关注解3. 文档操作3.1 添加文档3.2 批量添加文档3.3 查询文档3.3.1 查询所有文档3.3.2 根据id查询3.3.3 等值查询3.3.4 范围查询3.3.5 and查…

8、gateway使用和原理

一、什么是Spring Cloud Gateway 1、网关简介 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等。 2、Gateway简介 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Netflix Zuul。相比 …

【iOS】编译与链接过程

前言 计算机语言分为&#xff1a;机器语言、汇编语言和高级语言。 高级语言又能分为&#xff1a;编辑语言、解释语言。 解释语言 解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行&#xff0c;即解释一条代码&#xff0c;执行一条代码。 优点&…

ADC 的初识

ADC介绍 Q: ADC是什么&#xff1f; A: 全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 ADC的性能指标 量程&#xff1a;能测量的电压范围分辨率&#xff1a;ADC能辨别的最小模拟量&#xff0c;通常以输出二进制数的位数表示&#xff0c;比如&am…

一百三十、海豚调度器——用DolphinScheduler定时调度HiveSQL任务

一、目标 用海豚调度器对Hive数仓各层数据库的SQL任务进行定时调度。比如&#xff0c;DWD层脱敏清洗表的动态插入数据、DWS层指标表的动态插入数据 二、工具版本 1、海豚调度器&#xff1a;apache-dolphinscheduler-2.0.5-bin.tar.gz 2、Hive&#xff1a;apache-hive-3.1.2…

随手笔记——Sophus的基本使用方法

随手笔记——Sophus的基本使用方法 说明CMakeLists.txt补充&#xff1a;关于 ADD_SUBDIRECTORY 的使用使用CMakeLists执行顺序 源代码 说明 Sophus 库支持SO(3) 和SE(3)&#xff0c;此外还含有二维运动 SO(2)&#xff0c;SE(2) 以及相似变换 Sim(3) 的内容。它是直接在 Eigen …

数据结构--图的存储邻接矩阵法

数据结构–图的存储邻接矩阵法 无向图&#xff1a; 有向图&#xff1a; #define MaxVerTexNum 100 //顶点数目的最大值 typedef struct {char vex[MaxVerTexNum]; //顶点表int Edge[MaxVerTexNum][MaxVerTexNum]; //邻接矩阵&#xff0c;边表int vexnum, arcnum; //图的当前顶…

最新 robot framework安装

相信大家对robot framework并不陌生&#xff0c;它是一个基于Python语言&#xff0c;用于验收测试和验收测试驱动开发&#xff08;ATDD&#xff09;的通用测试自动化框架&#xff0c;提供了一套特定的语法&#xff0c;并且有非常丰富的测试库。 ### [Python](https://www.pytho…

gogs的自定义配置

在 GOGS 下载并安装后&#xff0c;在程序目录下建立一个custom/conf/app.ini的配置文件&#xff0c;内容如下&#xff1a; APP_NAME Gogs # APP名字 RUN_USER git # 启动用户&#xff0c;设置后只能以此账号启动gogs RUN_MODE prod[database] DB_TYPE mysql HOST 1…

联通 Flink 实时计算平台化运维实践

摘要&#xff1a;本文整理自联通数科实时计算团队负责人、Apache StreamPark Committer 穆纯进在 Flink Forward Asia 2022 平台建设专场的分享&#xff0c;本篇内容主要分为四个部分&#xff1a; 实时计算平台背景介绍 Flink 实时作业运维挑战 基于 StreamPark 一体化管理 …

智能安全配电装置在老旧建筑防火中的应用 安科瑞 许敏

【摘要】现代社会的发展离不开电能&#xff0c;随着电能应用的广泛性&#xff0c;对用电安全有了更高的要求。近些年来&#xff0c;用电安全形式严峻&#xff0c;尤其是一些老旧建筑中因用电而引起的火灾事故频发&#xff0c;造成一系列严重的损失&#xff0c;严重影响着民众的…