Hoe digitale handtekeningen aan documenten toevoegen in Java
Introductie
Het implementeren van add digital signature java functionaliteit kan aanvoelen als het navigeren door een mijnenveld. Je moet certificaatformaten, handtekeningplaatsing en strikte beveiligingsbeleid jongleren — terwijl je de gebruikerservaring soepel houdt. Eén misstap en je eindigt met ongeldige handtekeningen of documenten die niet slagen voor validatie in Adobe Reader.
Gelukkig hoef je het wiel niet opnieuw uit te vinden of te worstelen met low‑level cryptografie. Of je nu een contract‑management portal bouwt, een e‑commerce checkout die ondertekende bonnen vereist, of een interne HR‑workflow, een betrouwbare Java‑bibliotheek bespaart je uren ontwikkeling en elimineert veelvoorkomende valkuilen.
In deze gids lopen we GroupDocs.Signature for Java door, een commerciële bibliotheek die het zware werk van digitale handtekeningen abstraheert. Je leert hoe je:
- De bibliotheek instelt en certificaten correct configureert
- PDF-, Word-, Excel- en PowerPoint‑bestanden ondertekent met een professioneel visueel zegel
- Handtekeningen valideert en veelvoorkomende fouten afhandelt, zoals niet‑vertrouwde certificaten of geheugenknelpunten
- Beste beveiligingspraktijken toepast voor productieomgevingen
Aan het einde heb je een kant‑en‑klaar implementatie die je kunt uitbreiden voor elk documenttype dat je applicatie verwerkt.
Snelle antwoorden
- Welke bibliotheek laat je digitale handtekeningen toevoegen in Java? GroupDocs.Signature for Java.
- Hoeveel documentformaten worden ondersteund? Meer dan 30 formaten, inclusief PDF, DOCX, XLSX, PPTX en afbeeldingsbestanden.
- Heb ik een licentie nodig voor productie? Ja—een commerciële licentie verwijdert watermerken en ontgrendelt alle functies.
- Kan ik grote PDF’s (100+ pagina’s) ondertekenen zonder OOM‑fouten? Ja—door de JVM‑heap aan te passen en de
setAllPages(false)‑optie te gebruiken. - Wordt timestamping ondersteund? Absoluut; je kunt een vertrouwde Time‑Stamp Authority (TSA)‑token toevoegen voor langetermijnvaliditeit.
Wat is add digital signature java?
add digital signature java verwijst naar het programmatische proces van het insluiten van een cryptografische handtekening in een digitaal document met behulp van Java‑API’s. De handtekening bindt de identiteit van de ondertekenaar—gevalideerd door een digitaal certificaat—aan de inhoud van het document, waardoor integriteit, non‑repudiatie en juridische afdwingbaarheid over platformen heen worden gegarandeerd.
Waarom digitale handtekeningen in Java implementeren?
GroupDocs.Signature ondersteunt 30+ invoer‑ en uitvoerformaten en kan bestanden tot 500 MB verwerken zonder het volledige bestand in het geheugen te laden, wat een 2‑5× snelheidsverbetering oplevert ten opzichte van handmatige PDFBox‑implementaties. Dit gekwantificeerde voordeel vertaalt zich in snellere transactietijden en lagere serverkosten voor workloads met een hoog volume.
Vereisten
Voordat je begint, controleer of je het volgende hebt:
- Java Development Kit (JDK) 8+ – JDK 11 wordt aanbevolen vanwege de verbeterde TLS‑ondersteuning.
- IDE – IntelliJ IDEA, Eclipse of VS Code met Java‑extensies.
- GroupDocs.Signature for Java – we laten drie manieren zien om het toe te voegen aan je build.
- Een geldig digitaal certificaat in PFX‑ of P12‑formaat (je hebt de privésleutel en het wachtwoord nodig).
Optioneel maar nuttig:
- Vertrouwdheid met Maven of Gradle voor dependency‑beheer.
- Een voorbeeld‑PDF, DOCX of XLSX‑bestand om de ondertekeningsstroom te testen.
Hoe installeer ik GroupDocs.Signature voor Java?
GroupDocs.Signature vereist een eenvoudige toevoeging aan je build‑configuratie. Gebruik de snippet die bij je build‑tool past, vervang de placeholder‑versie door de nieuwste stabiele release, en voer het build‑commando uit om de bibliotheek van Maven Central te halen.
Maven (voeg toe aan je pom.xml):
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle (voeg toe aan je build.gradle):
implementation 'com.groupdocs:groupdocs-signature:23.12'
Handmatige installatie (als je geen build‑tool gebruikt):
Download de JAR van de officiële release‑pagina — GroupDocs.Signature for Java releases — en voeg deze toe aan je classpath.
Pro tip: Verwijs altijd naar de nieuwste stabiele versie. Op het moment van schrijven is versie 23.12 actueel, maar nieuwere releases bevatten vaak beveiligingspatches en prestatieverbeteringen.
Hoe verkrijg en pas ik een GroupDocs‑licentie toe?
GroupDocs.Signature vereist een licentie voor productiegebruik. Een licentie verwijdert watermerken en ontgrendelt de volledige functionaliteit, zodat ondertekende documenten voldoen aan enterprise‑beleid.
- Gratis proefversie: Vraag een 30‑daagse tijdelijke licentie aan op de Temporary License Page.
- Betaalde licentie: Koop een ontwikkelaars‑ of enterprise‑licentie via de GroupDocs Purchase Page.
Zonder een geldige licentie bevatten ondertekende documenten een zichtbaar watermerk, wat alleen nuttig is voor evaluatie.
Hoe initialiseert ik het Signature‑object?
Signature‑klasse is het toegangspunt voor alle documentbewerkingen. Het vertegenwoordigt één bestand in het geheugen en biedt methoden voor ondertekenen, verifiëren en extraheren van handtekeningen. Het aanmaken van een Signature‑instantie laadt het doelbestand en maakt het klaar voor verdere verwerking.
Signature signature = new Signature("path/to/input.pdf");
Wat gebeurt er hier?
De regel creëert een Signature‑instantie die het doel‑document laadt. Het pad kan absoluut of relatief zijn; zorg er alleen voor dat het bestand bestaat. Dit object kan hergebruikt worden voor meerdere ondertekenings‑ of verificatie‑acties, wat overhead in batch‑scenario’s vermindert.
Hoe configureer ik digitale handtekeningopties?
Digitale handtekeningopties omvatten alle instellingen die nodig zijn om een geldige PKI‑handtekening te produceren, inclusief certificaatinformatie, visueel uiterlijk en plaatsingsregels. Een juiste configuratie zorgt ervoor dat de resulterende handtekening zowel cryptografisch correct als visueel passend is voor het documenttype.
Hoe stel ik certificaatdetails in?
DigitalSignOptions‑klasse bevat alle certificaatgerelateerde instellingen. Hieronder staat de eerste definitie‑anker voor deze klasse.
DigitalSignOptions definieert de cryptografische parameters—certificaatbestand, wachtwoord en optionele metadata—die de bibliotheek gebruikt om een geldige PKI‑handtekening te maken.
DigitalSignOptions options = new DigitalSignOptions();
options.setCertificatePath("YOUR_DOCUMENT_DIRECTORY/certificate.pfx");
options.setCertificatePassword("yourPassword");
options.setReason("Approved Contract");
options.setContact("legal@yourcompany.com");
options.setLocation("New York, USA");
Belangrijke punten:
- Hard‑code nooit het wachtwoord; laad het vanuit omgevingsvariabelen of een secret manager.
- Gebruik
setReason,setContactensetLocationom reviewers context te geven wanneer ze de handtekeningeigenschappen inspecteren.
Hoe pas ik het visuele uiterlijk van de handtekening aan?
SignatureOptions (een subclass van DigitalSignOptions) regelt de weergave op de pagina. Het laat je een afbeelding toevoegen, de grootte aanpassen en het visuele zegel op de pagina positioneren.
SignatureOptions laat je een afbeelding toevoegen, de grootte aanpassen en het visuele zegel op de pagina positioneren.
options.setImageFilePath("YOUR_DOCUMENT_DIRECTORY/signature.png");
options.setAllPages(true);
options.setWidth(150);
options.setHeight(0); // Auto‑scale based on image aspect ratio
- ImageFilePath: Verwijs naar een PNG‑ of JPG‑bestand van je handgeschreven handtekening of bedrijfslogo. Transparante PNG’s werken het beste.
- AllPages: Zet op
truevoor contracten die op elke pagina een bewijs nodig hebben; andersfalseondertekent alleen de laatste pagina. - Width/Height: Gemeten in pixels; een hoogte van 50‑80 pixels ziet er professioneel uit voor de meeste zakelijke documenten.
Hoe beheer ik uitlijning en opvulling?
Uitlijningsinstellingen bepalen waar het zegel op de pagina terechtkomt, terwijl opvulling een buffer rond het visuele element toevoegt zodat het niet tegen de paginaranden aanligt. Juiste uitlijning verbetert de leesbaarheid en zorgt ervoor dat de handtekening de bestaande inhoud niet hindert.
AlignmentOptions biedt verticale en horizontale plaatsingsconstanten zoals Bottom, Right, Top en Center.
options.setVerticalAlignment(VerticalAlignment.Bottom);
options.setHorizontalAlignment(HorizontalAlignment.Right);
options.setPadding(10);
- Padding: Voegt ademruimte toe rond het zegel; een waarde van 10 pixels voorkomt dat de afbeelding de paginaranden raakt.
- Praktijkvoorbeeld: In factuursjablonen kun je
Top/Leftgebruiken om de handtekening van de goedkeurder dicht bij de kop te plaatsen.
Hoe voeg ik een handtekeningregel toe voor Office‑documenten?
Bij het ondertekenen van DOCX‑ of XLSX‑bestanden verbetert een zichtbare handtekeningregel de leesbaarheid voor eindgebruikers. De bibliotheek maakt een Microsoft‑stijl handtekeningregel die de naam, titel en e‑mail van de ondertekenaar weergeeft, waardoor de native Office‑ervaring wordt nagebootst.
SignatureLineOptions creëert een Microsoft‑stijl handtekeningregel die de naam, titel en e‑mail van de ondertekenaar weergeeft.
options.setSignatureLineText("John Doe", "Chief Legal Officer", "j.doe@yourcompany.com");
- Deze functie wordt genegeerd voor PDF’s, maar is essentieel voor Word‑ en Excel‑bestanden die in Microsoft Office worden geopend.
Hoe teken ik daadwerkelijk een document?
Laad het bronbestand met een Signature‑instantie, pas de volledig geconfigureerde DigitalSignOptions toe en roep sign() aan. De bibliotheek schrijft een nieuw bestand naar het uitvoerpad, waarbij het origineel onaangeroerd blijft. Voor grote PDF’s (50+ pagina’s) kun je een verwerkingstijd van 2‑5 seconden verwachten; overweeg asynchrone uitvoering in webservices.
Signature signature = new Signature("SAMPLE_WORDPROCESSING/contract.docx");
DigitalSignOptions options = new DigitalSignOptions();
// ...configure options as shown earlier...
signature.sign("OUTPUT_FOLDER/signed_contract.docx", options);
Prestatie‑opmerking: Voor documenten van meer dan 100 pagina’s, vergroot de JVM‑heap (-Xmx2g) of schakel setAllPages(true) uit om het geheugenverbruik te beperken.
Hoe los ik veelvoorkomende problemen op?
Wanneer ondertekenen mislukt, hebben de meeste problemen te maken met certificaathandling, visuele plaatsing of geheugenbeperkingen. Identificeer het symptoom en volg de gerichte checklist hieronder om het probleem snel op te lossen.
Waarom zie ik “Invalid Certificate” of “Cannot Load Certificate” fouten?
Deze uitzonderingen ontstaan meestal door een van de vier oorzaken:
- Onjuist wachtwoord – controleer met OpenSSL:
openssl pkcs12 -info -in yourcert.pfx. - Verlopen certificaat – controleer de geldigheid met
keytool -list -v -keystore yourcert.pfx. - Verkeerd bestandsformaat – alleen
.pfxof.p12(die privésleutels bevatten) worden geaccepteerd. - Bestandspermissie‑problemen – zorg ervoor dat het Java‑proces het certificaatbestand kan lezen.
Waarom verschijnt de handtekening niet op de pagina?
- De AllPages‑vlag kan
falsezijn, waardoor je naar een pagina zonder zegel kijkt. - Het Image‑pad kan verkeerd gespeld zijn; print
options.getImageFilePath()om te bevestigen. - Alignment‑instellingen kunnen het zegel buiten het scherm duwen; schakel tijdelijk over naar
Centervoor debugging.
Waarom meldt Adobe Reader “Signature Invalid”?
- Certificaat niet vertrouwd – zelfondertekende certificaten veroorzaken waarschuwingen. Gebruik een door een CA uitgegeven certificaat voor productie.
- Onvolledige certificaatketen – zorg ervoor dat de
.pfxtussen‑ en root‑certificaten bevat. - Ontbrekende timestamp – zonder een TSA‑token kan de handtekening als ongeldig worden beschouwd nadat het certificaat is verlopen. GroupDocs ondersteunt timestamping via
setTimeStampOptions().
Hoe vermijd ik OutOfMemoryError bij enorme PDF’s?
- Vergroot de JVM‑heap (
-Xmx4gof hoger). - Onderteken alleen de benodigde pagina’s (
setAllPages(false)). - Verwerk bestanden in kleinere batches of stream ze als je in een beperkte omgeving werkt.
Hoe beheer ik certificaten veilig in productie?
Plaats certificaten of wachtwoorden nooit in de broncode. Volg deze stappen:
- Sla
.pfx‑bestanden op in een veilige kluis (AWS Secrets Manager, Azure Key Vault of HashiCorp Vault). - Laad het wachtwoord tijdens runtime vanuit omgevingsvariabelen of de API van de kluis.
- Beperk bestandspermissies zodat alleen het service‑account het certificaat kan lezen.
- Roteer certificaten minstens 30 dagen vóór vervaldatum en werk het opgeslagen geheim bij.
String certPath = System.getenv("CERT_PATH");
String certPassword = System.getenv("CERT_PASSWORD");
options.setCertificatePath(certPath);
options.setCertificatePassword(certPassword);
Hoe log ik handtekeningbewerkingen voor audit‑compliance?
Audit‑logs bieden bewijs van non‑repudiatie. Leg de volgende velden vast voor elke ondertekeningsgebeurtenis:
- Documentnaam en hash vóór ondertekening
- Identiteit van de ondertekenaar (certificaat‑subject)
- Tijdstempel van de operatie (bij voorkeur UTC)
- Resultaatstatus (succes/fout) en eventuele foutdetails
logger.info("Signing document {} with certificate {} at {}", docPath, options.getCertificatePath(), Instant.now());
Hoe verifieer ik een handtekening nadat deze is toegepast?
Verificatie zorgt ervoor dat het document na ondertekening niet is gemanipuleerd. Gebruik de verify()‑methode, die een VerificationResult retourneert met geldigheidsstatus, ondertekenaar‑details en eventuele timestamp‑informatie. Een succesvolle verificatie bevestigt zowel integriteit als authenticiteit.
VerificationResult result = signature.verify("OUTPUT_FOLDER/signed_contract.docx");
if (result.isValid()) {
logger.info("Signature is valid and trusted.");
} else {
logger.warn("Signature verification failed: {}", result.getErrorMessage());
}
Hoe kan ik meerdere handtekeningen aan één document toevoegen?
Je hebt mogelijk een ondertekenaar en een getuige nodig. Roep sign() meerdere keren aan met verschillende DigitalSignOptions‑instanties, elk geconfigureerd met een eigen certificaat en visuele instellingen. De bibliotheek behoudt bestaande handtekeningen terwijl nieuwe worden toegevoegd.
// First signature (approver)
signature.sign("output.docx", approverOptions);
// Second signature (witness)
signature.sign("output.docx", witnessOptions);
Hoe maak ik een factory‑methode voor verschillende documenttypes?
Een hulpfunctie kan een vooraf geconfigureerde DigitalSignOptions teruggeven op basis van de bestandsextensie, waardoor je code DRY blijft. Dit centraliseert het laden van certificaten, visuele standaardinstellingen en paginaselectielogica voor PDF, Word, Excel en andere ondersteunde formaten.
public DigitalSignOptions getOptionsFor(String extension) {
DigitalSignOptions opts = new DigitalSignOptions();
// common settings
if (extension.equalsIgnoreCase("pdf")) {
opts.setImageFilePath("signatures/pdf_stamp.png");
} else if (extension.equalsIgnoreCase("docx")) {
opts.setSignatureLineText("Jane Smith", "Finance Manager", "j.smith@company.com");
}
return opts;
}
Hoe valideer ik dat een document nog niet ondertekend is?
Controleer vóór het toepassen van een nieuwe handtekening op bestaande handtekeningen om dubbelondertekening te voorkomen. Gebruik de getSignatures()‑methode; als de geretourneerde collectie niet leeg is, beslis dan of je een nieuwe handtekening toevoegt of de operatie afbreekt.
List<SignatureInfo> existing = signature.getSignatures();
if (!existing.isEmpty()) {
logger.warn("Document already contains {} signatures.", existing.size());
}
Praktische toepassingen (reële use‑cases)
- Geautomatiseerde contractworkflows – Wanneer een contract de status “goedgekeurd” bereikt in je BPM‑systeem, activeer je de ondertekeningsservice om het certificaat van de juridische afdeling in te sluiten en de ondertekende kopie naar de leverancier te e‑mailen.
- Factuurgoedkeuringssystemen – Nadat finance een factuur heeft goedgekeurd, voeg je automatisch een digitale handtekening toe voordat je deze naar de klant stuurt, waardoor cryptografisch bewijs van authenticiteit wordt geleverd.
- Documentverificatie‑portalen – Bied een self‑service portaal waar gebruikers een PDF uploaden, jij ondertekent deze met een bedrijfsbreed certificaat, en je retourneert een manipulatie‑evident bestand voor juridische naleving.
- Industrieën met strenge compliance – In de gezondheidszorg (HIPAA) of financiën (SOX) voldoen digitale handtekeningen aan audit‑vereisten door te bewijzen wie een document heeft ondertekend en wanneer.
- Interne beleidsdistributie – Vervang handmatig stempelen van HR‑beleid door een geautomatiseerd proces dat de definitieve PDF ondertekent met het certificaat van de CHRO, zodat elke medewerker een geverifieerde kopie ontvangt.
Prestatie‑overwegingen
| Documentgrootte | Gemiddelde verwerkingstijd | Aanbevolen instellingen |
|---|---|---|
| 1‑5 pagina’s | ~0,5 s | Standaardopties |
| 5‑50 pagina’s | 1‑3 s | Heap vergroten, setAllPages(true) indien nodig |
| 50‑200 pagina’s | 3‑10 s | setAllPages(false), async uitvoering, grotere heap |
Optimalisatietips:
- Hergebruik één
Signature‑instantie bij het ondertekenen van veel bestanden in een batch. - Cache het geladen
DigitalSignOptions‑object; het herhaaldelijk laden van het certificaat voegt overhead toe. - Voor webservices, wikkel de ondertekeningsaanroep in een
CompletableFutureof plaats deze in een berichtwachtrij om de UI responsief te houden.
Pro‑tips (geavanceerd gebruik)
- Timestamping voor langetermijnvaliditeit – Voeg een TSA‑token toe met
setTimeStampOptions()om te zorgen dat handtekeningen geldig blijven nadat het certificaat is verlopen. - Onzichtbare handtekeningen – Laat
ImageFilePathweg en stelWidth/Heightin op0om een cryptografisch geldige maar onzichtbare handtekening te creëren, nuttig voor backend‑processen die geen visueel zegel nodig hebben. - Aangepaste QR‑code‑handtekeningen – GroupDocs kan een QR‑code insluiten met ondertekenaar‑metadata; ideaal voor supply‑chain‑documenten die snelle verificatie via mobiele apparaten vereisen.
Veelgestelde vragen
Q: Wat is het belangrijkste verschil tussen GroupDocs.Signature en iText voor PDF‑ondertekening?
A: iText richt zich uitsluitend op PDF en vereist dat je low‑level cryptografie zelf afhandelt, terwijl GroupDocs.Signature 30+ formaten ondersteunt, kant‑en‑klare visuele zegels biedt en certificaathandling abstraheert, waardoor de ontwikkeltijd drastisch wordt verkort.
Q: Kan ik GroupDocs.Signature integreren in een Spring Boot‑microservice?
A: Ja. Voeg de Maven‑dependency toe, maak een @Service‑bean die de ondertekeningslogica omsluit, en injecteer deze waar je documenten moet ondertekenen. Dit houdt je controllers slank en je ondertekeningscode herbruikbaar.
Q: Hoe veilig zijn handtekeningen die met GroupDocs.Signature worden gemaakt?
A: De bibliotheek gebruikt standaard PKI‑algoritmen (RSA/ECDSA) en volgt dezelfde specificaties als browsers en Adobe Reader. De veiligheid hangt af van de kwaliteit van je certificaat; gebruik altijd een door een CA uitgegeven certificaat en bescherm de privésleutel.
Q: Werken ondertekende documenten in verschillende PDF‑readers?
A: Absoluut. Zolang het ondertekeningscertificaat vertrouwd wordt, zullen Adobe Reader, Foxit en moderne browsers de handtekening correct valideren. Zelfondertekende certificaten geven een waarschuwing maar blijven technisch geldig.
Q: Is het mogelijk om documenten te ondertekenen zonder een zichtbaar handtekeningbeeld?
A: Ja—laat simpelweg ImageFilePath weg en stel de grootte‑parameters in op nul. De resulterende handtekening is onzichtbaar maar nog steeds cryptografisch geldig, perfect voor backend‑automatisering waar visuele aanwijzingen niet nodig zijn.
Conclusie
Je beschikt nu over een volledige, productie‑klare roadmap voor add digital signature java met GroupDocs.Signature. We hebben alles behandeld, van omgeving‑setup en certificaathandling tot visuele aanpassing, prestatie‑tuning en geavanceerde scenario’s zoals meerdere handtekeningen en timestamping.
Volgende stappen:
- Test de voorbeeldcode met je eigen certificaten en documentsjablonen.
- Verhard je deployment door certificaten naar een secret manager te verplaatsen en juiste JVM‑geheugenlimieten te configureren.
- Breid de hulpfuncties uit om batch‑verwerking te ondersteunen of integreer ze met je bestaande workflow‑engine.
Voor diepere duiken, bekijk de officiële documentatie en community‑forums via de onderstaande links.
Last Updated: 2026-06-11
Tested With: GroupDocs.Signature 23.12 for Java
Author: GroupDocs
Resources:
import com.groupdocs.signature.Signature;
public class SignatureSetup {
public static void main(String[] args) {
Signature signature = new Signature("path/to/your/document");
// Your signing logic goes here
}
}
import com.groupdocs.signature.options.sign.DigitalSignOptions;
import com.groupdocs.signature.domain.enums.HorizontalAlignment;
import com.groupdocs.signature.domain.enums.VerticalAlignment;
import com.groupdocs.signature.exception.GroupDocsSignatureException;
DigitalSignOptions options = new DigitalSignOptions("YOUR_DOCUMENT_DIRECTORY/CertificatePfx");
options.setPassword("1234567890"); // Ensure your certificate password is secure
options.setReason("Sign"); // Reason for signing, e.g., "Contract Approval"
options.setContact("JohnSmith"); // Contact information of the signer
options.setLocation("Office1"); // Location where document is signed
options.setImageFilePath("YOUR_DOCUMENT_DIRECTORY/ImageHandwrite");
options.setAllPages(true); // Apply signature to all pages of the document
options.setWidth(0); // Auto-width based on content
options.setHeight(60); // Height in pixels
options.setVerticalAlignment(VerticalAlignment.Bottom);
options.setHorizontalAlignment(HorizontalAlignment.Right);
Padding padding = new Padding();
padding.setBottom(10); // Bottom padding for aesthetic spacing
padding.setRight(10); // Right padding to prevent clipping at edges
options.setMargin(padding);
import com.groupdocs.signature.domain.signatures.DigitalSignatureAppearance;
options.setAppearance(new DigitalSignatureAppearance("John Smith", "Title", "jonny@test.com"));
try {
Signature signature = new Signature("YOUR_DOCUMENT_DIRECTORY/SAMPLE_WORDPROCESSING");
String outputFilePath = "YOUR_OUTPUT_DIRECTORY/DigitalAppearance.docx";
signature.sign(outputFilePath, options);
} catch (GroupDocsSignatureException e) {
throw new RuntimeException(e.getMessage());
}
// BAD - Don't do this
options.setPassword("1234567890");
// GOOD - Load from environment variable
String certPassword = System.getenv("CERT_PASSWORD");
if (certPassword == null) {
throw new RuntimeException("CERT_PASSWORD environment variable not set");
}
options.setPassword(certPassword);
logger.info("Document signed: {}, SignedBy: {}, Timestamp: {}",
documentName, signerEmail, LocalDateTime.now());
// Verify the signature immediately after signing
List<DigitalSignature> signatures = signature.verify();
if (signatures.isEmpty()) {
throw new RuntimeException("Signature verification failed");
}
signature.sign(outputPath, approverOptions);
signature = new Signature(outputPath); // Reload the signed document
signature.sign(finalOutputPath, witnessOptions);
public DigitalSignOptions getOptionsForDocType(String docType) {
DigitalSignOptions options = new DigitalSignOptions(certPath);
if (docType.equals("contract")) {
options.setVerticalAlignment(VerticalAlignment.Bottom);
// Contract-specific settings
} else if (docType.equals("invoice")) {
options.setVerticalAlignment(VerticalAlignment.Top);
// Invoice-specific settings
}
return options;
}
List<DigitalSignature> existingSignatures = signature.search(DigitalSignature.class);
if (!existingSignatures.isEmpty()) {
System.out.println("Document already signed by: " +
existingSignatures.get(0).getContactInfo());
}