当前位置: 首页 > 知识库问答 >
问题:

我可以使用iText合并PDF的权限吗

申光临
2023-03-14

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

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

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

谢谢GarryM

共有1个答案

陶飞鸿
2023-03-14

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

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

情境:iText是一个库,它允许您在非常低的级别上访问PDF,而不需要GUI。它可以很容易地访问只使用所有者密码加密的PDF,但它不能检查您是否尊重为PDF定义的权限。为了确保您了解您的责任,会抛出一个异常,说明PdfReader未使用所有者密码打开。这通常过于严格:有时您有权汇编PDF文件,但对于iText来说,这是全部或全部。要么你能打开文件,要么你不能。iText不会检查你之后在做什么。

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

PdfReader.unethicalreading = true;

--编辑(自iText 7起):

pdfReader.setUnethicalReading(true);

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

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

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

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

就像是荒废路上的停车标志。上面写着:你应该停在这里,但是如果没有人在身边,没有人/什么也阻挡不了你。

建议的方法:我的方法是使用unethicalreading参数解密PDF,并查看设置的权限。如果权限不允许程序集,我将拒绝该文档。我还在生成的PDF上设置权限,在PDF中我试图找到尊重在原始文档上设置的权限的权限组合。

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

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

 类似资料:
  • 我正在使用旧版本的iText(2.1.7)来合并PDF。因为这是MPL的最后一个版本。我无法改变这一点。 不管怎样。我正在尝试合并多个PDF。一切似乎都正常工作,但当我翻阅大约1500页时,生成的PDF无法打开(表现得好像它被破坏了一样)

  • 是否可以使用iText最新版本在我的PDF中查找特定字段的边框颜色?我可以得到AcroField。项目,但我看不到从那里获取bordercolor的选项。

  • 问题内容: 使用iText合并不同宽度的文档时出现问题。 下面是我用来合并的代码。 pdf的首页宽度为14英寸,高度为13英寸。文档上的所有其他页面将始终小于该页面。 我想将所有文档全部合并到一个文档中。 我不知道如何设置单个合并文档的宽度和高度。 我认为应该这样做,但是如果将其更改为,文档无效将不起作用。 请进一步指导我。 问题答案: 使用类合并文档违反了 官方 文档中的所有建议,尽管有一些 非

  • 问题内容: iText可以在Swing应用程序中呈现PDF文档吗?还是我必须为此使用另一个库/框架? 问题答案: iText用于以编程方式生成PDF文件(例如,从HTML转换为PDF或生成PDF报告。) 要查看PDF,您可以使用ICEpdf之类的库

  • 问题内容: 如何使用iText将书签添加到现有PDF? 我将多个PDF合并为一个PDF,并且需要为最终PDF构建书签。例如,我有三个PDF:doc1.pdf,doc2.pdf和doc3.pdf,doc1和doc2属于Group1,doc3属于Group2。我需要合并它们,并且必须为生成的PDF构建嵌套书签,如下所示: 等等 问题答案: 我已经制作了一个MergeWithOutlines示例,该示例

  • 我有几份产品数据表。每个文件都是一个单独的文件。我想做的是使用iText根据Web表单的答案生成一组摘要/建议的操作,然后将所有相关的数据表附加到这些操作中。这样,我只需要在浏览器中打开一个新选项卡来打印所有信息,而不是为摘要打开一个选项卡,为所需的每个数据表打开一个选项卡。 那么,使用iText可以做到这一点吗?