我正在尝试使用Apache POI打开受密码保护的.doc文件。但是,我得到了错误。
org.apache.poi.EncryptedDocumentException:无法处理加密的单词文件
任何人都可以帮助我解决这个问题。 如果能得到我的代码,我将不胜感激。
答案 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();
}
}