如何在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 数据库

如何使用 c# 以写入模式打开受密码保护的 Zip 文件?

如何使用python打开受密码保护的excel文件?

我需要在 Excel 文件中打开受密码保护的 VBA 项目 [重复]

Eclipse 无法打开 java 文件 -> 无法创建受保护的最终 java.lang.Class java.lang.ClassLoader.defineClass