Java’da Belgeler İçin Dijital İmzalar Nasıl Eklenir

Giriş

add digital signature java işlevselliğini uygulamak bir mayın tarlasında gezinmek gibi hissettirebilir. Sertifika formatları, imza konumu ve katı güvenlik politikalarını dengelemek zorundasınız—tüm bunları kullanıcı deneyimini sorunsuz tutarak. Tek bir adım hatası, geçersiz imzalar veya Adobe Reader’da doğrulama hatası veren belgelerle sonuçlanabilir.

Neyse ki, tekerleği yeniden icat etmenize veya düşük seviyeli kriptografiyle uğraşmanıza gerek yok. İster bir sözleşme yönetim portalı, imzalı makbuzlar gerektiren bir e‑ticaret ödeme süreci, ister dahili bir İK iş akışı inşa ediyor olun, güvenilir bir Java kütüphanesi geliştirme süresini saatlerce kısaltır ve yaygın tuzakları ortadan kaldırır.

Bu rehberde, dijital imzaların ağır işini soyutlayan ticari bir kütüphane olan GroupDocs.Signature for Java‘ı adım adım inceleyeceğiz. Şunları öğreneceksiniz:

  • Kütüphaneyi kurmak ve sertifikaları doğru şekilde yapılandırmak
  • PDF, Word, Excel ve PowerPoint dosyalarını profesyonel bir görsel damga ile imzalamak
  • İmzaları doğrulamak ve güvenilmeyen sertifikalar veya bellek darboğazları gibi yaygın hataları ele almak
  • Üretim ortamları için en iyi güvenlik uygulamalarını uygulamak

Sonunda, uygulamanızın işlediği herhangi bir belge türü için genişletebileceğiniz, anında kullanılabilir bir uygulamaya sahip olacaksınız.

Hızlı Yanıtlar

  • Java’da dijital imzalar eklemenizi sağlayan kütüphane nedir? GroupDocs.Signature for Java.
  • Kaç belge formatı destekleniyor? PDF, DOCX, XLSX, PPTX ve görüntü dosyaları dahil 30’dan fazla format.
  • Üretim için lisansa ihtiyacım var mı? Evet—ticari bir lisans su işaretlerini kaldırır ve tam özellikleri açar.
  • 100+ sayfalık büyük PDF’leri OOM hatası almadan imzalayabilir miyim? Evet—JVM yığın ayarını değiştirerek ve setAllPages(false) seçeneğini kullanarak.
  • Zaman damgası desteği var mı? Kesinlikle; uzun vadeli geçerlilik için güvenilir bir Time‑Stamp Authority (TSA) token’ı ekleyebilirsiniz.

add digital signature java nedir?

add digital signature java, Java API’leri kullanarak bir dijital belgeye kriptografik imza yerleştirme programatik sürecine denir. İmza, imzalayanın kimliğini—dijital bir sertifika ile doğrulanmış—belgenin içeriğine bağlar, bütünlük, inkâr edilemezlik ve platformlar arası yasal geçerlilik sağlar.

Java’da dijital imzalar neden uygulanmalı?

GroupDocs.Signature, 30’dan fazla giriş ve çıkış formatını destekler ve dosyaları 500 MB‘a kadar, tüm dosyayı belleğe yüklemeden işleyebilir; bu da manuel PDFBox uygulamalarına göre 2‑5 kat hızlı bir performans sağlar. Bu ölçülebilir fayda, yüksek hacimli iş yüklerinde daha hızlı işlem süreleri ve daha düşük sunucu maliyetleri anlamına gelir.

Önkoşullar

  • Java Development Kit (JDK) 8+ – JDK 11, geliştirilmiş TLS desteği nedeniyle önerilir.
  • IDE – IntelliJ IDEA, Eclipse veya Java uzantılarına sahip VS Code.
  • GroupDocs.Signature for Java – bunu projenize eklemenin üç yolunu göstereceğiz.
  • PFX veya P12 formatında geçerli bir dijital sertifika** (özel anahtar ve şifre gerekir).

Opsiyonel ancak faydalı:

  • Maven veya Gradle bağımlılık yönetimi konusunda bilgi sahibi olmak.
  • İmzalama akışını test etmek için örnek bir PDF, DOCX veya XLSX dosyası.

GroupDocs.Signature for Java nasıl kurulur?

GroupDocs.Signature, yapılandırmanıza basit bir ekleme gerektirir. Build aracınıza uygun kod parçacığını kullanın, yer tutucu sürümü en son kararlı sürümle değiştirin ve Maven Central’dan kütüphaneyi çekmek için build komutunu çalıştırın.

Maven (pom.xml dosyanıza ekleyin):

<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-signature</artifactId>
    <version>23.12</version>
</dependency>

Gradle (build.gradle dosyanıza ekleyin):

implementation 'com.groupdocs:groupdocs-signature:23.12'

Manuel Kurulum (bir build aracı kullanmıyorsanız):
Resmi sürüm sayfasından JAR dosyasını indirin — GroupDocs.Signature for Java releases — ve sınıf yolunuza ekleyin.

Pro ipucu: Her zaman en son kararlı sürümü referans alın. Bu yazı itibarıyla sürüm 23.12 günceldir, ancak daha yeni sürümler genellikle güvenlik yamaları ve performans iyileştirmeleri içerir.

GroupDocs lisansı nasıl alınır ve uygulanır?

GroupDocs.Signature, üretim kullanımında bir lisans gerektirir. Lisans su işaretlerini kaldırır ve tam özellik setini açar, böylece imzalı belgeler kurumsal politikalara uygun olur.

Geçerli bir lisans olmadan, imzalı belgeler görünür bir su işareti içerir; bu sadece değerlendirme amaçlı faydalıdır.

Signature nesnesi nasıl başlatılır?

Signature sınıfı, tüm belge işlemlerinin giriş noktasıdır. Bellekte tek bir dosyayı temsil eder ve imzalama, doğrulama ve imzaları çıkarma yöntemleri sunar. Bir Signature örneği oluşturmak, hedef dosyayı yükler ve sonraki işleme hazır hale getirir.

Signature signature = new Signature("path/to/input.pdf");

Burada ne oluyor?
Bu satır, hedef belgeyi yükleyen bir Signature örneği oluşturur. Yol mutlak ya da göreli olabilir; dosyanın var olduğundan emin olun. Bu nesne, toplu senaryolarda yükü azaltmak için birden fazla imzalama veya doğrulama eylemi için yeniden kullanılabilir.

Dijital imza seçenekleri nasıl yapılandırılır?

Dijital imza seçenekleri, sertifika bilgileri, görsel görünüm ve yerleştirme kuralları dahil geçerli bir PKI imzası üretmek için gereken tüm ayarları kapsar. Doğru yapılandırma, ortaya çıkan imzanın hem kriptografik olarak sağlam hem de belge türü için görsel olarak uygun olmasını sağlar.

Sertifika ayrıntıları nasıl ayarlanır?

DigitalSignOptions sınıfı, tüm sertifika ile ilgili ayarları tutar. Aşağıda bu sınıfın ilk tanım referansı yer almaktadır.

DigitalSignOptions, kütüphanenin geçerli bir PKI imzası oluşturmak için kullandığı kriptografik parametreleri—sertifika dosyası, şifre ve isteğe bağlı meta verileri—tanımlar.

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");

Anahtar noktalar:

  • Şifreyi asla kod içinde sabitlemeyin; ortam değişkenlerinden veya bir gizli yönetim aracından yükleyin.
  • setReason, setContact ve setLocation kullanarak, inceleyenlere imza özelliklerini incelerken bağlam sağlayın.

İmzanın görsel görünümü nasıl özelleştirilir?

SignatureOptions (DigitalSignOptions‘ın bir alt sınıfı), sayfa üzerindeki renderlamayı kontrol eder. Bir görüntü eklemenize, boyutu ayarlamanıza ve görsel damgayı sayfada konumlandırmanıza olanak tanır.

SignatureOptions lets you attach an image, adjust size, and position the visual stamp on the page.

options.setImageFilePath("YOUR_DOCUMENT_DIRECTORY/signature.png");
options.setAllPages(true);
options.setWidth(150);
options.setHeight(0); // Auto‑scale based on image aspect ratio
  • ImageFilePath: El yazısı imzanızın veya kurumsal logonuzun PNG veya JPG dosyasına işaret edin. Şeffaf PNG’ler en iyisidir.
  • AllPages: Her sayfada kanıt gerektiren sözleşmeler için true olarak ayarlayın; aksi takdirde false sadece son sayfayı imzalar.
  • Width/Height: Piksel cinsinden ölçülür; 50‑80 piksel yükseklik çoğu iş belgesi için profesyonel görünür.

Hizalama ve dolgu nasıl kontrol edilir?

Hizalama ayarları, damganın sayfada nerede konumlanacağını belirler, dolgu ise görsel öğenin sayfa kenarlarına temas etmemesi için bir tampon ekler. Doğru hizalama okunabilirliği artırır ve imzanın mevcut içeriği etkilememesini sağlar.

AlignmentOptions, Bottom, Right, Top ve Center gibi dikey ve yatay yerleştirme sabitlerini sağlar.

options.setVerticalAlignment(VerticalAlignment.Bottom);
options.setHorizontalAlignment(HorizontalAlignment.Right);
options.setPadding(10);
  • Padding: Damganın etrafına boşluk ekler; 10 piksel değeri görüntünün sayfa kenarlarına temas etmesini önler.
  • Gerçek dünya örneği: Fatura şablonlarında, onaylayıcının imzasını başlığın yakınına yerleştirmek için Top/Left kullanabilirsiniz.

Office belgeleri için imza satırı nasıl eklenir?

DOCX veya XLSX dosyalarını imzalarken, görünür bir imza satırı son kullanıcıların okunabilirliğini artırır. Kütüphane, imzalayanın adını, unvanını ve e‑postasını gösteren Microsoft tarzı bir imza satırı oluşturur, yerel Office deneyimini yansıtır.

SignatureLineOptions, imzalayanın adı, unvanı ve e‑postasını gösteren Microsoft tarzı bir imza satırı oluşturur.

options.setSignatureLineText("John Doe", "Chief Legal Officer", "j.doe@yourcompany.com");
  • Bu özellik PDF’lerde göz ardı edilir ancak Microsoft Office’te açılan Word ve Excel dosyaları için esastır.

Bir belgeyi gerçekten nasıl imzalarım?

Signature örneğiyle kaynak dosyayı yükleyin, tamamen yapılandırılmış DigitalSignOptions‘ı uygulayın ve sign() metodunu çağırın. Kütüphane, çıktıyı yeni bir dosyaya yazar ve orijinali dokunulmaz bırakır. Büyük PDF’ler (50+ sayfa) için 2‑5 saniye işleme süresi bekleyin; web servislerinde asenkron yürütmeyi düşünün.

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);

Performans notu: 100 sayfanın üzerindeki belgeler için JVM yığınını (-Xmx2g) artırın veya bellek tüketimini sınırlamak için setAllPages(true) seçeneğini devre dışı bırakın.

Yaygın sorunlar nasıl giderilir?

İmza başarısız olduğunda, en yaygın problemler sertifika yönetimi, görsel yerleşim veya bellek kısıtlamalarıyla ilgilidir. Belirtiyi belirleyin, ardından sorunu hızlıca çözmek için aşağıdaki hedefli kontrol listesini izleyin.

“Invalid Certificate” veya “Cannot Load Certificate” hatalarını neden görüyorum?

Bu istisnalar genellikle dört nedenden birine dayanır:

  1. Yanlış şifre – OpenSSL ile doğrulayın: openssl pkcs12 -info -in yourcert.pfx.
  2. Süresi dolmuş sertifika – geçerliliği keytool -list -v -keystore yourcert.pfx ile kontrol edin.
  3. Yanlış dosya formatı – yalnızca özel anahtar içeren .pfx veya .p12 kabul edilir.
  4. Dosya izin sorunları – Java sürecinin sertifika dosyasını okuyabildiğinden emin olun.

İmza sayfada neden görünmüyor?

  • AllPages bayrağı false olabilir, bu yüzden damga olmayan bir sayfaya bakıyor olabilirsiniz.
  • Image path yanlış yazılmış olabilir; doğrulamak için options.getImageFilePath() yazdırın.
  • Alignment settings damgayı ekrandan dışarı itebilir; hata ayıklama için geçici olarak Center‘a geçin.

Adobe Reader “Signature Invalid” hatasını neden rapor ediyor?

  • Sertifika güvenilir değil – kendinden imzalı sertifikalar uyarı verir. Üretim için CA tarafından verilen bir sertifika kullanın.
  • Eksik sertifika zinciri – .pfx dosyasının ara ve kök sertifikaları içerdiğinden emin olun.
  • Zaman damgası eksik – TSA tokenı olmadan, sertifika süresi dolduğunda imza geçersiz kabul edilebilir. GroupDocs, setTimeStampOptions() aracılığıyla zaman damgasını destekler.

Büyük PDF’lerde OutOfMemoryError nasıl önlenir?

  • JVM yığınını artırın (-Xmx4g veya daha yüksek).
  • Sadece gerekli sayfaları imzalayın (setAllPages(false)).
  • Kısıtlı bir ortamda iseniz dosyaları daha küçük partiler halinde işleyin veya akış olarak işleyin.

Üretimde sertifikalar güvenli bir şekilde nasıl yönetilir?

Sertifikaları veya şifreleri asla kaynak koda gömmeyin. Aşağıdaki adımları izleyin:

  1. .pfx dosyalarını güvenli bir kasada (AWS Secrets Manager, Azure Key Vault veya HashiCorp Vault) saklayın.
  2. Şifreyi çalışma zamanında ortam değişkenlerinden veya kasanın API’sinden yükleyin.
  3. Dosya sistemi izinlerini, sadece hizmet hesabının sertifikayı okuyabileceği şekilde kısıtlayın.
  4. Sertifikaları süresi dolmadan en az 30 gün önce değiştirin ve saklanan gizli bilgiyi buna göre güncelleyin.
String certPath = System.getenv("CERT_PATH");
String certPassword = System.getenv("CERT_PASSWORD");
options.setCertificatePath(certPath);
options.setCertificatePassword(certPassword);

Denetim uyumluluğu için imza işlemleri nasıl kaydedilir?

Denetim günlükleri, inkâr edilemezlik kanıtı sağlar. Her imzalama olayı için aşağıdaki alanları kaydedin:

  • İmzalamadan önce belge adı ve hash’i
  • İmzalayan kimliği (sertifika konusu)
  • İşlemin zaman damgası (tercihen UTC)
  • Sonuç durumu (başarı/başarısız) ve varsa hata detayları
logger.info("Signing document {} with certificate {} at {}", docPath, options.getCertificatePath(), Instant.now());

Uygulandıktan sonra bir imza nasıl doğrulanır?

Doğrulama, belgenin imzalama sonrası değiştirilmediğini garanti eder. verify() metodunu kullanın; bu metod geçerlilik durumu, imzalayan detayları ve zaman damgası bilgilerini içeren bir VerificationResult döndürür. Başarılı bir doğrulama, bütünlük ve kimlik doğrulamasını onaylar.

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());
}

Tek bir belgeye birden fazla imza nasıl eklenir?

Bir onaycı ve bir şahit imzasına ihtiyacınız olabilir. Her biri kendi sertifikası ve görsel ayarlarıyla yapılandırılmış farklı DigitalSignOptions örnekleriyle sign() metodunu birden çok kez çağırın. Kütüphane, mevcut imzaları korurken yenilerini ekler.

// First signature (approver)
signature.sign("output.docx", approverOptions);
// Second signature (witness)
signature.sign("output.docx", witnessOptions);

Farklı belge tipleri için bir fabrika metodu nasıl oluşturulur?

Bir yardımcı metod, dosya uzantısına göre önceden yapılandırılmış bir DigitalSignOptions döndürebilir, böylece kodunuz DRY kalır. Bu, sertifika yüklemeyi, görsel varsayılanları ve PDF, Word, Excel ve diğer desteklenen formatlar için sayfa seçimi mantığını merkezileştirir.

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;
}

Bir belgenin zaten imzalanmadığını nasıl doğrularım?

Yeni bir imza uygulamadan önce, çift imzalamayı önlemek için mevcut imzaları kontrol edin. getSignatures() metodunu kullanın; dönen koleksiyon boş değilse, yeni bir imza eklemeye mi yoksa işlemi iptal etmeye mi karar verin.

List<SignatureInfo> existing = signature.getSignatures();
if (!existing.isEmpty()) {
    logger.warn("Document already contains {} signatures.", existing.size());
}

Pratik Uygulamalar (Gerçek Dünya Kullanım Örnekleri)

  1. Otomatik Sözleşme İş Akışları – Sözleşme BPM sisteminizde “onaylandı” durumuna geldiğinde, imzalama hizmetini tetikleyerek hukuk departmanının sertifikasını ekleyin ve imzalı kopyayı satıcıya e‑posta ile gönderin.
  2. Fatura Onay Sistemleri – Finans bir faturayı onayladıktan sonra, müşteriye göndermeden önce otomatik olarak dijital imza ekleyin, böylece kimlik doğrulama için kriptografik kanıt sağlanır.
  3. Belge Doğrulama Portalları – Kullanıcıların PDF yükleyebildiği, şirket çapında bir sertifika ile imzaladığınız ve yasal uyumluluk için müdahale kanıtı sağlayan bir dosya döndürdüğünüz bir self‑service portal sunun.
  4. Uyumluluk‑Yoğun Endüstriler – Sağlık (HIPAA) veya finans (SOX) sektörlerinde, dijital imzalar bir belgenin kim tarafından ve ne zaman imzalandığını kanıtlayarak denetim gereksinimlerini karşılar.
  5. İç Politika Dağıtımı – HR politikalarının manuel damgalanmasını, CHRO’nun sertifikasıyla son PDF’yi imzalayan otomatik bir süreçle değiştirin; böylece her çalışan doğrulanmış bir kopya alır.

Performans Hususları

Belge BoyutuOrtalama İşlem SüresiÖnerilen Ayarlar
1‑5 pages~0.5 sDefault options
5‑50 pages1‑3 sIncrease heap, setAllPages(true) if needed
50‑200 pages3‑10 ssetAllPages(false), async execution, larger heap

Optimizasyon ipuçları:

  • Toplu imzalarda tek bir Signature örneğini yeniden kullanın.
  • Yüklenen DigitalSignOptions nesnesini önbelleğe alın; sertifikayı tekrar tekrar yüklemek ek yük getirir.
  • Web servisleri için, imzalama çağrısını bir CompletableFuture içinde sarın veya UI’nin yanıt vermesini sağlamak için bir mesaj kuyruğuna gönderin.

Pro İpuçları (İleri Düzey Kullanım)

  • Uzun vadeli geçerlilik için zaman damgası – Sertifika süresi dolduktan sonra imzaların geçerli kalmasını sağlamak için setTimeStampOptions() ile bir TSA tokenı ekleyin.
  • Görünmez imzalar – ImageFilePath‘i atlayın ve Width/Height‘i 0 olarak ayarlayın; bu, görsel damga gerektirmeyen arka uç süreçleri için kriptografik olarak geçerli ama görünmez bir imza oluşturur.
  • Özel QR‑kod imzaları – GroupDocs, imzalayan meta verilerini içeren bir QR kodu gömebilir; mobil cihazlarla hızlı doğrulama gerektiren tedarik zinciri belgeleri için idealdir.

Sıkça Sorulan Sorular

S: GroupDocs.Signature ile iText arasındaki temel fark PDF imzalama konusunda nedir?
C: iText yalnızca PDF üzerine odaklanır ve düşük seviyeli kriptografiyi kendiniz yönetmenizi gerektirir, oysa GroupDocs.Signature 30+ formatı destekler, hazır görsel damgalar sunar ve sertifika yönetimini soyutlayarak geliştirme süresini büyük ölçüde azaltır.

S: GroupDocs.Signature’ı bir Spring Boot mikroservisine entegre edebilir miyim?
C: Evet. Maven bağımlılığını ekleyin, imzalama mantığını kapsayan bir @Service bean’i oluşturun ve belge imzalamanız gereken her yerde enjekte edin. Bu, denetleyicilerinizi ince tutar ve imzalama kodunuzun yeniden kullanılabilir olmasını sağlar.

S: GroupDocs.Signature ile oluşturulan imzalar ne kadar güvenli?
C: Kütüphane, standart PKI algoritmalarını (RSA/ECDSA) kullanır ve tarayıcılar ile Adobe Reader’ın aynı spesifikasyonlarını izler. Güvenlik, sertifikanızın kalitesine bağlıdır; her zaman CA tarafından verilen bir sertifika kullanın ve özel anahtarı koruyun.

S: İmzalı belgeler farklı PDF okuyucularında çalışır mı?
C: Kesinlikle. İmza sertifikası güvenilir olduğu sürece, Adobe Reader, Foxit ve modern tarayıcılar imzayı doğru şekilde doğrular. Kendinden imzalı sertifikalar bir uyarı gösterir ancak teknik olarak geçerlidir.

S: Görünür bir imza görüntüsü olmadan belgeleri imzalamak mümkün mü?
C: Evet—sadece ImageFilePath‘i atlayın ve boyut parametrelerini sıfıra ayarlayın. Ortaya çıkan imza görünmez ama hâlâ kriptografik olarak sağlamdır; görsel ipuçlarının gerekli olmadığı arka uç otomasyonu için mükemmeldir.

Sonuç

Artık GroupDocs.Signature kullanarak add digital signature java için eksiksiz, üretim‑hazır bir yol haritasına sahipsiniz. Ortam kurulumundan sertifika yönetimine, görsel özelleştirmeden performans ayarına ve çoklu imzalar ile zaman damgası gibi ileri senaryolara kadar her şeyi kapsadık.

Sonraki adımlar:

  1. Örnek kodu kendi sertifikalarınız ve belge şablonlarınızla test edin.
  2. Sertifikaları bir gizli yöneticisine taşıyarak ve uygun JVM bellek limitlerini yapılandırarak dağıtımınızı güçlendirin.
  3. Yardımcı metodları toplu işleme destekleyecek şekilde genişletin veya mevcut iş akışı motorunuzla entegre edin.

Daha derinlemesine bilgi için, aşağıda bağlantısı verilen resmi dokümantasyon ve topluluk forumlarını inceleyin.


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());
}

İlgili Eğitimler