6

アプリケーションを iText 5.5.9 から iText 7 に移行しようとしていますが、クライアントで作成された署名を使用してサーバーでドキュメントに署名する際に問題があります (PDF ドキュメントのデジタル署名で説明されています)。

getRangeStream()メソッドは iText 5.5.9 のように公開されなくなったため、範囲ストリームへの参照を取得するにはどうすればよいですか?

4

1 に答える 1

3

getRangeStreamからリファクタリングされ、その方法で作成された唯一のメソッドではありPdfSignatureAppearanceませPdfSignerprotected。同じ問題が他のメソッドにも存在します。たとえば、および およびPDF ドキュメントのデジタル署名のサーブレットで使用されているメソッドでもあり、使用しているpreCloseと思われるか、少なくともコードを借用していると思われます。closePreSignPostSign

これは、私が推測するように、iText 7 ユーザーがアプリケーションに署名するのに通常は十分なsignDeferredsignDetached、およびsignExternalContainerメソッドを使用し、「正しく実行する」ようにするために行われました。署名。

PreSignおよびPostSignサーブレットは、残念ながらこれら 3 つのメソッドを使用できません。実際には、HTTP セッションに格納された関連するローカル変数を使用して 2 つに分割されたコードのようなものですsignDetached

したがって、基本的に次の 2 つの選択肢があります。

それでも保護されたメソッドを使用する

私が何かを見落としていない限り、これは、独自の署名者クラスを派生させ、PdfSignerそれらのメソッドとおそらくメンバー変数を再度パブリックにアクセスできるようにすることによっても実行できます。一見反射魔法を使う必要はないようだ。

PreSignおよびPostSignサーブレット アーキテクチャを変更する

これらの署名関連オブジェクトをメモリ内に保持する (HTTP セッションを介して参照される) ことから、単に中間 PDF ファイルをメモリ内またはディスク上に保持し、おそらく中途半端な署名コンテナーをメモリ内に保持するように切り替えることができる場合は、次のように進めることができます。

  • サーブレットを、ダミーの署名を提供するだけの実装を使用しPreSignて PDF に「署名」するサーブレットに置き換えます。PdfSigner.signExternalContainerIExternalSignatureContainernew byte[0]

    これIExternalSignatureContainerは、求められている範囲ストリームをそのsignメソッドのパラメーターとして取得するため、範囲ストリーム ハッシュを計算できます。

    これで、ダミー署名付きの PDF をディスクに保存したり、メモリに保持したりできます。また、レンジ ストリーム ハッシュに基づいて、PdfPKCS7以前と同様にインスタンスの構築とフィードを続行できます。そして、それをメモリに保持します。たとえば、HTTP セッションから参照されます。

  • サーブレットを、以前と同様にインスタンスへのフィードを終了し、CMS 署名コンテナーを生成するPostSignサーブレットに置き換えます。次に、メソッドPdfPKCS7を使用して、保存した PDF にこのコンテナーを挿入します。PdfSigner.signDeferred

または、CMS 署名コンテナーの作成全体をクライアントに移動することもできます。その場合、セッションが覚えておく必要があるのは、中間の PDF が保存されている場所だけです...

C4_09_DeferredSigning.java iText 7の例からインスピレーションが得られるかもしれません。

于 2016-08-10T14:09:49.020 に答える