如何在Java中打开受密码保护的docx文件? [英] How to open password protected docx file in java?
问题描述
我想使用Apache POI打开一个受密码保护的docx文件.有人可以帮我提供完整的代码吗?此代码无法解决问题
I want to open a password protected docx file using Apache POI. Can anyone help me with the complete code please? Am not getting solution with this code
线程主"中的异常org.apache.poi.poifs.filesystem.OfficeXmlFileException:提供的数据似乎在Office 2007+ XML中.您正在调用与OLE2 Office文档有关的POI部分.您需要调用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)
Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF) at org.apache.poi.poifs.storage.HeaderBlock.(HeaderBlock.java:126) at org.apache.poi.poifs.storage.HeaderBlock.(HeaderBlock.java:113) at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.(NPOIFSFileSystem.java:301) at org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:413) at 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格式的基本代码显示在
The basic code for decryption the XML-based formats of Microsoft Office is shown in XML-based formats - Decryption.
但是,当然必须知道 *.docx
(它是Office Open XML格式的 Word
文件)不能是 HSSFWorkbook
,这是二进制 BIFF
文件格式的 Excel
工作簿,但必须是 XWPFDocument
.
But of course one must know that *.docx
, which is a Word
file in Office Open XML format, cannot be a HSSFWorkbook
, which would be a Excel
workbook in binary BIFF
file format, but instead must be a 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();
}
}
这篇关于如何在Java中打开受密码保护的docx文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!