c 的word转为html5,word与html互转(1) -- word转html

使用忠告

使用该方式进行xhtml到word的转换, 简单转换是可以, 但是可能并没有想象中那么满意, 转换出来的word格式并不完美, 比如目录和标题都会丢失, 标题显示看起来一样, 但是是用正文加粗和加大字号来显示的. 毕竟word是一种文档格式, 而html是一种标记性语言, 要想实现完美兼容和转换很难

加上word与html互转(2) -- html转word, 虽然word与html互转都有实现手段, 但是考虑到转换的格式复杂度和后期的维护成本, 我们最后放弃去实现这个成本高但是对项目影响不大的功能

其中word转html功能实现中, 转出的html的格式并没有想象中的好, 某些样式是通过class样式来显示的, 并不全是行内样式, 并且html所有文本标签都是使用的p标签, 包括标题.

实现

实现方式

我在网上搜集了很多实现方式, 各式各样的, 最后我决定使用poi+xdocreport来实现

poi都熟悉, 这边我不作介绍

xdocreport是github上的一个开源项目, 他的具体介绍可以去他的项目地址查看--项目地址, 选择这个开源项目主要有以下几个原因:

1. 他是开源的(免费)

2项目本身模块化, 我们可以只引用需要的功能(轻量化)

3.转换是基于poi的转换进行补充扩展的,感觉比poi原生的更好一些(emm...没验证)

4.使用简单便捷

这里只使用了xdocreport的转换器功能, 可以点这里直接查看对应的wiki

引入相关程序包

org.apache.poi

poi

3.14

org.apache.poi

poi-scratchpad

3.14

org.apache.poi

poi-ooxml

3.14

fr.opensagres.xdocreport

fr.opensagres.poi.xwpf.converter.xhtml

2.0.1

org.apache.poi

poi-ooxml-schemas

3.14

org.apache.poi

ooxml-schemas

1.3

docx转html

public static void main(String[] args) {

String fileInName = "test.docx";

XWPFDocument document = null;

try {

document = new XWPFDocument(new FileInputStream(fileInName));

XHTMLOptions options = XHTMLOptions.create();

options.setImageManager( new ImageManager(new File(""), "") {

@Override

public void extract(String imagePath, byte[] imageData) throws IOException {

System.out.println("这里上传图片到图片服务器");

}

@Override

public String resolve(String uri) {

return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";

}

});

StringWriter stringWriter = new StringWriter();

// XHTMLConverter.getInstance().convert( document, out, options );

XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();

xhtmlConverter.convert(document, stringWriter, options);

} catch (IOException e) {

e.printStackTrace();

}

}

上面我自己写的示例跟官方的示例有所区别, 下面我贴出官方示例然后在进行解释

/**

* 官方示例

*/

import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;

import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;

...

// 1) Load DOCX into XWPFDocument

InputStream in= new FileInputStream(new File("HelloWord.docx"));

XWPFDocument document = new XWPFDocument(in);

// 2) Prepare XHTML options (here we set the `ImageManager` to store image and resolve iamge src)

XHTMLOptions options = XHTMLOptions.create().setImageManager( new ImageManager( new File(root), "images" ) );

// 3) Convert XWPFDocument to XHTML

OutputStream out = new FileOutputStream(new File("HelloWord.htm"));

XHTMLConverter.getInstance().convert(document, out, options);

跟官方不一样的地方的解释

1.在给XHTMLOption设置图片管理器对象的时候

官方是直接设置了一个图片路径, 生成的html里面的图片引用指向的是设 置的路径, 而我这边有专门的文件服务器, 所以需要将里面的图片上传到图片服务器中, 然后将html中图片的引用指向文件服务器, 所以我重写了图片管理器的代码, 将其中保存图片和给html中图片引用换成了自己的实现

XHTMLOptions options = XHTMLOptions.create();

options.setImageManager( new ImageManager(new File(""), "") {

@Override

public void extract(String imagePath, byte[] imageData) throws IOException {

System.out.println("这里上传图片到图片服务器");

}

@Override

public String resolve(String uri) {

return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";

}

});

2.转换并保存html的时候

官方示例是将html保存成文件到一个路径下面, 而我的需求并不是保存文件, 而是要将生成的html分段下沉到DB, 所以可以在这里

StringWriter stringWriter = new StringWriter();

XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();

xhtmlConverter.convert(document, stringWriter, options);

将官方示例的文件输出流换成自己的StringWriter就可以了(你也可以换成自己需要的流), 我这样替换就可以拿到html的字符串, 接着就可以使用jsoup进行html的解析并分段存储了

doc转html

public String doc2html() throws Exception {

HWPFDocument hwpfDocument = new HWPFDocument(new FileInputStream("test.doc"));

Document newDocument = XMLHelper.getDocumentBuilderFactory().newDocumentBuilder().newDocument();

WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(newDocument);

wordToHtmlConverter.setPicturesManager((content, pictureType, suggestedName, widthInches, heightInches) -> {

//content是图片内容, 这里将图片保存到图片服务器, 然后将保存的图片路径返回

//同样, 你也可以将图片保存到本地相对路径, 然后将相对路径返回, html也能正常显示图片

return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";

});

wordToHtmlConverter.processDocument(hwpfDocument);

Transformer transformer = TransformerFactory.newInstance()

.newTransformer();

//指定Transformer在输出结果树时是否可以添加额外的空格

transformer.setOutputProperty(OutputKeys.INDENT, "yes");

//指定输出编码

transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");

transformer.setOutputProperty(OutputKeys.METHOD, "html");

//这里是希望将转换后的流最终输出到字符串进行返回, 如果你希望直接输出文件, 你可以创建一个文件流放进下面的参数

StringWriter stringWriter = new StringWriter();

transformer.transform(new DOMSource(wordToHtmlConverter.getDocument()), new StreamResult(stringWriter));

return stringWriter.toString();

}

示例代码比较简单, 但是已经具备转换的功能, 需要注意和可能变动的点我在代码注释中已经说明, 可以根据需求来修改图片的保存和最后输出的结果

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

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

相关文章

html5列表菜单特效,HTML5 SVG汉堡包菜单按钮分段动画特效

这是一款效果非常炫酷的HTML5 SVG汉堡包菜单按钮分段动画特效。该菜单按钮特效在用户点击汉堡包按钮时,按钮会分割为多段,并旋转变形为关闭按钮的状态。当再次点击该按钮时,它会逆向变形为汉堡包图标。该特效是基于Segment.js插件(一款可以只…

计算机选修课学什么,计算机专业都学什么 主要课程有什么

计算机专业的主要学习内容有什么呢,都开设哪些课程呢,下面小编为大家提供计算机专业主要学习内容,仅供大家参考。计算机专业主要学习内容一、数学类主要课程:高等数学、线性代数、离散数学、概率论、数理统计二、语言类主要课程&a…

Python学习札记(十七) 高级特性3 列表生成式

参考:列表生成式 Note 1.List Comprehensions,即列表生成式,是Python中内置的非常强大的list生成式。 eg.生成一个列表:[1*1, 2*2, ..., 10*10] 使用for...in的方法: #!/usr/bin/env python3L1 []for i in range(1, 1…

excel取html文本长度,excel字符长度 怎么计算excel里的字符串的长度

请教:在EXCEL中如何统计字符长度?打开excel文件,确定需要编辑的内容选择功能区的“公式”功能在公式中选择“LEN”功能在text中选择需要编辑的单元格 7、点击“确定” 8、系统自动计算出了单元excel中怎么判断字符串的长度在Excel中可以使用两…

Java学习之String StringBuffer StringBuilder区别

1.String:对象长度是不可变的,是线程安全。 2.StringBuffer:对象长度是可变的,是线程安全。 3.StringBuilder:对象长度是可变,不是线程安全。转载于:https://www.cnblogs.com/michaelShao/p/6372556.html

计算机找不到管理无线网络,电脑wifi密码忘了 并且找不到管理无线网络该怎么处理?...

电脑能连无线网而不能连有线网怎么办你的网卡的TCP/IP协议,设置了自动获取IP地址,然而你的局域网中不存在可以让你的机器得到IP地址的DHCP服务器。所以你的IP地址没有获取到,当然是受限制或无连接。解决方法是,为每个网卡设置一个…

Java虚拟机(JVM)默认字符集详解

Java中对字符串等进行转换字节数组时, 需要根据字符集编码来进行转换, 当不显示的指定字符集编码时(如: "测试".getBytes()), 会使用Charset.defaultCharset()获取到的字符集编码进行转换! 相关代码如下: 上面的代码可以看出, 在JVM中defaultCharset()是在初始化阶段…

计算机本地用户删除后怎么恢复,Default User文件夹被删了怎样恢复

满意答案opposities2013.06.06采纳率:80% 等级:24已帮助:17327人1、开机后出现“Windows 不能加载本地存储的配置文件。此问题的可能原因是安全权限不足或本地配置文件损坏。如果此问题持续存在,请与您的网络管理员联系。倒数3…

08-SSH综合案例:前台用户模块:注册页面的前台JS校验

这个是MyEclipse设置的问题 把设置去掉就没问题了。 你也可以在每一个input后面加个span来显示提示的信息。这些东西也要提交到后台,后台也是要对这些东西进行校验的。转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6377756.html

html绘制波形图,JS实现波形图

一直想写个波线图,但写出来发现这是点阵组成的,不知道如何把线条弄的特别的平滑,有会的,求留言评论指导。1.[代码][JavaScript]代码Document.container{width:500px;height:500px;border:1px solid #DEDEDE;}.container span{widt…

sql 中on和where的区别

table a(id, type): id type ---------------------------------- 1 1 2 1 3 2 table b(id, class): id class --------------------------------- 1 1 2 2 sql语句1:select a.*, b.* from a left j…

计算机管理员无法创建密码,找到电脑管理员的密码

轻松找回遗忘的WinXP管理员密码很多“不拘小节”的朋友在使用电脑时,经常是昨天改了Windows XP帐户密码,今天便忘记了内容,把自己锁在“门外”的情况时有发生。对此,大多数朋友只能痛苦的去重新安装系统。其实如果你有以下的条件&…

上传文件插件(plupload)

引入插件&#xff1a; <script src"../../static/js/plupload.full.min.js"></script> /** 上传文件配置* *///配置uploadervar uploader new plupload.Uploader({runtimes: html5,flash,silverlight,html4,browse_button : uploader,url:/delivery/bat…

计算机网络项目实训教程课后答案,计算机网络项目实训教程

摘要&#xff1a;《计算机网络项目实训教程》是专门为Nikon D700相机用户或潜在用户量身定制的实用型图书.将官方手册中抽象的功能描述及没有讲清楚的内容,通过实拍测试及精美照片示例具体地展现出来,特别是精选的摄影玩家实际使用经验与技巧,让您感觉身边时刻有"高手点拨…

如何正确的做事

职场中&#xff0c;常常遇见下列两种人&#xff0c;一种是永远处在无休止忙碌状态&#xff0c;却事倍功半的人&#xff0c;一种是处理工作十拿九稳&#xff0c;经常事半功倍的人。 同样都是做事&#xff0c;造成两种结果的原因究竟是什么呢&#xff1f;答案其实很简单。前者&am…

北大计算机科学与技术专业河南录取分数线,北京大学河南录取分数线|2021北京大学河南分数线|2021年北京大学河南高考分数线|2021年北京大学河南招生计划录取人数...

北京大学2014年在河南省高考录取工作顺利结束。今年北大在豫共录取考生200名&#xff0c;其中全省理科第一名曹林菁、文科投档分第一名齐华瑞和文科实考分第一名齐思涵三位全省最高分考生均选择进入北京大学。今年北大在豫招生无论是总体招生数量还是顶尖高分考生录取&#xff…

clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight

clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight是几个困惑了好久的元素属性&#xff0c;趁着有时间整理一下 1. clientWidth 和 clientHeight 网页中的每个元素都具有 clientWidth 和 clientHeight 属性&#xff0c;表示可视区域的宽高&…

计算机组成原理题库带答案详解,计算机组成原理试试题库(含答案解析) -.doc

Word文档下载可编辑专业技术资料计算机组成原理试题一、单项选择题(从下列各题四个备选答案中选出一个正确答案&#xff0c;并将其代号写在题干前面的括号内。)1.为了缩短指令中某个地址段的位数&#xff0c;有效的方法是采取(C)。A、立即寻址B、变址寻址C、间接寻址 D、寄存器…

51Nod--1100-斜率最大

51Nod--1100-斜率最大 1100 斜率最大平面上有N个点&#xff0c;任意2个点确定一条直线&#xff0c;求出所有这些直线中&#xff0c;斜率最大的那条直线所通过的两个点。 &#xff08;点的编号为1-N&#xff0c;如果有多条直线斜率相等&#xff0c;则输出所有结果&#xff0c;按…

张掖计算机职称考试,甘肃省张掖市2018年3月计算机等级考试公告

&nbsp&nbsp[导读]:甘肃省张掖市2018年3月计算机等级考试甘肃省2018年3月全国计算机等级考试报名时间&#xff1a;2017年12月13日—2018年01月7日&#xff0c;打印准考证时段&#xff1a;2018年3月11—26日甘肃省张掖市2018年3月计算机等级考试公告一、报考条件考生不受…