如何使用Apache POI解密.doc / docx文件?

时间:2018-06-27 06:28:50

标签: java eclipse apache-poi

我正在尝试使用Apache POI打开受密码保护的.doc文件。但是,我得到了错误。

  

org.apache.poi.EncryptedDocumentException:无法处理加密的单词文件

任何人都可以帮助我解决这个问题。 如果能得到我的代码,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

EncryptedDocumentException表示您正在尝试处理以前未“解锁”的加密文档。

以下代码段适合检查基于XML的格式( .xlsx,.pptx,.docx,... )是否属于这种情况,以便您以后可以安全地对其进行处理上:

String password = "secret"; // set password
File fileToProcess; // obtain/read/open the file here....
NPOIFSFileSystem filesystem  = new NPOIFSFileSystem(fileToProcess);
EncryptionInfo info = new EncryptionInfo(filesystem);
Decryptor d = Decryptor.getInstance(info);

try {
    if (!d.verifyPassword(password)) {
        throw new RuntimeException("Unable to process: document is encrypted");
    }

    InputStream dataStream = d.getDataStream(filesystem);

    // parse dataStream as the document is now processable from here on
    // ...

} catch (GeneralSecurityException ex) {
    throw new RuntimeException("Unable to process encrypted document", ex);
}

以上示例取自encryption section of the official POI documentation,并根据项目的JavaDoc进行了修改。您可能要检查/读取类Decryptor和/或NPOIFSFileSystem的JavaDoc。

如果要转换二进制文件格式( .xls,.ppt,.doc,... ),请查看加密部分中的代码示例。< / p>

希望有帮助。

答案 1 :(得分:0)

由于最初的问题是解密二进制*.doc格式:

Apache POI - Encryption support Binary formats中的代码需要进行一些更新才能与HWPF一起使用。无法从NPOIFSFileSystem创建HWPFDocument。需要POIFSFileSystem。但是其他都一样。

运行此代码后,使用密码“ pass”对file.doc进行了加密,新文件fileDecrypted.doc被解密,无需密码即可打开。

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hwpf.HWPFDocument;

import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ReadEncryptedHWPF {

 public static void main(String[] args) throws Exception {

  Biff8EncryptionKey.setCurrentUserPassword("pass"); 
  POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("file.doc")); 
  HWPFDocument doc = new HWPFDocument(fs);
  Biff8EncryptionKey.setCurrentUserPassword(null);
  doc.write(new FileOutputStream("fileDecrypted.doc"));
  doc.close();

  doc = new HWPFDocument(new FileInputStream("fileDecrypted.doc"));
  org.apache.poi.hwpf.extractor.WordExtractor extractor = new org.apache.poi.hwpf.extractor.WordExtractor(doc);
  System.out.println(extractor.getText());
  extractor.close();

 }
}