タイトルが示すように、特定の PDF ファイルが既にデジタル署名されているかどうかを知りたいです。
iText を使用して署名しましたが、最終的に辞任するか、他のアクションを実行するために既に署名されているかどうかを知ることができません。
簡単に(おそらくiTextを使用して)行う方法はありますか?
タイトルが示すように、特定の PDF ファイルが既にデジタル署名されているかどうかを知りたいです。
iText を使用して署名しましたが、最終的に辞任するか、他のアクションを実行するために既に署名されているかどうかを知ることができません。
簡単に(おそらくiTextを使用して)行う方法はありますか?
iText の使用:
PdfReader reader = new PdfReader(...);
AcroFields acroFields = reader.getAcroFields();
List<String> signatureNames = acroFields.getSignatureNames();
signatureNames
署名を含む到達可能なすべての署名フィールドの名前が含まれるようになりました。JavaDoc:
/**
* Gets the field names that have signatures and are signed.
*
* @return the field names that have signatures and are signed
*/
public ArrayList<String> getSignatureNames()
同様の問題がありましたが、itext 7を使用していますが、ありません
PdfReader reader = new PdfReader(...);
AcroFields acroFields = reader.getAcroFields();
現在のバージョンで。
だから私はこのソリューションを使用しました[更新済み]
private boolean hasSignatures(final PdfDocument pdfDocument) {
final List<String> signatureNames = new SignatureUtil(pdfDocument).getSignatureNames();
return !signatureNames.isEmpty();
}
一例はこちら
public static final String verifSign(PdfReader pdfReader)
{
KeyStore kall = PdfPKCS7.loadCacertsKeyStore();
AcroFields acroFields = pdfReader.getAcroFields();
List<String> signatureNames = acroFields.getSignatureNames();
if (signatureNames.isEmpty())
{
return ("El documento no tiene ni una firma registrada");
}
for(String name : signatureNames)
{
if (!acroFields.signatureCoversWholeDocument(name))
{
return ("la firma: "+name+" does not covers the whole document.");
}
PdfPKCS7 pk = acroFields.verifySignature(name);
Certificate[] certificates = pk.getCertificates();
Calendar cal = pk.getSignDate();
//System.out.println("Document modified: " + !pk.verify());
Object fails[] = PdfPKCS7.verifyCertificates(certificates, kall, null, cal);
if (fails == null)
{
// Documento PDF firmado correctamente
}
else
{
return ("Firma no válida");
}
}
// Todo firmado correctamente
return null;
}
http://www.berthou.com/us/2009/07/01/verify-pdf-signature-with-itext/