2016-10-07 21 views
0

私は複数の署名付きのデジタル署名pdfを持っています。今私は署名の1つだけを取り除きたいと思う。私は同じもののためにそれを使用しています。"少なくとも1つの署名が無効です"というエラーメッセージが表示される

PdfReader reader = new PdfReader(src_path); 

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest_path)); 


     { 
       AcroFields.Item item =  stamper.getAcroFields().getFieldItem(fieldname); 

       ClearSignatureDictionary(item.getMerged(0)); 
       ClearSignatureDictionary(item.getWidget(0)); 
       ClearSignatureDictionary(item.getValue(0)); 
      } 
     } 

private static void ClearSignatureDictionary(PdfDictionary dic) 
    { 
    dic.remove(PdfName.AP); 
    dic.remove(PdfName.AS); 
    dic.remove(PdfName.V); 
    dic.remove(PdfName.DV); 
    dic.remove(PdfName.SV); 
    dic.remove(PdfName.FF); 
    dic.put(PdfName.F, new PdfNumber(4)); 
} 

をしかし、私は取り除かれ、署名付き文書を開くと、それは私にアクロバットリーダー 「の署名のうち少なくとも一つが無効である」

答えて

2

することができますに次のエラーを与える:次のようにコードがあります署名付き文書の辞書からキーを削除しないでください。また、署名が有効であることを期待してください。追加された最後の署名のみを削除できます。ドキュメントが複数のユーザーによって署名されていて、最初の署名を削除する場合は、後続の署名がすべて破棄されます。

この画像は理由を説明:

enter image description here

この画像は、すべての新しいデジタル署名がそのまま元のバイトを保持していることを示しています。新しいシグネチャごとに新しいバイトが追加されます。 Rev1は、1つのデジタル署名を持つ文書のバイト数を表します。 Rev2は、2つのデジタル署名を持つ文書のバイト数を表します。第2のデジタル署名はRev1に完全に署名する。最初の署名を削除すると、2番目の署名が無効になります。

デジタル署名は、特殊な形式のフォームフィールドです。 iTextのを使用すると、このようなPDFの署名フォームフィールドの名前を取得することができます:

PdfReader reader = new PdfReader(path); 
AcroFields fields = reader.getAcroFields(); 
ArrayList<String> names = fields.getSignatureNames(); 

我々は"sig1""sig2"、および"sig3"を持っている場合にのみ、例えば、文書全体をカバーして署名を削除することができます(この順番で追加されます)、fields.signatureCoversWholeDocument("sig3")だけがtrueを返します。

fields.getTotalRevisions()fields.getRevision("sig1")のような特定のリビジョン("sig1"という名前の署名フィールドがある場合)のようなリビジョンの合計数を取得できます。

リビジョン3(Rev3)で追加されたすべてのバイトを削除することで、イメージがドキュメントを表し、1つの署名を削除する必要があるとします。 iTextでは、リビジョン2(Rev2)に戻ります。そのリビジョンは署名フィールドsig2を使用して署名されました。 あなたはこのように、このリビジョンを抽出することができます。

FileOutputStream os = new FileOutputStream("revision2.pdf"); 
byte bb[] = new byte[1028]; 
InputStream ip = fields.extractRevision("sig2"); 
int n = 0; 
while ((n = ip.read(bb)) > 0) 
    os.write(bb, 0, n); 
os.close(); 
ip.close(); 

ファイルrevision2.pdf"sig3"を作成するときに追加されたバイトなし"sig1""sig2"によって署名されたファイルになります。

+0

複数の署名を個別に削除することはできませんか? – dexter

+0

一度に複数の署名を削除することはできますが、特定のリビジョンに移動するだけで削除できます。 'fields.signatureCoversWholeDocument(" sig3 ")'を使っても意味をなさないので、同じエラーが発生するというあなたのコメントは無視します。署名が文書全体をカバーしているかどうかをチェックすることは、**読み取り専用操作です**。その機能を持つ文書を変更することはできませんので、署名を破棄することはできません。 –

関連する問題