利用POI将word转换成html实现在线阅读

一、分析
通过网上找资料,发现用java实现word在线阅读有以下的实现方式:
1
Word=>PDF(OpenOffice+JodConverter)=>SWF(pdf2swf)=>FlexPaper浏览
2
Word=>PDF(MSOffice+JACOB)=>SWF(pdf2swf)=>FlexPaper浏览
3
Word =>SWF (FlashPaper)=> FlexPaper浏览
4
Word=>SWF(print2flash)=> FlexPaper浏览
5
用第三方收费组件:PageOffice
6
1) 利用 POI把 Word2003转换成 html;
2) 利用OpenOffice+JodConverter将word2003转换成html
  前4种方式,目标都是一致的,就是都将word文档转换成flash文件,只是中间的实现不大一样。前两种方式比较麻烦,都是先转成PDF,再转成SWF,最后用FlexPaper浏览。两种比较快捷,可直接将源文件转为SWF,用FlexPaper浏览。第二种方式用到的jacob是微软的组件,在linux平台下基本是无望的了,第一个淘汰。由于FlashPaper不是开源工具,加之Win8系统不兼容(我现在用的系统),所以就没采用第三种实现方式。Print2flash是开源工具,即使公司产品中用到也不会出现版权纠纷,遗憾的是没找到如何用程序控制该工具转换文件的命令。所以第3,4种方式也淘汰了。通过下载,预使用,发现第5种方式用PageOffice是最省时省力的,也能将word文档完美的展现,但是,要钱!!好吧,一提到钱,此种实现只能暂作废。
后面一开始是想用OpenOffice+JodConverter实现转swf的,后面在逛百度文库的时候,发现一个让我很好奇的东西。就是,百度文库里的文档基本上都用html进行展示了,也就是说,我们上传的word文档,百度对其做了html转换的处理,与页面的嵌合也相当的好。这让我想到,我们的项目中是否也可以用此方式实现word的在线预览呢。
        基于这个想法,我到谷歌找相关的资料,发现将word转html的开源工具没几个。其中,介绍得比较多的就是用POI进行转换,但是,由于POI对word的处理功能相当的弱,因此,开启了使用POI将wordàhtml的艰苦历程(后面发现网上有介绍用OpenOffice+JodConverter将word2003转换成html的方式,但是,我没有深究,有兴趣的同学可以去观望一下http://www.cnblogs.com/codeplus/archive/2011/10/22/2220952.html):
二、实现
1.      POI介绍:
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。
Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。
基本结构:
HSSF -提供读写Microsoft Excel XLS格式档案的功能。
XSSF -提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF -提供读写Microsoft Word DOC格式档案的功能。
HSLF -提供读写Microsoft PowerPoint格式档案的功能。
HDGF -提供读Microsoft Visio格式档案的功能。
HPBF -提供读Microsoft Publisher格式档案的功能。
HSMF -提供读Microsoft Outlook格式档案的功能。
其实,POI比较拿手的是处理Excel表格,即上面的HSSF及XSSF,我们的很多项目,只要涉及报表的,基本上都有用到它吧。用对于HWPF即处理DOC的包,功能就没有那么健全了,且API也不完善。
2.      poi相关包及依赖包配置。
3.      处理流程图:
1)   主体流程:
利用POI将word转换成html实现在线阅读
2)   进行word文档解释转换子流程
利用POI将word转换成html实现在线阅读
4.      代码实现

package com.lejie.common.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.List;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.w3c.dom.Document;
/**
 * 利用poi将word简单的转换成html文件 Util
 * @author weidetian
 * @version 2014-3-6
 */    
	public class Word2Html {    
    public static void main(String argv[]) {    
        try {    
            convert2Html("F:\\web\\","统一账号性能测试方案.doc");    
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
    }    
/**
 * 读出内容生成html  
 * @param content 读取word的内容
 * @param path 生成的html路径
 */	    
public static void writeFile(String content, String path) {    
    FileOutputStream fos = null;    
    BufferedWriter bw = null;    
    try {    
        File file = new File(path);    
        fos = new FileOutputStream(file);    
        bw = new BufferedWriter(new OutputStreamWriter(fos,"utf-8"));    
        bw.write(content);    
    } catch (FileNotFoundException fnfe) {    
        fnfe.printStackTrace();    
    } catch (IOException ioe) {    
        ioe.printStackTrace();    
    } finally {    
        try {    
            if (bw != null)    
                bw.close();    
            if (fos != null)    
                fos.close();    
        } catch (IOException ie) {    
        }    
    }    
}	   
/**
 * 将word文档转化,生成html
 * @param filePath 文件路径
 * @param fileName 文件名称
 * @return 生成的html路径
 * @throws TransformerException
 * @throws IOException
 * @throws ParserConfigurationException
 */
public static String convert2Html(String filePath, String fileName)    
	            throws TransformerException, IOException,    
	            ParserConfigurationException {    
        HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(filePath+fileName));//WordToHtmlUtils.loadDoc(new FileInputStream(inputFile));    
        WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(    
                DocumentBuilderFactory.newInstance().newDocumentBuilder()    
                        .newDocument());    
         wordToHtmlConverter.setPicturesManager( new PicturesManager()    
         {    
             public String savePicture( byte[] content,    
                     PictureType pictureType, String suggestedName,    
                     float widthInches, float heightInches )    
             {    
                 return suggestedName;    
             }    
         } );    
        wordToHtmlConverter.processDocument(wordDocument);    
        //save pictures    
        List pics=wordDocument.getPicturesTable().getAllPictures();    
        if(pics!=null){    
            for(int i=0;i<pics.size();i++){    
                Picture pic = (Picture)pics.get(i);    
                try {    
                    pic.writeImageContent(new FileOutputStream(filePath+ pic.suggestFullFileName()));    
                } catch (FileNotFoundException e) {    
                    e.printStackTrace();    
                }      
            }    
        }    
        Document htmlDocument = wordToHtmlConverter.getDocument();    
        ByteArrayOutputStream out = new ByteArrayOutputStream();    
        DOMSource domSource = new DOMSource(htmlDocument);    
        StreamResult streamResult = new StreamResult(out);    
        fileName = fileName.substring(0, fileName.indexOf("."));
		String outPutFilePath = filePath + fileName + ".html";
        TransformerFactory tf = TransformerFactory.newInstance();    
        Transformer serializer = tf.newTransformer();    
        serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");    
        serializer.setOutputProperty(OutputKeys.INDENT, "yes");    
        serializer.setOutputProperty(OutputKeys.METHOD, "html");    
        serializer.transform(domSource, streamResult);    
        out.close();    
        writeFile(new String(out.toByteArray()),outPutFilePath); 
        return outPutFilePath;
    }    
}    



需要的jar在附件下载

利用POI将word转换成html实现在线阅读

你可能感兴趣的:(html)