Cách Thêm Chữ Ký Số vào Tài Liệu trong Java

Giới thiệu

Việc triển khai add digital signature java có thể giống như đi qua một bãi mìn. Bạn phải cân bằng các định dạng chứng chỉ, vị trí chữ ký và các chính sách bảo mật nghiêm ngặt — đồng thời giữ trải nghiệm người dùng mượt mà. Một bước sai lầm và bạn sẽ có chữ ký không hợp lệ hoặc tài liệu không vượt qua kiểm tra trong Adobe Reader.

May mắn thay, bạn không cần phải phát minh lại bánh xe hay đấu tranh với mật mã cấp thấp. Dù bạn đang xây dựng cổng quản lý hợp đồng, quy trình thanh toán thương mại điện tử yêu cầu biên lai có chữ ký, hay quy trình làm việc nội bộ của HR, một thư viện Java đáng tin cậy sẽ giúp bạn tiết kiệm hàng giờ phát triển và loại bỏ các bẫy thường gặp.

Trong hướng dẫn này chúng tôi sẽ đi qua GroupDocs.Signature for Java, một thư viện thương mại trừu tượng hoá việc xử lý nặng của chữ ký số. Bạn sẽ học cách:

  • Thiết lập thư viện và cấu hình chứng chỉ một cách chính xác
  • Ký các tệp PDF, Word, Excel và PowerPoint với dấu tem trực quan chuyên nghiệp
  • Xác thực chữ ký và xử lý các lỗi thường gặp như chứng chỉ không tin cậy hoặc tắc nghẽn bộ nhớ
  • Áp dụng các biện pháp bảo mật theo thực tiễn tốt nhất cho môi trường sản xuất

Khi hoàn thành, bạn sẽ có một triển khai sẵn sàng để tích hợp và có thể mở rộng cho bất kỳ loại tài liệu nào mà ứng dụng của bạn xử lý.

Câu trả lời nhanh

  • Thư viện nào cho phép bạn thêm chữ ký số trong Java? GroupDocs.Signature for Java.
  • Có bao nhiêu định dạng tài liệu được hỗ trợ? Hơn 30 định dạng, bao gồm PDF, DOCX, XLSX, PPTX và các tệp hình ảnh.
  • Tôi có cần giấy phép cho môi trường sản xuất không? Có — giấy phép thương mại loại bỏ watermark và mở khóa đầy đủ tính năng.
  • Tôi có thể ký các PDF lớn (hơn 100 trang) mà không gặp lỗi OOM không? Có — bằng cách điều chỉnh bộ nhớ heap của JVM và sử dụng tùy chọn setAllPages(false).
  • Có hỗ trợ đánh dấu thời gian không? Chắc chắn; bạn có thể đính kèm token của Time‑Stamp Authority (TSA) đáng tin cậy để duy trì tính hợp lệ lâu dài.

add digital signature java là gì?

add digital signature java đề cập đến quá trình lập trình nhúng một chữ ký mật mã vào tài liệu kỹ thuật số bằng các API Java. Chữ ký liên kết danh tính của người ký — được xác thực bởi chứng chỉ số — với nội dung tài liệu, đảm bảo tính toàn vẹn, không thể phủ nhận và tính pháp lý trên mọi nền tảng.

Tại sao triển khai chữ ký số java?

GroupDocs.Signature hỗ trợ 30+ định dạng đầu vào và đầu ra và có thể xử lý các tệp lên tới 500 MB mà không cần tải toàn bộ tệp vào bộ nhớ, mang lại tăng tốc 2‑5× so với các triển khai thủ công bằng PDFBox. Lợi ích định lượng này chuyển thành thời gian giao dịch nhanh hơn và chi phí máy chủ thấp hơn cho các khối lượng công việc lớn.

Yêu cầu trước

Trước khi bắt đầu, hãy xác minh rằng bạn có các mục sau:

  • Java Development Kit (JDK) 8+ – JDK 11 được khuyến nghị vì hỗ trợ TLS nâng cao.
  • IDE – IntelliJ IDEA, Eclipse hoặc VS Code với các extension Java.
  • GroupDocs.Signature for Java – chúng tôi sẽ trình bày ba cách để thêm nó vào dự án của bạn.
  • Một chứng chỉ số hợp lệ ở định dạng PFX hoặc P12 (bạn sẽ cần khóa riêng và mật khẩu).

Tùy chọn nhưng hữu ích:

  • Quen thuộc với Maven hoặc Gradle để quản lý phụ thuộc.
  • Một tệp PDF, DOCX hoặc XLSX mẫu để kiểm tra luồng ký.

Cách cài đặt GroupDocs.Signature cho Java?

GroupDocs.Signature yêu cầu một bước thêm đơn giản vào cấu hình build của bạn. Sử dụng đoạn mã phù hợp với công cụ build, thay thế phiên bản placeholder bằng bản phát hành ổn định mới nhất, và chạy lệnh build để tải thư viện từ Maven Central.

Maven (add to your pom.xml):

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

Gradle (add to your build.gradle):

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

Manual Installation (if you don’t use a build tool):
Tải JAR từ trang phát hành chính thức — GroupDocs.Signature for Java releases — và thêm vào classpath của bạn.

Pro tip: Luôn tham chiếu phiên bản ổn định mới nhất. Tại thời điểm viết, phiên bản 23.12 là hiện tại, nhưng các bản phát hành mới hơn thường chứa các bản vá bảo mật và cải thiện hiệu năng.

Cách lấy và áp dụng giấy phép GroupDocs?

GroupDocs.Signature yêu cầu giấy phép cho việc sử dụng trong môi trường sản xuất. Giấy phép loại bỏ watermark và mở khóa toàn bộ tính năng, đảm bảo các tài liệu đã ký tuân thủ chính sách doanh nghiệp.

Nếu không có giấy phép hợp lệ, các tài liệu đã ký sẽ chứa watermark hiển thị, chỉ hữu ích cho mục đích đánh giá.

Cách khởi tạo đối tượng Signature?

Lớp Signature là điểm vào cho mọi thao tác tài liệu. Nó đại diện cho một tệp duy nhất trong bộ nhớ và cung cấp các phương thức để ký, xác thực và trích xuất chữ ký. Tạo một thể hiện Signature sẽ tải tệp mục tiêu và chuẩn bị cho các xử lý tiếp theo.

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

What’s happening here?
Dòng này tạo một thể hiện Signature tải tài liệu mục tiêu. Đường dẫn có thể là tuyệt đối hoặc tương đối; chỉ cần đảm bảo tệp tồn tại. Đối tượng này có thể được tái sử dụng cho nhiều hành động ký hoặc xác thực, giảm tải trong các kịch bản batch.

Cách cấu hình tùy chọn chữ ký số?

Các tùy chọn chữ ký số gói gọn mọi cài đặt cần thiết để tạo một chữ ký PKI hợp lệ, bao gồm thông tin chứng chỉ, giao diện trực quan và quy tắc vị trí. Cấu hình đúng đảm bảo chữ ký tạo ra vừa an toàn mật mã vừa phù hợp về mặt hình ảnh cho loại tài liệu.

Cách thiết lập chi tiết chứng chỉ?

Lớp DigitalSignOptions chứa tất cả các cài đặt liên quan đến chứng chỉ. Dưới đây là định nghĩa lần đầu cho lớp này.

DigitalSignOptions định nghĩa các tham số mật mã — tệp chứng chỉ, mật khẩu và siêu dữ liệu tùy chọn — mà thư viện sử dụng để tạo chữ ký PKI hợp lệ.

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

Key points:

  • Không bao giờ hard‑code mật khẩu; tải nó từ biến môi trường hoặc trình quản lý bí mật.
  • Sử dụng setReason, setContact, và setLocation để cung cấp ngữ cảnh cho người xem khi họ kiểm tra thuộc tính chữ ký.

Cách tùy chỉnh giao diện trực quan của chữ ký?

SignatureOptions (lớp con của DigitalSignOptions) điều khiển việc render trên trang. Nó cho phép bạn đính kèm hình ảnh, điều chỉnh kích thước và đặt vị trí dấu tem trực quan trên trang.

SignatureOptions cho phép bạn đính kèm hình ảnh, điều chỉnh kích thước và đặt vị trí dấu tem trực quan trên trang.

options.setImageFilePath("YOUR_DOCUMENT_DIRECTORY/signature.png");
options.setAllPages(true);
options.setWidth(150);
options.setHeight(0); // Auto‑scale based on image aspect ratio
  • ImageFilePath: Trỏ tới PNG hoặc JPG của chữ ký viết tay hoặc logo công ty. PNG trong suốt hoạt động tốt nhất.
  • AllPages: Đặt true cho các hợp đồng cần chứng minh trên mọi trang; ngược lại false chỉ ký trang cuối cùng.
  • Width/Height: Được đo bằng pixel; chiều cao 50‑80 pixel trông chuyên nghiệp cho hầu hết tài liệu doanh nghiệp.

Cách kiểm soát căn chỉnh và khoảng đệm?

Cài đặt căn chỉnh xác định nơi dấu tem đặt trên trang, trong khi khoảng đệm thêm không gian xung quanh yếu tố trực quan để tránh chạm vào mép trang. Căn chỉnh hợp lý cải thiện khả năng đọc và đảm bảo chữ ký không can thiệp vào nội dung hiện có.

AlignmentOptions cung cấp các hằng số vị trí dọc và ngang như Bottom, Right, Top, và Center.

options.setVerticalAlignment(VerticalAlignment.Bottom);
options.setHorizontalAlignment(HorizontalAlignment.Right);
options.setPadding(10);
  • Padding: Thêm không gian xung quanh dấu tem; giá trị 10 pixel ngăn hình ảnh chạm mép trang.
  • Real‑world example: Trong mẫu hoá đơn, bạn có thể dùng Top/Left để đặt chữ ký người phê duyệt gần phần tiêu đề.

Cách thêm dòng chữ ký cho tài liệu Office?

Khi ký các tệp DOCX hoặc XLSX, một dòng chữ ký hiển thị cải thiện khả năng đọc cho người dùng cuối. Thư viện tạo một dòng chữ ký kiểu Microsoft hiển thị tên, chức vụ và email của người ký, mô phỏng trải nghiệm gốc của Office.

SignatureLineOptions tạo một dòng chữ ký kiểu Microsoft hiển thị tên, chức vụ và email của người ký.

options.setSignatureLineText("John Doe", "Chief Legal Officer", "j.doe@yourcompany.com");
  • Tính năng này bị bỏ qua cho PDF nhưng rất quan trọng đối với các tệp Word và Excel mở trong Microsoft Office.

Cách thực sự ký một tài liệu?

Tải tệp nguồn bằng một thể hiện Signature, áp dụng DigitalSignOptions đã cấu hình đầy đủ, và gọi sign(). Thư viện ghi tệp mới vào đường dẫn đầu ra, để nguyên tệp gốc. Đối với các PDF lớn (50+ trang) hãy dự kiến thời gian xử lý 2‑5 giây; cân nhắc thực thi bất đồng bộ trong các dịch vụ 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);

Performance note: Đối với tài liệu trên 100 trang, tăng heap JVM (-Xmx2g) hoặc tắt setAllPages(true) để giới hạn tiêu thụ bộ nhớ.

Cách khắc phục các vấn đề thường gặp?

Khi ký thất bại, các vấn đề phổ biến thường liên quan đến xử lý chứng chỉ, vị trí trực quan hoặc hạn chế bộ nhớ. Xác định triệu chứng, sau đó làm theo danh sách kiểm tra mục tiêu dưới đây để nhanh chóng giải quyết.

Tại sao tôi thấy lỗi “Invalid Certificate” hoặc “Cannot Load Certificate”?

Các ngoại lệ này thường xuất phát từ một trong bốn nguyên nhân:

  1. Incorrect password – xác minh bằng OpenSSL: openssl pkcs12 -info -in yourcert.pfx.
  2. Expired certificate – kiểm tra thời hạn bằng keytool -list -v -keystore yourcert.pfx.
  3. Wrong file format – chỉ chấp nhận .pfx hoặc .p12 (có chứa khóa riêng).
  4. File permission problems – đảm bảo quá trình Java có quyền đọc tệp chứng chỉ.

Tại sao chữ ký không xuất hiện trên trang?

  • AllPages flag có thể là false, vì vậy bạn đang xem một trang không có dấu tem.
  • Image path có thể bị viết sai; in ra options.getImageFilePath() để xác nhận.
  • Alignment settings có thể đẩy dấu tem ra ngoài màn hình; tạm thời chuyển sang Center để gỡ lỗi.

Tại sao Adobe Reader báo “Signature Invalid”?

  • Certificate not trusted – chứng chỉ tự ký gây cảnh báo. Sử dụng chứng chỉ do CA cấp cho môi trường sản xuất.
  • Incomplete certificate chain – đảm bảo .pfx bao gồm chứng chỉ trung gian và gốc.
  • Missing timestamp – nếu không có token TSA, chữ ký có thể bị coi là không hợp lệ sau khi chứng chỉ hết hạn. GroupDocs hỗ trợ timestamp qua setTimeStampOptions().

Làm sao tránh OutOfMemoryError với các PDF lớn?

  • Tăng heap JVM (-Xmx4g hoặc cao hơn).
  • Chỉ ký các trang cần thiết (setAllPages(false)).
  • Xử lý tệp theo lô nhỏ hơn hoặc stream nếu môi trường bị giới hạn.

Cách quản lý chứng chỉ một cách an toàn trong môi trường sản xuất?

Không bao giờ nhúng chứng chỉ hoặc mật khẩu vào mã nguồn. Thực hiện các bước sau:

  1. Lưu các tệp .pfx trong kho bảo mật (AWS Secrets Manager, Azure Key Vault, hoặc HashiCorp Vault).
  2. Tải mật khẩu tại thời gian chạy từ biến môi trường hoặc API của kho.
  3. Hạn chế quyền truy cập hệ thống sao cho chỉ tài khoản dịch vụ có thể đọc chứng chỉ.
  4. Thay đổi chứng chỉ ít nhất 30 ngày trước khi hết hạn và cập nhật bí mật lưu trữ tương ứng.
String certPath = System.getenv("CERT_PATH");
String certPassword = System.getenv("CERT_PASSWORD");
options.setCertificatePath(certPath);
options.setCertificatePassword(certPassword);

Cách ghi lại các hoạt động chữ ký để tuân thủ kiểm toán?

Log kiểm toán cung cấp bằng chứng không thể phủ nhận. Ghi lại các trường sau cho mỗi sự kiện ký:

  • Tên và hash tài liệu trước khi ký
  • Danh tính người ký (subject của chứng chỉ)
  • Thời gian thực hiện (tốt nhất là UTC)
  • Trạng thái kết quả (thành công/thất bại) và chi tiết lỗi nếu có
logger.info("Signing document {} with certificate {} at {}", docPath, options.getCertificatePath(), Instant.now());

Cách xác minh chữ ký sau khi đã áp dụng?

Xác thực đảm bảo tài liệu không bị thay đổi sau khi ký. Sử dụng phương thức verify(), trả về một VerificationResult chứa trạng thái hợp lệ, thông tin người ký và bất kỳ thông tin timestamp nào. Xác thực thành công khẳng định cả tính toàn vẹn và xác thực.

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

Làm sao thêm nhiều chữ ký vào một tài liệu duy nhất?

Bạn có thể cần chữ ký của người phê duyệt và người chứng kiến. Gọi sign() nhiều lần với các thể hiện DigitalSignOptions riêng biệt, mỗi cái được cấu hình với chứng chỉ và giao diện riêng. Thư viện giữ lại các chữ ký hiện có đồng thời thêm các chữ ký mới.

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

Cách tạo phương thức factory cho các loại tài liệu khác nhau?

Một phương thức trợ giúp có thể trả về một DigitalSignOptions đã được cấu hình sẵn dựa trên phần mở rộng tệp, giúp mã của bạn DRY. Điều này tập trung việc tải chứng chỉ, cài đặt mặc định giao diện và logic chọn trang cho PDF, Word, Excel và các định dạng hỗ trợ khác.

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

Cách xác thực rằng một tài liệu chưa được ký?

Trước khi áp dụng chữ ký mới, kiểm tra các chữ ký hiện có để tránh ký trùng. Sử dụng phương thức getSignatures(); nếu tập hợp trả về không rỗng, quyết định có nên thêm chữ ký mới hay hủy thao tác.

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

Ứng dụng thực tế (Các trường hợp sử dụng thực tế)

  1. Automated Contract Workflows – Khi một hợp đồng đạt trạng thái “được phê duyệt” trong hệ thống BPM của bạn, kích hoạt dịch vụ ký để nhúng chứng chỉ của phòng pháp lý và gửi bản sao đã ký cho nhà cung cấp.
  2. Invoice Approval Systems – Sau khi bộ tài chính duyệt hoá hoá đơn, tự động thêm chữ ký số trước khi gửi cho khách hàng, cung cấp bằng chứng mật mã về tính xác thực.
  3. Document Verification Portals – Cung cấp cổng tự phục vụ nơi người dùng tải lên PDF, bạn ký bằng chứng chỉ toàn công ty và trả lại tệp không thể bị giả mạo để tuân thủ pháp lý.
  4. Compliance‑Heavy Industries – Trong y tế (HIPAA) hoặc tài chính (SOX), chữ ký số đáp ứng yêu cầu kiểm toán bằng cách chứng minh ai đã ký tài liệu và khi nào.
  5. Internal Policy Distribution – Thay thế việc đóng dấu thủ công các chính sách HR bằng quy trình tự động ký PDF cuối cùng bằng chứng chỉ của CHRO, đảm bảo mọi nhân viên nhận được bản sao đã xác thực.

Các cân nhắc về hiệu năng

Kích thước tài liệuThời gian xử lý trung bìnhCài đặt đề xuất
1‑5 trang~0.5 sCài đặt mặc định
5‑50 trang1‑3 sTăng heap, setAllPages(true) nếu cần
50‑200 trang3‑10 ssetAllPages(false), thực thi bất đồng bộ, heap lớn hơn

Optimization tips:

  • Tái sử dụng một thể hiện Signature duy nhất khi ký nhiều tệp trong một batch.
  • Cache đối tượng DigitalSignOptions đã tải; việc tải chứng chỉ lặp lại gây tốn thời gian.
  • Đối với dịch vụ web, bọc lời gọi ký trong một CompletableFuture hoặc đẩy vào hàng đợi tin nhắn để giữ UI phản hồi nhanh.

Mẹo chuyên nghiệp (Sử dụng nâng cao)

  • Timestamping for long‑term validity – Đính kèm token TSA bằng setTimeStampOptions() để đảm bảo chữ ký vẫn hợp lệ sau khi chứng chỉ hết hạn.
  • Invisible signatures – Bỏ ImageFilePath và đặt Width/Height về 0 để tạo chữ ký mật mã hợp lệ nhưng không hiển thị, hữu ích cho các quy trình backend không cần dấu tem trực quan.
  • Custom QR‑code signatures – GroupDocs có thể nhúng mã QR chứa siêu dữ liệu người ký; lý tưởng cho tài liệu chuỗi cung ứng cần xác thực nhanh qua thiết bị di động.

Câu hỏi thường gặp

Q: Sự khác biệt chính giữa GroupDocs.Signature và iText trong việc ký PDF là gì?
A: iText chỉ tập trung vào PDF và yêu cầu bạn tự xử lý mật mã cấp thấp, trong khi GroupDocs.Signature hỗ trợ hơn 30 định dạng, cung cấp sẵn dấu tem trực quan và trừu tượng hoá việc xử lý chứng chỉ, giảm thời gian phát triển đáng kể.

Q: Tôi có thể tích hợp GroupDocs.Signature vào microservice Spring Boot không?
A: Có. Thêm phụ thuộc Maven, tạo bean @Service bao bọc logic ký, và tiêm vào bất kỳ controller nào cần ký tài liệu. Điều này giữ cho controller gọn gàng và mã ký tái sử dụng.

Q: Chữ ký tạo bằng GroupDocs.Signature bảo mật như thế nào?
A: Thư viện sử dụng các thuật toán PKI tiêu chuẩn (RSA/ECDSA) và tuân thủ cùng các thông số kỹ thuật như trình duyệt và Adobe Reader. Bảo mật phụ thuộc vào chất lượng chứng chỉ của bạn; luôn sử dụng chứng chỉ do CA cấp và bảo vệ khóa riêng.

Q: Các tài liệu đã ký sẽ hoạt động trên các trình đọc PDF khác nhau không?
A: Chắc chắn. Miễn là chứng chỉ ký được tin cậy, Adobe Reader, Foxit và các trình duyệt hiện đại sẽ xác thực chữ ký đúng. Chứng chỉ tự ký sẽ hiển thị cảnh báo nhưng vẫn hợp lệ về mặt kỹ thuật.

Q: Có thể ký tài liệu mà không có hình ảnh chữ ký hiển thị không?
A: Có — chỉ cần bỏ ImageFilePath và đặt các tham số kích thước về zero. Chữ ký kết quả sẽ vô hình nhưng vẫn mạnh về mặt mật mã, phù hợp cho tự động hoá backend không cần dấu hiệu trực quan.

Kết luận

Bạn giờ đã có một lộ trình hoàn chỉnh, sẵn sàng cho môi trường sản xuất để add digital signature java bằng GroupDocs.Signature. Chúng tôi đã bao phủ mọi khía cạnh từ thiết lập môi trường và xử lý chứng chỉ đến tùy chỉnh giao diện, tối ưu hiệu năng và các kịch bản nâng cao như ký đa chữ ký và timestamping.

Next steps:

  1. Kiểm thử mã mẫu với chứng chỉ và mẫu tài liệu của riêng bạn.
  2. Củng cố triển khai bằng cách chuyển chứng chỉ vào trình quản lý bí mật và cấu hình giới hạn bộ nhớ JVM phù hợp.
  3. Mở rộng các phương thức trợ giúp để hỗ trợ xử lý batch hoặc tích hợp với engine workflow hiện có.

Để tìm hiểu sâu hơn, khám phá tài liệu chính thức và diễn đàn cộng đồng được liên kết bên dưới.


Cập nhật lần cuối: 2026-06-11
Kiểm tra với: GroupDocs.Signature 23.12 for Java
Tác giả: GroupDocs

Tài nguyên:

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

Hướng dẫn liên quan