我想使用 Apache POI 打开受密码保护的 docx 文件。谁能帮我完整的代码吗?我无法使用此代码得到解决方案
线程“main”org.apache.poi.poifs.filesystem.OfficeXmlFileException 中出现异常:提供的数据似乎位于 Office 2007+ XML 中。您正在调用 POI 中处理 OLE2 Office 文档的部分。您需要调用 POI 的不同部分来处理此数据(例如 XSSF 而不是 HSSF)
在 org.apache.poi.poifs.storage.HeaderBlock.(HeaderBlock.java:126)
在 org.apache.poi.poifs.storage.HeaderBlock.(HeaderBlock.java:113)
在 org.apache.poi.poifs.filesystem.NPOIFSFileSystem.(NPOIFSFileSystem.java:301)
在 org.apache.poi.hssf.usermodel.HSSFWorkbook。(HSSFWorkbook.java:413)
在 org.apache.poi.hssf.usermodel.HSSFWorkbook。(HSSFWorkbook.java:394)
POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream("D:/abc.docx"));
EncryptionInfo info=new EncryptionInfo(fs);
Decryptor decryptor=Decryptor.getInstance(info);
if(!decryptor.verifyPassword("user"))
{
throw new RuntimeException("document is encrypted");
}
InputStream in=decryptor.getDataStream(fs);
HSSFWorkbook wb=new HSSFWorkbook(in);
File f=new File("D:/abc5.docx");
wb.write(f);
用于解密 Microsoft Office 基于 XML 的格式的基本代码如下所示基于 XML 的格式 - 解密 https://poi.apache.org/encryption.html#XML-based+formats+-+Decryption.
但当然我们必须知道*.docx
,这是一个Word
Office Open XML 格式的文件不能是HSSFWorkbook
,这将是一个Excel
二进制工作簿BIFF
文件格式,但必须是XWPFDocument
.
So:
import java.io.InputStream;
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.Decryptor;
import java.security.GeneralSecurityException;
public class ReadEncryptedXWPF {
static XWPFDocument decryptdocx(POIFSFileSystem filesystem, String password) throws Exception {
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);
return new XWPFDocument(dataStream);
} catch (GeneralSecurityException ex) {
throw new RuntimeException("Unable to process encrypted document", ex);
}
}
public static void main(String[] args) throws Exception {
POIFSFileSystem filesystem = new POIFSFileSystem(new FileInputStream("abc.docx"));
XWPFDocument document = decryptdocx(filesystem, "user");
XWPFWordExtractor extractor = new XWPFWordExtractor(document);
System.out.println(extractor.getText());
extractor.close();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)