SetProtection 函数概览
核心概念与参数
在生成 PDF 的阶段,SetProtection 提供了将 权限控制、用户密码、以及 拥有者密码 一并绑定到文档的能力,从而实现对打开、打印和复制等操作的管理。通过这一机制,文档的敏感信息在分发时能获得第一层防护,降低未授权访问的风险。
该函数通常接收三个核心要素:permissions(权限位集合)、userPassword(用户打开文档所需密码)以及 ownerPassword(拥有者密码,通常用于修改保护策略)。permissions 是一个包含允许操作的字符串数组,例如 'print'、'copy'、'modify' 等。不同的权限组合会产生不同的使用场景与保护强度。
重要点:SetProtection 不会改变文档中的文本和布局,但会改变打开和修改该文档的权限体系,确保未授权用户无法进行受限操作。
基本用法示例
下面的示例展示了如何在 mPDF 初始化后应用保护策略、设置用户和拥有者密码,并输出一个受保护的 PDF。请注意,实际运行前请确保已正确加载 mPDF,并根据需求调整权限与密码。
SetProtection($permissions, 'user-pass-123', 'owner-pass-456');// 写入内容并输出为下载
$mpdf->WriteHTML('<p>示例文本,可在受保护的 PDF 中查看。</p>');
$mpdf->Output('protected_example.pdf', 'D');
?>分配用户密码和拥有者密码
用户密码用于打开文档时的身份验证,拥有者密码则用于修改保护策略或解除限制。明确区分两者有助于在需要时给特定人员更多权限,同时保留对根本保护的控制。
在实际应用中,密码的复杂度和长度应符合安全策略要求。将 userPassword 与 ownerPassword 分离,可以实现“开放阅读但受限操作”的灵活组合。若将用户密码留空,则部分阅读者在某些版本的阅读器中可能仍能打开文档,但权限控制通常仍有效。
SetProtection(array('print','modify'), '', 'strongOwnerPass!2025');
?>输出前的校验与测试
在完成保护设定后,建议进行本地测试以确保权限按预期生效。通过尝试以不同身份打开文档,观察是否需要输入 userPassword,以及能否执行受限操作如 打印、复制、修改 等。
如果测试未通过,可以通过再次调用 SetProtection 调整权限组合,或更新 userPassword 与 ownerPassword,以实现新的保护策略。
在 mPDF 中实现权限控制的步骤
配置权限位集
权限位集是 SetProtection 的核心,常见的操作项包括 print、modify、copy、annot-forms 等。合理选择组合可以在确保信息可用性的同时降低泄露风险。不同版本的 PDF 阅读器对权限项的支持略有差异,请结合实际场景进行测试。
通过以下代码,可以快速建立一个基本的权限组合,并与用户/拥有者密码绑定:
SetProtection($permissions, 'user123', 'owner456');
?> 设置密码策略
将 userPassword 和 ownerPassword 结合使用,是实现灵活保护策略的关键。用户密码 控制打开读阅,而 拥有者密码 则用于修改保护策略或解除保护。对于高敏感文档,建议使用强密码并定期轮换。
示例中,若只设置了 ownerPassword,用户打开时可能不会被要求输入该密码。但更安全的做法是同时设置两者,并对密码进行独立管理。
SetProtection(array('print'), 'user-pass-abc', 'owner-pass-xyz');
?> 输出与测试
完成保护后,输出阶段应确保目标行为一致:是否只能查看、是否需要输入密码,以及是否能够执行受限操作。可以通过浏览器直接预览或使用下载方式进行最终验证。
常用输出方式包括直接在浏览器内打开、下载到本地或以流式传输的方式展示。保护策略应在不同客户端和版本的 PDF 阅读器中保持稳定性。
Output('protected_final.pdf', 'I'); // 在浏览器内查看
?>权限位的详细解读与组合
打印权限
打印权限决定了受保护文档是否可以被物理打印。常见做法是区分低分辨率打印与高分辨率打印,或者完全禁止打印以保护原始数据。若需要交付给外部合作方,可以仅允许低分辨率打印以减少信息泄露风险。
在 SetProtection 中通过将 print 包含与否来控制这一行为;若不包含该项,部分阅读器将禁止打印。实际效果可能因阅读器实现而略有差异,因此需要综合测试。
修改与内容复制权限
修改与复制权限通常用于保护文档内容不被未授权改动或搬运。禁用这两项可以有效阻止抄袭和未经授权的内容再利用。对于草案版本或对外审批件,可以仅保留 查看 权限。
组合示例:permissions 仅包含 view 风格的行为,常见写法是省略 copy、modify 等项。
SetProtection(array('print'), '', 'owner-only');
?> 表单填写与注释权限
对于需要收集信息的文档,可以开启 annot-forms,允许填写表单或添加注释;同时可保留其他操作的限制,以平衡可用性与安全性。合理设置有助于实现合规性与数据保护的折中。
示例中可将该项与 print、copy 等权限定向组合,达到更精细的控制。
SetProtection(array('annot-forms', 'print'), 'user', 'owner');
?> 实战案例:不同场景的保护策略
对外共享的企业报告
对于对外分享的企业报告,通常希望实现“只读、有限打印、禁止复制”的保护策略,以确保信息在公开传播时保持可控性。通过将 permissions 设置为 array('print'),并配合空的 userPassword,使用拥有者密码来管理后续变更,既保留了可访问性,又限制了敏感操作。
以下示例演示一个常见场景:仅允许打印、禁止复制和修改,用户登陆凭证由拥有者管理:
SetProtection(array('print'), '', 'enterpriseOwnerPass!');
$mpdf->WriteHTML('对外共享的企业报告,受保护。
');
$mpdf->Output('external_report_protected.pdf', 'D');
?> 内部资料保护与合规性
对内部文档,需在确保可内网阅读的基础上,加强对复制、修改与外传的控制。使用 ownerPassword 来保护策略,员工在特定情境下可解锁保护,但日常访问应遵循严格权限。
示例策略:允许打印与注释以便审阅,但禁止复制和修改,确保内容原封不动地传递给审阅人。
SetProtection(array('print', 'annot-forms'), 'internalUser2025', 'complianceOwner2025');
$mpdf->WriteHTML('内部资料,需遵循合规性要求。
');
$mpdf->Output('internal_doc_protected.pdf', 'I');
?> 学术论文提交保护与传播控制
学术论文在提交期通常需要保护图表和数据不被随意复制,同时允许评审者查看与标注。通过设置 print、copy 权限的组合,可以实现“查看允许、复制受限、注释可用”的平衡。

示例场景中,提供了对评审者的最小权限集,同时保留必要的注释和讨论空间:
SetProtection(array('annot-forms', 'print'), 'reviewerPass', 'journalPass');
$mpdf->WriteHTML('学术论文稿件,供评审使用。
');
$mpdf->Output('paper_for_review.pdf', 'I');
?> 

