前兩天幫同學實現在線預覽word文檔中的內容,而且需要提供可以下載的鏈接!在網上找了好久,都沒有什么可行的方法,只得用最笨的方法來實現了。希望得到各位大神的指教。下面我就具體談談自己的實現過程,總結一下學習中的收獲。
我相信很多程序員都遇到過,有些word文檔希望直接在瀏覽器中打開進行預覽,但是瀏覽器往往不是很配合,直接就提示下載,不像pdf文檔,瀏覽器可以直接進行預覽。Word文檔甚至始終都會通過本地的Office軟件打開。那么,問題來了,如何可以在線瀏覽word文檔呢?
其實,我在最初的時候也沒有接觸過這方面的東西,一般用的比較多的是生成pdf文檔,而瀏覽器一般都支持pdf的瀏覽,因此,直接通過后台傳來的數據,再利用java和一些相關的jar包就可以生產一個pdf文檔,在瀏覽器中可以直接顯示。盡管可以這樣,但是我們需要的是解決實際問題啊?在瀏覽器中打開word文檔。
在網上查了一些資料,也都沒有查出個所以然。看了好幾個博客和論壇,也都是大同小異,測試了好幾個,基本都是瀏覽器提示直接下載,或者打開,這里的打開也都是利用本地的Office軟件打開的,所以這並不是自己想要的結果。於是,自己動手,既然瀏覽器不支持顯示word文檔,我何不將word文檔按照原來word的樣式和內容轉為html呢?而在瀏覽器中,html是再熟悉不過了。基本思路就是這樣,首先是利用上傳的word文檔轉為html文件,然后生成的鏈接顯示在jsp頁面上,如果點擊顯示該word文檔,那么實際上瀏覽器讀取的是剛生成的html文件。
下面將自己的實現過程總結如下,歡迎各位朋友提供更好的解決辦法。轉載本文請在文章明顯位置標明文章的原始出處,個人博客:http://itred.cnblogs.com 郵箱: it_red@sina.com
1. Word文檔轉為html
這里采用第三方組件jacob來實現的,本demo所用的版本為jacob-1.18-M2;下載鏈接為:http://sourceforge.jp/projects/sfnet_jacob-project/releases/
先在這里說一下,用這個組件還是比較麻煩的,首先要根據自己的電腦實際情況將壓縮包里面的動態鏈接庫放到多個目錄下,而這個動態鏈接庫為:
將其復制的位置分別是:
C:\Windows\System32
機器所安裝的java目錄下的jdk下的bin中
在myeclipse中指定jre
然后就是編碼階段:
導入相關的jar包,新建一個WordReader類,源碼如下:
package com.mh.test; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class WordReader { public static void extractDoc(String inputFIle, String outputFile) { boolean flag = false; // 打開Word應用程序 ActiveXComponent app = new ActiveXComponent("Word.Application"); try { // 設置word不可見 app.setProperty("Visible", new Variant(false)); // 打開word文件 Dispatch doc1 = app.getProperty("Documents").toDispatch(); Dispatch doc2 = Dispatch .invoke(doc1, "Open", Dispatch.Method, new Object[] {inputFIle, new Variant(false), new Variant(true)}, new int[1]).toDispatch(); // 作為html格式保存到臨時文件::參數 new Variant(8)其中8表示word轉html;7表示word轉txt;44表示Excel轉html。。。 Dispatch.invoke(doc2, "SaveAs", Dispatch.Method, new Object[] {outputFile, new Variant(8)}, new int[1]); // 關閉word Variant f = new Variant(false); Dispatch.call(doc2, "Close", f); flag = true; } catch (Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); } if (flag == true) { System.out.println("Transformed Successfully"); } else { System.out.println("Transform Failed"); } } }
新建測試類,包含main方法:
package com.mh.test; public class TT { /** * @param args */ public static void main(String[] args) { WordReader.extractDoc("e:/f.docx","e:/ee.html"); } }
這里是將word轉為html就算完成了,因此知道了,如果需要將word轉為html就可以直接調用WordReader中的方法就可以實現。這里就不多說了。
2. 且說文件的上傳,下載
這里是利用Struts2實現的上傳功能,index頁面中的源碼:
<%@ page language="java" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>文件上傳</title> </script> </head> <body> <s:form action="upload" method="post" enctype="multipart/form-data"> <s:file name="upload" label="上傳的文件" id="ufile"></s:file> <s:submit value="上傳"></s:submit> </s:form> <div id="retShow"></div> </body> </html>
Struts.xml中的相關配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <action name="upload" class="com.mh.action.UploadAction"> <result name="success">/success.jsp</result> </action> <action name="*viewAction" class="com.mh.action.ViewAction" method="{1}"> </action> </package> <constant name="struts.multipart.saveDir" value="/tmp"></constant> </struts>
UploadAction的源碼:
package com.mh.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import org.apache.struts2.util.ServletContextAware; import com.mh.test.WordReader; import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport implements ServletContextAware { private List<File> upload; private List<String> uploadFileName; private ServletContext context; HttpServletRequest request = ServletActionContext.getRequest(); public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public String execute() throws Exception { String path = ""; if (upload != null) { for (int i = 0; i < upload.size(); i++) { System.out.println(upload.get(i).getPath() + "-----------------------------" + getUploadFileName().get(i)); InputStream is = new FileInputStream(upload.get(i)); path = context.getRealPath(getUploadFileName().get(i)); System.out.println(context.getRealPath(getUploadFileName().get(i)) + "=============="); String str = getUploadFileName().get(i); String view = getUploadFileName().get(i).replace(".docx", ".html"); request.setAttribute("str", str); request.setAttribute("view", view); OutputStream os = new FileOutputStream(context.getRealPath(getUploadFileName().get(i))); byte buffer[] = new byte[1024]; int count = 0; while ((count = is.read(buffer)) > 0) { os.write(buffer, 0, count); } os.close(); is.close(); } } System.out.println(path.replace("\\", "/")+"&&&&&&&&&&&&"); System.out.println(path.replace("\\", "/").replace(".docx", ".html")+"%%%%%%%%%%%%%"); WordReader.extractDoc(path.replace("\\", "/"), path.replace("\\", "/").replace(".docx", ".html")); return SUCCESS; } public List<File> getUpload() { return upload; } public void setUpload(List<File> upload) { this.upload = upload; } public List<String> getUploadFileName() { return uploadFileName; } public void setUploadFileName(List<String> uploadFileName) { this.uploadFileName = uploadFileName; } public void setServletContext(ServletContext context) { this.context = context; } }
ViewAction源碼:
package com.mh.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.mh.test.WordReader; import com.opensymphony.xwork2.ActionSupport; public class ViewAction extends ActionSupport { private static final long serialVersionUID = 1814430419057331187L; HttpServletRequest request = ServletActionContext.getRequest(); public void UView() { String ufile = request.getParameter("upf"); System.out.println(ufile + "++++++++++++++++"); System.out.println(ufile.replace("\\", "/") + "****************"); WordReader.extractDoc(ufile.replace("\\", "/"), ufile.replace("\\", "/").replace(".docx", ".html")); } }
在這里同時將上面實現的轉換的功能加到模塊中,只要上傳就進行轉換。在這里,我並沒有設置上傳后的文件路徑,直接按默認的上傳到ROOT目錄下,下載的時候就按照最原始的方式,直接打開word文檔的鏈接,瀏覽器就自動進行下載了,而在線預覽實際上就是打開該文檔生成的html文檔的鏈接。十分方便,但是,這樣做有一個弊端,需要隨時注意文件的數量,如果文件過多會影響程序的運行和計算機的硬件水平,同時,如果該項目需要進行重新部署,以前上傳的數據就沒有了,這也是需要考慮的,本demo只是進行拋磚引玉的作用,更多地完善,拒絕伸手主義。始終堅信,動手時最好的學習方式,願與君共勉!
實現效果如下:
下載word文檔:
預覽效果:
控制台輸出:
-------------------------注意----------------------------
在文章前就說過,要想用好這個第三方的組件,就必須了解自己的計算機,然后根據實際情況配置好環境;在程序的實現過程中,就遇到一些常見錯誤:
(1) Open錯誤:說明沒有找到指定路徑下的word文檔,要么就是路徑中的斜杠寫反了,本人犯錯最多的地方;解決辦法:配置並確認好路徑后再進行運行;
(2)SaveAs錯誤:路徑問題;解決辦法同上。
(3)注意tomcat和jdk。
-------------------------------------------------------------------
探索,讓人無悔;失敗,令人思索;剩下的便是心平氣和,專心致志,既不瞻前顧后,也不無目的地四面出擊。
郵箱:it_red@sina.com 個人博客: http://itred.cnblogs.com 網站: http://wangxingyu.jd-app.com
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但請在文章顯眼位置標明文章出處。未經本人書面同意,將其作為他用,本人保留追究責任的所有權利。