Como Assinar Digitalmente um PDF em Java
Assinar digitalmente um PDF em Java com o IronPDF permite aplicar assinaturas criptográficas que verificam a autenticidade do documento e detectam alterações não autorizadas. O IronPDF suporta PdfSignature para anexar assinaturas baseadas em certificados PFX a qualquer PDF, definir imagens de assinatura visíveis, controlar os níveis de certificação do PDF com PdfCertificationLevel e conectar-se a um servidor de Autoridade de Timestamp para validade de assinatura a longo prazo.
Início rápido: Assinatura digital de um PDF em Java
- Instalar o IronPDF for Java via Maven ou Gradle
- Defina sua chave de licença com
License.setLicenseKey() - Carregue o PDF com
PdfDocument.fromFile() - Crie um
PdfSignaturecom seu arquivo de certificado PFX e senha. - Aplique a assinatura com
signDigitalSignature() - Salve o PDF assinado com
saveAs()
```java :title=Início Rápido //:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/quickstart.java import java.io.IOException; import java.nio.file.Path; import IronPDF; import IronPDF; import IronPDF;
public class Main { public static void main(String[] args) throws IOException { // Configure a chave de licença do IronPDF License.setLicenseKey("IronPDF-MYLICENSE-KEY-1EF01");
// Carregue um documento PDF existente
PdfDocument pdf = PdfDocument.fromFile(Path.of("document.pdf"));
// Crie um PdfSignature usando um arquivo de certificado PFX e sua senha
PdfSignature assinatura = new PdfSignature("certificado.pfx", "senha123");
// Configure os metadados da assinatura para trilhas de auditoria
assinatura.setSigningContact("John Smith");
assinatura.definirLocalDeAssinatura("Nova York");
assinatura.setSigningReason("Aprovação do Documento");
// Aplique a assinatura digital ao PDF
pdf.signDigitalSignature(assinatura);
// Salve o PDF assinado em um novo arquivo
pdf.saveAs(Path.of("signed.pdf"));
}
}
Assinaturas digitais dão aos documentos PDF uma identidade criptográfica ligada a uma chave privada e certificado. Quando um destinatário abre um PDF assinado no Adobe Acrobat ou em qualquer visualizador compatível, o aplicativo verifica se a cadeia de certificados remonta a uma autoridade confiável e se o conteúdo do documento não mudou desde a assinatura. Esta combinação de autenticação e integridade torna as assinaturas digitais essenciais para contratos, faturas, arquivos regulamentares e qualquer documento onde a evidência de adulteração importa.
As assinaturas de PDF se dividem em duas categorias: assinaturas de aprovação e assinaturas de autor (certificação). Uma assinatura de aprovação registra a aprovação de um signatário em um ponto no tempo; várias partes podem adicionar assinaturas de aprovação em sequência sem invalidar as anteriores. Uma assinatura de certificação, aplicada com `certify()`, bloqueia o documento de acordo com um `PdfCertificationLevel` e marca o signatário como o autor do documento. Assinaturas de certificação devem ser a primeira assinatura em um documento e controlam quais mudanças, se houver, signatários subsequentes podem fazer.
O IronPDF lida com ambos os tipos de assinatura por meio de uma API consistente construída em torno de `PdfSignature` e `PdfDocument`. Para configuração inicial, configuração de dependências e instruções sobre a chave de licença, consulte a [Visão Geral de Introdução](https://ironpdf.com/java/docs/).
<div class="hsg-featured-snippet">
<h2>Como Assinar Digitalmente um PDF em Java</h2>
<ol>
<li><a href="https://ironpdf.com/java/#download-modal">Instale a biblioteca IronPDF for Java para assinaturas digitais</a></li>
<li>Use a classe <strong>PdfDocument</strong> para carregar o PDF</li>
<li>Crie uma <strong>PdfSignature</strong> usando um arquivo de certificado PFX e senha</li>
<li>Opcionalmente, defina uma imagem de assinatura visível com <code>setSignatureImage</code></li>
<li>Aplique a assinatura com <code>signDigitalSignature</code></li>
<li>Certifique o PDF com <code>certify</code> e um <code>PdfCertificationLevel</code></li>
<li>Salve o PDF assinado com <code>saveAs</code></li>
</ol>
</div>
## O que preciso antes de começar?
Antes de assinar PDFs com IronPDF, confirme os seguintes pré-requisitos:
- **Java 8 ou superior**: IronPDF requer um JDK da versão 8 ou superior.
- **IronPDF for Java**: Adicione a dependência ao seu arquivo de construção. Encontre a versão mais recente em [Maven Central](https://central.sonatype.com/artifact/com.ironsoftware/ironpdf).
- **Uma chave de licença válida** : Defina a chave na inicialização do aplicativo com `License.setLicenseKey()`. Para detalhes de configuração, visite o [guia de chaves de licença](https://ironpdf.com/java/get-started/license-keys/).
- **Um arquivo de certificado PFX ou P12**: Este é um arquivo protegido por senha que contém sua chave privada e certificado público no formato PKCS#12. Certificados autoassinados funcionam para desenvolvimento e testes; para documentos de produção que precisam ser confiáveis por destinatários externos, use um certificado emitido por uma Autoridade Certificadora (CA) reconhecida, como DigiCert, Comodo ou GlobalSign.
Para configuração completa de dependências e configuração de projeto, consulte a [Visão Geral de Introdução](https://ironpdf.com/java/docs/).
## Como Aplicar uma Assinatura Digital a um PDF?
O construtor `PdfSignature` recebe o caminho do arquivo do seu certificado PFX e a respectiva senha. Uma vez construído, você pode anexar metadata opcional por meio de três métodos setter:
- `setSigningContact(String)`: o nome ou e-mail da pessoa que assina
- `setSigningLocation(String)`: a localização física ou organizacional do signatário
- `setSigningReason(String)`: uma breve descrição do motivo da assinatura do documento
Esses campos aparecem no painel de propriedades da assinatura dos visualizadores de PDF e criam um registro de auditoria útil para fins de conformidade. Chame `signDigitalSignature(PdfSignature)` no `PdfDocument` carregado para incorporar a assinatura criptográfica e, em seguida, salve o resultado com `saveAs()`.
```java
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/apply-signature.java
import java.io.IOException;
import java.nio.file.Path;
import IronPDF;
import IronPDF;
import IronPDF;
public class Main {
public static void main(String[] args) throws IOException {
// Configure a chave de licença do IronPDF
License.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 assinatura = new PdfSignature("certificado.pfx", "senha123");
// 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(assinatura);
// Save the signed document
pdf.saveAs(Path.of("contract-signed.pdf"));
}
}
Após a conclusão do código signDigitalSignature(), o PDF contém um hash criptográfico do conteúdo do documento, assinado com a chave privada do arquivo PFX. Qualquer modificação no arquivo após esse ponto invalidará a assinatura.
Como Adicionar uma Imagem de Assinatura Visível a um PDF?
Uma imagem de assinatura visível coloca uma representação gráfica diretamente na página do PDF no local do campo de assinatura. Isso é comumente usado para exibir uma assinatura manual digitalizada, um carimbo da empresa ou um logotipo, para que o documento pareça assinado quando impresso ou visualizado, não apenas quando inspecionado com o painel de assinaturas de um leitor de PDF.
Para adicionar uma imagem visível, abra o arquivo de imagem como um FileInputStream e passe-o para PdfSignature.setSignatureImage(InputStream) antes de chamar signDigitalSignature(). A imagem é incorporada dentro do campo de assinatura na 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;
import java.io.IOException;
import java.nio.file.Path;
import IronPDF;
import IronPDF;
import IronPDF;
public class Main {
public static void main(String[] args) throws IOException {
// Configure a chave de licença do IronPDF
License.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 assinatura = new PdfSignature("certificado.pfx", "senha123");
// 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(assinatura);
// 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;
import java.io.IOException;
import java.nio.file.Path;
import IronPDF;
import IronPDF;
import IronPDF;
public class Main {
public static void main(String[] args) throws IOException {
// Configure a chave de licença do IronPDF
License.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 assinatura = new PdfSignature("certificado.pfx", "senha123");
// 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(assinatura);
// Save the signed PDF with the visible signature image embedded
pdf.saveAs(Path.of("agreement-signed.pdf"));
}
}
A imagem de assinatura não substitui a proteção criptográfica; tanto o carimbo gráfico quanto o certificado subjacente continuam parte do resultado assinado. Os formatos PNG e JPEG são suportados para a imagem de assinatura.
Como Certificar um PDF Com um Nível de Permissão Específico?
Certificar um PDF difere de adicionar uma assinatura de aprovação. Ao ligar para pdf.certify(PdfSignature, PdfCertificationLevel), você assina o documento como autor e especifica quais tipos de alterações são permitidas para usuários subsequentes. Um PDF certificado exibe um selo azul ou indicador de confiança semelhante no Adobe Acrobat, sinalizando aos destinatários que o documento provém de uma fonte verificada.
O IronPDF oferece três níveis de certificação através da enumeração PdfCertificationLevel:
PdfCertificationLevel.NO_CHANGES_ALLOWED: o documento fica totalmente bloqueado após a certificação; nenhuma modificação adicional é permitida.PdfCertificationLevel.FORM_FILLING: os destinatários podem preencher os campos do formulário, mas não podem adicionar comentários, anotações ou outras alterações.PdfCertificationLevel.FORM_FILLING_AND_ANNOTATIONS: os destinatários podem preencher os campos do formulário e adicionar anotações, mas as edições estruturais ainda são proibidas.
Como a assinatura de certificação deve ser a primeira assinatura em um documento, ligue para certify() antes de adicionar quaisquer assinaturas de aprovação de outras partes.
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/certify-pdf.java
import java.io.IOException;
import java.nio.file.Path;
import IronPDF;
import IronPDF;
import com.ironsoftware.ironpdf.signature.PdfCertificationLevel;
import IronPDF;
public class Main {
public static void main(String[] args) throws IOException {
// Configure a chave de licença do IronPDF
License.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
import java.io.IOException;
import java.nio.file.Path;
import IronPDF;
import IronPDF;
import com.ironsoftware.ironpdf.signature.PdfCertificationLevel;
import IronPDF;
public class Main {
public static void main(String[] args) throws IOException {
// Configure a chave de licença do IronPDF
License.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"));
}
}
Uma vez certificado com NO_CHANGES_ALLOWED, qualquer tentativa de modificar o PDF invalidará a assinatura de certificação e os visualizadores de PDF exibirão um aviso. Selecione FORM_FILLING ou FORM_FILLING_AND_ANNOTATIONS quando o documento certificado precisar ser preenchido ou anotado por destinatários posteriores sem invalidar a certificação do autor.
Como Adicionar um Indicador de Data e Hora a uma Assinatura Digital?
Um servidor de Autoridade de Carimbo de Tempo (TSA) fornece um token de tempo assinado criptograficamente que é incorporado junto com a assinatura no PDF. Este indicador de data e hora prova quando a assinatura foi aplicada, independentemente do relógio local do assinante. A validade a longo prazo depende de carimbos de tempo: mesmo depois que um certificado de assinatura expira, um carimbo de tempo confiável permite que os validadores confirmem que a assinatura foi criada enquanto o certificado ainda era válido.
Para habilitar a marcação de tempo, defina duas propriedades no objeto PdfSignature antes de assinar:
setTimestampHashAlgorithm(PdfHashAlgorithm): especifica o algoritmo de hash a ser usado ao calcular o token de carimbo de data/hora.PdfHashAlgorithm.SHA256é a opção padrão.setTimestampUrl(String): o endpoint HTTP ou HTTPS do servidor TSA que emitirá o token de carimbo de data/hora.
Vários servidores TSA estão disponíveis sem custo para testes e uso de produção de baixo volume. https://freetsa.org/tsr e http://timestamp.digicert.com são dois endpoints comumente usados.
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/how-to-digitally-sign-pdfs-java-tutorial/timestamp-signature.java
import java.io.IOException;
import java.nio.file.Path;
import IronPDF;
import IronPDF;
import com.ironsoftware.ironpdf.signature.PdfHashAlgorithm;
import IronPDF;
public class Main {
public static void main(String[] args) throws IOException {
// Configure a chave de licença do IronPDF
License.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 assinatura = new PdfSignature("certificado.pfx", "senha123");
// 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(assinatura);
// 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
import java.io.IOException;
import java.nio.file.Path;
import IronPDF;
import IronPDF;
import com.ironsoftware.ironpdf.signature.PdfHashAlgorithm;
import IronPDF;
public class Main {
public static void main(String[] args) throws IOException {
// Configure a chave de licença do IronPDF
License.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 assinatura = new PdfSignature("certificado.pfx", "senha123");
// 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(assinatura);
// Save the timestamped, signed PDF
pdf.saveAs(Path.of("invoice-signed-timestamped.pdf"));
}
}
Quando o TSA está inacessível no momento da assinatura, o IronPDF lançará uma exceção; verifique o acesso à rede e a URL do endpoint TSA antes de implantar em produção. Para fluxos de trabalho de produção de alto volume, considere uma assinatura TSA comercial para garantir o tempo de atividade e as garantias de rendimento.
Quais São os Próximos Passos para Assinar PDFs Digitalmente em Java?
A classe PdfSignature do IronPDF abrange toda a gama de requisitos de assinatura em PDF: assinaturas de aprovação com metadados de certificado, carimbos gráficos visíveis, certificação de PDF com níveis de controle de acesso e carimbos de data/hora com suporte da TSA para validade a longo prazo. Para ampliar seu fluxo de trabalho de PDF além da assinatura, explore estes recursos relacionados:
- Criar Formulários PDF em Java: construa campos de formulário preenchíveis que podem ser completados após um PDF ser certificado
- Preencher Formulários PDF em Java: popula campos de formulário programaticamente em documentos PDF existentes
- Adicionar Anotações a PDFs em Java: anexe comentários, destaques e marcações a locais específicos da página
- Mesclar PDFs em Java: combine vários documentos antes de aplicar uma única assinatura de certificação
- Exemplos de IronPDF for Java: copie e cole exemplos de código cobrindo toda a API do IronPDF Java
Inicie seu teste gratuito para adicionar assinaturas digitais ao seu fluxo de trabalho de PDF em Java. Para adquirir uma licença para uso em produção, veja as opções de licenciamento.
Perguntas frequentes
Como faço para assinar digitalmente um PDF em Java com IronPDF?
Carregue seu PDF com PdfDocument.fromFile(), crie uma PdfSignature usando o caminho para o arquivo de certificado PFX e sua senha, opcionalmente defina metadados com setSigningContact(), setSigningLocation() e setSigningReason(), então chame pdf.signDigitalSignature(signature) e salve com pdf.saveAs().
Qual é a diferença entre signDigitalSignature() e certify() no IronPDF?
signDigitalSignature() adiciona uma assinatura de aprovação que registra a aprovação de um signatário. Várias assinaturas de aprovação podem ser adicionadas em sequência. certify() adiciona uma assinatura de autor que deve ser a primeira no documento e define um PdfCertificationLevel que controla quais alterações signatários subsequentes podem fazer.
Como faço para adicionar uma imagem de assinatura visível a um PDF assinado em Java?
Abra o arquivo de imagem como um FileInputStream e passe-o para signature.setSignatureImage(imageStream) antes de chamar signDigitalSignature(). A imagem é incorporada no campo de assinatura na página junto com a assinatura criptográfica.
Quais níveis de certificação PDF o IronPDF suporta?
IronPDF suporta três níveis via o enum PdfCertificationLevel: NO_CHANGES_ALLOWED bloqueia completamente o documento, FORM_FILLING permite apenas a entrada de campos de formulário, e FORM_FILLING_AND_ANNOTATIONS permite campos de formulário e anotações enquanto previne edições estruturais.
Como faço para adicionar um carimbo de data/hora a uma assinatura digital em Java?
Defina signature.setTimestampHashAlgorithm(PdfHashAlgorithm.SHA256) e signature.setTimestampUrl("https://freetsa.org/tsr") na PdfSignature antes de chamar signDigitalSignature(). IronPDF contata o servidor TSA e incorpora o token de carimbo de data/hora no PDF assinado.
Qual formato de arquivo de certificado o IronPDF exige para assinatura de PDF?
IronPDF exige um arquivo de certificado PFX ou P12, que é um arquivo PKCS#12 contendo a chave privada e o certificado público. Certificados autofirmados funcionam para desenvolvimento; para uso em produção, obtenha um certificado de uma Autoridade Certificadora confiável, como DigiCert ou GlobalSign.
Quais são os pré-requisitos para assinar digitalmente PDFs com IronPDF em Java?
Você precisa do Java 8 ou superior, da dependência IronPDF adicionada via Maven ou Gradle, uma chave de licença válida definida com License.setLicenseKey(), e um arquivo de certificado PFX ou P12 com sua senha.


