1

PDF ファイルの特定の署名のタイムスタンプの存在を確認しようとしています。これまでのところ、私はこのコードに行き着きました:

RandomAccessFileOrArray random = 
    new RandomAccessFileOrArray(new File("temp.pdf").getAbsolutePath());

PdfReader reader = new PdfReader(random, null);
AcroFields af = reader.getAcroFields();
ArrayList<?> names = af.getSignatureNames();

//this are the signatures?
for (Object o : names){

    AcroFields.Item item = (Item) af.getFields().get((String)o);

    //this is the class for verifying the signature, 
    //how do I get it from the item?
    PdfPKCS7 pdfPKCS7 = null; //XYZ ??? 

    Calendar signingDate = pdfPKCS7.getTimeStampDate();
}

どうやら署名にアクセスできたようですが、署名を検証するには PdfPKCS7 クラスにアクセスする必要があります。どうすればそこにたどり着くことができるか、誰にもわかりませんか?

4

1 に答える 1

1

検証の継続には、オブジェクトを返すAcroFieldsメソッドを使用する必要があります。verifySignature(String name)PdfPKCS7

そのメソッドの JavaDocs は、その使用例を示しています。

KeyStore kall = PdfPKCS7.loadCacertsKeyStore();
PdfReader reader = new PdfReader("my_signed_doc.pdf");
AcroFields af = reader.getAcroFields();
ArrayList names = af.getSignatureNames();
for (int k = 0; k < names.size(); ++k) {
    String name = (String)names.get(k);
    System.out.println("Signature name: " + name);
    System.out.println("Signature covers whole document: " + af.signatureCoversWholeDocument(name));
    PdfPKCS7 pk = af.verifySignature(name);
    Calendar cal = pk.getSignDate();
    Certificate pkc[] = pk.getCertificates();
    System.out.println("Subject: " + PdfPKCS7.getSubjectFields(pk.getSigningCertificate()));
    System.out.println("Document modified: " + !pk.verify());
    Object fails[] = PdfPKCS7.verifyCertificates(pkc, kall, null, cal);
    if (fails == null)
        System.out.println("Certificates verified against the KeyStore");
    else
        System.out.println("Certificate failed: " + fails[1]);
}

PdfPKCS7ここでは、インスタンスを使用してコードを簡単に追加できます。

Ceterum censeo... ただし、その古い iText バージョンに縛られている場合を除き (互換性やライセンスの問題などにより)、現在のバージョンに更新することを検討する必要があります。

于 2013-03-06T11:18:05.800 に答える