word與html互轉(1) -- word轉html

使用忠告

使用該方式進行xhtml到word的轉換, 簡單轉換是可以, 但是可能并沒有想象中那么滿意, 轉換出來的word格式并不完美, 比如目錄和標題都會丟失, 標題顯示看起來一樣, 但是是用正文加粗和加大字號來顯示的. 畢竟word是一種文檔格式, 而html是一種標記性語言, 要想實現完美兼容和轉換很難

加上word與html互轉(2) -- html轉word, 雖然word與html互轉都有實現手段, 但是考慮到轉換的格式復雜度和后期的維護成本, 我們最后放棄去實現這個成本高但是對項目影響不大的功能

其中word轉html功能實現中, 轉出的html的格式并沒有想象中的好, 某些樣式是通過class樣式來顯示的, 并不全是行內樣式, 并且html所有文本標簽都是使用的p標簽, 包括標題.

實現

實現方式

我在網上搜集了很多實現方式, 各式各樣的, 最后我決定使用poi+xdocreport來實現
poi都熟悉, 這邊我不作介紹
xdocreport是github上的一個開源項目, 他的具體介紹可以去他的項目地址查看--項目地址, 選擇這個開源項目主要有以下幾個原因:
????1. 他是開源的(免費)
????2項目本身模塊化, 我們可以只引用需要的功能(輕量化)
????3.轉換是基于poi的轉換進行補充擴展的,感覺比poi原生的更好一些(emm...沒驗證)
????4.使用簡單便捷
這里只使用了xdocreport的轉換器功能, 可以點這里直接查看對應的wiki

引入相關程序包

 <dependency>
  <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.14</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.14</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.14</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.poi.xwpf.converter.xhtml</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>3.14</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>ooxml-schemas</artifactId>
    <version>1.3</version>
</dependency>

docx轉html

    public static void main(String[] args) {
        String fileInName = "test.docx";
        XWPFDocument document = null;
        try {
            document = new XWPFDocument(new FileInputStream(fileInName));
            XHTMLOptions options = XHTMLOptions.create();
            options.setImageManager( new ImageManager(new File(""), "") {

                @Override
                public void extract(String imagePath, byte[] imageData) throws IOException {
                    System.out.println("這里上傳圖片到圖片服務器");
                }

                @Override
                public String resolve(String uri) {
                    return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";
                }

            });
            StringWriter stringWriter = new StringWriter();
//            XHTMLConverter.getInstance().convert( document, out, options );
            XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();
            xhtmlConverter.convert(document, stringWriter, options);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

上面我自己寫的示例跟官方的示例有所區別, 下面我貼出官方示例然后在進行解釋

/**
 * 官方示例
 */
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;

...

// 1) Load DOCX into XWPFDocument
InputStream in= new FileInputStream(new File("HelloWord.docx"));
XWPFDocument document = new XWPFDocument(in);

// 2) Prepare XHTML options (here we set the `ImageManager` to store image and resolve iamge src)
XHTMLOptions options = XHTMLOptions.create().setImageManager( new ImageManager( new File(root), "images" ) );

// 3) Convert XWPFDocument to XHTML
OutputStream out = new FileOutputStream(new File("HelloWord.htm"));
XHTMLConverter.getInstance().convert(document, out, options);

跟官方不一樣的地方的解釋
1.在給XHTMLOption設置圖片管理器對象的時候
官方是直接設置了一個圖片路徑, 生成的html里面的圖片引用指向的是設 置的路徑, 而我這邊有專門的文件服務器, 所以需要將里面的圖片上傳到圖片服務器中, 然后將html中圖片的引用指向文件服務器, 所以我重寫了圖片管理器的代碼, 將其中保存圖片和給html中圖片引用換成了自己的實現

XHTMLOptions options = XHTMLOptions.create();
options.setImageManager( new ImageManager(new File(""), "") {

    @Override
    public void extract(String imagePath, byte[] imageData) throws IOException {
        System.out.println("這里上傳圖片到圖片服務器");
    }

    @Override
    public String resolve(String uri) {
        return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";
    }

});

2.轉換并保存html的時候
官方示例是將html保存成文件到一個路徑下面, 而我的需求并不是保存文件, 而是要將生成的html分段下沉到DB, 所以可以在這里

    StringWriter stringWriter = new StringWriter();
    XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();
    xhtmlConverter.convert(document, stringWriter, options);

將官方示例的文件輸出流換成自己的StringWriter就可以了(你也可以換成自己需要的流), 我這樣替換就可以拿到html的字符串, 接著就可以使用jsoup進行html的解析并分段存儲了

doc轉html

public String doc2html() throws Exception {
    HWPFDocument hwpfDocument = new HWPFDocument(new FileInputStream("test.doc"));

    Document newDocument = XMLHelper.getDocumentBuilderFactory().newDocumentBuilder().newDocument();
    WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(newDocument);

    wordToHtmlConverter.setPicturesManager((content, pictureType, suggestedName, widthInches, heightInches) -> {
        //content是圖片內容, 這里將圖片保存到圖片服務器, 然后將保存的圖片路徑返回
        //同樣, 你也可以將圖片保存到本地相對路徑, 然后將相對路徑返回, html也能正常顯示圖片
        return "https://csdnimg.cn/pubfooter/images/csdn_cs_qr.png";
    });

    wordToHtmlConverter.processDocument(hwpfDocument);

    Transformer transformer = TransformerFactory.newInstance()
                .newTransformer();
    //指定Transformer在輸出結果樹時是否可以添加額外的空格
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    //指定輸出編碼
    transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    transformer.setOutputProperty(OutputKeys.METHOD, "html");

    //這里是希望將轉換后的流最終輸出到字符串進行返回, 如果你希望直接輸出文件, 你可以創建一個文件流放進下面的參數
    StringWriter stringWriter = new StringWriter();
    transformer.transform(new DOMSource(wordToHtmlConverter.getDocument()), new StreamResult(stringWriter));

    return stringWriter.toString();
}

示例代碼比較簡單, 但是已經具備轉換的功能, 需要注意和可能變動的點我在代碼注釋中已經說明, 可以根據需求來修改圖片的保存和最后輸出的結果

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 程序設計需要將各種需要模擬計算的內容抽象為數字。 通常采用二維數組表示2D地圖 又以不同的數字代表地圖上不同類型的...
    Godan閱讀 2,114評論 0 1
  • 博客鏈接:http://www.ideabuffer.cn/2017/05/07/理解CPU-Cache/ CPU...
    閃電是只貓閱讀 3,070評論 2 14
  • 作為大學生。對于我來說,這是第一個,讓我覺得無聊的假期。 怎么說呢,以前放假,基本上是游戲填充了所有時光,并不覺得...
    我懂xxhhz了閱讀 179評論 0 0
  • 躲在空無一人的樓頂曬太陽,心頭的悲傷都隨著陽光蕩漾。我嗅出城市的朽爛被蒸發的味道,那個黑暗的影子, 在我的右邊模仿...
    栗子_栗子閱讀 515評論 4 5
  • 問題嚴重!中國老齡化調查報告 這條音頻給你分享一份,中國老齡化調查報告。 大家都知道,中國老齡化的現象是越來越嚴重...
    嗨嗨皮皮的閱讀 734評論 0 2