¿Cómo firmar digitalmente un PDF en Java

This article was translated from English: Does it need improvement?
Translated
View the article in English

Firmar digitalmente un PDF en Java con IronPDF le permite aplicar firmas criptográficas que verifican la autenticidad del documento y detectan cambios no autorizados. IronPDF soporta PdfSignature para adjuntar firmas basadas en certificados PFX a cualquier PDF, configurando imágenes de firmas visibles, controlando niveles de certificación PDF con PdfCertificationLevel y conectándose a un servidor de Autoridad de Sellado de Tiempo para la validez a largo plazo de la firma.

Inicio rápido: Firmar digitalmente un PDF en Java

  1. Instale IronPDF for Java a través de Maven o Gradle
  2. Establezca su clave de licencia con License.setLicenseKey()
  3. Cargue el PDF con PdfDocument.fromFile()
  4. Cree un PdfSignature con su archivo de certificado PFX y contraseña
  5. Aplique la firma con signDigitalSignature()
  6. Guarde el PDF firmado con saveAs()

```java :title=Quickstart //:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/quickstart.java importar java.io.IOException; import java.nio.file.Path; import com.ironsoftware.ironpdf.License; importar com.ironsoftware.ironpdf IronPDF; import com.ironsoftware.ironpdf.signature.PdfSignature;

public class Main { public static void main(String[] args) lanza IOException { // Configura la clave de licencia de IronPDF Licencia.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

// Cargue un documento PDF existente PdfDocument pdf = PdfDocument.fromFile(Path.of("document.pdf"));

// Cree un PdfSignature usando un archivo de certificado PFX y su contraseña PdfSignature signature = new PdfSignature("certificate.pfx", "password123");

// Establezca los metadatos de la firma para auditorías signature.setSigningContact("John Smith"); signature.setSigningLocation("New York"); signature.setSigningReason("Aprobación del Documento");

// Aplique la firma digital al PDF pdf.signDigitalSignature(signature);

// Guarde el PDF firmado en un archivo nuevo pdf.saveAs(Path.of("signed.pdf")); } }


Las firmas digitales brindan a los documentos PDF una identidad criptográfica vinculada a una clave privada y certificado. Cuando un destinatario abre un PDF firmado en Adobe Acrobat o cualquier visor compatible, la aplicación verifica que la cadena de certificados remonte a una autoridad confiable y que el contenido del documento no ha cambiado desde la firma. Esta combinación de autenticación e integridad hace que las firmas digitales sean esenciales para contratos, facturas, presentaciones regulatorias, y cualquier documento donde importe la evidencia de manipulación.

Las firmas PDF se dividen en dos categorías: firmas de aprobación y firmas de autor (certificación). Una firma de aprobación registra la aprobación de un firmante en un punto en el tiempo; múltiples partes pueden agregar firmas de aprobación en secuencia sin invalidar las anteriores. Una firma de certificación, aplicada con `certify()`, bloquea el documento de acuerdo a un `PdfCertificationLevel` y marca al firmante como el autor del documento. Las firmas de certificación deben ser la primera firma en un documento y controlan qué cambios, si los hay, pueden hacer los firmantes posteriores.

IronPDF maneja ambos tipos de firma a través de una API consistente basada en `PdfSignature` y `PdfDocument`. Para la configuración inicial, configuración de dependencias, e instrucciones de clave de licencia, vea el [Resumen para comenzar](https://ironpdf.com/java/docs/).

<div class="hsg-featured-snippet">
    <h2>Cómo firmar digitalmente un PDF en Java</h2>
    <ol>
        <li><a href="https://ironpdf.com/java/#download-modal">Instale la biblioteca Java de IronPDF para firmas digitales</a></li>
        <li>Use la clase <strong>PdfDocument</strong> para cargar el PDF</li>
        <li>Cree un <strong>PdfSignature</strong> usando un archivo de certificado PFX y contraseña</li>
        <li>Opcionalmente establezca una imagen de firma visible con <code>setSignatureImage</code></li>
        <li>Aplique la firma con <code>signDigitalSignature</code></li>
        <li>Certifique el PDF con <code>certify</code> y un <code>PdfCertificationLevel</code></li>
        <li>Guarde el PDF firmado con <code>saveAs</code></li>
    </ol>
</div>

## ¿Qué necesito antes de empezar?

Antes de firmar PDFs con IronPDF, confirme los siguientes requisitos previos:

- **Java 8 o superior**: IronPDF requiere un JDK de versión 8 o superior.
- **IronPDF for Java**: Agregue la dependencia a su archivo de construcción. Encuentre la última versión en [Maven Central](https://central.sonatype.com/artifact/com.ironsoftware/ironpdf).
- **Una clave de licencia válida**: Establezca la clave al inicio de la aplicación con `License.setLicenseKey()`. Para obtener detalles de configuración, visite la [guía de claves de licencia](https://ironpdf.com/java/get-started/license-keys/).
- **Un archivo de certificado PFX o P12**: Este es un archivo protegido por contraseña que contiene su clave privada y certificado público en formato PKCS#12. Los certificados autofirmados funcionan para desarrollo y pruebas; para documentos de producción que necesitan ser confiados por destinatarios externos, use un certificado emitido por una Autoridad de Certificación reconocida (CA) como DigiCert, Comodo, o GlobalSign.

Para una configuración completa de dependencias y configuración de proyectos, consulte el [Resumen para comenzar](https://ironpdf.com/java/docs/).

## ¿Cómo aplico una firma digital a un PDF?

El constructor de `PdfSignature` toma la ruta del archivo a su certificado PFX y su contraseña. Una vez construido, puede adjuntar metadatos opcionales a través de tres métodos setter:

- `setSigningContact(String)`: el nombre o correo electrónico de la persona que firma
- `setSigningLocation(String)`: la ubicación física u organizativa del firmante
- `setSigningReason(String)`: una breve descripción de por qué se está firmando el documento

Estos campos aparecen en el panel de propiedades de la firma de los visores de PDF y crean un registro de auditoría útil para fines de cumplimiento. Llame a `signDigitalSignature(PdfSignature)` en el `PdfDocument` cargado para incrustar la firma criptográfica, luego guarde el resultado con `saveAs()`.

```java
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/apply-signature.java
importar java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
importar com.ironsoftware.ironpdf IronPDF;
import com.ironsoftware.ironpdf.signature.PdfSignature;

public class Main {
    public static void main(String[] args) lanza IOException {
// Configura la clave de licencia de IronPDF
        Licencia.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

        // Load the PDF to sign
        PdfDocument pdf = PdfDocument.fromFile(Path.of("contract.pdf"));

        // Construct the PdfSignature with the certificate path and password
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");

        // Set metadata that will appear in the signature properties panel
        signature.setSigningContact("Jane Doe");
        signature.setSigningLocation("Austin, TX");
        signature.setSigningReason("Contract Approval");

        // Embed the digital signature in the PDF
pdf.signDigitalSignature(signature);

        // Save the signed document
        pdf.saveAs(Path.of("contract-signed.pdf"));
    }
}

Después de que signDigitalSignature() se complete, el PDF contiene un hash criptográfico del contenido del documento firmado con la clave privada del archivo PFX. Cualquier modificación al archivo después de este punto invalidará la firma.

¿Cómo agrego una imagen de firma visible a un PDF?

Una imagen de firma visible coloca una representación gráfica directamente en la página del PDF en la ubicación del campo de firma. Esto se usa comúnmente para mostrar una firma manuscrita escaneada, un sello de la empresa, o un logotipo para que el documento parezca firmado cuando se imprime o se visualiza, y no solo al inspeccionarlo con el panel de firma de un lector de PDF.

Para añadir una imagen visible, abra el archivo de imagen como un FileInputStream y páselo a PdfSignature.setSignatureImage(InputStream) antes de llamar a signDigitalSignature(). La imagen está incrustada dentro del campo de firma en la página.

//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/visible-signature-image.java
import java.io.FileInputStream;
importar java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
importar com.ironsoftware.ironpdf IronPDF;
import com.ironsoftware.ironpdf.signature.PdfSignature;

public class Main {
    public static void main(String[] args) lanza IOException {
// Configura la clave de licencia de IronPDF
        Licencia.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

        // Load the PDF document to sign
        PdfDocument pdf = PdfDocument.fromFile(Path.of("agreement.pdf"));

        // Build the PdfSignature from a PFX certificate
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");

        // Set signing metadata
        signature.setSigningContact("Alice Johnson");
        signature.setSigningLocation("Chicago, IL");
        signature.setSigningReason("Agreement Authorization");

        // Open the signature image file and attach it to the signature
        FileInputStream imageStream = new FileInputStream("signature.png");
        signature.setSignatureImage(imageStream);

        // Apply the digital signature with the visible image to the PDF
pdf.signDigitalSignature(signature);

        // Save the signed PDF with the visible signature image embedded
        pdf.saveAs(Path.of("agreement-signed.pdf"));
    }
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/visible-signature-image.java
import java.io.FileInputStream;
importar java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
importar com.ironsoftware.ironpdf IronPDF;
import com.ironsoftware.ironpdf.signature.PdfSignature;

public class Main {
    public static void main(String[] args) lanza IOException {
// Configura la clave de licencia de IronPDF
        Licencia.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

        // Load the PDF document to sign
        PdfDocument pdf = PdfDocument.fromFile(Path.of("agreement.pdf"));

        // Build the PdfSignature from a PFX certificate
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");

        // Set signing metadata
        signature.setSigningContact("Alice Johnson");
        signature.setSigningLocation("Chicago, IL");
        signature.setSigningReason("Agreement Authorization");

        // Open the signature image file and attach it to the signature
        FileInputStream imageStream = new FileInputStream("signature.png");
        signature.setSignatureImage(imageStream);

        // Apply the digital signature with the visible image to the PDF
pdf.signDigitalSignature(signature);

        // Save the signed PDF with the visible signature image embedded
        pdf.saveAs(Path.of("agreement-signed.pdf"));
    }
}
JAVA

La imagen de la firma no reemplaza la protección criptográfica; tanto el sello gráfico como el certificado subyacente siguen siendo parte del resultado firmado. Se admiten los formatos PNG y JPEG para la imagen de la firma.

¿Cómo certifico un PDF con un nivel de permiso específico?

Certificar un PDF difiere de agregar una firma de aprobación. Cuando llame a pdf.certify(PdfSignature, PdfCertificationLevel), firma el documento como su autor y especifica qué tipos de cambios son permitidos por los usuarios posteriores. Un PDF certificado muestra un lazo azul o un indicador de confianza similar en Adobe Acrobat, indicando a los destinatarios que el documento proviene de una fuente verificada.

IronPDF proporciona tres niveles de certificación a través del enum PdfCertificationLevel:

  • PdfCertificationLevel.NO_CHANGES_ALLOWED: el documento está completamente bloqueado después de la certificación; no se permiten más modificaciones.
  • PdfCertificationLevel.FORM_FILLING: los destinatarios pueden rellenar los campos del formulario, pero no pueden agregar comentarios, anotaciones u otros cambios.
  • PdfCertificationLevel.FORM_FILLING_AND_ANNOTATIONS: los destinatarios pueden rellenar campos del formulario y agregar anotaciones, pero todavía se prohíben ediciones estructurales.

Debido a que una firma de certificación debe ser la primera firma en un documento, llame a certify() antes de aplicar cualquier firma de aprobación de otras partes.

//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/certify-pdf.java
importar java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
importar com.ironsoftware.ironpdf IronPDF;
import com.ironsoftware.ironpdf.signature.PdfCertificationLevel;
import com.ironsoftware.ironpdf.signature.PdfSignature;

public class Main {
    public static void main(String[] args) lanza IOException {
// Configura la clave de licencia de IronPDF
        Licencia.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

        // Load the PDF that will be certified
        PdfDocument pdf = PdfDocument.fromFile(Path.of("report.pdf"));

        // Create the PdfSignature from the author's certificate
        PdfSignature signature = new PdfSignature("author-certificate.pfx", "password123");

        // Set author metadata for the certification signature
        signature.setSigningContact("Legal Department");
        signature.setSigningLocation("San Francisco, CA");
        signature.setSigningReason("Official Publication");

        // Certify the document with NO_CHANGES_ALLOWED to lock it completely
        // Use FORM_FILLING to allow form field input after certification
        // Use FORM_FILLING_AND_ANNOTATIONS to also permit annotations
        pdf.certify(signature, PdfCertificationLevel.NO_CHANGES_ALLOWED);

        // Save the certified PDF
        pdf.saveAs(Path.of("report-certified.pdf"));
    }
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/certify-pdf.java
importar java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
importar com.ironsoftware.ironpdf IronPDF;
import com.ironsoftware.ironpdf.signature.PdfCertificationLevel;
import com.ironsoftware.ironpdf.signature.PdfSignature;

public class Main {
    public static void main(String[] args) lanza IOException {
// Configura la clave de licencia de IronPDF
        Licencia.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

        // Load the PDF that will be certified
        PdfDocument pdf = PdfDocument.fromFile(Path.of("report.pdf"));

        // Create the PdfSignature from the author's certificate
        PdfSignature signature = new PdfSignature("author-certificate.pfx", "password123");

        // Set author metadata for the certification signature
        signature.setSigningContact("Legal Department");
        signature.setSigningLocation("San Francisco, CA");
        signature.setSigningReason("Official Publication");

        // Certify the document with NO_CHANGES_ALLOWED to lock it completely
        // Use FORM_FILLING to allow form field input after certification
        // Use FORM_FILLING_AND_ANNOTATIONS to also permit annotations
        pdf.certify(signature, PdfCertificationLevel.NO_CHANGES_ALLOWED);

        // Save the certified PDF
        pdf.saveAs(Path.of("report-certified.pdf"));
    }
}
JAVA

Una vez certificado con NO_CHANGES_ALLOWED, cualquier intento de modificar el PDF romperá la firma de certificación y los visores de PDF mostrarán una advertencia. Elija FORM_FILLING o FORM_FILLING_AND_ANNOTATIONS cuando el documento certificado necesite ser rellenado o anotado por destinatarios posteriores sin invalidar la certificación del autor.

¿Cómo agrego una marca de tiempo a una firma digital?

Un servidor de Autoridad de Tiempos (TSA) proporciona un token de tiempo firmado criptográficamente que se integra junto con la firma en el PDF. Esta marca de tiempo prueba cuándo se aplicó la firma, independientemente del reloj local del firmante. La validez a largo plazo depende de las marcas de tiempo: incluso después de que un certificado de firma expira, una marca de tiempo confiable permite a los validadores confirmar que la firma fue creada mientras el certificado aún era válido.

Para habilitar el sellado de tiempo, establezca dos propiedades en el objeto PdfSignature antes de firmar:

  • setTimestampHashAlgorithm(PdfHashAlgorithm): especifica el algoritmo de hash a usar al calcular el token de marca de tiempo. PdfHashAlgorithm.SHA256 es la opción estándar.
  • setTimestampUrl(String): el endpoint HTTP o HTTPS del servidor TSA que emitirá el token de marca de tiempo.

Varios servidores TSA están disponibles sin costo para pruebas y uso en producción de bajo volumen. https://freetsa.org/tsr y http://timestamp.digicert.com son dos endpoints comúnmente usados.

//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/timestamp-signature.java
importar java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
importar com.ironsoftware.ironpdf IronPDF;
import com.ironsoftware.ironpdf.signature.PdfHashAlgorithm;
import com.ironsoftware.ironpdf.signature.PdfSignature;

public class Main {
    public static void main(String[] args) lanza IOException {
// Configura la clave de licencia de IronPDF
        Licencia.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

        // Load the PDF to sign with a timestamp
        PdfDocument pdf = PdfDocument.fromFile(Path.of("invoice.pdf"));

        // Construct the PdfSignature from the certificate file
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");

        // Set signature metadata
        signature.setSigningContact("Finance Team");
        signature.setSigningLocation("Seattle, WA");
        signature.setSigningReason("Invoice Authorization");

        // Configure the timestamp: set the hash algorithm and TSA endpoint
        signature.setTimestampHashAlgorithm(PdfHashAlgorithm.SHA256);
        signature.setTimestampUrl("https://freetsa.org/tsr");

        // Apply the digital signature; IronPDF will contact the TSA to obtain
        // and embed a timestamp token alongside the cryptographic signature
pdf.signDigitalSignature(signature);

        // Save the timestamped, signed PDF
        pdf.saveAs(Path.of("invoice-signed-timestamped.pdf"));
    }
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/timestamp-signature.java
importar java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
importar com.ironsoftware.ironpdf IronPDF;
import com.ironsoftware.ironpdf.signature.PdfHashAlgorithm;
import com.ironsoftware.ironpdf.signature.PdfSignature;

public class Main {
    public static void main(String[] args) lanza IOException {
// Configura la clave de licencia de IronPDF
        Licencia.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");

        // Load the PDF to sign with a timestamp
        PdfDocument pdf = PdfDocument.fromFile(Path.of("invoice.pdf"));

        // Construct the PdfSignature from the certificate file
PdfSignature signature = new PdfSignature("certificate.pfx", "password123");

        // Set signature metadata
        signature.setSigningContact("Finance Team");
        signature.setSigningLocation("Seattle, WA");
        signature.setSigningReason("Invoice Authorization");

        // Configure the timestamp: set the hash algorithm and TSA endpoint
        signature.setTimestampHashAlgorithm(PdfHashAlgorithm.SHA256);
        signature.setTimestampUrl("https://freetsa.org/tsr");

        // Apply the digital signature; IronPDF will contact the TSA to obtain
        // and embed a timestamp token alongside the cryptographic signature
pdf.signDigitalSignature(signature);

        // Save the timestamped, signed PDF
        pdf.saveAs(Path.of("invoice-signed-timestamped.pdf"));
    }
}
JAVA

Cuando la TSA no se puede alcanzar en el momento de la firma, IronPDF lanzará una excepción; verifica el acceso a la red y la URL del punto final de TSA antes de desplegar en producción. Para flujos de trabajo de producción de alto volumen, considera una suscripción comercial de TSA para asegurar garantía de tiempo de actividad y rendimiento.

¿Cuáles son los próximos pasos para firmar digitalmente PDFs en Java?

La clase PdfSignature de IronPDF cubre toda la gama de requisitos de firma PDF: firmas de aprobación con metadatos de certificado, sellos gráficos visibles, certificación PDF con niveles de control de acceso y sellos de tiempo respaldados por TSA para validez a largo plazo. Para extender tu flujo de trabajo de PDF más allá de la firma, explora estos recursos relacionados:

Comienza tu prueba gratuita para agregar firmas digitales a tu flujo de trabajo de PDF en Java. Para comprar una licencia para uso en producción, ver opciones de licencia.

Preguntas Frecuentes

¿Cómo firmo digitalmente un PDF en Java con IronPDF?

Cargue su PDF con PdfDocument.fromFile(), cree un PdfSignature usando la ruta a su archivo de certificado PFX y su contraseña, opcionalmente configure metadatos con setSigningContact(), setSigningLocation() y setSigningReason(), luego llame a pdf.signDigitalSignature(signature) y guarde con pdf.saveAs().

¿Cuál es la diferencia entre signDigitalSignature() y certify() en IronPDF?

signDigitalSignature() añade una firma de aprobación que registra la aprobación de un firmante. Se pueden añadir múltiples firmas de aprobación en secuencia. certify() añade una firma de autor que debe ser la primera en el documento y establece un PdfCertificationLevel que controla qué cambios pueden hacer los firmantes posteriores.

¿Cómo añado una imagen de firma visible a un PDF firmado en Java?

Abra el archivo de imagen como un FileInputStream y páselo a signature.setSignatureImage(imageStream) antes de llamar a signDigitalSignature(). La imagen se incrusta en el campo de firma en la página junto a la firma criptográfica.

¿Qué niveles de certificación de PDF admite IronPDF?

IronPDF admite tres niveles a través del enumerado PdfCertificationLevel: NO_CHANGES_ALLOWED bloquea el documento por completo, FORM_FILLING permite solo la entrada en campos de formulario, y FORM_FILLING_AND_ANNOTATIONS permite campos de formulario y anotaciones mientras evita ediciones estructurales.

¿Cómo añado una marca de tiempo a una firma digital en Java?

Configure signature.setTimestampHashAlgorithm(PdfHashAlgorithm.SHA256) y signature.setTimestampUrl("https://freetsa.org/tsr") en el PdfSignature antes de llamar a signDigitalSignature(). IronPDF contacta al servidor TSA y embebe el token de marca de tiempo en el PDF firmado.

¿Qué formato de archivo de certificado requiere IronPDF para la firma de PDFs?

IronPDF requiere un archivo de certificado PFX o P12, que es un archivo PKCS#12 que contiene la clave privada y el certificado público. Los certificados autofirmados funcionan para desarrollo; para uso en producción, obtenga un certificado de una Autoridad de Certificación de confianza como DigiCert o GlobalSign.

¿Cuáles son los requisitos previos para firmar digitalmente PDFs con IronPDF en Java?

Necesita Java 8 o superior, la dependencia IronPDF añadida a través de Maven o Gradle, una clave de licencia válida configurada con License.setLicenseKey() y un archivo de certificado PFX o P12 con su contraseña.

Darrius Serrant
Ingeniero de Software Full Stack (WebOps)

Darrius Serrant tiene una licenciatura en Ciencias de la Computación de la Universidad de Miami y trabaja como Ingeniero de Marketing WebOps Full Stack en Iron Software. Atraído por la programación desde joven, vio la computación como algo misterioso y accesible, convirtiéndolo en el ...

Leer más
¿Listo para empezar?
Versión: 2026.5 just released
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida?
ejecutar una muestra Mira cómo tu HTML se convierte en PDF.