Cara Menambahkan Tanda Tangan Digital ke Dokumen dalam Java
Pendahuluan
Menerapkan add digital signature java dapat terasa seperti menavigasi medan ranjau. Anda harus mengelola format sertifikat, penempatan tanda tangan, dan kebijakan keamanan yang ketat—semua sambil menjaga pengalaman pengguna tetap mulus. Satu langkah salah dan Anda akan mendapatkan tanda tangan yang tidak valid atau dokumen yang gagal validasi di Adobe Reader.
Untungnya, Anda tidak perlu menciptakan kembali roda atau berjuang dengan kriptografi tingkat rendah. Baik Anda membangun portal manajemen kontrak, proses checkout e‑commerce yang memerlukan tanda terima bertanda tangan, atau alur kerja HR internal, pustaka Java yang handal menghemat jam pengembangan dan menghilangkan jebakan umum.
Dalam panduan ini kami akan membahas GroupDocs.Signature for Java, sebuah pustaka komersial yang menyederhanakan pekerjaan berat tanda tangan digital. Anda akan belajar cara:
- Menyiapkan pustaka dan mengonfigurasi sertifikat dengan benar
- Menandatangani file PDF, Word, Excel, dan PowerPoint dengan stempel visual profesional
- Memvalidasi tanda tangan dan menangani kesalahan umum seperti sertifikat tidak tepercaya atau bottleneck memori
- Menerapkan langkah‑langkah keamanan terbaik untuk lingkungan produksi
Pada akhir, Anda akan memiliki implementasi siap pakai yang dapat Anda perluas untuk jenis dokumen apa pun yang ditangani aplikasi Anda.
Jawaban Cepat
- Perpustakaan apa yang memungkinkan Anda menambahkan tanda tangan digital di Java? GroupDocs.Signature for Java.
- Berapa banyak format dokumen yang didukung? Lebih dari 30 format, termasuk PDF, DOCX, XLSX, PPTX, dan file gambar.
- Apakah saya memerlukan lisensi untuk produksi? Ya—lisensi komersial menghapus watermark dan membuka semua fitur.
- Bisakah saya menandatangani PDF besar (100+ halaman) tanpa error OOM? Ya—dengan menyesuaikan heap JVM dan menggunakan opsi
setAllPages(false). - Apakah timestamp didukung? Tentu; Anda dapat melampirkan token Time‑Stamp Authority (TSA) yang tepercaya untuk validitas jangka panjang.
Apa itu add digital signature java?
add digital signature java mengacu pada proses pemrograman menyisipkan tanda tangan kriptografis ke dalam dokumen digital menggunakan API Java. Tanda tangan mengikat identitas penandatangan—yang divalidasi oleh sertifikat digital—ke isi dokumen, memastikan integritas, non‑repudiation, dan keberlakuan hukum di seluruh platform.
Mengapa mengimplementasikan digital signatures java?
GroupDocs.Signature mendukung lebih dari 30 format input dan output dan dapat memproses file hingga 500 MB tanpa memuat seluruh file ke memori, memberikan peningkatan kecepatan 2‑5× dibandingkan implementasi PDFBox manual. Manfaat terukur ini diterjemahkan menjadi waktu transaksi yang lebih cepat dan biaya server yang lebih rendah untuk beban kerja volume tinggi.
Prasyarat
Sebelum Anda memulai, pastikan Anda memiliki hal berikut:
- Java Development Kit (JDK) 8+ – JDK 11 direkomendasikan untuk dukungan TLS yang ditingkatkan.
- IDE – IntelliJ IDEA, Eclipse, atau VS Code dengan ekstensi Java.
- GroupDocs.Signature for Java – kami akan menunjukkan tiga cara menambahkannya ke build Anda.
- Sertifikat digital yang valid dalam format PFX atau P12 (Anda memerlukan kunci pribadi dan kata sandi).
Opsional tetapi membantu:
- Familiaritas dengan Maven atau Gradle untuk manajemen dependensi.
- File contoh PDF, DOCX, atau XLSX untuk menguji alur penandatanganan.
Bagaimana cara menginstal GroupDocs.Signature untuk Java?
GroupDocs.Signature memerlukan penambahan sederhana ke konfigurasi build Anda. Gunakan potongan kode yang sesuai dengan alat build Anda, ganti versi placeholder dengan rilis stabil terbaru, dan jalankan perintah build untuk mengambil pustaka dari Maven Central.
Maven (tambahkan ke pom.xml Anda):
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle (tambahkan ke build.gradle Anda):
implementation 'com.groupdocs:groupdocs-signature:23.12'
Instalasi Manual (jika Anda tidak menggunakan alat build):
Unduh JAR dari halaman rilis resmi — GroupDocs.Signature for Java releases — dan tambahkan ke classpath Anda.
Pro tip: Selalu referensikan versi stabil terbaru. Pada saat penulisan ini, versi 23.12 adalah yang terbaru, tetapi rilis yang lebih baru sering berisi perbaikan keamanan dan peningkatan performa.
Bagaimana cara mendapatkan dan menerapkan lisensi GroupDocs?
GroupDocs.Signature memerlukan lisensi untuk penggunaan produksi. Lisensi menghapus watermark dan membuka semua fitur, memastikan dokumen yang ditandatangani mematuhi kebijakan perusahaan.
- Free Trial: Dapatkan lisensi sementara 30‑hari di Temporary License Page.
- Paid License: Beli lisensi developer atau enterprise dari GroupDocs Purchase Page.
Tanpa lisensi yang valid, dokumen yang ditandatangani akan berisi watermark yang terlihat, yang hanya berguna untuk evaluasi.
Bagaimana cara menginisialisasi objek Signature?
Kelas Signature adalah titik masuk untuk semua operasi dokumen. Ia mewakili satu file dalam memori dan menyediakan metode untuk menandatangani, memverifikasi, dan mengekstrak tanda tangan. Membuat instance Signature memuat file target dan menyiapkannya untuk pemrosesan lebih lanjut.
Signature signature = new Signature("path/to/input.pdf");
Apa yang terjadi di sini?
Baris tersebut membuat instance Signature yang memuat dokumen target. Path dapat berupa absolut atau relatif; pastikan file tersebut ada. Objek ini dapat digunakan kembali untuk beberapa tindakan penandatanganan atau verifikasi, yang mengurangi beban dalam skenario batch.
Bagaimana cara mengonfigurasi opsi tanda tangan digital?
Opsi tanda tangan digital mencakup semua pengaturan yang diperlukan untuk menghasilkan tanda tangan PKI yang valid, termasuk informasi sertifikat, tampilan visual, dan aturan penempatan. Konfigurasi yang tepat memastikan tanda tangan yang dihasilkan secara kriptografis kuat dan secara visual sesuai untuk tipe dokumen.
Bagaimana cara mengatur detail sertifikat?
Kelas DigitalSignOptions menyimpan semua pengaturan terkait sertifikat. Di bawah ini adalah definisi pertama untuk kelas ini.
DigitalSignOptions mendefinisikan parameter kriptografis—file sertifikat, kata sandi, dan metadata opsional—yang digunakan pustaka untuk membuat tanda tangan PKI yang valid.
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");
Poin penting:
- Jangan pernah menuliskan kata sandi secara hard‑code; muat dari variabel lingkungan atau secret manager.
- Gunakan
setReason,setContact, dansetLocationuntuk memberi konteks kepada peninjau saat mereka memeriksa properti tanda tangan.
Bagaimana cara menyesuaikan tampilan visual tanda tangan?
SignatureOptions (subkelas dari DigitalSignOptions) mengontrol rendering pada halaman. Ia memungkinkan Anda melampirkan gambar, menyesuaikan ukuran, dan menempatkan stempel visual pada halaman.
SignatureOptions memungkinkan Anda melampirkan gambar, menyesuaikan ukuran, dan menempatkan stempel visual pada halaman.
options.setImageFilePath("YOUR_DOCUMENT_DIRECTORY/signature.png");
options.setAllPages(true);
options.setWidth(150);
options.setHeight(0); // Auto‑scale based on image aspect ratio
- ImageFilePath: Arahkan ke PNG atau JPG dari tanda tangan tulisan tangan atau logo perusahaan Anda. PNG transparan bekerja paling baik.
- AllPages: Atur ke
trueuntuk kontrak yang memerlukan bukti pada setiap halaman; jika tidak,falsehanya menandatangani halaman terakhir. - Width/Height: Diukur dalam piksel; tinggi 50‑80 piksel terlihat profesional untuk kebanyakan dokumen bisnis.
Bagaimana cara mengontrol perataan dan padding?
Pengaturan perataan menentukan di mana stempel ditempatkan pada halaman, sementara padding menambahkan ruang di sekitar elemen visual agar tidak menyentuh tepi halaman. Perataan yang tepat meningkatkan keterbacaan dan memastikan tanda tangan tidak mengganggu konten yang ada.
AlignmentOptions menyediakan konstanta penempatan vertikal dan horizontal seperti Bottom, Right, Top, dan Center.
options.setVerticalAlignment(VerticalAlignment.Bottom);
options.setHorizontalAlignment(HorizontalAlignment.Right);
options.setPadding(10);
- Padding: Menambahkan ruang di sekitar stempel; nilai 10 piksel mencegah gambar menyentuh tepi halaman.
- Contoh dunia nyata: Pada templat faktur, Anda mungkin menggunakan
Top/Leftuntuk menempatkan tanda tangan approver dekat header.
Bagaimana cara menambahkan baris tanda tangan untuk dokumen Office?
Saat menandatangani file DOCX atau XLSX, baris tanda tangan yang terlihat meningkatkan keterbacaan bagi pengguna akhir. Pustaka membuat baris tanda tangan gaya Microsoft yang menampilkan nama, jabatan, dan email penandatangan, meniru pengalaman Office asli.
SignatureLineOptions membuat baris tanda tangan gaya Microsoft yang menampilkan nama, jabatan, dan email penandatangan.
options.setSignatureLineText("John Doe", "Chief Legal Officer", "j.doe@yourcompany.com");
- Fitur ini diabaikan untuk PDF tetapi penting untuk file Word dan Excel yang dibuka di Microsoft Office.
Bagaimana cara benar‑benar menandatangani dokumen?
Muat file sumber dengan instance Signature, terapkan DigitalSignOptions yang telah dikonfigurasi sepenuhnya, dan panggil sign(). Pustaka menulis file baru ke jalur output, meninggalkan yang asli tidak tersentuh. Untuk PDF besar (50+ halaman) harapkan waktu pemrosesan 2‑5 detik; pertimbangkan eksekusi asynchronous dalam layanan web.
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);
Catatan kinerja: Untuk dokumen lebih dari 100 halaman, tingkatkan heap JVM (-Xmx2g) atau nonaktifkan setAllPages(true) untuk membatasi konsumsi memori.
Bagaimana cara memecahkan masalah umum?
Ketika penandatanganan gagal, masalah paling umum terkait dengan penanganan sertifikat, penempatan visual, atau batasan memori. Identifikasi gejala, lalu ikuti daftar periksa di bawah ini untuk menyelesaikan masalah dengan cepat.
Mengapa saya melihat error “Invalid Certificate” atau “Cannot Load Certificate”?
Pengecualian ini biasanya berasal dari salah satu dari empat penyebab:
- Password salah – verifikasi dengan OpenSSL:
openssl pkcs12 -info -in yourcert.pfx. - Sertifikat kedaluwarsa – periksa keabsahan menggunakan
keytool -list -v -keystore yourcert.pfx. - Format file salah – hanya
.pfxatau.p12(yang berisi kunci pribadi) yang diterima. - Masalah izin file – pastikan proses Java dapat membaca file sertifikat.
Mengapa tanda tangan tidak muncul di halaman?
- Flag AllPages mungkin
false, sehingga Anda melihat halaman tanpa stempel. - Path gambar mungkin salah ketik; cetak
options.getImageFilePath()untuk memastikan. - Pengaturan perataan mungkin menempatkan stempel di luar layar; sementara ubah ke
Centeruntuk debugging.
Mengapa Adobe Reader melaporkan “Signature Invalid”?
- Sertifikat tidak tepercaya – sertifikat self‑signed memicu peringatan. Gunakan sertifikat yang dikeluarkan CA untuk produksi.
- Rantai sertifikat tidak lengkap – pastikan
.pfxmencakup sertifikat intermediate dan root. - Timestamp hilang – tanpa token TSA, tanda tangan dapat dianggap tidak valid setelah sertifikat kedaluwarsa. GroupDocs mendukung timestamping melalui
setTimeStampOptions().
Bagaimana cara menghindari OutOfMemoryError dengan PDF besar?
- Tingkatkan heap JVM (
-Xmx4gatau lebih tinggi). - Hanya menandatangani halaman yang diperlukan (
setAllPages(false)). - Proses file dalam batch lebih kecil atau streaming jika Anda berada di lingkungan terbatas.
Bagaimana cara mengelola sertifikat secara aman di produksi?
Jangan pernah menyematkan sertifikat atau kata sandi dalam kode sumber. Ikuti langkah‑langkah berikut:
- Simpan file
.pfxdi vault yang aman (AWS Secrets Manager, Azure Key Vault, atau HashiCorp Vault). - Muat kata sandi pada runtime dari variabel lingkungan atau API vault.
- Batasi izin sistem file sehingga hanya akun layanan yang dapat membaca sertifikat.
- Rotasi sertifikat setidaknya 30 hari sebelum kedaluwarsa dan perbarui secret yang disimpan sesuai.
String certPath = System.getenv("CERT_PATH");
String certPassword = System.getenv("CERT_PASSWORD");
options.setCertificatePath(certPath);
options.setCertificatePassword(certPassword);
Bagaimana cara mencatat operasi tanda tangan untuk kepatuhan audit?
Log audit menyediakan bukti non‑repudiation. Catat bidang berikut untuk setiap peristiwa penandatanganan:
- Nama dokumen dan hash sebelum penandatanganan
- Identitas penandatangan (subjek sertifikat)
- Timestamp operasi (sebaiknya UTC)
- Status hasil (sukses/gagal) dan detail error jika ada
logger.info("Signing document {} with certificate {} at {}", docPath, options.getCertificatePath(), Instant.now());
Bagaimana cara memverifikasi tanda tangan setelah diterapkan?
Verifikasi memastikan dokumen tidak diubah setelah penandatanganan. Gunakan metode verify(), yang mengembalikan VerificationResult berisi status validitas, detail penandatangan, dan informasi timestamp apa pun. Verifikasi yang berhasil mengonfirmasi integritas dan keaslian.
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());
}
Bagaimana cara menambahkan beberapa tanda tangan ke satu dokumen?
Anda mungkin memerlukan tanda tangan approver dan saksi. Panggil sign() beberapa kali dengan instance DigitalSignOptions yang berbeda, masing‑masing dikonfigurasi dengan sertifikat dan pengaturan visualnya sendiri. Pustaka mempertahankan tanda tangan yang ada sambil menambahkan yang baru.
// First signature (approver)
signature.sign("output.docx", approverOptions);
// Second signature (witness)
signature.sign("output.docx", witnessOptions);
Bagaimana cara membuat metode factory untuk tipe dokumen yang berbeda?
Metode pembantu dapat mengembalikan DigitalSignOptions yang telah dikonfigurasi sebelumnya berdasarkan ekstensi file, menjaga kode Anda tetap DRY. Ini memusatkan pemuatan sertifikat, default visual, dan logika pemilihan halaman untuk PDF, Word, Excel, dan format lain yang didukung.
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;
}
Bagaimana cara memvalidasi bahwa dokumen belum ditandatangani?
Sebelum menerapkan tanda tangan baru, periksa tanda tangan yang ada untuk menghindari double‑signing. Gunakan metode getSignatures(); jika koleksi yang dikembalikan tidak kosong, putuskan apakah akan menambahkan tanda tangan baru atau membatalkan operasi.
List<SignatureInfo> existing = signature.getSignatures();
if (!existing.isEmpty()) {
logger.warn("Document already contains {} signatures.", existing.size());
}
Aplikasi Praktis (Kasus Penggunaan Dunia Nyata)
- Alur Kerja Kontrak Otomatis – Ketika kontrak mencapai status “disetujui” dalam sistem BPM Anda, aktifkan layanan penandatanganan untuk menyisipkan sertifikat departemen hukum dan mengirimkan salinan yang ditandatangani ke vendor.
- Sistem Persetujuan Faktur – Setelah keuangan menandatangani faktur, secara otomatis tambahkan tanda tangan digital sebelum mengirimkannya ke pelanggan, memberikan bukti kriptografis keaslian.
- Portal Verifikasi Dokumen – Tawarkan portal swalayan di mana pengguna mengunggah PDF, Anda menandatanganinya dengan sertifikat perusahaan, dan mengembalikan file yang tahan manipulasi untuk kepatuhan hukum.
- Industri dengan Kepatuhan Tinggi – Di bidang kesehatan (HIPAA) atau keuangan (SOX), tanda tangan digital memenuhi persyaratan audit dengan membuktikan siapa yang menandatangani dokumen dan kapan.
- Distribusi Kebijakan Internal – Gantikan stamping manual kebijakan HR dengan proses otomatis yang menandatangani PDF akhir menggunakan sertifikat CHRO, memastikan setiap karyawan menerima salinan yang terverifikasi.
Pertimbangan Kinerja
| Ukuran Dokumen | Waktu Proses Rata‑rata | Pengaturan yang Disarankan |
|---|---|---|
| 1‑5 halaman | ~0.5 s | Opsi default |
| 5‑50 halaman | 1‑3 s | Tingkatkan heap, setAllPages(true) jika diperlukan |
| 50‑200 halaman | 3‑10 s | setAllPages(false), eksekusi async, heap lebih besar |
Tips Optimasi:
- Gunakan kembali satu instance
Signaturesaat menandatangani banyak file dalam batch. - Cache objek
DigitalSignOptionsyang dimuat; memuat sertifikat berulang menambah beban. - Untuk layanan web, bungkus panggilan penandatanganan dalam
CompletableFutureatau dorong ke antrian pesan untuk menjaga UI tetap responsif.
Tips Pro (Penggunaan Lanjutan)
- Timestamping untuk validitas jangka panjang – Lampirkan token TSA menggunakan
setTimeStampOptions()untuk memastikan tanda tangan tetap valid setelah sertifikat kedaluwarsa. - Tanda tangan tak terlihat – Hilangkan
ImageFilePathdan aturWidth/Heightke0untuk membuat tanda tangan yang secara kriptografis valid namun tak terlihat, berguna untuk proses backend yang tidak memerlukan stempel visual. - Tanda tangan kode QR khusus – GroupDocs dapat menyematkan kode QR yang berisi metadata penandatangan; ideal untuk dokumen rantai pasokan yang memerlukan verifikasi cepat melalui perangkat seluler.
Pertanyaan yang Sering Diajukan
Q: Apa perbedaan utama antara GroupDocs.Signature dan iText untuk penandatanganan PDF?
A: iText fokus hanya pada PDF dan mengharuskan Anda menangani kriptografi tingkat rendah sendiri, sementara GroupDocs.Signature mendukung lebih dari 30 format, menawarkan stempel visual siap pakai, dan mengabstraksi penanganan sertifikat, mengurangi waktu pengembangan secara dramatis.
Q: Bisakah saya mengintegrasikan GroupDocs.Signature ke dalam microservice Spring Boot?
A: Ya. Tambahkan dependensi Maven, buat bean @Service yang membungkus logika penandatanganan, dan injeksikan di mana pun Anda perlu menandatangani dokumen. Ini membuat controller Anda tetap ringan dan kode penandatanganan dapat digunakan kembali.
Q: Seberapa aman tanda tangan yang dibuat dengan GroupDocs.Signature?
A: Pustaka menggunakan algoritma PKI standar (RSA/ECDSA) dan mengikuti spesifikasi yang sama dengan browser dan Adobe Reader. Keamanan bergantung pada kualitas sertifikat Anda; selalu gunakan sertifikat yang dikeluarkan CA dan lindungi kunci pribadi.
Q: Apakah dokumen yang ditandatangani akan berfungsi di berbagai pembaca PDF?
A: Tentu saja. Selama sertifikat penandatanganan tepercaya, Adobe Reader, Foxit, dan browser modern akan memvalidasi tanda tangan dengan benar. Sertifikat self‑signed akan menampilkan peringatan tetapi tetap secara teknis valid.
Q: Apakah memungkinkan menandatangani dokumen tanpa gambar tanda tangan yang terlihat?
A: Ya—cukup hilangkan ImageFilePath dan atur parameter ukuran ke nol. Tanda tangan yang dihasilkan tidak terlihat namun tetap secara kriptografis sah, sempurna untuk otomatisasi backend di mana petunjuk visual tidak diperlukan.
Kesimpulan
Anda kini memiliki panduan lengkap yang siap produksi untuk add digital signature java menggunakan GroupDocs.Signature. Kami membahas semua mulai dari penyiapan lingkungan dan penanganan sertifikat hingga kustomisasi visual, penyetelan kinerja, dan skenario lanjutan seperti beberapa tanda tangan dan timestamping.
Langkah selanjutnya:
- Uji kode contoh dengan sertifikat dan templat dokumen Anda sendiri.
- Perkuat deployment Anda dengan memindahkan sertifikat ke secret manager dan mengonfigurasi batas memori JVM yang tepat.
- Perluas metode pembantu untuk mendukung pemrosesan batch atau integrasikan dengan mesin alur kerja yang ada.
Untuk penjelasan lebih mendalam, jelajahi dokumentasi resmi dan forum komunitas yang ditautkan di bawah.
Terakhir Diperbarui: 2026-06-11
Diuji Dengan: GroupDocs.Signature 23.12 for Java
Penulis: GroupDocs
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());
}