为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMMHUHU 2021-04-07 13:38:50
我想使用Apache POI打开受密码保护的docx文件。有人可以帮我提供完整的代码吗?无法通过此代码获得解决方案线程“主”中的异常org.apache.poi.poifs.filesystem.OfficeXmlFileException:提供的数据似乎在Office 2007+ XML中。您正在调用与OLE2 Office文档有关的POI部分。您需要在org.apache.poi.poifs.storage处的org.apache.poi.poifs.storage.HeaderBlock。(HeaderBlock.java:126)处调用POI的不同部分来处理此数据(例如XSSF而不是HSSF)。 org.apache.poi.poifs.filesystem.NPOIFSFileSystem。(NPOIFSFileSystem.java:301)的.HeaderBlock。(HeaderBlock.java:113)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 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

解密Microsoft Office基于XML格式的基本代码以基于XML的格式-Decryption显示。


但是当然必须知道*.docx,它不能是WordOffice Open XML格式的文件,而应该是二进制文件格式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();


 }

}


查看完整回答
反对 回复 2021-04-14
?
慕标5832272

TA贡献1966条经验 获得超4个赞

我已经解决了。代码如下


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


查看完整回答
反对 回复 2021-04-14
  • 2 回答
  • 0 关注
  • 236 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信