2013-03-05 54 views
1

我想检查给定的PDF文件签名是否存在时间戳。 到目前为止,我来到这个代码:使用iText检查时间戳2.1.7

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类验证签名。有谁知道我怎么去那里?

回答

1

您应该使用AcroFields方法verifySignature(String name),它将返回一个PdfPKCS7对象以继续验证。

该方法的显示的JavaDoc其使用的一个示例:

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版本(例如,由于兼容性或许可证问题),但是,你应该考虑更新到当前版本。

+0

我以前有过这个解决方案,但它不会编译。我下载了itext版本,发现af.verifySignature(name)起作用。这是我修改过的第三方版本。谢谢。 – mrcaramori 2013-03-06 14:12:40