【发布时间】:2014-12-02 12:22:26
【问题描述】:
如何为现有的 PDF 设置密码?
【问题讨论】:
-
请始终提供mcve 您的问题。此外,请描述您已经尝试过的内容。您使用哪种语言?
如何为现有的 PDF 设置密码?
【问题讨论】:
你看过我书中第 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();
}
请注意,USER 和 OWNER 的类型为 byte[]。您有不同的权限选项(查找以ALLOW_ 开头的常量),您可以从不同的加密算法中进行选择。
至于参数:src是现有PDF的路径。 dest 是加密 PDF 的路径。很明显,您在读取文件时不能写入文件。这在这里解释:How to update a PDF without creating a new PDF?
【讨论】:
@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();
}
【讨论】: