猿问

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

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

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

谁能帮我解决这个问题。如果能得到我的代码,我将不胜感激。


慕桂英3389331
浏览 449回答 2
2回答

子衿沉夜

一个EncryptedDocumentException信号,你正在尝试处理先前没有“解锁”的加密文档。以下代码段适合检查基于XML的格式(.xlsx,.pptx,.docx等)是否适用,以便以后可以安全地对其进行处理:String password = "secret"; // set passwordFile 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);}上面的示例摘自官方POI文档的加密部分,并根据项目的JavaDoc进行了修改。您可能要检查/阅读类Decryptor和/或的JavaDoc NPOIFSFileSystem。如果要转换二进制文件格式(.xls,.ppt,.doc等),请查看加密部分以获取代码示例。

GCT1015

由于问题最初是关于解密二进制*.doc格式的,所以:Apache POI加密支持中的代码二进制格式需要稍作更新以用于HWPF。无法从创建HWPFDocumentNPOIFSFileSystem。有POIFSFileSystem需要。但是其他都是一样的。在file.doc运行此代码后,使用密码“ pass”进行了加密,新文件将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(); }}
随时随地看视频慕课网APP

相关分类

Java
我要回答