猿问

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

我想使用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);


MMMHUHU
浏览 237回答 2
2回答

慕标琳琳

解密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(); }}

慕标5832272

我已经解决了。代码如下    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();
随时随地看视频慕课网APP

相关分类

Java
我要回答