我可以使用iText合并PDF';有权限的

我可以使用iText合并PDF';有权限的,pdf,itext,Pdf,Itext,我想把几个PDF文档合并成一个。源文档可以由我创建的PDF和其他组织创建的PDF组成。我无法控制附加到非我创建的文档的权限。其中一些文档(不是我创建的文档)可能设置了权限。如果文档需要密码才能打开,我不会尝试合并它 我正在使用iText 5.5.1(我认为这是最新的)创建一个PDFCopy对象,以在循环中包含结果文档和每个源PDF的读取器(我正在传递一个要合并的文档列表)。我检查每个文档的页数,然后使用PDFCopy对象导入每个页面,然后将其添加到PDFCopy对象中(这两个步骤之所以分开,是因

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

我正在使用iText 5.5.1(我认为这是最新的)创建一个PDFCopy对象,以在循环中包含结果文档和每个源PDF的读取器(我正在传递一个要合并的文档列表)。我检查每个文档的页数,然后使用PDFCopy对象导入每个页面,然后将其添加到PDFCopy对象中(这两个步骤之所以分开,是因为我在IBM iSeries上使用的java对象RPG语言非常复杂)。问题是,我可以使用权限将读卡器附加到PDF并获取页面计数,但只要我尝试将页面导入复制对象,程序就会抱怨并终止,并显示消息“PdfReader not OPEN with owner password”。我无法让其他组织提供文件的人员不保护文件(保护原始文件不受更改的原因非常充分),但我需要将这些文件合并为一个文件

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

谢谢
GarryM

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

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

情况:iText是一个库,允许您以非常低的级别访问PDF,而无需GUI。它可以轻松访问只使用所有者密码加密的PDF,但无法检查您是否尊重为PDF定义的权限。为了确保您知道自己的责任,将抛出一个异常,说明PdfReader未使用所有者密码打开。这通常太严格了:有时候你有权组装一个PDF文件,但使用iText就可以了。您可以打开该文件,也可以不打开。iText不会检查您之后在做什么

解决方案:有一个名为
unethicalreading
的静态布尔参数,默认设置为
false
。您可以这样更改它:

PdfReader.unethicalreading = true;
--编辑(从iText 7开始):

从现在起,就好像PDF没有加密一样

这合法吗?不太清楚,而且我不是律师,但是:

当Adobe仍然拥有PDF规范的版权时,它曾经是非法的。Adobe在某些条件下授予任何开发者使用该版权的权利。其中一个条件是您没有“破解”PDF。从PDF中删除密码破坏了您与Adobe使用PDF规范的“合同”,您有被起诉的风险

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

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

这就像一条废弃道路上的停车标志。上面写着:你应该停在这里,但是如果周围没有人,没有人/没有什么能阻止你

建议的方法: 我的方法是使用
unethicalreading
参数解密PDF,并查看设置的权限。如果权限不允许汇编,我将拒绝该文档。我还对生成的PDF设置了权限,试图找到与原始文档上设置的权限相关的权限组合

在某些情况下,这并不难:不知道PDF的人往往是文档的所有者,他们忘记了用于加密文档的密码。在这种情况下,文档所有者的简单许可就足以对其进行解密

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

此属性(不道德读取)在iTextSharp v4.1.6.0中可用吗?FindBugs已标记此“不道德读取”属性,因为它是公共的、静态的,但不是最终的。也许它应该是PDF阅读器本身的一个设定器?要澄清的是,公共静态可变内容的问题在于没有可靠的方法来设置它-即使我将其设置为true,我也不可能知道同一JVM中是否有其他代码将相同的值设置为false。@Trejkaz你在说什么
pdfReader.setUnethicalReading(true);