Skip to content

PDF 权限

PDF 权限模块用于确保 PDF 文档的安全性,提供加密、文档权限、解密、移除密码功能,以保障用户对文档的安全控制和有效管理。

加密

加密功能分为用户密码和所有者密码两部分。用户密码用于打开文档,确保只有授权的用户可以访问文档内容。当设置用户密码时,通常会限制一些诸如修改、复制或打印等文档权限。而所有者密码不仅可以打开文档,还能解锁所有被禁止的权限,使用户能够对文档进行修改、复制或打印等操作。双层密码体系旨在提供更加灵活和安全的文档访问和管理方式。

ComPDFKit 提供多种加密算法和权限设置,根据需求使用合适的算法,设置自定义权限以保护文档。

以下是加密的步骤:

  1. 设定不同的用户密码和所有者密码。

  2. 创建权限信息类。

  3. 设定加密算法。

  4. 使用用户密码和所有者密码,权限信息,算法对文档加密。

  5. 保存文档

以下是加密 PDF 文档的示例代码:

java
// Open document from file path.
CPDFDocument document = new CPDFDocument(context);
document.open(pdfPath);
// Set user password.
document.setUserPassword(user_password);
// Set encrypt algorithm type.
document.setEncryptAlgorithm(PDFDocumentEncryptAlgo.PDFDocumentAES256);
// Set owner password.
document.setOwnerPassword(owner_password);
// Set permission info.
CPDFDocumentPermissionInfo info = document.getPermissionsInfo();
info.setAllowsPrinting(false);
info.setAllowsCopying(true);
document.setPermissionsInfo(info);
// Save document.
document.save();
kotlin
val document = CPDFDocument(context).apply {
  // Open document from file path.
  open(pdfPath)
  // Set user password.
  setUserPassword(user_password)
  // Set encrypt algorithm type.
  encryptAlgorithm = PDFDocumentEncryptAlgo.PDFDocumentAES256
  // Set owner password.
  setOwnerPassword(owner_password)
  // Set permission info.
  permissionsInfo.apply {
    isAllowsPrinting = false
    isAllowsCopying = true
  }
  save()
}

不同的加密算法及其描述:

算法描述枚举值
没有加密CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentNoEncryptAlgo
RC4对明文使用密钥进行异或运算加密CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentRC4
AES-128使用128位密钥AES算法加密CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentAES128
AES-256使用256位密钥AES算法加密CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentAES256

文档权限

PDF 规范中,支持对文档的多种权限进行设置,通过设置这些权限,可以限制用户只能做出符合预期的行为。

PDF 规范定义了如下所示的权限:

  • 打印 - 打印文档。
  • 高质量打印 - 高保真打印文档。
  • 复制 - 复制文档内容。
  • 文档更改 - 修改文档内容,但不包括文档属性。
  • 文档组合 - 插入、删除和旋转页面。
  • 注释 - 创建或修改文档注释,包括表单字段条目。
  • 表单字段输入 - 修改表单字段条目,即使不能编辑文档注释。

以下是查看文档权限的步骤:

  1. 获取文档权限信息。

  2. 通过文档权限信息查看指定的权限。

以下是查看文档权限的示例代码:

java
// Open document from file path.
CPDFDocument document = new CPDFDocument(context);
document.open(pdfPath);
// get permission info.
CPDFDocumentPermissionInfo info = document.getPermissionsInfo();
System.out.println("Allows Printing:" + info.isAllowsPrinting());
System.out.println("Allows Copying:" + info.isAllowsCopying());
kotlin
// Open document from file path.
val document = CPDFDocument(context)
document.open(pdfPath)
// get permission info.
val info = document.getPermissionsInfo()
println("Allows Printing:${info.isAllowsPrinting}")
println("Allows Copying:${info.isAllowsCopying}")

解密

访问具有密码保护的 PDF 文档,需要输入密码。ComPDFKit 提供了两种密码:用户密码和所有者密码。用户密码用于打开文档,确保只有授权的用户可以访问文档内容。而所有者密码不仅打开文档,还解锁所有权限,使用户能够对文档进行修改、打印或复制等操作。双层密码体系旨在提供更加灵活和安全的文档访问和管理方式。

使用不同级别的密码获取不同的权限级别。

解密的步骤如下:

  1. 打开文档时判断文档是否已被加密。

  2. 对于已加密的文档,输入用户密码或所有者密码均可打开文档。

以下是解密 PDF 文档的示例代码:

java
// Open document from file path.
CPDFDocument document = new CPDFDocument(context);
CPDFDocument.PDFDocumentError error = document.open(pdfPath);
if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorPassword) {
    // Password required.
  	document.open(pdfFath, password);
}
kotlin
// Open document from file path.
val document = CPDFDocument(context)
val error: PDFDocumentError = document.open(pdfPath)
if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorPassword) {
  // Password required.
  document.open(pdfPath, password)
}

删除密码

删除密码是指用户在已经获得了所有者权限的情况下,将文档的所有者密码和用户密码移除并另存为新的文档,新的文档将不再需要密码即可打开且默认可使用所有权限。

删除密码的步骤如下:

  1. 解锁文档并获取所有权限。

  2. 将解锁后的文档保存。

以下是删除密码的示例代码:

java
// Open document from file path.
CPDFDocument document = new CPDFDocument(context);
document.open(pdfPath, password);
// Remove password.
try {
  document.save(CPDFDocument.PDFDocumentSaveType.PDFDocumentSaveRemoveSecurity);
} catch (CPDFDocumentException e) {
  e.printStackTrace();
}
kotlin
// Open document from file path.
val document = CPDFDocument(context)
document.open(pdfPath, password)
// Remove password.
try {
  document.save(CPDFDocument.PDFDocumentSaveType.PDFDocumentSaveRemoveSecurity)
} catch (e: CPDFDocumentException) {
  e.printStackTrace()
}