陳進(jìn)才
摘要:隨著我國(guó)互聯(lián)網(wǎng)和信息化的發(fā)展,越來(lái)越多的企事業(yè)單位及政府單位實(shí)現(xiàn)了基于互聯(lián)網(wǎng)的辦公自動(dòng)化,通過(guò)辦公自動(dòng)化系統(tǒng)實(shí)現(xiàn)日常辦公,大大提高了辦公效率。自動(dòng)化辦公系統(tǒng)中通常存在著大量對(duì)WORD文檔的操作,但WORD文檔不能在瀏覽器中預(yù)覽和編輯,只有下載后才能預(yù)覽和編輯,編輯后又不能直接保存到服務(wù)器上,這給廣大用戶(hù)在使用上造成了很大不便。本文重點(diǎn)討論在互聯(lián)網(wǎng)辦公自動(dòng)化系統(tǒng)中如何在線進(jìn)行WORD文檔的預(yù)覽及編輯。
關(guān)鍵詞: PIO;WORD讀寫(xiě);WORD在線預(yù)覽;WORD在線編輯;辦公自動(dòng)化
中圖分類(lèi)號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)07-0215-02
1 引言
基本互聯(lián)網(wǎng)的辦公自動(dòng)化系統(tǒng)通常是B/S架構(gòu),也就是客戶(hù)端是瀏覽器,后端是服務(wù)器。該架構(gòu)相對(duì)于C/S架構(gòu)的優(yōu)勢(shì)是客戶(hù)端直接使用PC系統(tǒng)集成的瀏覽器訪問(wèn)系統(tǒng),不需要專(zhuān)門(mén)在每臺(tái)客戶(hù)機(jī)上安裝客戶(hù)端軟件。C/S架構(gòu)的系統(tǒng)需要在每個(gè)客戶(hù)電腦上安裝客戶(hù)端,所以相對(duì)B/S架構(gòu)維護(hù)起來(lái)比較麻煩;C/S架構(gòu)的系統(tǒng)由于客戶(hù)端是本機(jī)程序所以能很方便地通過(guò)WINDOWS的OLE(Object Linking and Embedding,即對(duì)象連接與嵌入技術(shù))對(duì)象訪問(wèn)WORD對(duì)象,進(jìn)而對(duì)WORD文檔進(jìn)行預(yù)覽讀寫(xiě)等操作。 B/S架構(gòu)的前端是瀏覽器,由第三方公司開(kāi)發(fā),不提供對(duì)WORD文檔的直接操作,無(wú)法查看WORD文檔的內(nèi)容,通常是直接下載,下載后使用本機(jī)OFFICE打開(kāi),不能提供在線預(yù)覽功能。
2 需要解決的問(wèn)題
本單位辦公自動(dòng)化系統(tǒng)主要為本單位的日常辦公服務(wù),后端服務(wù)器端使用JAVA開(kāi)發(fā),前端使用JS開(kāi)發(fā),主要模塊有合同管理、項(xiàng)目管理、收款管理、支出管理、資料管理等,每個(gè)模塊中都要上傳WORD文檔。比如合同管理模塊,經(jīng)辦人在申請(qǐng)合同時(shí)需要上傳WORD版本的合同,然后提交部門(mén)經(jīng)理審批,部門(mén)經(jīng)理在審批該合同時(shí),只需要閱讀該合同的內(nèi)容,如發(fā)現(xiàn)有錯(cuò)誤,將退回給經(jīng)辦人,讓經(jīng)辦人修改,現(xiàn)在部門(mén)經(jīng)理閱讀該WORD文檔的辦法通常是下載該文檔,然后用本機(jī)的OFFICE軟件打開(kāi)閱讀,這樣每次閱讀都要下載一次,產(chǎn)生了大量的垃圾文件,也給他們?cè)谑褂弥性斐珊艽蟮牟槐悖凰运麄兗鼻行枰?jiǎn)便的操作,也就是需要系統(tǒng)能提供在線預(yù)覽功能,不需要下載文檔直接使用瀏覽器在線查看WORD文檔的內(nèi)容。
3 預(yù)覽WORD文檔的解決方法
由于本單位的WORD文檔是作為單獨(dú)文件存放于服務(wù)器上的,所以可以通過(guò)轉(zhuǎn)換成其瀏覽器可顯示的文件的方式來(lái)預(yù)覽WORD文檔。
3.1 將WORD文檔轉(zhuǎn)換成HTML顯示
將WORD文檔轉(zhuǎn)換成HTML顯示的方法有很多,這里使用Apache的提供的PIO庫(kù)進(jìn)行轉(zhuǎn)換;由于WORD有DOC和DOCX兩種,所以需要區(qū)別對(duì)待,以下為實(shí)現(xiàn)的關(guān)鍵代碼:
public static void docToHtml(String inFile, String outFile)
throws TransformerException, IOException,
ParserConfigurationException {
HWPFDocument hwpf = new HWPFDocument(new FileInputStream(inFile));
if (null==hwpf)
return;
WordToHtmlConverter hConverter = new WordToHtmlConverter(
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
if (null==hConverter)
return; hConverter.setPicturesManager( new PicturesManager() {
public String savePicture( byte[] content, PictureType picType, String sugName, float wInc, float hInc ) {
return "./"+sugName;
}
} );
hConverter.processDocument(hwpf);
List picList = hwpf.getPicturesTable().getAllPictures();
if (null==picList)
return;
for(int i=0;i Picture pic = (Picture)picList.get(i); try { pic.writeImageContent(new FileOutputStream("./" + pic.suggestFullFileName())); } catch (FileNotFoundException e) { e.printStackTrace(); } } Document htmFile = hConverter.getDocument(); if (null==htmFile) return; ByteArrayOutputStream outStream = new ByteArrayOutputStream();
if (null==outStream)
return;
DOMSource dmsrc = new DOMSource(htmFile);
if (null==dmsrc)
return;
StreamResult strmResult = new StreamResult(outStream);
if (null==strmResult)
return;
TransformerFactory tf = TransformerFactory.newInstance();
Transformer tformer = tf.newTransformer();
tformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tformer.setOutputProperty(OutputKeys.INDENT, "yes");
tformer.setOutputProperty(OutputKeys.METHOD, "HTML");
tformer.transform(dmsrc, strmResult);
outStream.close();
writeFile(new String(outStream.toByteArray()), ouFile);
}
將WORD文檔轉(zhuǎn)換為HTML文件后,基本可以實(shí)現(xiàn)WORD文檔的預(yù)覽功能了。
3.2 將WORD轉(zhuǎn)換為PDF進(jìn)行顯示
將WORD文檔轉(zhuǎn)換為HTML文件后,基本可以實(shí)現(xiàn)WORD文檔的預(yù)覽功能了,但是卻不能保持良好的WORD的排版格式,為了有更好的用戶(hù)體驗(yàn),可以進(jìn)一步將HTML文件轉(zhuǎn)換成PDF文檔。
1) 第一步 將WORD文檔轉(zhuǎn)換成HTML
參見(jiàn)3.1
2) 將HTML文檔轉(zhuǎn)換為PDF文檔
使用Apache的iText庫(kù)進(jìn)行轉(zhuǎn)換,以下為實(shí)現(xiàn)的關(guān)鍵代碼:
public int htmlToPdf(String inFile, String outFile)
throws Exception {
OutputStream outStream = new FileOutputStream(outFile);
ITextRenderer render = new ITextRenderer();
if (null==render || null== outStream)
return 0;
render.setDocument(new File(intFile));
ITextFontResolver tfont = render.getFontResolver();
//加入對(duì)中文字體的支持
tfont.addFont("simsunb.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); render.getSharedContext().setBaseURL("./");
render.layout(); render.createPDF(outStream);//創(chuàng)建文件
outStream.flush();//存盤(pán)
outStream.close();//關(guān)閉文件
return 1;
}
3) 顯示PDF文檔
可以通過(guò)jquery將PDF文件顯示在網(wǎng)頁(yè)中,代碼如下: