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

在文本7中,如何获取范围流以签署pdf?

景育
2023-03-14

我正在尝试将我的应用程序从iText 5.5.9迁移到iText 7,但在服务器上使用在客户端创建的签名(如PDF文档的数字签名中所述)签署文档时遇到问题。

由于 getRangeStream() 方法不再像在 iText 5.5.9 中那样公开,我该如何获取对范围流的引用?

共有1个答案

贡可人
2023-03-14

getRangeStream并不是唯一一个从PdfSignatureAppearance重构为 并以此方式实现 protected>的方法。其他方法也存在同样的问题,如 preCloseclose,它们也是您似乎在使用或至少从中借用代码的PDF文档的数字签名的 servlet和 servlets中使用的方法。

我认为,这样做是为了让iText 7用户使用signDeferredsignDetachedsignExternalContainer方法,这些方法通常足以对应用程序进行签名并“正确执行”,即以创建有效签名的方式使用其他现在不再公开的方法。

遗憾的是,< code>PreSign和< code > post sign servlet不能使用这三种方法,它们实际上类似于分成两半的< code>signDetached代码,相关的局部变量存储在HTTP会话中。

因此,您基本上有两个选择:

除非我忽略了什么,否则这甚至可以通过从PdfSigner派生您自己的签名者类并使这些方法和可能的成员变量再次公开访问来完成;乍一看使用反射魔法似乎没有必要。

如果您可以从将这些签名相关对象保留在内存中(通过HTTP会话引用)切换到仅将中间PDF文件保存在内存中,甚至保存在磁盘上,并可能将半成品签名容器保存在内存,您可以这样操作:

>

  • PreSignservlet替换为使用PdfSigner.signExternalContainer对PDF进行“签名”的servlet,并使用仅提供虚拟签名的IExternalSignatureContainer实现,例如new byte[0]

    IExternal 签名容器检索搜索的范围流作为其符号方法的参数,因此它可以计算范围流哈希。

    现在,带有虚拟签名的PDF可以保存到磁盘或保存在内存中。根据范围流哈希,您可以像以前一样继续构建和提供PdfPKCS7实例。并将其保存在内存中,例如从HTTP会话中引用。

    PostSignservlet替换为一个servlet,该servlet与之前一样完成对PdfPKCS7实例的馈送,并生成一个CMS签名容器。然后使用PdfSigner将此容器注入保存的PDF。signDeferred方法。

    或者,您甚至可以将整个CMS签名容器创建移动到客户端。在这种情况下,会话需要记住的是中间PDF的存储位置。。。

    一些灵感可能来自C4_09_DeferredSigning.javaiText 7的例子。

  •  类似资料:
    • 问题内容: 给定一个,我可以做,但不能两者都做,因为它们中的任何一个都会消耗流。 现在假设我有 如何获得信息流的范围?(除以外) 问题答案: 您可以调用的方法。它返回一个包含最小值和最大值以及其他一些统计信息的对象:平均值,计数和总和。 并有类似的方法。

    • 我使用getElementsByClass获取一个元素,我注意到span标签的不寻常使用。文本实际上在标签特征-标题内,而不是跨越一些文本。 以下是我得到的信息: 这是我的代码: 有人能帮助获取span标签的“标题”数据吗?

    • 我想用“IntStream”来执行后范围。 所以,普通看起来像: 但是我需要,像这样: 如何实现?

    • 问题内容: 我将列出用户将从中选择的地址列表,然后将返回地址文本。我需要使用,因为不允许换行。 在Label类中,踢球者没有类似方法… 我知道我可以做类似的事情: 但是,我有一个5-20地址的列表,其中包含多个单独的,这将很困难b / c,我无法识别有效标签的位置。我只想访问激活的窗口小部件内容。 是否使用了正确的小部件? 问题答案: 要从标签中获取值,可以使用方法,该方法可用于获取任何配置选项的

    • 所有。我看了网页,但没有找到适合我的解决方案。 在会话被销毁之前,我需要从中的globalsession作用域bean访问信息。 在检查会话属性后,我找到了一个解决方案,但它似乎并不顺利: 我还有单例bean,通过目标代理包含会话bean,但通过,对会话bean的引用在它们内部无效(会话bean在调用之前已被销毁) 有没有人知道解决这样的问题的好方法? 我想我们需要类似于的东西,但是对于会话bea