关于java实现word(docx、doc)转html的解决方案

最近在研究一些关于文档转换格式的方法,因为需要用在开发的一个项目上,所以投入了一些时间,给大家聊下这块逻辑及解决方案。

一、关于word转换html大致都有哪些方法?

(1)使用 Microsoft Word 导出

        其实该方法就是使用word本身导出方案

操作步骤

  1. 在 Microsoft Word 中打开文档。
  2. 点击 文件 > 另存为 或 导出。
  3. 选择保存类型为 网页(.html, .htm)。
  4. 保存文件后,会生成一个 HTML 文件(有时会附带一个文件夹用于存放图片等资源)。

优点

  • 保留了文档的大部分格式。
  • 操作简单,无需其他工具。

缺点

  • 导出的 HTML 文件代码较冗余,包含许多与 Word 相关的样式和标签。

(2)使用第三方工具或在线转换工具

        一般常见的有SmallPDF、Zamzar、Convertio、LibreOffice等在线工具或软件进行转换

优点

  • 方便快捷,适合大多数人使用。
  • 有些工具可以清理冗余代码,生成更简洁的 HTML。

缺点

  • 在线工具可能存在隐私和安全风险。
  • 某些工具可能无法完全保留复杂文档的格式。

(3)使用编程实现自动化转换

常见的编程实现有:

  • Python
    • 使用 python-docx 库读取 .docx 文件,再用自定义逻辑生成 HTML。
    • 使用 mammoth 库,专门将 .docx 转为干净的 HTML(推荐)。
    • 使用 pywin32 调用 Windows COM 接口操作 Microsoft Word。
  • Java
    • 使用 Apache POI 的 XWPF 模块解析 .docx 文件并输出 HTML。
  • Node.js
    • 使用 officegenmammoth.js 转换 .docx 文件。
  • C#
    • 使用 OpenXML SDK 或 Interop.Word 来操作 Word 文件并转换为 HTML。

        本此讲解的就是通过java的poi内的模块进行解析输出html

二、docx转换html

        示例代码如下:

public static void docxtoHtml(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<ul>\n");  // 直接从 <ul> 开始,表示目录// 遍历文档中的段落,查找目录项List<XWPFParagraph> paragraphs = document.getParagraphs();int tocLevel = 0; // 目录的当前级别,1代表一级目录,2代表二级目录,3代表三级目录boolean tocStarted = false; // 标记目录是否开始for (XWPFParagraph paragraph : paragraphs) {String style = paragraph.getStyle();  // 获取段落样式String text = paragraph.getText();  // 获取段落文本// 根据段落的样式级别来识别目录项,假设标题样式为 Heading 1, Heading 2, Heading 3if (style != null) {if (style.equals("Heading 1")) {  // 一级标题if (tocStarted) {toc.append("</ul>\n"); // 关闭上一级目录}toc.append("<ul>\n");  // 开始一个新的无序列表toc.append("<li><a href='#" + text.hashCode() + "'>" + text + "</a></li>\n");tocLevel = 1;tocStarted = true;} else if (style.equals("Heading 2")) {  // 二级标题if (tocLevel == 1) {toc.append("<ul>\n");  // 开始二级目录}toc.append("<li><a href='#" + text.hashCode() + "'>" + text + "</a></li>\n");tocLevel = 2;} else if (style.equals("Heading 3")) {  // 三级标题if (tocLevel == 2) {toc.append("<ul>\n");  // 开始三级目录}toc.append("<li><a href='#" + text.hashCode() + "'>" + text + "</a></li>\n");tocLevel = 3;}}// 在目录项前插入锚点if (style != null && (style.equals("Heading 1") || style.equals("Heading 2") || style.equals("Heading 3"))) {String anchor = "<a name='" + text.hashCode() + "'></a>";String modifiedText = anchor + text;  // 在目录项文本前添加锚点// 更新段落中的文本for (XWPFRun run : paragraph.getRuns()) {run.setText(modifiedText, 0); // 更新段落内容}}}// 如果目录结束后,确保关闭所有的<ul>标签if (tocLevel > 0) {toc.append("</ul>\n");}toc.append("</ul>\n</div>\n");  // 关闭最外层的 <ul> 和 <div>// 设置XHTMLOptionsXHTMLOptions options = XHTMLOptions.create().indent(4);File imageFolder = new File(tempPath);  // 图片临时文件夹路径options.setExtractor(new FileImageExtractor(imageFolder));options.URIResolver(new FileURIResolver(imageFolder));// 使用 `XHTMLConverter` 进行 DOCX 到 HTML 的转换ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();XHTMLConverter.getInstance().convert(document, byteArrayOutputStream, options);System.out.println("Generate " + outPutFile + " with " + (System.currentTimeMillis() - startTime) + " ms.");// 获取转换后的HTML内容String htmlContent = new String(byteArrayOutputStream.toByteArray(), "UTF-8");// 将TOC插入到HTML的开头htmlContent = toc + htmlContent;// 处理分页符:将分页符添加到HTML中htmlContent = htmlContent.replaceAll("<!-- PAGE_BREAK -->", "<div class='page-break'></div>");// 添加表格样式(边框)htmlContent = htmlContent.replaceAll("<table>", "<table style='border: 1px solid black !important; border-collapse: collapse; width: 100%;'>");htmlContent = htmlContent.replaceAll("<td>", "<td style='border: 1px solid black !important; padding: 5px; text-align: left;'>");htmlContent = htmlContent.replaceAll("<th>", "<th style='border: 1px solid black !important; padding: 5px; text-align: left;'>");htmlContent = htmlContent.replaceAll("<tr>", "<tr style='border: 1px solid black !important;'>");htmlContent = htmlContent.replaceAll("<thead>", "<thead style='border: 1px solid black !important;'>");htmlContent = htmlContent.replaceAll("<tbody>", "<tbody style='border: 1px solid black !important;'>");htmlContent = htmlContent.replaceAll("<tfoot>", "<tfoot style='border: 1px solid black !important;'>");// 增加全局CSS样式(确保表格和目录样式正确)String style = "<style>\n" +"table { border: 1px solid black !important; border-collapse: collapse; width: 100%; }\n" +"td, th { border: 1px solid black !important; padding: 5px; text-align: left; }\n" +"tr { border: 1px solid black !important; }\n" +"ul { list-style-type: none; padding: 0; }\n" + // 去掉默认的列表样式"li { margin: 5px 0; }\n" + // 设置目录项的间距"</style>\n";htmlContent = style + htmlContent;// 将最终的HTML内容写入文件writeFile(htmlContent, outPutFile);
}

        该方法功能实现:

  • .docx 文件转换为 HTML 文件。
  • 自动生成基于文档标题的目录 (TOC)。
  • 为标题添加锚点链接,支持 HTML 页面内跳转。
  • 处理分页符,将其转换为 HTML 的 <div> 元素。
  • 增强表格样式,添加边框和对齐(有时原表格css样式转换后会被覆盖掉)。
  • 为 HTML 页面添加全局 CSS 样式,保证视觉效果统一。

三、doc转换html

        示例代码如下:

public static void doctoHtml(String fileName, String outPutFile) throws TransformerException, IOException, ParserConfigurationException {// 开始计时long startTime = System.currentTimeMillis();// 读取 Word 文档HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(fileName));// 创建 Word 转 HTML 转换器WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());// 图片保存路径设置String imageFolderPath = tempPath + "images" + File.separator;  // 存储图片的绝对路径// 设置图片管理器,处理图片保存逻辑wordToHtmlConverter.setPicturesManager(new PicturesManager() {public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) {String picturePath = imageFolderPath + suggestedName;  // 图片保存路径File imageFolder = new File(imageFolderPath);if (!imageFolder.exists()) {boolean created = imageFolder.mkdirs(); // 创建图片文件夹if (created) {System.out.println("在以下位置创建图片文件夹:" + imageFolder.getAbsolutePath());} else {System.out.println("创建图片文件夹失败");}}try {File pictureFile = new File(picturePath);try (FileOutputStream fos = new FileOutputStream(pictureFile)) {fos.write(content);  // 写入图片数据System.out.println("图片保存路径" + pictureFile.getAbsolutePath());}} catch (IOException e) {e.printStackTrace();}return picturePath;  // 返回图片路径}});// 处理文档内容,转换为 HTMLwordToHtmlConverter.processDocument(wordDocument);// 获取生成的 HTML 文档Document htmlDocument = wordToHtmlConverter.getDocument();// 自定义分页符处理:查找文档中的分页符并插入到 HTML 中NodeList bodyNodes = htmlDocument.getElementsByTagName("body");if (bodyNodes.getLength() > 0) {Node bodyNode = bodyNodes.item(0);  // 获取 HTML 中的 <body> 节点NodeList paragraphs = bodyNode.getChildNodes();for (int i = 0; i < paragraphs.getLength(); i++) {Node paragraph = paragraphs.item(i);if (paragraph.getNodeType() == Node.ELEMENT_NODE && paragraph.getNodeName().equals("p")) {String innerText = paragraph.getTextContent();if (innerText.contains("\f")) {  // 检查是否包含分页符(\f)// 创建自定义分页符 HTML 元素Element pageBreak = htmlDocument.createElement("div");pageBreak.setAttribute("class", "page-break");  // 设置 class 属性,方便样式控制pageBreak.appendChild(htmlDocument.createTextNode(" "));// 在分页符前插入自定义分页符标记bodyNode.insertBefore(pageBreak, paragraph);}}}}// 将 HTML 文档输出为字节流ByteArrayOutputStream out = new ByteArrayOutputStream();DOMSource domSource = new DOMSource(htmlDocument);StreamResult streamResult = new StreamResult(out);// 使用 Transformer 进行 HTML 格式化输出TransformerFactory tf = TransformerFactory.newInstance();Transformer serializer = tf.newTransformer();serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");  // 设置编码为 UTF-8serializer.setOutputProperty(OutputKeys.INDENT, "yes");  // 格式化输出serializer.setOutputProperty(OutputKeys.METHOD, "html");  // 输出格式为 HTMLserializer.transform(domSource, streamResult);out.close();// 将字节流转换为字符串String htmlContent = new String(out.toByteArray());// 处理特殊标记符,例如去掉目录标记(根据需要调整)htmlContent = htmlContent.replaceAll("TOC \\\\o \"1-3\" \\\\h \\\\z \\\\u", "");// 将生成的 HTML 内容写入文件writeFile(htmlContent, outPutFile);// 输出生成文件的信息及用时System.out.println("Generate " + outPutFile + " with " + (System.currentTimeMillis() - startTime) + " ms.");
}

        该方法功能实现:

  • .doc 格式的 Word 文档转换为 HTML 文件。
  • 提取并保存文档中的图片到指定路径,并在 HTML 中插入图片引用。
  • 处理分页符,将分页符(\f)替换为自定义的 HTML 标记。
  • 格式化生成的 HTML 文件,便于阅读和使用。

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

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

相关文章

doris:Insert Into Values

INSERT INTO VALUES 语句支持将 SQL 中的值导入到 Doris 的表中。INSERT INTO VALUES 是一个同步导入方式&#xff0c;执行导入后返回导入结果。可以通过请求的返回判断导入是否成功。INSERT INTO VALUES 可以保证导入任务的原子性&#xff0c;要么全部导入成功&#xff0c;要么…

C语言初阶--折半查找算法

目录 练习1&#xff1a;在一个有序数组中查找具体的某个数字n 练习2&#xff1a;编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 练习3&#xff1a;简单编写代码实现&#xff0c;模拟用户登录情景&#xff0c;并且只能登录三次 练习4&#xff1a;猜数字…

单片机(STC89C52)开发:点亮一个小灯

软件安装&#xff1a; 安装开发板CH340驱动。 安装KEILC51开发软件&#xff1a;C51V901.exe。 下载软件&#xff1a;PZ-ISP.exe 创建项目&#xff1a; 新建main.c 将main.c加入至项目中&#xff1a; main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…

Adobe的AI生成3D数字人框架:从自拍到生动的3D化身

一、引言 随着人工智能技术的发展,我们见证了越来越多创新工具的出现,这些工具使得图像处理和视频编辑变得更加智能与高效。Adobe作为全球领先的创意软件公司,最近推出了一项令人瞩目的新技术——一个能够将普通的二维自拍照转换成栩栩如生的三维(3D)数字人的框架。这项技…

Ansys Thermal Desktop 概述

介绍 Thermal Desktop 是一种用于热分析和流体分析的通用工具。它可用于组件或系统级分析。 来源&#xff1a;CRTech 历史 Thermal Desktop 由 C&R Technologies (CR Tech) 开发。它采用了 SINDA/FLUINT 求解器。SINDA/FLUINT 最初由 CR Tech 的创始人为 NASA 的约翰逊航…

【数据分享】1929-2024年全球站点的逐日平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

Java27:SPRING

一&#xff1a;SPRING介绍 1.spring的概念 广义的Spring&#xff1a;Spring技术栈&#xff08;全家桶&#xff09; 广义的Spring泛指以Spring Framework 为基础的Spring技术栈&#xff0c;Spring不在是一个单纯的应用框架&#xff0c;而是逐渐发展成为一个由不同子模块组成的…

数据标注开源框架 Label Studio

数据标注开源框架 Label Studio Label Studio 是一个开源的、灵活的数据标注平台&#xff0c;旨在帮助开发者和数据科学家轻松创建高质量的训练数据集。它支持多种类型的数据&#xff08;如文本、图像、音频、视频等&#xff09;以及复杂的标注任务&#xff08;如分类、命名实体…

k8s简介,k8s环境搭建

目录 K8s简介环境搭建和准备工作修改主机名&#xff08;所有节点&#xff09;配置静态IP&#xff08;所有节点&#xff09;关闭防火墙和seLinux&#xff0c;清除iptables规则&#xff08;所有节点&#xff09;关闭交换分区&#xff08;所有节点&#xff09;修改/etc/hosts文件&…

单片机内存管理剖析

一、概述 在单片机系统中&#xff0c;内存资源通常是有限的&#xff0c;因此高效的内存管理至关重要。合理地分配和使用内存可以提高系统的性能和稳定性&#xff0c;避免内存泄漏和碎片化问题。单片机的内存主要包括程序存储器&#xff08;如 Flash&#xff09;和数据存储器&a…

1. 握手问题python解法——2024年省赛蓝桥杯真题

原题传送门&#xff1a;1.握手问题 - 蓝桥云课 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人&#xff0c;…

15.7k!DISM++一款快捷的系统优化工具

软件介绍 链接 软件介绍 dism是一款由初雨团队开发的win系统优化工具&#xff0c;可当作是微软系统命令行工具dism的GUI版本。可用作系统垃圾清除、启动项管理、程序卸载、驱动管理、系统优化等 该工具个人感觉最重要的就是系统优化选项&#xff0c;它将一些实用、无用或者没…

Gin 应用并注册 pprof

pprof 配置与使用步骤 1. 引言 通过下面操作&#xff0c;你可以顺利集成和使用 pprof 来收集和分析 Gin 应用的性能数据。你可以查看 CPU 使用情况、内存占用、以及其他运行时性能数据&#xff0c;并通过图形化界面进行深度分析。 1. 安装依赖 首先&#xff0c;确保安装了 gi…

idea修改模块名导致程序编译出错

本文简单描述分别用Idea菜单、pom.xml文件管理项目模块module 踩过的坑&#xff1a; 通过idea菜单创建模块&#xff0c;并用idea菜单修改模块名&#xff0c;结构程序编译报错&#xff0c;出错的代码莫名奇妙。双击maven弹窗clean时&#xff0c;还是报错。因为模块是新建的&am…

C#编程:List.ForEach与foreach循环的深度对比

在C#中&#xff0c;List<T>.ForEach 方法和传统的 foreach 循环都用于遍历列表中的元素并对每个元素执行操作&#xff0c;但它们之间有一些关键的区别。 List<T>.ForEach 方法 方法签名&#xff1a;public void ForEach(Action<T> action)类型&#xff1a;…

微服务学习-Nacos 注册中心实战

1. 注册中心的设计思路 1.1. 微服务为什么会用到注册中心&#xff1f; 服务与服务之间调用需要有服务发现功能&#xff1b;例如订单服务调用库存服务&#xff0c;库存服务如果有多个&#xff0c;订单服务到底调用那个库存服务呢&#xff08;负载均衡器&#xff09;&#xff0…

Effective C++笔记

文章目录 术语Chapter 1 Accustoming Yourself to C条款1 视c为一个语言城邦&#xff08;View C as a federation of languages&#xff09;条款2 尽量以const、enum、inline替换#define &#xff08;Prefer consts, enums, and inlines to #defines&#xff09;条款3 尽可能使…

vim如何设置自动缩进

:set autoindent 设置自动缩进 :set noautoindent 取消自动缩进 &#xff08;vim如何使设置自动缩进永久生效&#xff1a;vim如何使相关设置永久生效-CSDN博客&#xff09;

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日&#xff0c;中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;数据委员会数据标注分委会&#xff08;以下简称“分委会”&#xff09;正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…

第四天 安装DevEco Studio,配置HarmonyOS开发环境

要安装DevEco Studio并配置HarmonyOS开发环境&#xff0c;你可以按照以下步骤进行&#xff1a; 一、系统要求 在开始安装之前&#xff0c;请确保你的计算机满足以下要求&#xff1a; 操作系统&#xff1a;Windows 10/11 64位&#xff0c;macOS (X86) 10.15及以上版本&#x…