0

iReport を使用して 3 ページのレポートを生成しました。現在、署名は 1 ページにのみ表示されます。ただし、iText を使用して各ページに署名する必要があります。

PdfReader reader = new PdfReader(fullFilePath);

String outputPath = reportPath + randomUUID + fileExtension;
FileOutputStream fout = new FileOutputStream(outputPath);
stp = PdfStamper.createSignature(reader, fout, '\0', null, true);
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null,PdfSignatureAppearance.SELF_SIGNED);
sap.setReason("test");
sap.setLocation("test");

String imagePath = servletContextPath + "/resources/img/signature.png";
File file = new File(imagePath);
byte[] imageByte = new byte[(int) file.length()];

try (FileInputStream fileInputStream = new FileInputStream(file)) {
    fileInputStream.read(imageByte);
    Image image = Image.getInstance(imageByte);
    sap.setImage(image);
}

// comment next line to have an invisible signature
for (int page = 1; page <= reader.getNumberOfPages(); page++){
    sap.setVisibleSignature(signatureRectangle, page, null);
}
4

2 に答える 2

1

法的な問題は別として、Itext api (バージョン 5.5.*) を使用してすべてのページに署名したい場合は、署名の外観がページに含まれるクラスpreClose(HashMap<PdfName, Integer> exclusionSizes)のメソッドを少しハックする必要があります。PdfSignatureAppearance

writer.addAnnotation(sigField, pagen);クラス内の行を検索しPdfSignatureAppearanceて置き換えます

for (int p = 1; p <= writer.reader.getNumberOfPages(); p++) {
   writer.addAnnotation(sigField, p);
}

すべてのページに署名の参照を追加します。

于 2016-11-23T06:20:43.437 に答える
1
sap.setVisibleSignature(signatureRectangle, page, null);

視覚的表現を設定しますが、別のものを追加しません。したがって、ループ内のこのメソッドのすべての呼び出しは無駄です。

そのままの IText 署名作成コードは、署名ごとに 1 つの視覚的表現しか作成できません。仕様に従って、たとえば複数のウィジェットで同じ署名を視覚化することは可能ですが、PDF ビューアーは、複数の視覚化を使用した署名の正当な価値としてそれを拒否する場合があります。疑問です。

編集:

たとえば Adob​​e は、Digital Signature Appearances v9 ホワイト ペーパーで次のように書いています。

ドキュメント内の署名の場所は、その法的意味に影響を与える可能性があります。このため、署名フィールドが複数の注釈を参照することはありません。複数の場所が署名に関連付けられている場合、意味があいまいになる可能性があります。

したがって、将来的には、複数の注釈 (つまり、ビジュアライゼーション) を含む署名の受け入れを完全に停止する可能性があります。

于 2013-03-28T08:00:25.847 に答える