gpt4 book ai didi

java - 如何在java中打开受密码保护的docx文件?

转载 作者:行者123 更新时间:2023-12-02 02:05:17 25 4
gpt4 key购买 nike

我想使用 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-based formats - Decryption 所示。 .

但是,当然必须知道 *.docx 是 Office Open XML 格式的 Word 文件,不能是 HSSFWorkbook ,这将是二进制 BIFF 文件格式的 Excel 工作簿,但必须是 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 - 如何在java中打开受密码保护的docx文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50928926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com