Ниже — часть моего кода. Я хочу отображать информацию о подписывающем лице в содержимом моей подписи. Какие изменения мне нужно внести?
static byte[] prepareAndHashForSigning(PdfReader pdfReader, OutputStream outputStream, String fieldName) throws DocumentException, IOException, GeneralSecurityException {
PdfStamper pdfStamper = PdfStamper.createSignature(pdfReader, outputStream, (char) 0);
PdfSignatureAppearance pdfSignatureAppearance = pdfStamper.getSignatureAppearance();
pdfSignatureAppearance.setVisibleSignature(new Rectangle(80, 140, 188, 172), 1, fieldName);
ExternalSignatureContainer blankContainer = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
MakeSignature.signExternalContainer(pdfSignatureAppearance, blankContainer, 12000);
InputStream rangeStream = pdfSignatureAppearance.getRangeStream();
BouncyCastleDigest bouncyCastleDigest = new BouncyCastleDigest();
byte[] hash = DigestAlgorithms.digest(rangeStream, bouncyCastleDigest.getMessageDigest("SHA256"));
return hash;
}
/**
* This method sets the signature container placeholder in the signature dictionary
* value of the signature field with the given name.
*/
static void injectPkcs7Container(PdfReader pdfReader, OutputStream outputStream, String fieldName, byte[] signatureContainer) throws DocumentException, IOException, GeneralSecurityException {
ExternalSignatureContainer injectingContainer = new InjectingSignatureContainer(signatureContainer);
MakeSignature.signDeferred(pdfReader, fieldName, outputStream, injectingContainer);
}
/**
* This is a dummy method that returns the given hash itself instead of a signature
* container for it. Obviously, it is not for production purposes.
*/
static byte[] retrievePkcs7ContainerForHash(byte[] hash) {
String base64CertificateString =".....";
byte[] decodedCertificateBytes = Base64.getDecoder().decode(base64CertificateString);
return decodedCertificateBytes;
}
/**
* This {@link ExternalSignatureContainer} implementation returns a pre-generated
* byte array in its {@link #sign(InputStream)} method.
*/
static class InjectingSignatureContainer implements ExternalSignatureContainer {
final byte[] signatureContainer;
public InjectingSignatureContainer(byte[] signatureContainer) {
this.signatureContainer = signatureContainer;
}
@Override
public byte[] sign(InputStream data) throws GeneralSecurityException {
return signatureContainer;
}
@Override
public void modifySigningDictionary(PdfDictionary signDic) {
}
}
public static void main(String[] args) throws IOException {
File origFile = new File("POL571_RedLight_company.pdf");
File tempFile = new File("deferredContainerSigningTemp.pdf");
File resultFile = new File("deferredContainerSigningResult.pdf");
String fieldName = "Signature";
byte[] hash = null;
try (
OutputStream tempOutput = Files.newOutputStream(tempFile.toPath())
) {
PdfReader pdfReader = new PdfReader(origFile.getPath());
hash = prepareAndHashForSigning(pdfReader, tempOutput, fieldName);
String s = Base64.getEncoder().encodeToString(hash);
System.out.println(s);
} catch (DocumentException | GeneralSecurityException | IOException e) {
throw new RuntimeException(e);
}
byte[] signatureContainer = retrievePkcs7ContainerForHash(hash);
try (
OutputStream resultOutput = Files.newOutputStream(resultFile.toPath())
) {
PdfReader pdfReader = new PdfReader(tempFile.getPath());
injectPkcs7Container(pdfReader, resultOutput, fieldName, signatureContainer);
} catch (DocumentException | GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... -signed-by