【问题标题】:How to protect an already existing PDF with a password?如何使用密码保护已经存在的 PDF?
【发布时间】:2014-12-02 12:22:26
【问题描述】:

如何为现有的 PDF 设置密码?

【问题讨论】:

标签: java itext


【解决方案1】:

你看过我书中第 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?

【讨论】:

  • 如果只有字节数组作为输入,你如何加密 pdf - 并且需要另一个字节数组作为输出,这是可能的?
  • @AlbertoAcuña,回答您的问题并参考布鲁诺的回答。
  • 抛出 java.lang.NoClassDefFoundError: 解析失败:Lorg/spongycastle/crypto/engines/AESFastEngine;
  • 奇怪的是,Chrome 似乎无需输入密码即可显示使用此代码创建的 PDF。 Firefox 和 MacOS 中的 Preview-App 需要它。
  • 我之前的评论可能与我使用iText 2.1.7有关。使用此调用时,加密工作 stamper.setEncryption(userPassword.getBytes(), ownerPassword.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
【解决方案2】:

@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);

//removed manual write to output stream

        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();
    }

【讨论】:

  • ByteArrayOutputStream?
  • @Lijo,请完成您的问题。我没明白。
  • 这对我不起作用,我仍然可以在没有密码提示的情况下打开我的 PDF。
猜你喜欢
  • 2011-12-23
  • 2015-04-19
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多