gpt4 book ai didi

java - 在 Itext 7 中,如何获取范围流来签署 pdf?

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:45 27 4
gpt4 key购买 nike

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

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

最佳答案

getRangeStream不是从 PdfSignatureAppearance 重构的唯一方法至 PdfSigner并制作了protected在那条路上。其他方法也存在同样的问题,例如 preCloseclose这也是 PreSign 中使用的方法和 PostSign来自 PDF 文档数字签名 的 servlet,您似乎在使用或至少从中借用代码。

据我推测,这样做是为了让 iText 7 用户使用 signDeferred , signDetached , 和 signExternalContainer通常足以签署应用程序并“正确执行”的方法,即使用其他方法,现在不再以创建有效签名的方式使用公共(public)方法。

PreSignPostSign不幸的是,servlet 不能使用这三种方法,它们实际上就像 signDetached代码被分成两半,相关的局部变量存储在 HTTP session 中。

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

仍然使用 protected 方法

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

更改PreSignPostSign servlet架构

如果您可以从将那些与签名相关的对象保存在内存中(通过 HTTP session 引用)切换到仅将中间 PDF 文件保存在内存中甚至磁盘上,并且可能将半生不熟的签名容器保存在内存中,您可以继续这个:

  • 替换 PreSign servlet 由使用 PdfSigner.signExternalContainer“签署”PDF 的 servlet用IExternalSignatureContainer仅提供虚拟签名的实现,例如new byte[0] .

    IExternalSignatureContainer检索搜索范围流作为其 sign 的参数方法,因此它可以计算范围流哈希。

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

  • 替换 PostSign servlet 由一个 servlet 完成喂养 PdfPKCS7实例并生成 CMS 签名容器。然后使用 PdfSigner.signDeferred 将这个容器注入(inject)到保存的 PDF 中。方法。

或者,您甚至可以将整个 CMS 签名容器创建移动到客户端。在那种情况下,所有 session 都必须记住中间 PDF 的存储位置......

一些灵感可能来自C4_09_DeferredSigning.java iText 7 示例。

关于java - 在 Itext 7 中,如何获取范围流来签署 pdf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38869300/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com