使用Apache POI打开.docx并使用密码保存

时间:2018-08-16 11:13:53

标签: java ms-word apache-poi docx

目标是打开现有的.docx文档,并使用密码加密将其保存。 我为此使用Apache POI库。以下代码可以正常工作,并且可以对文档进行加密和密码保护。

但是在文件创建后,我可以使用LibreOffice打开它,但是不能使用MS Word或OpenOffice Writer打开它。

文件似乎没有内容类型,因为OpenOffice向我询问了文件过滤器。但是当我选择“ Microsoft Word 2007 XML”时,我从OpenOffice收到了“常见输入输出错误”

伙计们,我能请您帮我吗? 附言 我使用Java 8和POI 3.17

    static boolean encryptOne(String documentPath, String password) {
    try {
        POIFSFileSystem fs = new POIFSFileSystem();

        EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
        Encryptor encryptor = info.getEncryptor();
        encryptor.confirmPassword(password);

        OPCPackage opc = OPCPackage.open(new File(documentPath), PackageAccess.READ_WRITE);
        opc.save(encryptor.getDataStream(fs));
        opc.close();

        FileOutputStream fos = new FileOutputStream(documentPath);
        fs.writeFilesystem(fos);
        fos.close();

        System.out.println("Document successfully encrypted");

        return true;

    } catch (IOException | GeneralSecurityException | InvalidFormatException e) {
        ExceptionPrinter.printOutStream(e);

        return false;
    }
}

1 个答案:

答案 0 :(得分:0)

因此,我通过更改EncryptionMode解决了该问题:

// EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard);

我发现一些信息表明免费版(免费)的MS Word不支持ECMA-376。敏捷加密。因此,我将加密模式更改为ECMA-376.Standard,它对我有用。 我不确定这是真的,但对我来说有帮助。

希望这会对某人有所帮助。

谢谢。