一、背景介绍
Word文档与日常办公密不可分,在实际应用中,当某一文档服务器中有很多Word文档,假如有成千上万个文档时,用户查找打开包含某些指定关键字的文档就变得很困难,一般情况下能想到的解决方案是使用服务器端的Apache poi技术将所有文档的文本获取后存储到数据库,然后打开文档时利用sql语句检索文档是否包含关键字来判断是否是打开文档。但是这种解决办法有很大的弊端,首先poi技术对word文档支持不是很好,其中支持word的接口单一而且不太稳定,对word文档的格式也要求很高。其次如果将成千上万个文档使用poi将其文本内容存储到数据库这一操作将会在很大程度上影响服务器的性能。本文的方案采用PageOffice提供的获取Word文档全文纯文本的功能,在每次编辑保存文件的同时,把Word文档全文纯文本提取出来保存到数据库,利用数据库sql语句检索文档是否包含关键字来实现这一需求。因为PageOffice获取全文的纯文本文档是客户端执行的,这样就在很大程度上减轻了对服务器的压力,提高了服务器的性能。
二、主要实现代码
1. 调用PageOffice在线打开word文件:test.doc
PageOfficeCtrl poCtrl=newPageOfficeCtrl(request);//设置服务器页面
poCtrl.setServerPage(request.getContextPath()+"/poserver.zz");//设置保存页面为SaveFile.jsp,或SaveFile.do SaveFile.action 等action方法或RequestMapping方法均可
poCtrl.setSaveFilePage("SaveFile.jsp");//打开Word文档
poCtrl.webOpen("doc/test.doc",OpenModeType.docNormalEdit,"张三");
2. 在保存文件的页面(SaveFile.jsp)或方法里执行:
FileSaver fs=newFileSaver(request,response);
fs.saveToFile(request.getSession().getServletContext().getRealPath("SaveAndSearch/doc/")+"/"+fs.getFileName());
fs.setCustomSaveResult("ok");
String strDocumentText=fs.getDocumentText();//获取文档的纯文本内容,不带任何附加格式//--开始 更新数据库中文档的文本内容,以SQLite数据库为例 ---
int id=Integer.parseInt(request.getParameter("id"));
Class.forName("org.sqlite.JDBC");
String strUrl= "jdbc:sqlite:"
+ this.getServletContext().getRealPath("demodata/") + "\\SaveAndSearch.db";
Connection conn=DriverManager.getConnection(strUrl);
Statement stmt=conn.createStatement();
String strsql="update word set Content='"+strDocumentText+"' where id="+id;
stmt.executeUpdate(strsql);
stmt.close();
conn.close();//--结束 更新数据库中文档的文本内容 ---
fs.close();
3. 需要对全文检索的时候,只需对数据库中保存了word文件纯文本内容的Content字段做查询即可实现。
三、示例说明
1. 下载地址:http://www.zhuozhengsoft.com/dowm/,下载PageOffice for JAVA 开发包
2. 示例部署:解压PageOffice开发包,拷贝Samples4文件夹到Tomcat的Webapps目录下,访问:http://localhost:8080/Samples4/index.html,查看示例演示:三、14、全文搜索包含关键字的Word文档