在Java中使用Apache POI用密码保护文档

时间:2018-06-20 13:24:57

标签: java apache-poi

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

  

线程“主”中的异常   org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException:   提供的数据似乎是OLE2格式。您正在呼叫   POI的一部分,用于处理OOXML(Office Open XML)文档。您   需要调用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");

1 个答案:

答案 0 :(得分:0)

我检查并参考了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

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