使用忠告

使用该方式进行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();

}

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

android+word转html,word与html互转(1) -- word转html相关推荐

  1. excel转las文件_这3种Word、Excel格式不变的互转方法,实在太好用了

    日常工作中用Word写总结.写报告,写分析,一定离不开数据支持.但在制作的过程中你一定碰到过这些问题:Excel里做的表格.图表,一复制到word就变的乱七八糟! 那么,有没有什么好的方法,即省时,又 ...

  2. [转载]Word直接发布新浪博客(以Word 2013为例)

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Word直接发布新浪博客(以Word 2013为例) 作者:paulke2011 注意:这篇博客直接由Word 20 ...

  3. 计算机再带word打不开,word打不开,详细教您怎么解决word打不开

    在我们平时工作的时候,都会遇到一个问题,那就是打不开word文档.但是我们的工作时间有很紧迫,那么这个时候,我们该怎么办呢?不要慌,今天小编就来告诉你们当遇到word打不开的时候应该怎么办. 对于那些 ...

  4. mysql 启动安全模式_“ Word上次启动时失败,以安全模式启动Word ....”解决办法...

    " Word上次启动时失败,以安全模式启动Word ...."解决办法  Word上次启动时失败,以安全模式启动word将帮助您纠正或发现启动中的问题,下一次成功启动应用程序.但是 ...

  5. python打开word并在前台显示_Python自动化办公之Word,全网最全看这一篇就够了

    作者:超级大洋葱806 https://tangxing.blog.csdn.net/article/details/108418066 环境安装 使用Python操作word大部分情况都是写操作,也 ...

  6. word vba高效排版范例应用_收藏 | 原来word里面也有函数!

    Word里面的rand"函数" 可以在文档中快速生成文本,小伙伴在Word中练习排版时,可以用虚拟文本来练习排版.在任意位置输入=rand()必须为英文半角,按[Enter]键,就 ...

  7. 电脑word在哪_怎么将图片转换成Word?学会这3种方法,轻松将图片转文字!

    怎么将图片转换成Word文字?相信很多朋友都有这样的困惑,大多数人都会选择将图片里面的内容一个字一个字的录入到Word里面,这样的话会浪费我们大量的时间,这里笔者给大家介绍几种方法,不管哪一种都能够轻 ...

  8. word双引号间距大_微软判定:Word 编辑英文句号后“两个空格”为拼写异常

    IT之家4月24日消息 微软解决了这一场激烈的空格辩论,认为英文句子标点后只留"一个空格"是正确的规范.微软已开始更新Office Word,将把英文句子标点后保留"两个 ...

  9. python word.documents.open报错_Python教程:[43]Word基本操作

    使用python操作Word用到了win32com模块,我们现在就要介绍一下python对Word的基本操作,文章涉及到如何与Word程序建立连接.如果与Word文档建立连接的,以及对Word文档的基 ...

  10. 计算机二级 word 论文,最新计算机二级第十四套word题目要求

    最新计算机二级第十四套word题目要求 计算机二级第十四套word题目要求 习题十四 北京XX大学信息工程学院讲师张东明撰写了一篇名为"基于频率域特性的闭合轮廓描述子对比分析"的学 ...

最新文章

  1. 如何从功能测试转化自动化测试?
  2. 觉得酒驾处罚太严厉?看看国外的再说吧...
  3. python安装步骤win10-教你如何在Win10系统安装Python?
  4. 【数据库开发】Redis key-value内存数据库介绍
  5. python k线合成_手把手教你写一个Python版的K线合成函数
  6. 开箱即用 - jwt 无状态分布式授权
  7. ios支付宝支付失败不回调_iOS 支付宝网页支付回调问题
  8. c语言逗号占几个字符,C语言 scanf输入多个数字只能以逗号分隔的操作
  9. html 中用canvas加载图片,【实例】使用canvas缓缓加载一个图片到web页面中
  10. Android 应用开发---ViewPager----1.相关基本知识
  11. python可视化利器Yellowbrick实践
  12. 如何在fedora安装Telegram
  13. 《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》读书笔记
  14. Python3 文档批量助手
  15. Error occurred when evaluating apply
  16. 想将PPT的文字转换到Word文档?看这一篇就够了!!!
  17. 一句话题解(20170801~20170125)
  18. win7计算机怎么优化驱动器,win7如何优化加速的12条技巧
  19. 简单地人物介绍页面设计
  20. ASP.NET 中关GridView里加入CheckBox 在后台获取不到选中状态的问题

热门文章

  1. winrar x64 3.93如何破解
  2. screw (螺丝钉) ~ 简洁好用的数据库表结构文档生成工具
  3. dataframe中多列除以不同列_Python之DataFrame切片与索引实验
  4. php1.9,PHP1.9--数组
  5. 使用Docker搭建私有云笔记
  6. PostgreSQL 优化器案例之 - order by limit 索引选择问题
  7. 线程工具类 - CountDownLatch(倒计时器)
  8. Linux下的定时器
  9. Python程序-离散和线性图形
  10. 使用 putty 免密码 ssh 登录 mac os