簡體   English   中英

如何在Java中打開受密碼保護的docx文件?

[英]How to open password protected docx file in java?

我想使用Apache POI打開受密碼保護的docx文件。 有人可以幫我提供完整的代碼嗎? 無法獲得此代碼的解決方案

線程“主”中的異常org.apache.poi.poifs.filesystem.OfficeXmlFileException:提供的數據似乎在Office 2007+ XML中。 您正在調用POI的OLE2 Office文檔。 您需要在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);

解密Microsoft Office基於XML格式的基本代碼以基於XML的格式-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();

 }
}

我已經解決了。 代碼如下

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM