Подписание PDF-файла на основе XFA с помощью iText
У меня есть PDF на основе XFA, некоторые поля должны быть подписаны. Однако эти поля встроены в форму XFA, поэтому я не могу подписать ее, используя следующие коды
public void sign(String keystore, char[] password, String src, String name, String dest)
throws GeneralSecurityException, IOException, DocumentException {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream(keystore), password);
String alias = (String)ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, password);
Certificate[] chain = ks.getCertificateChain(alias);
// Creating the reader and the stamper
PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0', null, true);
// Creating the appearance
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(name);
// Creating the signature
PrivateKeySignature pks = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, "BC");
ExternalDigest digest = new BouncyCastleDigest();
MakeSignature.signDetached(appearance, digest, pks, chain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
}
Например, у меня есть поле с именем "root[0].mainpage[0].root[2].DefaultPage[0].Page1[0].SignArea[0].GSA[0].GSF-shinfo_sh-tmp03_sh_sf[0]". Когда я попытался поставить его в аргумент "имя", я получил сообщение об ошибке
"Исключение в потоке" main "java.lang.IllegalArgumentException: поле root [0].mainpage [0].root [2].DefaultPage [0].Page1 [0].SignArea [0].GSA [0]. GSF-shinfo_sh-tmp03_sh_sf [0] не существует. "
Я работал над этой проблемой в течение недели, но я не нашел решения. Есть ли идеи по этому вопросу? Спасибо!
PS: Это URL загрузки файла.