アプリケーションを iText 5.5.9 から iText 7 に移行しようとしていますが、クライアントで作成された署名を使用してサーバーでドキュメントに署名する際に問題があります (PDF ドキュメントのデジタル署名で説明されています)。
getRangeStream()
メソッドは iText 5.5.9 のように公開されなくなったため、範囲ストリームへの参照を取得するにはどうすればよいですか?
アプリケーションを iText 5.5.9 から iText 7 に移行しようとしていますが、クライアントで作成された署名を使用してサーバーでドキュメントに署名する際に問題があります (PDF ドキュメントのデジタル署名で説明されています)。
getRangeStream()
メソッドは iText 5.5.9 のように公開されなくなったため、範囲ストリームへの参照を取得するにはどうすればよいですか?
getRangeStream
からリファクタリングされ、その方法で作成された唯一のメソッドではありPdfSignatureAppearance
ませPdfSigner
んprotected
。同じ問題が他のメソッドにも存在します。たとえば、および およびPDF ドキュメントのデジタル署名のサーブレットで使用されているメソッドでもあり、使用しているpreClose
と思われるか、少なくともコードを借用していると思われます。close
PreSign
PostSign
これは、私が推測するように、iText 7 ユーザーがアプリケーションに署名するのに通常は十分なsignDeferred
、signDetached
、およびsignExternalContainer
メソッドを使用し、「正しく実行する」ようにするために行われました。署名。
PreSign
およびPostSign
サーブレットは、残念ながらこれら 3 つのメソッドを使用できません。実際には、HTTP セッションに格納された関連するローカル変数を使用して 2 つに分割されたコードのようなものですsignDetached
。
したがって、基本的に次の 2 つの選択肢があります。
私が何かを見落としていない限り、これは、独自の署名者クラスを派生させ、PdfSigner
それらのメソッドとおそらくメンバー変数を再度パブリックにアクセスできるようにすることによっても実行できます。一見反射魔法を使う必要はないようだ。
PreSign
およびPostSign
サーブレット アーキテクチャを変更するこれらの署名関連オブジェクトをメモリ内に保持する (HTTP セッションを介して参照される) ことから、単に中間 PDF ファイルをメモリ内またはディスク上に保持し、おそらく中途半端な署名コンテナーをメモリ内に保持するように切り替えることができる場合は、次のように進めることができます。
サーブレットを、ダミーの署名を提供するだけの実装を使用しPreSign
て PDF に「署名」するサーブレットに置き換えます。PdfSigner.signExternalContainer
IExternalSignatureContainer
new byte[0]
これIExternalSignatureContainer
は、求められている範囲ストリームをそのsign
メソッドのパラメーターとして取得するため、範囲ストリーム ハッシュを計算できます。
これで、ダミー署名付きの PDF をディスクに保存したり、メモリに保持したりできます。また、レンジ ストリーム ハッシュに基づいて、PdfPKCS7
以前と同様にインスタンスの構築とフィードを続行できます。そして、それをメモリに保持します。たとえば、HTTP セッションから参照されます。
サーブレットを、以前と同様にインスタンスへのフィードを終了し、CMS 署名コンテナーを生成するPostSign
サーブレットに置き換えます。次に、メソッドPdfPKCS7
を使用して、保存した PDF にこのコンテナーを挿入します。PdfSigner.signDeferred
または、CMS 署名コンテナーの作成全体をクライアントに移動することもできます。その場合、セッションが覚えておく必要があるのは、中間の PDF が保存されている場所だけです...
C4_09_DeferredSigning.java iText 7の例からインスピレーションが得られるかもしれません。