pom.xml
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
SignatureUtilTest
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.security.PdfPKCS7;
import lombok.SneakyThrows;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.jupiter.api.Test;
import org.springframework.core.io.ClassPathResource;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
/**
* @Auther: lenky.li
* @Date: 2022/2/23 17:04
*/
public class SignatureUtilTest {
@SneakyThrows
@Test
public void verifySignature() {
// 添加提供者以获取签名
Security.addProvider(new BouncyCastleProvider());
long start = System.currentTimeMillis();
PdfReader reader = new PdfReader(new ClassPathResource("file/100000发票.pdf").getInputStream()); //pdf reader 读取流内容
AcroFields fields = reader.getAcroFields(); // 获取Acro字段
ArrayList<String> names = fields.getSignatureNames(); // 获取Acro字段里的签名信息
for (String name : names) {
// 指定提供者
PdfPKCS7 pkcs7 = fields.verifySignature(name,"BC"); // 获取签名的pkcs7数据
X509Certificate certificate = pkcs7.getSigningCertificate();
System.out.println(pkcs7.getSignDate().getTime()); // 签名日期时间
System.out.println(certificate.getNotBefore()); // 有效期开始时间
System.out.println(certificate.getNotAfter()); // 有效期
System.out.println(certificate.getSubjectDN().getName()); // 证书名称
System.out.println(certificate.getSerialNumber().toString(16)); // 序列号要转16进制
System.out.println(certificate.getPublicKey().getFormat()); // 证书格式
System.out.println(certificate.getIssuerDN().getName()); // 证书颁发者
}
System.out.println("耗时:"+(System.currentTimeMillis()-start));
}
}