如何使用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
相关产品推荐
相关产品推荐

