Java 处理word文档后在前端展示
最新新开发的这个项目需要使用word文档并要求能在前端页面上带格式展示,由于项目不是内部使用,所以不考虑插件类的处理模式,都必须要本地处理完成,前端不需要做什么更新或者说安装就能直接访问,类似于百度文库这种。
- 首先想到的是JSP能不能直接显示word文档呢?
然后找了很多资料,逛了很多论坛,发现很多人说可以,只要在处理的时候页面头上加上<%@page contentType="application/msword;charset=GBK" %> ,不知是我水平不够,还是有什么地方没有注意到,最终的结果都是提示下载或者是使用word打开,没有想象中的在jsp端直接显示的。
外面都是这种或类似这种意思:
<%@ page contentType="application/msword;charset=gb2312" %> <%
File f=new File("D:/Tomcat 5.5/webapps/neiwang/txt/telephone.doc");
FileInputStream fin=new FileInputStream(f);
OutputStream output=response.getOutputStream();
byte[] buf=new byte[1024];
int r=0;
response.setContentType("application/msword;charset=GB2312");
while((r=fin.read(buf,0,buf.length))!=-1)
{
output.write(buf,0,r);//response.getOutputStream()
}
fin.close();
output.close();
%>
我做了一些尝试,发现根本无法显示,最终的结果都是提示下载。我想说的是,作为一个技术,发出来的解答首先你得自己能实现吧,不过帖子时间也比较久远了,可能当时确实是可以的或者说只是我不会而已,多说无益。既然这种办法处理不了,只能另寻他法。
- 我换了个方法就是将 word 转换成 html ,再通过jsp来访问这个链接
这个是个比较传统的解决思路,搜一搜其实发现很多人都这么干,这批人难道也是对上述方法(jsp直接显示)失望了后找的这种模式?呵呵
比较常用的开源免费的有且只有几种,选择其中几种我尝试了一下。
首先想到的是POI,但处理 Word 没有想象的中的那样优秀,出来的基本一团糟,没有任何格式性可谈,而且需要一个字符一个字符的处理特别费力,结果不理想代码就不贴了,曾使用它来处理过 Excel 觉得还很优秀!
然后就另找了一个叫 OpenOffice,经过尝试发现经过它转换出来的文档,虽然缺失格式,但也不是不能接受,自己再另行加处理也许能成。将Word转Html的原理是这样的:
1、客户上传Word文档到服务器
2、服务器调用OpenOffice程序打开上传的Word文档
3、OpenOffice将Word文档另存为Html格式
基于这个基础上的实现需要下载 openOffice 。
1、下载 OpenOffice,http://download.openoffice.org/index.html
2、下载 Jodconverter,http://www.artofsolving.com/opensource/jodconverter 这是开启OpenOffice进行格式转化的第三方jar包。
3、安装 OpenOffice,成功后在安装目录下启动监听端口:
soffice -headless -accept="socket,port=8100;urp;"
可以通过 netstat –an|findstr “8100” 查看端口是否监听;如图
4、打开Eclipse新建项目,导入Jodconverter/lib 下面的 jar 。具体的需要哪些自己可以尝试。我比较懒就都添加了。
下面是代码:
import java.io.File;
import java.net.ConnectException;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; public class OfficeConverter { public static void main(String[] args) {
File inputFile = new File("C:/test/yy.doc");
File outputFile = new File("C:/test/yy.html"); OpenOfficeConnection con = new SocketOpenOfficeConnection(8100);
try {
con.connect();
} catch (ConnectException e) {
System.err.println("文件转换出错,请检查OpenOffice服务是否启动。");
e.printStackTrace();
}
DocumentConverter converter = new OpenOfficeDocumentConverter(con);
converter.convert(inputFile, outputFile);
con.disconnect();
}
}总结:使用OpenOffice作为转换引擎把word文档转换成html,比起使用微软的com组件有跨平台的优势,而且比Apache poi(POI貌似只能获取word中的文本内容,图片和表格,图片和表格的定位很是个问题,获取样式要一个字符一个字符的分析麻烦且效率低下)方便且简单,但是个人觉得这个结果其实并不理想,排版仍然缺失很严重。
普通情况下的排版差别见下图:
通过程序读取解析后的文档格式如下图,经过对比貌似比 word 自身的另存为还好看点,相信经过不断优化以后应该能完美支持解析。但是细心点还是会看见单元格样式变了,排版变了,如果要求不是太高,这个也能满足需求了。
不过如果只需要保存相关的文字的话,上面转化的html内容冗余比较多,可以用 java 正则表达式来处理多余字符串,详见下面的代码:
protected static String clearFormat(String htmlStr, String docImgPath) {
// 获取body内容的正则
String bodyReg = "<BODY .*</BODY>";
Pattern bodyPattern = Pattern.compile(bodyReg);
Matcher bodyMatcher = bodyPattern.matcher(htmlStr);
if (bodyMatcher.find()) {
// 获取BODY内容,并转化BODY标签为DIV
htmlStr = bodyMatcher.group().replaceFirst("<BODY", "<DIV").replaceAll("</BODY>", "</DIV>");
}
// 调整图片地址
htmlStr = htmlStr.replaceAll("<IMG SRC=\"", "<IMG SRC=\"" + docImgPath + "/");
// 把<P></P>转换成</div></div>保留样式
htmlStr = htmlStr.replaceAll("(<P)([^>]*>.*?)(<\\/P>)", "<div$2</div>");
// 把<P></P>转换成</div></div>并删除样式
htmlStr = htmlStr.replaceAll("(<P)([^>]*)(>.*?)(<\\/P>)", "<p$3</p>");
// 删除不需要的标签
htmlStr = htmlStr
.replaceAll("<[/]?(font|FONT|span|SPAN|xml|XML|del|DEL|ins|INS|meta|META|[ovwxpOVWXP]:\\w+)[^>]*?>","");
// 删除不需要的属性
htmlStr = htmlStr
.replaceAll("<([^>]*)(?:lang|LANG|class|CLASS|style|STYLE|size|SIZE|face|FACE|[ovwxpOVWXP]:\\w+)=(?:'[^']*'|\"\"[^\"\"]*\"\"|[^>]+)([^>]*)>","<$1$2>");
// 删除<STYLE TYPE="text/css"></STYLE>及之间的内容
int styleBegin = htmlStr.indexOf("<STYLE");
int styleEnd = htmlStr.indexOf("</STYLE>") + 8;
String style = htmlStr.substring(styleBegin, styleEnd);
htmlStr = htmlStr.replace(style, ""); return htmlStr;
}这个OpenOffice基本使用就介绍完了,自己如果有更多需求的话可以去查查资料看怎么更完善,谢谢分享。
Java 处理word文档后在前端展示的更多相关文章
- 使用Java生成word文档(附源码)
当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...
- (转)WEB页面导出为Word文档后分页&横向打印的方法
<html> <HEAD> <title>WEB页面导出为Word文档后分页&横向打印的方法 </title> < ...
- 解决图片插入word文档后清晰度降低的问题
解决图片插入word文档后清晰度降低的问题 在默认情况下,word程序会自动压缩插入word文档中的图片以减小整个word文档的.当我们需要插入word文档中的图片保持原始清晰度时,可以通过设置wor ...
- poi读写word模板 / java生成word文档
有一word文档表格 形如: 姓名 ${name} 电话 ${tel} 从数据库读取记录替换上述变量 import java.io.FileOutputStream; import java.util ...
- Java解析word文档
背景 在互联网教育行业,做内容相关的项目经常碰到的一个问题就是如何解析word文档. 因为系统如果无法智能的解析word,那么就只能通过其他方式手动录入word内容,效率低下,而且人工成本和录入出错率 ...
- JAVA生成Word文档(经过测试)
首先告诉大家这篇文章的原始出处:http://www.havenliu.com/java/514.html/comment-page-1#comment-756 我也是根据他所描述完成的,但是有一些地 ...
- java 处理word文档 (含图片,表格内容)
因为本人长期从事Oa相关项目的开发,所以处理word文档,Pdf,Excel等是在所难免的. 1.需求 处理Excel 能够用jxl 或者poi 2需求 用户在系统上填 ...
- Java 在 Word 文档中使用新文本替换指定文本
创作一份文案,经常会高频率地使用某些词汇,如地名.人名.人物职位等,若表述有误,就需要整体撤换.文本将介绍如何使用Spire.Doc for Java,在Java程序中对Word文档中的指定文本进行替 ...
- 使用Aspose.word (Java) 填充word文档数据(包含图片填充)
Aspose填充word数据 本文介绍了如何使用aspose进行word文档的生成,并提供了工具类供参考. 有问题欢迎 call 微信:905369866,小弟尽力而为..毕竟这玩意没吃透. 目录 A ...
随机推荐
- DateTimeFormat
中文:星期一,星期二 System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(DateTime.Now.Da ...
- 来吧学学.Net Core之项目文件简介及配置文件与IOC的使用
序言 在当前编程语言蓬勃发展与竞争的时期,对于我们.net从业者来说,.Net Core是风头正紧,势不可挡的.芸芸口水之中,不学习使用Core,你的圈内处境或许会渐渐的被边缘化.所以我们还是抽出一点 ...
- Linux下Netty实现高性能UDP服务(SO_REUSEPORT)
参考: https://www.jianshu.com/p/61df929aa98b SO_REUSEPORT学习笔记:http://www.blogjava.net/yongboy/archive/ ...
- deviceMotion.userAcceleration加速度方向
ios坐标系如图中所示,假设手机受到1个沿X正方向的力(假设该力产生了1m/s^2的加速度),那么deviceMotion.userAcceleration的值为多少呢? 答案是违反常识的:devic ...
- 克隆Rockey6加密狗复制资料
克隆Rockey6加密狗复制资料下载 描述:Rockey6加密狗复制克隆方法Rockey6加密狗复制案例解析! 一.用OD加载DLL,并分析: 10001320 >/$ B8 4C140000 ...
- HTTP协议基础总结
1,HTTP协议协议的概念:协议就是指计算机网络中,两台计算机之间进行通讯所必须共同遵守的规定和规则.HTTP协议:超文本传输协议是一种通信协议,它允许将超文本标记语言(html)文档从web服务器传 ...
- java操作Maven
记录瞬间 import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import ...
- python模块之re模块
# 正则表达式是用来匹配字符串的方法 # 字符串本身就有匹配方式,为什么要引入正则表达式? 因为原有的字符串匹配不出来原始的方法 # 正则匹配是用来进行模糊匹配的 s = "alex wan ...
- 不平衡数据下的机器学习方法简介 imbalanced time series classification
imbalanced time series classification http://www.vipzhuanli.com/pat/books/201510229367.5/2.html?page ...
- 无序数组求第k大/第k小的数
根据http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html 博客中所总结的7种解法,我挑了其中的解法3和解法6进行了实现. 解法3: ...