---
title: "Adding visible digital signatures to a PDF document | Nutrient Java SDK"
canonical_url: "https://www.nutrient.io/guides/java/editor/add-visible-signature-to-pdf/"
md_url: "https://www.nutrient.io/guides/java/editor/add-visible-signature-to-pdf.md"
last_updated: "2026-05-30T02:20:01.337Z"
description: "How to add visible digital signatures to a PDF using Nutrient Java SDK."
---

# Adding visible digital signatures to a PDF document

Use visible digital signatures to combine visual signoff with cryptographic integrity.

Common use cases include:

- Contract signing workflows

- Approval and authorization systems

- Document authentication pipelines

- Branded signature appearances

Unlike invisible signatures, visible signatures render content in a signature field on the page.

[Download sample](https://www.nutrient.io/downloads/samples/java/add-visible-signature-to-pdf.zip)

## How Nutrient helps

Nutrient Java SDK handles signature field operations, appearance generation, and cryptographic signing.

The SDK handles:

- Parsing signature field dictionaries and appearance stream generation

- Managing PKCS#12 certificate loading and private key extraction

- Handling signature appearance customization and font rendering

- Complex cryptographic signing operations and byte range calculations

## Complete implementation

This example adds a visible signature field and signs it with different appearance options:

```java

package io.nutrient.Sample;

import io.nutrient.sdk.Document;
import io.nutrient.sdk.types.Color;
import io.nutrient.sdk.editors.PdfEditor;
import io.nutrient.sdk.editors.pdf.pages.PdfPage;
import io.nutrient.sdk.editors.pdf.formfields.PdfSignatureField;
import io.nutrient.sdk.signing.Signature;
import io.nutrient.sdk.signing.DigitalSignatureOptions;
import io.nutrient.sdk.signing.SignatureAppearance;

public class DigitalSignatures {

```

Create the `main` method as the sample entry point:

```java

    public static void main(String[] args) {

```

## Creating a signature field

Create a signature field before signing.

In this sample:

- The field name is `ApprovalSignature`.

- The position is `(100, 700)`.

- The size is `200 × 50`.

Save the document after adding the field placeholder:

```java

        try (Document document = Document.open("input.pdf")) {
            PdfEditor editor = PdfEditor.edit(document);
            PdfPage page = editor.getPageCollection().getFirst();

            PdfSignatureField signatureField = editor.getFormFieldCollection().addSignatureField(
                "ApprovalSignature",
                page,
                100.0f,   // left
                700.0f,   // top
                200.0f,   // width
                50.0f     // height
            );

            editor.saveAs("output_document_with_field.pdf");
            editor.close();
        } catch (Exception e) {
            System.err.println("Error creating signature field: " + e.getMessage());
        }

```

## Signing with auto-generated appearance

Sign the field with an auto-generated visible appearance.

In this sample:

- `Document.open("output_document_with_field.pdf")` opens the PDF containing the signature field.

- `DigitalSignatureOptions` sets certificate path, password, and signer metadata.

- `setUseAutoGeneratedText(true)` generates visible text from metadata.

- `setShowValidationMark(true)` adds a validation icon.

- `signField(document, outputPath, fieldName, options, appearance)` applies the digital signature and embeds the appearance.

```java

        try (Signature signer = new Signature();
             Document document = Document.open("output_document_with_field.pdf")) {
            DigitalSignatureOptions options = new DigitalSignatureOptions();
            options.setCertificatePath("certificate.pfx");
            options.setCertificatePassword("Nutrient answers all your document needs");
            options.setSignerName("John Doe");
            options.setReason("Final Approval");
            options.setLocation("New York");

            SignatureAppearance appearance = new SignatureAppearance();
            appearance.setUseAutoGeneratedText(true);
            appearance.setShowValidationMark(true);

            signer.signField(
                document,
                "output_signed_visible.pdf",
                "ApprovalSignature",
                options,
                appearance
            );
        } catch (Exception e) {
            System.err.println("Error signing field: " + e.getMessage());
        }

```

## Signing with a custom image

Use an image-based appearance for handwritten signatures or logos.

In this sample:

- `Document.open("output_document_with_field.pdf")` opens the PDF before signing.

- `setImagePath(...)` sets the signature image.

- The image renders inside field bounds.

- `setShowValidationMark(true)` keeps validation marks visible.

- `signField(document, outputPath, fieldName, options, appearance)` applies the digital signature.

```java

        try (Signature signer = new Signature();
             Document document = Document.open("output_document_with_field.pdf")) {
            DigitalSignatureOptions options = new DigitalSignatureOptions();
            options.setCertificatePath("certificate.pfx");
            options.setCertificatePassword("Nutrient answers all your document needs");
            options.setSignerName("Jane Smith");
            options.setReason("Review Complete");

            SignatureAppearance appearance = new SignatureAppearance();
            appearance.setImagePath("input_signature.jpg");
            appearance.setShowValidationMark(true);

            signer.signField(
                document,
                "output_signed_with_image.pdf",
                "ApprovalSignature",
                options,
                appearance
            );
        } catch (Exception e) {
            System.err.println("Error signing field: " + e.getMessage());
        }

```

## Signing with custom text

Use custom text when you need workflow-specific signature content.

In this sample:

- `Document.open("output_document_with_field.pdf")` opens the PDF before signing.

- `setUseAutoGeneratedText(false)` disables metadata-generated text.

- `setText(...)` sets the visible signature text.

- `\n` creates multiline output.

- `signField(document, outputPath, fieldName, options, appearance)` applies the digital signature.

```java

        try (Signature signer = new Signature();
             Document document = Document.open("output_document_with_field.pdf")) {
            DigitalSignatureOptions options = new DigitalSignatureOptions();
            options.setCertificatePath("certificate.pfx");
            options.setCertificatePassword("Nutrient answers all your document needs");
            options.setSignerName("Manager");

            SignatureAppearance appearance = new SignatureAppearance();
            appearance.setUseAutoGeneratedText(false);
            appearance.setText("Approved by Management\nDate: 2024-01-15");

            signer.signField(
                document,
                "output_signed_custom_text.pdf",
                "ApprovalSignature",
                options,
                appearance
            );
        } catch (Exception e) {
            System.err.println("Error signing field: " + e.getMessage());
        }

```

## Customizing text appearance

Customize typography to match document or brand requirements.

In this sample:

- `Document.open("output_document_with_field.pdf")` opens the PDF before signing.

- `setFontName(...)` sets the typeface.

- `setFontSize(...)` sets text size.

- `setTextColor(...)` applies ARGB color values.

- `signField(document, outputPath, fieldName, options, appearance)` applies the digital signature.

```java

        try (Signature signer = new Signature();
             Document document = Document.open("output_document_with_field.pdf")) {
            DigitalSignatureOptions options = new DigitalSignatureOptions();
            options.setCertificatePath("certificate.pfx");
            options.setCertificatePassword("Nutrient answers all your document needs");
            options.setSignerName("Executive");

            SignatureAppearance appearance = new SignatureAppearance();
            appearance.setUseAutoGeneratedText(false);
            appearance.setText("Approved by Executive Board");
            appearance.setFontName("Times New Roman");
            appearance.setFontSize(14.0f);
            appearance.setTextColor(Color.fromArgb(255, 0, 0, 128));  // Navy blue

            signer.signField(
                document,
                "output_signed_styled_text.pdf",
                "ApprovalSignature",
                options,
                appearance
            );
        } catch (Exception e) {
            System.err.println("Error signing field: " + e.getMessage());
        }
    }
}

```

## Conclusion

Use this workflow to add visible digital signatures:

1. Open the document using try-with-resources for automatic resource cleanup.

2. Create a PDF editor and access the page collection.

3. Add a signature field with `addSignatureField()` specifying the name, page, position (x, y), and dimensions (width, height).

4. Save the document with the signature field placeholder.

5. Configure `DigitalSignatureOptions` with the certificate path, password, signer name, reason, and location.

6. Create a `SignatureAppearance` object to control visual presentation.

7. Use `setUseAutoGeneratedText(true)` for automatic signature text generation from metadata.

8. Use `setImagePath()` to embed custom signature images or logos.

9. Use `setText()` with `setUseAutoGeneratedText(false)` for custom text content.

10. Customize typography using `setFontName()`, `setFontSize()`, and `setTextColor()` with ARGB values.

11. Use `setShowValidationMark(true)` to display validation checkmarks.

12. Call `signField()` to perform cryptographic signing and embed appearance.

For related signing workflows, refer to the [Java SDK guides](https://www.nutrient.io/guides/java.md).
---

## Related pages

- [Adding link annotations to a PDF document](/guides/java/editor/add-link-annotations-to-pdf.md)
- [Adding interactive form fields to a PDF document](/guides/java/editor/add-form-fields-to-pdf.md)
- [Adding shape annotations to a PDF document](/guides/java/editor/add-shape-annotations-to-pdf.md)
- [Adding annotations to a PDF document](/guides/java/editor/add-annotations-to-pdf.md)
- [Adding a custom page to a PDF document](/guides/java/editor/add-custom-page-to-pdf.md)
- [Adding stamp annotations to a PDF document](/guides/java/editor/add-stamp-annotations-to-pdf.md)
- [Adding redaction annotations to a PDF document](/guides/java/editor/add-redaction-annotations-to-pdf.md)
- [Adding free text annotations to a PDF document](/guides/java/editor/add-freetext-annotations-to-pdf.md)
- [Adding sticky note annotations to a PDF document](/guides/java/editor/add-sticky-note-annotations-to-pdf.md)
- [Adding text markup annotations to a PDF document](/guides/java/editor/add-text-markup-annotations-to-pdf.md)
- [Adding invisible digital signatures to a PDF document](/guides/java/editor/add-invisible-signature-to-pdf.md)
- [Editing PDF form fields](/guides/java/editor/editing-pdf-form-fields.md)
- [Advanced digital signature workflows](/guides/java/editor/advanced-digital-signatures.md)
- [Nutrient Java SDK editor guides](/guides/java/editor.md)
- [Detecting and adding form fields to a PDF document](/guides/java/editor/detect-and-add-form-fields.md)
- [Managing PDF page order](/guides/java/editor/manage-pdf-page-order.md)
- [Editing PDF metadata with Nutrient Java SDK](/guides/java/editor/editing-pdf-metadata.md)
- [Filling PDF form fields](/guides/java/editor/fill-pdf-form.md)
- [Merging PDFs](/guides/java/editor/merge-pdf-into-other-pdf.md)

