Jak dodać podpisy cyfrowe do dokumentów w Javie
Wprowadzenie
Implementacja funkcjonalności add digital signature java może przypominać poruszanie się po polu minowym. Trzeba żonglować formatami certyfikatów, miejscem umieszczenia podpisu oraz ścisłymi zasadami bezpieczeństwa — wszystko przy zachowaniu płynnego doświadczenia użytkownika. Jeden błąd i otrzymujesz nieprawidłowe podpisy lub dokumenty, które nie przechodzą weryfikacji w Adobe Reader.
Na szczęście nie musisz wymyślać koła od nowa ani zmagać się z niskopoziomową kryptografią. Niezależnie od tego, czy tworzysz portal zarządzania umowami, proces płatności e‑commerce wymagający podpisanych paragonów, czy wewnętrzny przepływ pracy HR, niezawodna biblioteka Java zaoszczędzi Ci godziny pracy i wyeliminuje typowe pułapki.
W tym przewodniku przejdziemy przez GroupDocs.Signature for Java, komercyjną bibliotekę, która abstrahuje ciężkie operacje związane z podpisami cyfrowymi. Nauczysz się, jak:
- Skonfigurować bibliotekę i poprawnie ustawić certyfikaty
- Podpisywać pliki PDF, Word, Excel i PowerPoint przy użyciu profesjonalnej pieczątki wizualnej
- Weryfikować podpisy i obsługiwać typowe błędy, takie jak nieufne certyfikaty czy wąskie gardła pamięci
- Stosować najlepsze praktyki zabezpieczeń w środowiskach produkcyjnych
Po zakończeniu będziesz mieć gotową implementację, którą możesz rozszerzyć dla dowolnego typu dokumentu obsługiwanego przez Twoją aplikację.
Szybkie odpowiedzi
- Jaka biblioteka pozwala dodać podpisy cyfrowe w Javie? GroupDocs.Signature for Java.
- Ile formatów dokumentów jest obsługiwanych? Ponad 30 formatów, w tym PDF, DOCX, XLSX, PPTX oraz pliki graficzne.
- Czy potrzebna jest licencja do produkcji? Tak — licencja komercyjna usuwa znaki wodne i odblokowuje pełne funkcje.
- Czy mogę podpisać duże pliki PDF (100+ stron) bez błędów OOM? Tak — poprzez dostosowanie sterty JVM i użycie opcji
setAllPages(false). - Czy obsługiwane jest timestampowanie? Oczywiście; możesz dołączyć zaufany token Time‑Stamp Authority (TSA) dla długoterminowej ważności.
Co to jest add digital signature java?
add digital signature java odnosi się do programowego procesu osadzania kryptograficznego podpisu w dokumencie cyfrowym przy użyciu API Javy. Podpis wiąże tożsamość podpisującego — zweryfikowaną przez certyfikat cyfrowy — z zawartością dokumentu, zapewniając integralność, nieodrzucalność i prawne egzekwowanie na różnych platformach.
Dlaczego warto implementować podpisy cyfrowe w Javie?
GroupDocs.Signature obsługuje ponad 30 formatów wejścia i wyjścia oraz może przetwarzać pliki do 500 MB bez ładowania całego pliku do pamięci, oferując 2‑5× przyspieszenie w porównaniu z ręcznymi implementacjami PDFBox. Ten wymierny zysk przekłada się na szybsze czasy transakcji i niższe koszty serwera przy dużych obciążeniach.
Wymagania wstępne
Zanim rozpoczniesz, upewnij się, że masz:
- Java Development Kit (JDK) 8+ – zalecany JDK 11 ze względu na ulepszone wsparcie TLS.
- IDE – IntelliJ IDEA, Eclipse lub VS Code z rozszerzeniami Java.
- GroupDocs.Signature for Java – pokażemy trzy sposoby dodania go do projektu.
- Ważny certyfikat cyfrowy w formacie PFX lub P12 (potrzebny klucz prywatny i hasło).
Opcjonalnie, ale przydatne:
- Znajomość Maven lub Gradle do zarządzania zależnościami.
- Przykładowy plik PDF, DOCX lub XLSX do testowania przepływu podpisywania.
Jak zainstalować GroupDocs.Signature for Java?
GroupDocs.Signature wymaga prostego dodania do konfiguracji budowania. Użyj fragmentu odpowiadającego Twojemu narzędziu budowania, zamień wersję placeholdera na najnowsze stabilne wydanie i uruchom polecenie budowania, aby pobrać bibliotekę z Maven Central.
Maven (dodaj do pom.xml):
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle (dodaj do build.gradle):
implementation 'com.groupdocs:groupdocs-signature:23.12'
Instalacja ręczna (jeśli nie używasz narzędzia budowania):
Pobierz JAR ze strony oficjalnych wydań — GroupDocs.Signature for Java releases — i dodaj go do classpath.
Pro tip: Zawsze odwołuj się do najnowszej stabilnej wersji. Na moment pisania, wersja 23.12 jest aktualna, ale nowsze wydania często zawierają poprawki bezpieczeństwa i usprawnienia wydajności.
Jak uzyskać i zastosować licencję GroupDocs?
GroupDocs.Signature wymaga licencji do użytku produkcyjnego. Licencja usuwa znaki wodne i odblokowuje pełny zestaw funkcji, zapewniając zgodność podpisanych dokumentów z politykami przedsiębiorstwa.
- Bezpłatna wersja próbna: Pobierz 30‑dniową tymczasową licencję na Temporary License Page.
- Licencja płatna: Kup licencję deweloperską lub korporacyjną na GroupDocs Purchase Page.
Bez ważnej licencji podpisane dokumenty będą zawierały widoczny znak wodny, przydatny wyłącznie do oceny.
Jak zainicjalizować obiekt Signature?
Klasa Signature jest punktem wejścia dla wszystkich operacji na dokumentach. Reprezentuje pojedynczy plik w pamięci i udostępnia metody do podpisywania, weryfikacji i wyodrębniania podpisów. Utworzenie instancji Signature ładuje docelowy plik i przygotowuje go do dalszego przetwarzania.
Signature signature = new Signature("path/to/input.pdf");
Co się tutaj dzieje?
Linia tworzy instancję Signature, która ładuje docelowy dokument. Ścieżka może być bezwzględna lub względna; po prostu upewnij się, że plik istnieje. Obiekt może być ponownie używany do wielu operacji podpisywania lub weryfikacji, co zmniejsza narzut w scenariuszach wsadowych.
Jak skonfigurować opcje podpisu cyfrowego?
Opcje podpisu cyfrowego kapsułkują wszystkie ustawienia niezbędne do wygenerowania prawidłowego podpisu PKI, w tym informacje o certyfikacie, wygląd wizualny i zasady umiejscowienia. Poprawna konfiguracja zapewnia, że wynikowy podpis jest zarówno kryptograficznie solidny, jak i wizualnie odpowiedni dla typu dokumentu.
Jak ustawić szczegóły certyfikatu?
Klasa DigitalSignOptions przechowuje wszystkie ustawienia związane z certyfikatem. Poniżej znajduje się definicja używana przy pierwszym użyciu tej klasy.
DigitalSignOptions definiuje parametry kryptograficzne — plik certyfikatu, hasło oraz opcjonalne metadane — które biblioteka wykorzystuje do stworzenia prawidłowego podpisu PKI.
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");
Kluczowe uwagi:
- Nigdy nie koduj na stałe hasła; wczytuj je ze zmiennych środowiskowych lub menedżera sekretów.
- Użyj
setReason,setContactisetLocation, aby dać recenzentom kontekst przy przeglądaniu właściwości podpisu.
Jak dostosować wygląd wizualny podpisu?
SignatureOptions (podklasa DigitalSignOptions) kontroluje renderowanie na stronie. Pozwala dołączyć obraz, dostosować rozmiar i pozycję wizualnej pieczątki.
SignatureOptions pozwala dołączyć obraz, dostosować rozmiar i pozycję wizualnej pieczątki na stronie.
options.setImageFilePath("YOUR_DOCUMENT_DIRECTORY/signature.png");
options.setAllPages(true);
options.setWidth(150);
options.setHeight(0); // Auto‑scale based on image aspect ratio
- ImageFilePath: Wskaż plik PNG lub JPG z odręcznym podpisem lub logo firmy. Transparentne PNG działają najlepiej.
- AllPages: Ustaw na
true, jeśli kontrakty wymagają dowodu na każdej stronie; w przeciwnym raziefalsepodpisze tylko ostatnią stronę. - Width/Height: Mierzone w pikselach; wysokość 50‑80 pikseli wygląda profesjonalnie w większości dokumentów biznesowych.
Jak kontrolować wyrównanie i odstępy?
Ustawienia wyrównania określają, gdzie pieczątka ląduje na stronie, a odstępy dodają bufor wokół elementu wizualnego, aby nie dotykał krawędzi strony. Odpowiednie wyrównanie poprawia czytelność i zapewnia, że podpis nie koliduje z istniejącą treścią.
AlignmentOptions udostępnia stałe określające pionowe i poziome położenie, takie jak Bottom, Right, Top i Center.
options.setVerticalAlignment(VerticalAlignment.Bottom);
options.setHorizontalAlignment(HorizontalAlignment.Right);
options.setPadding(10);
- Padding: Dodaje przestrzeń wokół pieczątki; wartość 10 pikseli zapobiega dotknięciu obrazu krawędzi strony.
- Przykład z życia: W szablonach faktur możesz użyć
Top/Left, aby umieścić podpis zatwierdzającego blisko nagłówka.
Jak dodać linię podpisu dla dokumentów Office?
Podczas podpisywania plików DOCX lub XLSX widoczna linia podpisu poprawia czytelność dla końcowych użytkowników. Biblioteka tworzy linię podpisu w stylu Microsoft, wyświetlającą imię i nazwisko, stanowisko oraz e‑mail podpisującego, odzwierciedlając natywne doświadczenie Office.
SignatureLineOptions tworzy linię podpisu w stylu Microsoft, wyświetlającą imię i nazwisko, stanowisko oraz e‑mail podpisującego.
options.setSignatureLineText("John Doe", "Chief Legal Officer", "j.doe@yourcompany.com");
- Ta funkcja jest ignorowana w PDF, ale jest niezbędna dla plików Word i Excel otwieranych w Microsoft Office.
Jak faktycznie podpisać dokument?
Wczytaj plik źródłowy przy użyciu instancji Signature, zastosuj w pełni skonfigurowane DigitalSignOptions i wywołaj sign(). Biblioteka zapisuje nowy plik w ścieżce wyjściowej, pozostawiając oryginał nietknięty. Dla dużych PDF (50+ stron) spodziewaj się okna przetwarzania 2‑5 sekund; rozważ asynchroniczne wykonanie w usługach sieciowych.
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);
Uwaga o wydajności: Dla dokumentów powyżej 100 stron zwiększ stertę JVM (-Xmx2g) lub wyłącz setAllPages(true), aby ograniczyć zużycie pamięci.
Jak rozwiązywać typowe problemy?
Gdy podpisywanie się nie udaje, najczęstsze problemy dotyczą obsługi certyfikatów, rozmieszczenia wizualnego lub ograniczeń pamięci. Zidentyfikuj objaw, a następnie postępuj zgodnie z poniższą listą kontrolną, aby szybko rozwiązać problem.
Dlaczego widzę błędy „Invalid Certificate” lub „Cannot Load Certificate”?
Te wyjątki zwykle wynikają z jednej z czterech przyczyn:
- Nieprawidłowe hasło – zweryfikuj przy pomocy OpenSSL:
openssl pkcs12 -info -in yourcert.pfx. - Wygasły certyfikat – sprawdź ważność przy użyciu
keytool -list -v -keystore yourcert.pfx. - Nieprawidłowy format pliku – akceptowane są wyłącznie
.pfxlub.p12(zawierające klucze prywatne). - Problemy z uprawnieniami – upewnij się, że proces Java może odczytać plik certyfikatu.
Dlaczego podpis nie pojawia się na stronie?
- Flaga AllPages może być ustawiona na
false, więc patrzysz na stronę bez pieczątki. - Ścieżka do obrazu może być błędna; wydrukuj
options.getImageFilePath()w celu weryfikacji. - Ustawienia wyrównania mogą przesuwać pieczątkę poza ekran; tymczasowo przełącz na
Centerw celu debugowania.
Dlaczego Adobe Reader zgłasza „Signature Invalid”?
- Certyfikat nieufny – samopodpisane certyfikaty wywołują ostrzeżenia. Użyj certyfikatu wydanego przez CA w produkcji.
- Niekompletna łańcuch certyfikatów – upewnij się, że
.pfxzawiera certyfikaty pośrednie i główne. - Brak timestampu – bez tokenu TSA podpis może być uznany za nieważny po wygaśnięciu certyfikatu. GroupDocs obsługuje timestampowanie poprzez
setTimeStampOptions().
Jak uniknąć OutOfMemoryError przy ogromnych PDF?
- Zwiększ stertę JVM (
-Xmx4glub wyżej). - Podpisuj tylko wymagane strony (
setAllPages(false)). - Przetwarzaj pliki w mniejszych partiach lub strumieniuj je, jeśli pracujesz w środowisku o ograniczonych zasobach.
Jak bezpiecznie zarządzać certyfikatami w produkcji?
Nigdy nie osadzaj certyfikatów ani haseł w kodzie źródłowym. Postępuj według poniższych kroków:
- Przechowuj pliki
.pfxw bezpiecznym sejfie (AWS Secrets Manager, Azure Key Vault lub HashiCorp Vault). - Ładuj hasło w czasie wykonywania ze zmiennych środowiskowych lub API sejfu.
- Ogranicz uprawnienia systemu plików tak, aby tylko konto serwisowe mogło odczytać certyfikat.
- Rotuj certyfikaty przynajmniej 30 dni przed wygaśnięciem i zaktualizuj odpowiedni sekret.
String certPath = System.getenv("CERT_PATH");
String certPassword = System.getenv("CERT_PASSWORD");
options.setCertificatePath(certPath);
options.setCertificatePassword(certPassword);
Jak logować operacje podpisywania dla zgodności audytowej?
Logi audytowe zapewniają dowód nieodrzucalności. Zarejestruj następujące pola dla każdego zdarzenia podpisywania:
- Nazwa dokumentu i hash przed podpisaniem
- Tożsamość podpisującego (subject certyfikatu)
- Znacznik czasu operacji (najlepiej w UTC)
- Status wyniku (sukces/porażka) oraz szczegóły błędów, jeśli wystąpiły
logger.info("Signing document {} with certificate {} at {}", docPath, options.getCertificatePath(), Instant.now());
Jak zweryfikować podpis po jego zastosowaniu?
Weryfikacja zapewnia, że dokument nie został zmodyfikowany po podpisaniu. Użyj metody verify(), która zwraca VerificationResult zawierający status ważności, dane podpisującego oraz informacje o timestampie. Udana weryfikacja potwierdza zarówno integralność, jak i autentyczność.
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());
}
Jak dodać wiele podpisów do jednego dokumentu?
Możesz potrzebować podpisu zatwierdzającego i świadka. Wywołaj sign() wielokrotnie z odrębnymi instancjami DigitalSignOptions, każdą skonfigurowaną z własnym certyfikatem i ustawieniami wizualnymi. Biblioteka zachowuje istniejące podpisy, jednocześnie dopisując nowe.
// First signature (approver)
signature.sign("output.docx", approverOptions);
// Second signature (witness)
signature.sign("output.docx", witnessOptions);
Jak stworzyć metodę fabryczną dla różnych typów dokumentów?
Metoda pomocnicza może zwracać wstępnie skonfigurowany DigitalSignOptions w zależności od rozszerzenia pliku, co utrzymuje kod DRY. Centralizuje to ładowanie certyfikatu, domyślne ustawienia wizualne i logikę wyboru stron dla PDF, Word, Excel i innych obsługiwanych formatów.
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;
}
Jak sprawdzić, czy dokument nie jest już podpisany?
Przed zastosowaniem nowego podpisu sprawdź istniejące podpisy, aby uniknąć podwójnego podpisywania. Użyj metody getSignatures(); jeśli zwrócona kolekcja nie jest pusta, zdecyduj, czy dodać nowy podpis, czy przerwać operację.
List<SignatureInfo> existing = signature.getSignatures();
if (!existing.isEmpty()) {
logger.warn("Document already contains {} signatures.", existing.size());
}
Praktyczne zastosowania (przykłady z życia)
- Zautomatyzowane przepływy pracy z umowami – Gdy umowa osiąga stan „zatwierdzona” w systemie BPM, wywołaj usługę podpisywania, aby osadzić certyfikat działu prawnego i wysłać podpisaną kopię do dostawcy.
- Systemy zatwierdzania faktur – Po zatwierdzeniu faktury przez dział finansowy automatycznie dodaj podpis cyfrowy przed wysłaniem do klienta, zapewniając kryptograficzny dowód autentyczności.
- Portale weryfikacji dokumentów – Udostępnij portal samoobsługowy, gdzie użytkownicy przesyłają PDF, a Ty podpisujesz go firmowym certyfikatem i zwracasz plik odporny na manipulacje dla zgodności prawnej.
- Branże o wysokich wymaganiach regulacyjnych – W ochronie zdrowia (HIPAA) lub finansach (SOX) podpisy cyfrowe spełniają wymogi audytowe, dowodząc, kto i kiedy podpisał dokument.
- Dystrybucja wewnętrznych polityk – Zastąp ręczne stemplowanie polityk HR automatycznym procesem, który podpisuje finalny PDF certyfikatem CHRO, zapewniając, że każdy pracownik otrzyma zweryfikowaną kopię.
Rozważania dotyczące wydajności
| Rozmiar dokumentu | Średni czas przetwarzania | Zalecane ustawienia |
|---|---|---|
| 1‑5 stron | ~0,5 s | Domyślne opcje |
| 5‑50 stron | 1‑3 s | Zwiększ stertę, setAllPages(true) w razie potrzeby |
| 50‑200 stron | 3‑10 s | setAllPages(false), wykonanie asynchroniczne, większa sterta |
Wskazówki optymalizacyjne:
- Ponownie używaj jednej instancji
Signatureprzy podpisywaniu wielu plików w partii. - Cache’uj załadowany obiekt
DigitalSignOptions; wielokrotne ładowanie certyfikatu zwiększa narzut. - W usługach sieciowych opakuj wywołanie podpisywania w
CompletableFuturelub przenieś je do kolejki komunikatów, aby UI pozostało responsywne.
Porady dla zaawansowanych (Pro Tips)
- Timestampowanie dla długoterminowej ważności – Dołącz token TSA przy użyciu
setTimeStampOptions(), aby zapewnić ważność podpisów po wygaśnięciu certyfikatu. - Niewidoczne podpisy – Pomiń
ImageFilePathi ustawWidth/Heightna0, aby stworzyć kryptograficznie ważny, ale niewidoczny podpis, przydatny w procesach backendowych nie wymagających wizualnej pieczątki. - Podpisy QR‑code – GroupDocs może osadzać kod QR zawierający metadane podpisującego; idealne dla dokumentów łańcucha dostaw, które wymagają szybkiej weryfikacji mobilnej.
Najczęściej zadawane pytania
P: Jaka jest główna różnica między GroupDocs.Signature a iText w kontekście podpisywania PDF?
O: iText koncentruje się wyłącznie na PDF i wymaga ręcznego zarządzania kryptografią, podczas gdy GroupDocs.Signature obsługuje ponad 30 formatów, oferuje gotowe pieczątki wizualne i abstrahuje obsługę certyfikatów, co drastycznie skraca czas rozwoju.
P: Czy mogę zintegrować GroupDocs.Signature w mikroserwisie Spring Boot?
O: Tak. Dodaj zależność Maven, utwórz bean @Service otaczający logikę podpisywania i wstrzykuj go tam, gdzie potrzebujesz podpisywać dokumenty. Dzięki temu kontrolery pozostają lekkie, a kod podpisywania jest wielokrotnie używalny.
P: Jak bezpieczne są podpisy tworzone przy użyciu GroupDocs.Signature?
O: Biblioteka używa standardowych algorytmów PKI (RSA/ECDSA) i spełnia te same specyfikacje co przeglądarki i Adobe Reader. Bezpieczeństwo zależy od jakości Twojego certyfikatu; zawsze używaj certyfikatu wydanego przez CA i chronić klucz prywatny.
P: Czy podpisane dokumenty działają w różnych czytnikach PDF?
O: Absolutnie. O ile certyfikat podpisującego jest zaufany, Adobe Reader, Foxit i nowoczesne przeglądarki poprawnie zweryfikują podpis. Samopodpisane certyfikaty wyświetlą ostrzeżenie, ale pozostaną technicznie ważne.
P: Czy można podpisać dokumenty bez widocznego obrazu podpisu?
O: Tak — po prostu pomiń ImageFilePath i ustaw parametry rozmiaru na zero. Wynikowy podpis jest niewidoczny, ale w pełni kryptograficznie ważny, idealny dla automatyzacji backendowej, gdzie nie są potrzebne elementy wizualne.
Zakończenie
Masz teraz kompletną, gotową do produkcji mapę drogową dla add digital signature java przy użyciu GroupDocs.Signature. Omówiliśmy wszystko, od konfiguracji środowiska i obsługi certyfikatów, po personalizację wizualną, optymalizację wydajności i zaawansowane scenariusze, takie jak wielokrotne podpisy i timestampowanie.
Kolejne kroki:
- Przetestuj przykładowy kod ze swoimi certyfikatami i szablonami dokumentów.
- Zabezpiecz wdrożenie, przenosząc certyfikaty do menedżera sekretów i konfigurując odpowiednie limity pamięci JVM.
- Rozszerz metody pomocnicze, aby obsługiwać przetwarzanie wsadowe lub zintegrować je z istniejącym silnikiem przepływu pracy.
Po głębsze zanurzenie się, zapoznaj się z oficjalną dokumentacją i forami społeczności podanymi poniżej.
Ostatnia aktualizacja: 2026-06-11
Testowane z: GroupDocs.Signature 23.12 for Java
Autor: GroupDocs
Zasoby:
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());
}