首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 調用 Jacob 橋接 COM 組件實現 Word 轉 HTML 完整代碼實戰

     編輯:Java 程式設計入門

背景與原理

Jacob (Java-COM Bridge) 讓 Java 程序能調用 Windows COM 組件。本方案利用 Microsoft Word 自身的 COM 接口(Word.Application),以「隱式啟動 Word → 打開文檔 → 另存為 HTML → 關閉 Word」流程實現高保真格式轉換。

版本要求:JDK 1.4+ 需 Jacob 1.9+ (含 jacob.dll 放入 java.library.path 或 JRE bin 目錄)。

Maven 依賴(現代化構建)

<dependency>
    <groupId>com.jacob</groupId>
    <artifactId>jacob</artifactId>
    1.19  </dependency>

核心轉換類

package com.example.doc;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class WordToHtmlConverter {

    /**
     * Word 文檔轉 HTML
     * @param docPath  Word 絕對路徑(含擴展名 .doc/.docx)
     * @param htmlPath 輸出 HTML 絕對路徑(不含擴展名,將自動生成 .html 及資源文件夾)
     */
    public static void convert(String docPath, String htmlPath) {
        ActiveXComponent word = new ActiveXComponent("Word.Application");
        try {
            // 1. 隱藏 Word 窗口
            word.setProperty("Visible", new Variant(false));
            
            // 2. 獲取 Documents 集合並打開文檔
            // Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, ...)
            Dispatch docs = word.getProperty("Documents").toDispatch();
            Dispatch doc = Dispatch.invoke(
                docs, "Open", Dispatch.Method,
                new Object[]{docPath, new Variant(false), new Variant(true)}, // 不確認轉換、只讀
                new int[1]
            ).toDispatch();

            // 3. 另存為 HTML (格式代碼 8 = wdFormatHTML)
            Dispatch.invoke(
                doc, "SaveAs", Dispatch.Method,
                new Object[]{htmlPath, new Variant(8)},
                new int[1]
            );

            // 4. 關閉文檔(不保存變更)
            Variant saveChanges = new Variant(false);
            Dispatch.call(doc, "Close", saveChanges);

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Word 轉 HTML 失敗: " + e.getMessage(), e);
        } finally {
            // 5. 強制退出 Word 進程,防止殭屍進程
            word.invoke("Quit", new Variant[]{});
        }
    }

    public static void main(String[] args) {
        convert("C:/docs/輸送調度系統總體方案.doc", "C:/output/輸送調度系統總體方案");
    }
}

關鍵參數說明

參數/常量含義
Visible = false後台運行,不彈出 Word 界面
Open 第 2/3 參數false 不確認格式轉換,true 只讀模式
SaveAs 格式代碼 8wdFormatHTML,其他常用:10=PDF(需 Word 2007+)、17=XML
Quit必須調用,否則 Word 進程殘留佔用授權/內存

常見問題與解決方案

  • UnsatisfiedLinkError: jacob.dll → 將 jacob.dll (32/64 位匹配 JDK) 放入 %JAVA_HOME%/bin 或啟動參數 -Djava.library.path=path/to/dll
  • 轉換卡死/無響應 → Word 彈出對話框(宏安全、轉換確認),需設置 DisplayAlerts = false、AutomationSecurity = msoAutomationSecurityForceDisable
  • 中文路徑亂碼 → 確保 Java 源文件 UTF-8 編譯,Jacob 內部用 Unicode 傳遞
  • 併發轉換衝突 → Word COM 為單進程單線程模型,需串行隊列或進程池隔離
  • Linux/Mac 不支持 → 僅限 Windows + 安裝 Word。跨平台方案請用 Apache POI (簡單文檔)、LibreOffice headless、Aspose.Words (商業) 或云端轉換 API

現代化替代方案對比

方案優點缺點適用場景
Jacob + Word COM格式保真度最高、支持複雜排版/圖表/公式需 Windows+Word 授權、併發差、部署重企業內網、高保真要求、Windows 服務器
Apache POI純 Java、跨平台、開源免費複雜排版/圖表轉 HTML 效果差簡單文檔、文本提取、元數據讀寫
LibreOffice Headless跨平台、開源、格式支持廣啟動慢、內存大、字體兼容性依賴系統Linux 服務器、批量轉換、無 Word 授權
Aspose.Words純 Java、功能最全、無需 Office商業收費(昂貴)商業項目、高可靠、預算充足

總結

Jacob 橋接 Word COM 是「高保真 Word 轉 HTML」在 Windows 平台最經典、成熟的方案。核心要點:隱式啟動、只讀打開、格式代碼 8、強制 Quit、串行化併發。現代項目若需跨平台或無 Office 授權,建議遷移至 LibreOffice Headless 或商業庫 Aspose.Words。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved