Как расшифровать файл .doc / docx с помощью Apache POI? - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь открыть защищенный паролем файл .doc, используя Apache POI. Однако я получаю ошибку.

org.apache.poi.EncryptedDocumentException: не удается обработать файл зашифрованного слова

Может кто-нибудь помочь мне в решении этого. Я буду благодарен, если смогу получить код.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Поскольку изначально речь шла о расшифровке двоичного *.doc формата:

Код в Apache POI - поддержка шифрования. Двоичные форматы необходимо немного обновить для использования с HWPF. HWPFDocument невозможно создать из NPOIFSFileSystem. Там POIFSFileSystem нужен. Но в остальном это то же самое.

Зашифровав file.doc паролем "pass", после запуска этого кода новый файл fileDecrypted.doc расшифровывается и может быть открыт без пароля.

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hwpf.HWPFDocument;

import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ReadEncryptedHWPF {

 public static void main(String[] args) throws Exception {

  Biff8EncryptionKey.setCurrentUserPassword("pass"); 
  POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("file.doc")); 
  HWPFDocument doc = new HWPFDocument(fs);
  Biff8EncryptionKey.setCurrentUserPassword(null);
  doc.write(new FileOutputStream("fileDecrypted.doc"));
  doc.close();

  doc = new HWPFDocument(new FileInputStream("fileDecrypted.doc"));
  org.apache.poi.hwpf.extractor.WordExtractor extractor = new org.apache.poi.hwpf.extractor.WordExtractor(doc);
  System.out.println(extractor.getText());
  extractor.close();

 }
}
0 голосов
/ 27 июня 2018

EncryptedDocumentException сигнализирует о том, что вы пытаетесь обработать зашифрованный документ, который ранее не был «разблокирован».

Следующий фрагмент кода подходит для проверки того, имеет ли это место для форматов на основе XML ( .xlsx, .pptx, .docx, ... ), чтобы впоследствии можно было безопасно обрабатывать его :

String password = "secret"; // set password
File fileToProcess; // obtain/read/open the file here....
NPOIFSFileSystem filesystem  = new NPOIFSFileSystem(fileToProcess);
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);

    // parse dataStream as the document is now processable from here on
    // ...

} catch (GeneralSecurityException ex) {
    throw new RuntimeException("Unable to process encrypted document", ex);
}

Приведенный выше пример взят из раздела шифрования официальной документации POI и был изменен в соответствии с JavaDoc проекта. Возможно, вы захотите проверить / прочитать JavaDoc классов Decryptor и / или NPOIFSFileSystem.

Если вы хотите преобразовать двоичные форматы файлов ( .xls, .ppt, .doc, ... ), проверьте раздел шифрования для примеров кода.

Надеюсь, это поможет.

...