You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java读取受密码保护的.doc格式文件?

读取受密码保护的.doc文件的Java解决方案

你当前用Apache POI处理加密.docx的逻辑无法直接复用在.doc文件上,因为二进制Word(.doc)采用旧版OLE2加密机制,而非.docx的OOXML加密体系。以下是两个可行的免费方案:

方案一:Apache POI HWPF组件直接处理

利用POI的HWPF(处理二进制Word的模块,属于poi-scratchpad包)配合加密解密工具,直接读取加密.doc文件:

依赖要求

需要引入poi和poi-scratchpad依赖(以Maven为例):

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>5.2.5</version>
</dependency>

代码实现

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.poifs.crypt.Decryptor;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import java.io.FileInputStream;
import java.io.InputStream;

public class EncryptedDocReader {
    public static void main(String[] args) throws Exception {
        String docPath = "path/to/your/encrypted.doc";
        String password = "your-doc-password";

        try (FileInputStream fis = new FileInputStream(docPath);
             POIFSFileSystem fs = new POIFSFileSystem(fis)) {

            // 针对旧版Office加密的.doc,指定legacy模式初始化加密信息
            EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.LEGACY, fs);
            Decryptor decryptor = Decryptor.getInstance(encryptionInfo);

            if (!decryptor.verifyPassword(password)) {
                throw new IllegalArgumentException("密码错误");
            }

            // 解密后加载HWPF文档并提取内容
            try (InputStream decryptedStream = decryptor.getDataStream(fs);
                 HWPFDocument doc = new HWPFDocument(decryptedStream);
                 WordExtractor extractor = new WordExtractor(doc)) {

                String docContent = extractor.getText();
                // 处理文档内容
                System.out.println(docContent);
            }
        }
    }
}

注意事项

  • 仅支持Office 97-2003格式的加密.doc文件;
  • 若遇到更复杂的加密类型(如Office 2007+针对.doc的加密),可能需要额外处理,但此类场景较少见。

方案二:Apache Tika简化处理

Apache Tika封装了POI的底层逻辑,可更简洁地处理加密文档,无需手动操作POIFS和加密组件:

依赖要求

引入Tika核心及标准解析器包:

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers-standard-package</artifactId>
    <version>2.9.1</version>
    <type>pom</type>
</dependency>

代码实现

import org.apache.tika.Tika;
import org.apache.tika.parser.microsoft.OfficeParserConfig;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

public class TikaEncryptedDocReader {
    public static void main(String[] args) throws Exception {
        String docPath = "path/to/your/encrypted.doc";
        String password = "your-doc-password";

        Tika tika = new Tika();
        OfficeParserConfig officeConfig = new OfficeParserConfig();
        officeConfig.setPassword(password);

        // 传递密码配置到Tika上下文
        Map<String, Object> context = new HashMap<>();
        context.put(OfficeParserConfig.class.getName(), officeConfig);

        // 直接解析并获取文档内容
        String docContent = tika.parseToString(new File(docPath), context);
        // 处理文档内容
        System.out.println(docContent);
    }
}

注意事项

  • Tika底层仍依赖POI的HWPF模块,支持的加密类型与方案一一致;
  • 该方案同时支持处理加密的.docx、.xls等其他Office格式,适合多格式统一处理场景。

内容的提问来源于stack exchange,提问作者Facundo Laxalde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:38:25