我可以使用iText将PDF与权限合并

use*_*489 6 pdf itext

我想将几个PDF文档合并为一个.源文档可以包含由我创建的PDF和由其他组织创建的其他文档.我无法控制附加到我不创建的文档的权限.其中一些文档(非我创建的文档)可能设置了权限.如果文档需要密码才能打开它,我不会尝试合并它.

我正在使用iText 5.5.1(我认为这是最新的)创建一个PDFCopy对象来包含结果文档和循环中每个源PDF的阅读器(我传递要合并的文档列表).我检查每个文档的页数,然后使用PDFCopy对象导入每个页面,然后将其添加到PDFCopy对象(这两个步骤分开的原因是由于我用来处理java的语言的复杂性对象,IBM iSeries上的RPG).问题是我可以将读取器附加到具有权限的PDF并获取页数,但是一旦我尝试将页面导入到复制对象中,程序就会抱怨并终止,并显示消息"PdfReader未使用所有者密码打开".我无法让提供其他组织的文件的人员不保护文件(这是非常好的理由,为什么原始文件不受保护变更),但我需要将这些文件合并为一份.

我的问题是,我可以使用iText将带有权限的PDF文件复制到新文档中吗?我可以在不知道所有者密码的情况下执行此操作吗?除此之外,我猜另一个问题是,合法吗?

谢谢GarryM

Bru*_*gie 13

简介: PDF文件可以使用公共证书加密.如果您有这样的PDF,则需要相应的私有证书来解密它.可以使用两个密码对PDF文件进行加密:用户密码和所有者密码.如果使用用户密码对PDF进行加密,则至少需要两个密码中的一个才能对其进行解密.

假设:我假设PDF只使用所有者密码加密.您可以在PDF查看器中打开这些文档,而无需提供用户密码,这意味着可以访问内容,但根据所设置的权限,存在一些限制.

情况: iText是一个库,允许您在没有GUI的情况下以非常低的级别访问PDF.它可以轻松访问仅使用所有者密码加密的PDF ,但无法检查您是否尊重为PDF定义的权限.为了确保您了解自己的职责,会抛出异常,说PdfReader没有使用所有者密码打开.这通常过于严格:有时您有权组装 PDF文件,但使用iText它是全部或全部.您可以打开文件,也可以不打开文件.iText不会检查您之后正在做什么.

解决方案:有一个叫静态布尔参数unethicalreading被设置为false默认.您可以像这样更改它:

PdfReader.unethicalreading = true;
Run Code Online (Sandbox Code Playgroud)

从现在开始,就好像PDF没有加密一样.

这合法吗?它不是那么清楚,我不是律师,但是:

当Adobe仍然拥有PDF规范的版权时,它曾经是非法的.Adobe授予在特定条件下向任何开发人员使用该版权的权利.其中一个条件是您没有"破解"PDF.从PDF中删除密码打破了与Adobe的"合同"以使用PDF规范,您可能会被起诉.

当Adobe将PDF规范捐赠给社区以使其成为ISO标准时,这一情况发生了变化.现在每个人都可以使用这个国际标准,以上(Adobe因侵犯版权而被起诉的风险)已不复存在.

由于ISO标准使用所有者密码记录加密机制,并且很容易使用ISO标准在没有该密码的情况下解密文档,因此从技术角度来看,引入所有者密码以强制执行权限的概念存在缺陷.这仅仅是一种心理学方法,可以防止人们对您作为作者不想要的文档做某事.

这就像在荒芜的道路上停车标志.它说:你应该停在这里,但如果没有人在身边,没有人/什么都不会阻止你.

建议的方法: 我的方法是使用unethicalreading参数解密PDF ,并查看设置的权限.如果权限不允许汇编,我拒绝该文档.我还在生成的PDF上设置权限,我尝试查找尊重原始文档上设置的权限的权限组合.

在某些情况下,并不难:人们不知道PDF通常是忘记用于加密密码的文档的所有者.在这种情况下,文档所有者的简单许可足以解密它们.

最后说明:我是iText的原始开发人员,我负责引入unethicalreading参数.我选择这个名字unethicalreading只是为了确保人们知道他们在做什么.这并不意味着使用该参数总是不道德或非法的.