TCPDF SetProtection方法无法正常工作

问题描述

我开始在这里写:

PHP PDF password protection (no open without password)

但是,由于我在这里的声誉,我无法添加评论(我在AskUbuntu上比较好,但是我不能从那里获取代表点)。我还在那开始赏金,如果有人在两天内在这里回答并给出了可接受的解决方案,我会在那奖励。

现在,问题是:SetProtection方法无法按预期工作。

想要的行为:使用TCPDF库创建受保护/加密的PDF文档,以便始终向每个人授予文档视图而无需询问任何密码,但如果尝试编辑,则需要输入密码。

我使用以下语法:

$ pdf-> SetProtection(array('modify','copy','annot-forms','fill-forms','extract','assemble'),null,'mypwd',1);

  1. 我可以按预期 使用pdf查看器打开文件。
  2. 如果我尝试使用 Libreoffice Draw 打开文件,则要求输入密码(按预期 ),但是我可以同时编辑文档 ,其中mypwd(期望并且输入空白密码(不期望)。

什么是正确的语法(如果有的话),以使所有人都可以阅读pdf,而仅提供“ mypwd”才能进行编辑?

编辑

在这里,您将获得一个包含空白用户密码和强主密码的文件。 Ilovepdf.com发现它已解锁,Libreoffice Draw可以对其进行编辑。 这不是预期的行为。

https://www.dropbox.com/s/864p8xjh1ue041z/tracking_12750_16.pdf?dl=0

解决方法

据我所知,示例PDF是以您想要的方式加密的,其中包含一个空用户密码和一个非空所有者密码。因此,TCPDF可以执行要求的操作。

最可能的问题是您的期望太强了:如果程序可以打开PDF进行阅读,则该程序可以对PDF进行任何操作,无论其配置有多严格。权限以及不同的所有者和用户角色需要相关软件的合作,但在技术上并未强制执行。

这已经从规范中明确了:

成功打开并解密文档后,PDF阅读器从技术上可以访问文档的全部内容。 PDF加密中没有固有的内容可以强制执行加密词典中指定的文档权限。 PDF阅读器应遵守文件创建者的意图,即根据文件中包含的权限限制用户对加密的PDF文件的访问。

(ISO 32000-2,第7.6.4节标准安全处理程序)

显然, Libreoffice Draw 的行为完全不符合PDF规范的要求,即,它没有正确地根据文件中包含的权限来限制用户对加密PDF文件的访问。可能是设计使然,可能只是编程故障。

您应该只知道您的期望

使用TCPDF库创建受保护/加密的PDF文档,以便始终向每个人授予文档视图而无需询问任何密码,但是如果尝试编辑,则需要输入密码。

不能使用标准的PDF加密工具为任意PDF处理器实现,仅适用于遵循上述PDF规范要求的处理器。

有些PDF DRM软件解决方案提供商不是那么容易被规避,但是我怀疑它们中的任何一家都可以承受坚定的黑客。 (除非有问题的解决方案根本不向用户提供PDF,而只是在基于Web服务的自定义查看器中仅向用户提供PDF;但这不是您的用例。)


根据您的实际要求,您可能想研究使用数字签名而不是加密的方法。如果您的目的是确保任何收件人都可以确定他得到了您的文档内容,而不是其他人对其进行了编辑,那么这似乎更合适。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...