使用忠告

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

}

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

c 的word转为html5,word与html互转(1) -- word转html相关推荐

  1. word 转为 html5,怎么把word转化为纯文本

    如何将有 流程图的图片文件 转换 成纯文本的word?而且要保证 流程图不乱. 大侠们了.急用埃万分感激. 方法是:使用文字识别工具这类软件(例如:Office中的"Microsoft Of ...

  2. xml格式的word转为标准格式_保持的怎么保证Word格式不变?4个技巧需要带走

    来自word妹,侵联系删 在处理文档时,我们时常需要复制或者插入内容等,那如何保持格式不发生变化呢?本期与大家分享4个保持格式不变的Word技巧. 1.复制内容,如何保持与文本格式一致? 复制文本内容 ...

  3. html5把word转为pDF,在线word转pdf 如何将word转换成pdf

    日常办公常接触到pdf.word文件,在打印或发送文件时也有需要word转成稳定性较好的pdf,那 一起来看看是如何将word转换成pdf的吧.打开安装好的word to pdf软件,如下图,界面很简 ...

  4. word转pdf图片模糊怎么办_迅捷PDF转换器如何将word转为长图?word转图片方法

    在日常工作中,我们基本都用word来编辑文档,编辑完成,如果将它保存为其他格式,那可能会出现跑版的情况.为了解决这一问题,我们可以用迅捷PDF转换器将word转长图,这样也方便在手机上阅读.只是很多人 ...

  5. Java 将Word转为PDF、PNG、SVG、RTF、XPS、TXT、XML

    同一文档在不同的编译或阅读环境中,需要使用特定的文档格式来打开,通常需要通过转换文档格式的方式来实现.下面将介绍在Java程序中如何来转换Word文档为其他几种常见文档格式,如PDF.图片png.sv ...

  6. word中存储矢量图,word转为PDF时矢量图不失真。以及Visio图片放入word后有大量空白

    一.使用draw.io绘制好,然后导出为vsdx 1.我们可以在Visio中绘制图形(或者使用diagrams.net:Flowchart Maker & Online Diagram Sof ...

  7. C# Word转为多种格式文件(Word转XPS/SVG/EMF/EPUB/TIFF)

    一款有着强大的文档转换功能的工具,无论何时何地都会是现代办公环境极为需要的.在本篇文章中,将继续介绍关于Word文档的转换功能(Word转XPS/SVG/EMF/EPUB/TIFF)希望方法中的代码能 ...

  8. aspose将word转为pdf

    aspose文件转换功能非常方便,文件也不会出现乱码,内容丢失的情况. 相关jar和license.xml下载地址:https://download.csdn.net/download/qq_3167 ...

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

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

最新文章

  1. libev源码解析——调度策略
  2. LeetCode 215. Kth Largest Element in an Array--数字第K大的元素--最大堆或优先队列--C++,Python解法
  3. vnctf——babyvm
  4. 科大星云诗社动态20210323
  5. 如何测量上下文切换时间
  6. (Z)标准电阻值的来历及色环电阻值定义
  7. 设置Eclipse中的字符集为UTF-8
  8. java的svn插件maver_项目版本管理工具---MAVENSVN
  9. Eevnt Loop (事件循环)
  10. 告诉家里做饭的人,这些食物一起吃才是大补!
  11. C/C++ 变量的初始化
  12. 剪映专业版 for Mac(全能好用的视频编辑工具)v1.0.11中文版
  13. 100%解决VMware虚拟机NAT上网方式,保姆教学
  14. Linux 打包压缩命令
  15. 财务 - 注册会计师
  16. python写文件byte_如何将bytelist写入Python文件?
  17. 什么是云计算,云计算运营方式和部署方式介绍
  18. AxGlyph矢量绘图软件 | 绘图软件
  19. 天涯上令人肝肠寸断的100个签名
  20. 社会生活中的著名法则(一)

热门文章

  1. import json java_JAVA的JSON数据包装-博客园老牛大讲
  2. 微信网页开发配置步骤
  3. Android recycleview使用详解,recycleview实现九宫格布局即横向排列,recycleview设置item占位数量大号item或小号item
  4. mac通过homebrew安装opensdk11
  5. Windows 环境下 Chrome浏览器崩溃“STATUS_INVALID_IMAGE_HASH”
  6. pxe安装linux后命令不可用,pxe自动安装linux
  7. 隐藏a标签seo_让黑帽都惊了,远离百度惩处的seo技术
  8. mysql c webservice_如何编写webservice c
  9. 实验6 实践课程中的程序
  10. 【Makefile由浅入深完全学习记录4】变量和不同的赋值方式