如何使用密码保护已存在的PDF?

时间:2014-12-02 12:22:26

标签: java itext

如何设置现有PDF的密码?

2 个答案:

答案 0 :(得分:3)

您是否看过我书中第12章的EncryptionPdf示例?

这很简单:

public void encryptPdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.setEncryption(USER, OWNER,
        PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
    stamper.close();
    reader.close();
}

请注意,USEROWNER的类型为byte[]。您有不同的权限选项(查找以ALLOW_开头的常量),您可以选择不同的加密算法。

至于参数:src是现有PDF的路径。 dest是加密PDF的路径。很明显,在阅读文件时无法写入文件。这在此解释:How to update a PDF without creating a new PDF?

答案 1 :(得分:0)

@Alberto的答案问题:如果只有字节数组作为输入,而又需要另一个字节数组作为输出,那么如何加密pdf,使用上一个答案。

我有一个名为addPassword(byte [] templateByte)的方法,该方法接受PDF文件的字节数组作为参数,并返回加密的字节数组作为响应。

public byte[] addPassword(byte[] templateByte)
    {

        String USER_PASS = "Hello123";
        String OWNER_PASS = "Deva123";
        PdfReader pdfReader = null;

        ByteArrayOutputStream byteArrayOutputStream = ByteArrayOutputStream(templateByte.length);

        byteArrayOutputStream.write(templateByte, 0, templateByte.length); 

        try
        {

            pdfReader = new PdfReader(templateByte);
            PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);
            stamper.setEncryption(USER_PASS.getBytes(), OWNER_PASS.getBytes(),
                    PdfWriter.ALLOW_PRINTING,
                    PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
            stamper.close();
            pdfReader.close();

            return byteArrayOutputStream.toByteArray();

        }
        catch (Exception e)
        {

            e.printStackTrace();
        }

        return byteArrayOutputStream.toByteArray();
    }