Написал тестовый код для подписи PDF с визуальным представлением.
Использовался ваш sdk и библиотека для работы с pdf IText 7.1.1
Правильный ли это подход и если да, то оцените более опытным глазом что я мог упустить.
public static void initkey(String doc, String keystore, char storepass[], String keyalias, char aliaspass[])
throws Exception {
// char password[] = "qwe".toCharArray();
Provider provider = new KalkanProvider();
//BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(keystore), storepass);
// String alias = "pupkinvru";
PrivateKey pk = (PrivateKey) ks.getKey(keyalias, aliaspass);
Certificate[] chain = ks.getCertificateChain(keyalias);
x509 = (X509Certificate) ks.getCertificate(keyalias);
System.out.println("|" + x509.getIssuerDN() + "|");
sign(doc, doc + "(signed)", chain, pk, DigestAlgorithms.SHA256, provider.getName(), CryptoStandard.CMS,
"Утвержденно", "Подписанно");
}
public static void sign(String src, String dest, Certificate[] chain, PrivateKey pk, String digestAlgorithm,
String provider, CryptoStandard subfilter, String reason, String location) throws Exception {
System.out.println(src + "|" + dest);
PdfFont fonttnw = PdfFontFactory.createFont("C://SSR56__C.TTF", "CP1251", true); // Поддержка
// кириллицы
ImageData imgdt = ImageDataFactory.create("C://pict.png"); // картиночка
try {
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src));
PdfReader reader = new PdfReader(src);
PdfSigner signer = new PdfSigner(reader, new FileOutputStream(dest), false);
int pages = pdfDoc.getNumberOfPages();
pdfDoc.close();
PdfSignatureAppearance appearance = signer.getSignatureAppearance().setReason(reason).setLocation(location)
.setReuseAppearance(false);
appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION);
// appearance.setSignatureGraphic(imgdt); изображение рядом
appearance.setImage(imgdt); // изображение фоном
appearance.setLayer2Text(x509.getIssuerDN() + "\n" + "Дата подписания: " + signer.getSignDate().getTime()
+ "\n" + "Основание: Утверждено");
appearance.setLayer2Font(fonttnw);
Rectangle rect = new Rectangle(2, 2, 150, 150);
appearance.setPageRect(rect).setPageNumber(pages);
signer.setFieldName("sig");
IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, provider);
IExternalDigest digest = new ProviderDigest(provider);
//IExternalDigest digest = new BouncyCastleDigest();
signer.signDetached(digest, pks, chain, null, null, null, 0, subfilter);
reader.close();
File forig = new File(src);
File fsig = new File(dest);
forig.delete();
fsig.renameTo(forig);
} catch (IOException e) {
throw new IOException(e);
}
}