当前位置: 首页 > 知识库问答 >
问题:

如何用所有者密码解密PDF文档?[关闭]

贺浩漫
2023-03-14

我需要能够删除安全/加密从一些PDF文档,最好与itextsharp库。这在过去是可能的(如何通过使用C#提供文件的密码作为参数来解密pdf文件?),但最近对库的更改意味着该解决方案不再起作用。

共有1个答案

李森
2023-03-14

为了测试加密PDF文件的代码,我们需要一个加密的PDF示例。我们将使用EncryptPdf示例创建这样一个文件。

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.setEncryption("Hello".getBytes(), "World".getBytes(),
        PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
    stamper.close();
}

使用这段代码,我创建了一个加密文件hello_encryption.pdf,我将在演示如何解密文件的第一个示例中使用该文件。

你最初的问题听起来像是“我如何才能用所有者密码解密一个PDF文档?”

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src, "World".getBytes());
    System.out.println(new String(reader.computeUserPassword()));
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.close();
    reader.close();
}

好在我能读懂字里行间,所以又打了个比方。

许多PDF是在没有用户密码的情况下加密的。任何人都可以打开它们,但添加了加密以强制执行某些限制(例如,您可以查看文档,但不能打印它)。在这种情况下,只有所有者密码,如EncryptpdfWithoutUserPassword示例所示:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.setEncryption(null, "World".getBytes(),
        PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
    stamper.close();
    reader.close();
}

现在我们得到了一个经过加密的PDF,但它可以在没有用户密码的情况下打开:hello_encrypted2.PDF

Exception in thread "main" com.itextpdf.text.exceptions.BadPasswordException: Bad user password
    at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:681)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:181)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:230)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:207)
    at sandbox.security.DecryptPdf.manipulatePdf(DecryptPdf.java:26)
    at sandbox.security.DecryptPdf.main(DecryptPdf.java:22)
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader.unethicalreading = true;
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.close();
    reader.close();
}

然而:iText中曾经有一个bug,在这种情况下也会删除所有者密码。那不是我们想要的行为。在第一个pdfdecrypt示例中,我们看到可以检索用户密码(如果存在用户密码),但无法检索所有者密码。这是真正的秘密。对于您所引用的iText的旧版本,在操作文件后,所有者密码会从文件中删除,并且该所有者密码会永远丢失。

我已经修复了这个bug,修复程序在5.3.5版中。因此,所有者密码现在被保留。你可以通过查看hello2.pdf来检查这一点,这是我们以“不道德”的方式解密的文件。(如果存在所有者和用户密码,则两者都将保留。)

基于这项研究,我假设你的问题是不正确的。您的意思是问:“我如何在没有所有者密码的情况下解密PDF文档?”或者“如何使用用户密码解密PDF?”

class MyReader extends PdfReader {
    public MyReader(String filename) throws IOException {
        super(filename);
    }
    public void decryptOnPurpose() {
        encrypted = false;
    }
}
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    MyReader.unethicalreading = true;
    MyReader reader = new MyReader(src);
    reader.decryptOnPurpose();
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.close();
    reader.close();
}

这将导致文件hello3.pdf,这是一个不再使用所有者密码加密的文件。这个示例甚至可以用来从使用用户和所有者密码加密的文件中删除所有密码,只要您有用户密码。

对于你关于Aspose不是免费的说法,我将以一个评论来结束这个回答。你知道iText是免费软件,但你也应该知道free不是for free的同义词。请阅读我对以下问题的回答以获得更多信息:iText Java库是免费的还是需要支付任何费用?

 类似资料:
  • 当我加密一个提供用户和所有者密码的PDF文档时,我可以使用这两个密码中的任何一个打开文档。 文件是否在内部复制,并且每一份都用密码加密?从加密文档文件的大小看,文件中有两个加密文档并不明显。 PD:我知道PDF中用户和所有者密码之间的“用户体验”差异。

  • 主要内容:加密PDF文档,示例在前一章中,我们已经看到了如何在PDF文档中插入图像。 在本章中,我们将学习如何加密PDF文档。 加密PDF文档 使用和类提供的方法加密PDF文档。 类用于通过为其分配访问权限来保护PDF文档。 使用此教程,您可以限制用户执行以下操作。 打印文档 修改文档的内容 复制或提取文档的内容 添加或修改注释 填写交互式表单域 提取文字和图形以便视障人士使用 汇编文件 打印质量下降 类用于向文档添加基于密码

  • 要求是一次处理一批PDF,成功后用用户密码加密每个PDF。 然而,这些PDF的加密之前随机生成的动态所有者密码(不知道任何人),以防止任何编辑。 我使用iText加密,如下所示: 但此代码抛出 是否有一个关于如何解决这个错误/绕过所有者密码的指导? 在这里我想说明的是,我们合法拥有这些PDF,所以没有犯罪/黑客行为。

  • 问题内容: 创建公司使用的平台的开发人员不再为我们工作,而且我不知道如何从自定义PHP应用程序中检索密码。 当我查看PHPmyAdmin时,密码已加密(例如* 2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19) 如何更改或检索这些? 问题答案: 如果使用正确的加密方法,将无法轻松检索它们。 只需使用新密码重置即可。 编辑: 字符串看起来像它正在使用:

  • 本文向大家介绍C# 对PDF文档加密、解密(基于Spire.Cloud.SDK for .NET),包括了C# 对PDF文档加密、解密(基于Spire.Cloud.SDK for .NET)的使用技巧和注意事项,需要的朋友参考一下 Spire.Cloud.SDK for .NET提供了接口PdfSecurityApi可用于加密、解密PDF文档。本文将通过C#代码演示具体加密及解密方法。 使用工具: