【问题标题】:protect doc with password using Apache POI in java在 java 中使用 Apache POI 使用密码保护文档
【发布时间】:2018-06-20 13:24:57
【问题描述】:

我想使用 apache poi 保护带有密码的 .doc 文件。运行代码时出现此错误。请帮帮我

线程“main”中的异常 org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: 提供的数据似乎是 OLE2 格式。你打电话给 处理 OOXML(Office Open XML)文档的 POI 的一部分。你 需要调用 POI 的不同部分来处理这些数据(例如 HSSF 而不是 XSSF) 在 org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:179) 在 org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipFile(ZipHelper.java:237) 在 org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:134) 在 org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:117) 在 org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:257)

    POIFSFileSystem fs=new POIFSFileSystem();
    EncryptionInfo info=new EncryptionInfo(EncryptionMode.agile);
    Encryptor enc=info.getEncryptor();
    enc.confirmPassword("user");
    OPCPackage opc=OPCPackage.open("D:/Amar.doc", PackageAccess.READ_WRITE);
    OutputStream os=enc.getDataStream(fs);
    opc.save(os);
    opc.close();
    FileOutputStream stream=new FileOutputStream("D:/ao.doc");
    fs.writeFilesystem(stream);
    stream.close();
    System.out.println("running");

【问题讨论】:

  • 错误显示在 OPCPackage opc=OPCPackage.open("D:/Amar.doc",PackageAccess.READ_WRITE);
  • 您似乎从docs 复制了代码。如果您仔细阅读,那么您也会看到它在XML-based formats - Encryption 部分中。对于.doc 文件,请阅读binary formats 部分
  • 但此代码适用于 .docx 格式
  • 是的,阅读我给你的链接......它的全部在那里解释......
  • 好的,谢谢......你能不能给我完整的代码来保护文档

标签: java apache-poi


【解决方案1】:

我检查并参考了Apache POI documentation,它说从3.17版本开始支持.doc文件的密码加密,所以我试了一下。

它必须使用HWPFDocument 来打开您的文档文件。 然后您需要通过以下方式设置密码:

Biff8EncryptionKey.setCurrentUserPassword(password);

完整方法:

public static void encryptDocFile(File inputDocFile, File outputDocFile, String password) {
    try {
        FileInputStream fileInput = new FileInputStream(inputDocFile);
        BufferedInputStream bufferInput = new BufferedInputStream(fileInput);
        POIFSFileSystem poiFileSystem = new POIFSFileSystem(bufferInput);
        // Setting password
        Biff8EncryptionKey.setCurrentUserPassword(password);

        HWPFDocument wordDoc = new HWPFDocument(poiFileSystem);
        FileOutputStream fileOut = new FileOutputStream(outputDocFile);
        wordDoc.write(fileOut);
        bufferInput.close();
        fileOut.close();
        wordDoc.close();
        System.out.println("Encrypted successfully");
    } catch (IOException e) {
        System.out.println("Failed to encrypt doc file");
        e.printStackTrace();
    }
}

或者你可以查看完整代码here

如果您还有其他问题或反馈,请告诉我。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    相关资源
    最近更新 更多