(四)、JAVA基于OPENXML的word文档插入、合并、替换操作系列之word转html
word文件转html文件
这一篇估计是本系列最简单的一篇了,当然也有可能是用的最少的(个人感觉), 要实现word转html,大部分情况应该是用于界面展示, 如果是这个场景还有更好的方法实现,比如word转pdf, word转成图片来展示等等(网上方法遍地都是,后期有时间可能我也会整理一下我的方法),因word转成html效果并不是太好,至少目前在我见过的方法里面对于复杂页面输出效果总不那么尽善完美,好了,言归正传开始干吧。
判断word文档版本(doc/docx)
警告!这小节以牢骚为主,凑凑篇幅,没兴趣请跳过!!
趣事一则:
鄙人在做项目的过程中,曾经有一次遇到一个功能我们限定了只允许上传 .zip 的文件(不要问我为什么这样做,因为解压方便呀),结果有习惯了winRAR的用户一键压缩了 .rar 文包,在上传时系统提示只允许zip,结果他直接把后缀名由 .rar 改成了 .zip,为此我们花了不少时间来定位。
前面提过,本系列笔记重点研究以 docx为准, 但在这里还是要重点提一下怎么来识别输入的文件是符合要求的的docx,作为一名合格的码农,虽然我们的口号是做项目写BUG,但不能老写些低级别的BUG是吧。
判断word版本一般有两种方法,一种方法就是最直接的通过文件名后缀doc、docx来判断,这个办法天下人皆知道我就不说了, 但这个办法容易上面的趣事,第二种办法其实也不是什么好办法(目前我也没有找到什么好办法):
对于POI针对doc,docx有两个不同的包和入口类分别对应:
HWPF HWPFDocument Microsoft Word 97(-2007) --.doc
XWPF XWPFDocument Microsoft Word 2007 --.docx
那么如果想严谨一点做的话,可以利用try-catch的方式结合两个版本的入口类来判断, 牢骚完毕!
基于xdocreport的word转成html
xdocreport是一个开源库结合poi可以实现word转成html,喏 就是下面这货
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.poi.xwpf.converter.xhtml</artifactId>
<version>2.0.2</version>
</dependency>
具体操作如下:
@Test
public void testWord2html() throws InvalidFormatException, IOException {
//加载word文件
XWPFDocument document = new XWPFDocument(OPCPackage.open("/Users/tenney/Desktop/2222222222.docx"));
//设置输出的html路径
String htmlPath = "/Users/tenney/Desktop/html";
// 生成html文件根文件夹
File baseFolder = new File(htmlPath);
if (!baseFolder.exists()) {
baseFolder.mkdirs(); //创建这个目录
}
//设置html静态资源图片的输出
XHTMLOptions options = XHTMLOptions.create();
options.setImageManager(new ImageManager(baseFolder,"images"));
options.setIgnoreStylesIfUnused(false);
options.setFragment(true);
// html转换
OutputStream out = new FileOutputStream(htmlPath + "/index.html");
XHTMLConverter.getInstance().convert(document, out, options);
System.err.println("转换完成.");
}
效果就是这样了
基于docx4j的word转html
docx4j这玩意前面已经用过了,就不多介绍,不知道的翻前面的笔记,或者撩度娘去,直接上代码:
@Test
public void testWord2html() throws InvalidFormatException, IOException, Docx4JException {
//加载word文件
// WordprocessingMLPackage wordMLPackage = Docx4J.load(new File("/Users/tenney/Desktop/2222222222.docx"));
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("/Users/tenney/Desktop/2222222222.docx"));
//设置输出的html路径
String htmlPath = "/Users/tenney/Desktop/html";
// 生成html文件根文件夹
File baseFolder = new File(htmlPath);
if (!baseFolder.exists()) {
baseFolder.mkdirs(); //创建这个目录
}
HTMLSettings htmlSettings = Docx4J.createHTMLSettings();
htmlSettings.setImageDirPath(htmlPath + "/images");
htmlSettings.setImageTargetUri( "images");
htmlSettings.setWmlPackage(wordMLPackage);
htmlSettings.setStyleElementHandler(new ConversionHTMLStyleElementHandler() {
public Element createStyleElement(OpcPackage opcPackage, org.w3c.dom.Document document, String styleDefinition) {
Element ret = null;
if (styleDefinition != null && styleDefinition.length() > 0) {
ret = document.createElement("style");
ret.appendChild(document.createComment(styleDefinition));
}
return ret;
}
});
OutputStream os = new FileOutputStream(htmlPath + "/index.html");
Docx4jProperties.setProperty("docx4j.Convert.Out.HTML.OutputMethodXML", true);
Docx4J.toHTML(htmlSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
System.err.println("转换完成.");
}
补充一下资源,这只是显示引入的包,其他依赖包自动加入这里就不单独贴了
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-core</artifactId>
<version>8.0.0</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-ImportXHTML</artifactId>
<version>8.0.0</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-Internal</artifactId>
<version>${docx4j.version}</version>
</dependency>
到此就完事儿了,至于那个方法好,你猜我会不会告诉你,哈哈!
补充说明
- 请注意两个方法中引入的库版本,我用的版本比较高,写法也跟网上大部分稍有区别,请注意区别。
- 以上方法一其实支持doc转html的, 只是写法略微不同,百度一大把现存代码,我就不多此一举了。