如何在java中打开受密码保护的docx文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在java中打开受密码保护的docx文件?相关的知识,希望对你有一定的参考价值。
我想使用Apache POI打开受密码保护的docx文件。任何人都可以帮我完整的代码吗?我没有得到这个代码的解决方案
线程“main”中的异常org.apache.poi.poifs.filesystem.OfficeXmlFileException:提供的数据似乎位于Office 2007+ XML中。您正在调用处理OLE2 Office文档的POI部分。您需要调用POI的不同部分来处理org.apache.poi.poifs.storage中的org.apache.poi.poifs.storage.HeaderBlock。(HeaderBlock.java:126)中的数据(例如XSSF而不是HSSF)。 .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);
解密基于XML的Microsoft Office格式的基本代码显示在XML-based formats - Decryption中。
但当然必须知道*.docx
,这是Office Open XML格式的Word
文件,不能是HSSFWorkbook
,这将是二进制Excel
文件格式的BIFF
工作簿,但必须是XWPFDocument
。
所以:
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();
}
}
我解决了这个问题。代码如下
POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream("D:/abc.docx"));
EncryptionInfo info=new EncryptionInfo(fs);
Decryptor decryptor=Decryptor.getInstance(info);
XWPFDocument document=null;
if(decryptor.verifyPassword("password"))
{
InputStream dataStream = decryptor.getDataStream(fs);
document = new XWPFDocument(dataStream);
}else{
throw new Exception("file is protected with password...please open with right password");
}
File f=new File("D:/abc.docx");
FileOutputStream fos = new FileOutputStream(f);
document.write(fos);
document.close();
以上是关于如何在java中打开受密码保护的docx文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 java 应用程序在文件资源管理器中打开受密码保护的文件夹
如何使用实体框架打开受密码保护的 SQL Server CE 数据库
我需要在 Excel 文件中打开受密码保护的 VBA 项目 [重复]
Eclipse 无法打开 java 文件 -> 无法创建受保护的最终 java.lang.Class java.lang.ClassLoader.defineClass