如何使用 iText 将没有所有者密码的仅用户密码添加到 PDF

Posted

技术标签:

【中文标题】如何使用 iText 将没有所有者密码的仅用户密码添加到 PDF【英文标题】:How to add only user password without owner password to a PDF using iText 【发布时间】:2013-01-20 01:10:02 【问题描述】:

如何在不使用 iText 添加所有者密码的情况下仅向 pdf 文件添加用户密码?据我所知,似乎只能通过添加用户密码和所有者密码来做到这一点。

【问题讨论】:

您希望具有用户密码但没有所有者密码的 PDF 表现如何?任何不通过密码识别自己的人都应被视为文档的所有者,因此可能比通过用户密码识别自己的任何人拥有更多的权利? 这是我的客户想要的,我个人不喜欢这样做。 请让您的客户提供带有他想要的安全设置的示例 PDF。如果他提供样品,请检查它。如果该 PDF 同时具有用户密码和所有者密码,但其中一个是默认密码或随机密码,我不会感到惊讶。 那么默认的所有者密码是什么?我很困惑 如果您使用加密权限限制权限但不要求用户在打开 PDF 时输入密码,则 PDF 实际上是使用规范中定义的默认用户密码加密的(因此通常已知)。也许您的客户或他的软件也已实现使用该默认密码作为所有者密码。必须进行检查。 【参考方案1】:

加密现有 PDF 的方法如下:

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

见http://itextpdf.com/examples/iia.php?id=219

如果 OWNER 是null,那么将生成一个随机的所有者密码(一个没人知道的密码)。也许这就是您的客户的意思。正如 mkl 已经解释的那样,拥有一个带有 USER 密码但没有 OWNER 密码的 PDF 是没有意义的。

【讨论】:

好吧,很公平,我想我必须接受这是 iText 的限制。 这不是 iText 的限制;这是 ISO-32000-1 固有的限制。我很确定 Foxxit 也有同样的限制。也许他们使用标准的所有者密码(您也可以这样做)。 什么是标准所有者密码?对不起,我不是PDF专家,请多多指教。 也许 Foxxit 选择了 Foxxit 附带的 32 个字符的密码,而且他们总是使用相同的密码。 问题是我没有这个密码,我想我得用我自己的标准密码,等等,:)【参考方案2】:

以下代码是你需要添加所有者密码的代码。

  JRPdfExporter exporter = new JRPdfExporter();       
  exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperprintobj);
  exporter.setParameter(JRExporterParameter.OUTPUT_FILE,new File(fileName));
  exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);
  exporter.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY, Boolean.TRUE);
  //exporter.setParameter(JRPdfExporterParameter.USER_PASSWORD, "jasper");
  exporter.setParameter(JRPdfExporterParameter.OWNER_PASSWORD, "reports");
  exporter.setParameter(
    JRPdfExporterParameter.PERMISSIONS, 
    new Integer(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING)
    );
  exporter.exportReport(); // finally export as pdf

在生成 pdf 的 java 中使用此代码。

【讨论】:

添加加密由您决定。但这是我推荐的安全功能 我没有添加所有者密码,我的客户只想添加用户密码。他说像foxit这样的某些软件可以做到这一点,因此我们需要添加它。我说的是添加到现有的 PDF,而不是生成新的

以上是关于如何使用 iText 将没有所有者密码的仅用户密码添加到 PDF的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 iText 重置忘记的所有者密码吗?

Itext 7 - PdfReader 未使用所有者密码错误打开

如何使用 C# 合并包含所有者密码的 PDF 文档

如何查找Linux系统中密码为空的所有用户

如何查找Linux系统中密码为空的所有用户

Laravel 8 Jetstream如何在重置密码后将用户重定向到自定义路由