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

时间:2018-06-19 12:50:53

标签: java eclipse apache-poi docx

我想使用Apache POI打开受密码保护的docx文件。有人可以帮我提供完整的代码吗?此代码无法解决问题

线程“主”中的异常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);

2 个答案:

答案 0 :(得分:2)

XML-based formats - Decryption中显示了解密Microsoft Office基于XML格式的基本代码。

但是当然必须知道*.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();

 }
}

答案 1 :(得分:0)

我解决了这个问题。代码在下面

    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();