我想将多个PDF文档合并为一个。源文档可以包含由我创建的PDF和由其他组织创建的其他文档。我无法控制附加到我不创建的文档的权限。其中一些文档(非我创建的文档)可能设置了权限。如果文档需要密码才能打开它,我不会尝试合并它。
我正在使用iText 5.5.1(我认为这是最新的)创建一个PDFCopy对象来包含结果文档和循环中每个源PDF的阅读器(我传递要合并的文档列表)。我检查每个文档的页数,然后使用PDFCopy对象导入每个页面,然后将其添加到PDFCopy对象(这两个步骤分开的原因是由于我用来处理java的语言的复杂性对象,IBM iSeries上的RPG)。问题是我可以将读者附加到具有权限的PDF并获取页数,但是一旦我尝试将页面导入到复制对象中,程序就会抱怨并终止并显示消息' PdfReader未与所有者一起打开密码&#39 ;.我无法让提供其他组织文件的人员不保护文件(原因文件保护不受更改的原因非常充分),但我需要将这些文件合并为一份。 / p>
我的问题是,我是否可以使用iText将具有权限的PDF文件复制到新文档中,我可以在不知道所有者密码的情况下执行此操作吗?除此之外,我想另一个问题是,合法吗?
由于 GarryM
答案 0 :(得分:13)
简介:可以使用公共证书加密PDF文件。如果您有这样的PDF,则需要相应的私有证书来解密它。可以使用两个密码对PDF文件进行加密:用户密码和所有者密码。如果使用用户密码对PDF进行加密,则至少需要两个密码中的一个才能对其进行解密。
假设:我认为PDF只使用所有者密码加密。您可以在PDF查看器中打开这些文档,而无需提供用户密码,这意味着可以访问内容,但根据所设置的权限,存在一些限制。
情况:iText是一个库,允许您在没有GUI的情况下以非常低的级别访问PDF。它可以轻松访问仅使用所有者密码加密的PDF,但无法检查您是否尊重为PDF定义的权限。为了确保您了解自己的职责,会抛出异常,说 PdfReader未使用所有者密码打开。这通常过于严格:有时您有权汇编一个PDF文件,但是使用iText它全部或全部。您可以打开文件,也可以不打开文件。 iText不会检查你之后做了什么。
解决方案:默认情况下,有一个名为unethicalreading
的静态布尔参数设置为false
。您可以这样更改:
PdfReader.unethicalreading = true;
从现在开始,就好像PDF没有加密一样。
这是合法的吗?这不是很明确,我不是律师,但是:
当Adobe仍然拥有PDF规范的版权时,它曾经是非法的。 Adobe在某些条件下授予任何开发者使用该版权的权利。其中一个条件是您没有“破解”PDF。从PDF中删除密码打破了与Adobe的“合同”以使用PDF规范,您可能会被起诉。
当Adobe将PDF规范捐赠给社区以使其成为ISO标准时,这一情况发生了变化。现在每个人都可以使用这个国际标准,以上(Adobe因侵犯版权而被起诉的风险)不再存在。
由于ISO标准使用所有者密码记录加密机制,并且很容易使用ISO标准在没有该密码的情况下解密文档,因此将所有者密码引入强制从技术角度来看,权限存在缺陷。这只是一种心理上的方式来防止人们对你作为作者不想要的文档做些什么。
这就像在荒芜的道路上停车标志。它说:你应该停在这里,但如果周围没有人,那么没有人/什么都不会阻止你。
建议的方法:
我的方法是使用unethicalreading
参数解密PDF,并查看设置的权限。如果权限不允许汇编,我拒绝该文档。我还对生成的PDF设置了权限,我尝试查找尊重原始文档上设置的权限的权限组合。
在某些情况下,并不难:人们不知道PDF通常是忘记用于加密密码的文档的所有者。在这种情况下,文件所有者的简单许可就足以解密它们。
最后评论:我是iText的原始开发者,我负责介绍unethicalreading
参数。我选择了unethicalreading
这个名字只是为了确保人们知道他们在做什么。这并不意味着使用该参数总是不道德或非法的。