java poi Word文檔轉(zhuǎn)為HTML文件 實現(xiàn)在線預(yù)覽功能

Java代碼

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.apache.poi.xwpf.converter.core.BasicURIResolver;
import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.core.FileURIResolver;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.w3c.dom.Document;

/**
 * word 轉(zhuǎn)換成html 2017-2-27
 */
public class Word2Html {

    /**
     * 將word2003轉(zhuǎn)換為html文件 2017-2-27
     * 
     * @param wordPath
     *            word文件路徑
     * @param wordName
     *            word文件名稱無后綴
     * @param suffix
     *            word文件后綴
     * @throws IOException
     * @throws TransformerException
     * @throws ParserConfigurationException
     */
    public static String Word2003ToHtml(String wordPath, String wordName,
            String suffix) throws IOException, TransformerException,
            ParserConfigurationException {
        String htmlPath = wordPath + File.separator +  "html"
                + File.separator;
        String htmlName = wordName + ".html";
        final String imagePath = htmlPath + "image" + File.separator;

        // 判斷html文件是否存在恩够,每次重新生成
        File htmlFile = new File(htmlPath + htmlName);
//      if (htmlFile.exists()) {
//          return htmlFile.getAbsolutePath();
//      }

        // 原word文檔
        final String file = wordPath + File.separator + wordName + suffix;
        InputStream input = new FileInputStream(new File(file));

        HWPFDocument wordDocument = new HWPFDocument(input);
        WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
                DocumentBuilderFactory.newInstance().newDocumentBuilder()
                        .newDocument());
        
        // 設(shè)置圖片存放的位置
        wordToHtmlConverter.setPicturesManager(new PicturesManager() {
            public String savePicture(byte[] content, PictureType pictureType,
                    String suggestedName, float widthInches, float heightInches) {
                File imgPath = new File(imagePath);
                if (!imgPath.exists()) {// 圖片目錄不存在則創(chuàng)建
                    imgPath.mkdirs();
                }
                File file = new File(imagePath + suggestedName);
                try {
                    OutputStream os = new FileOutputStream(file);
                    os.write(content);
                    os.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 圖片在html文件上的路徑 相對路徑
                return "image/" + suggestedName;
            }
        });

        // 解析word文檔
        wordToHtmlConverter.processDocument(wordDocument);
        Document htmlDocument = wordToHtmlConverter.getDocument();

        // 生成html文件上級文件夾
        File folder = new File(htmlPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }

        // 生成html文件地址
        OutputStream outStream = new FileOutputStream(htmlFile);

        DOMSource domSource = new DOMSource(htmlDocument);
        StreamResult streamResult = new StreamResult(outStream);

        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer serializer = factory.newTransformer();
        serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
        serializer.setOutputProperty(OutputKeys.INDENT, "yes");
        serializer.setOutputProperty(OutputKeys.METHOD, "html");

        serializer.transform(domSource, streamResult);

        outStream.close();

        return htmlFile.getAbsolutePath();
    }

    /**
     * 2007版本word轉(zhuǎn)換成html 2017-2-27
     * 
     * @param wordPath
     *            word文件路徑
     * @param wordName
     *            word文件名稱無后綴
     * @param suffix
     *            word文件后綴
     * @return
     * @throws IOException
     */
    public static String Word2007ToHtml(String wordPath, String wordName, String suffix)
            throws IOException {
        String htmlPath = wordPath + File.separator +  "html"
                + File.separator;
        String htmlName = wordName + ".html";
        String imagePath = htmlPath + "image" + File.separator;

        // 判斷html文件是否存在
        File htmlFile = new File(htmlPath + htmlName);
//      if (htmlFile.exists()) {
//          return htmlFile.getAbsolutePath();
//      }

        // word文件
        File wordFile = new File(wordPath + File.separator + wordName + suffix);

        // 1) 加載word文檔生成 XWPFDocument對象
        InputStream in = new FileInputStream(wordFile);
        XWPFDocument document = new XWPFDocument(in);

        // 2) 解析 XHTML配置 (這里設(shè)置IURIResolver來設(shè)置圖片存放的目錄)
        File imgFolder = new File(imagePath);
        XHTMLOptions options = XHTMLOptions.create();
        options.setExtractor(new FileImageExtractor(imgFolder));
        // html中圖片的路徑 相對路徑
        options.URIResolver(new BasicURIResolver("image"));
        options.setIgnoreStylesIfUnused(false);
        options.setFragment(true);

        // 3) 將 XWPFDocument轉(zhuǎn)換成XHTML
        // 生成html文件上級文件夾
        File folder = new File(htmlPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        OutputStream out = new FileOutputStream(htmlFile);
        XHTMLConverter.getInstance().convert(document, out, options);

        return htmlFile.getAbsolutePath();
    }

    public static void main(String[] args) throws Exception,
            TransformerException, ParserConfigurationException {
        System.out.println(Word2003ToHtml("C:/", "1", ".doc"));
//      System.out.println(Word2007ToHtml("C:/", "docx", ".docx"));
    }
}

需要的jar包

下載地址 https://pan.baidu.com/s/1jHJQSxK

找相關(guān)jar包找了好久,測試了03和07版本的word文檔伍宦,插入了簡單圖片咐鹤,均可轉(zhuǎn)換為HTML文件,復雜word文檔未做測試签舞。
參考來源 http://www.jb51.net/article/109307.htm

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秕脓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子儒搭,更是在濱河造成了極大的恐慌吠架,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搂鲫,死亡現(xiàn)場離奇詭異傍药,居然都是意外死亡,警方通過查閱死者的電腦和手機魂仍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門拐辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人擦酌,你說我怎么就攤上這事俱诸。” “怎么了赊舶?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵睁搭,是天一觀的道長。 經(jīng)常有香客問我笼平,道長园骆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任出吹,我火速辦了婚禮遇伞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捶牢。我一直安慰自己鸠珠,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布秋麸。 她就那樣靜靜地躺著渐排,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灸蟆。 梳的紋絲不亂的頭發(fā)上驯耻,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音炒考,去河邊找鬼可缚。 笑死,一個胖子當著我的面吹牛斋枢,可吹牛的內(nèi)容都是我干的帘靡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瓤帚,長吁一口氣:“原來是場噩夢啊……” “哼描姚!你這毒婦竟也來了涩赢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤轩勘,失蹤者是張志新(化名)和其女友劉穎筒扒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绊寻,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡花墩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了榛斯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片观游。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡搂捧,死狀恐怖驮俗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情允跑,我是刑警寧澤王凑,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站聋丝,受9級特大地震影響索烹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弱睦,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一百姓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧况木,春花似錦垒拢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屹耐,卻和暖如春尸疆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惶岭。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工寿弱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人按灶。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓症革,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兆衅。 傳聞我的和親對象是個殘疾皇子地沮,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容