Adicionar assinatura de código de barras a PDFs com GroupDocs.Signature Java
Em aplicações modernas centradas em documentos, adicionar assinatura de código de barras é uma maneira rápida e confiável de tornar PDFs legíveis tanto por humanos quanto por máquinas. Este tutorial orienta você em cada passo — desde a configuração do Maven, passando pela estilização do código de barras, até o tratamento de casos extremos com arquivos grandes — para que você possa integrar assinaturas de código de barras em seus projetos Java com confiança.
Respostas rápidas
- Qual é a primeira linha de código para iniciar a assinatura?
Signature signature = new Signature("sample.pdf"); - Qual artefato Maven eu preciso?
com.groupdocs:groupdocs-signature:23.10(replace with the latest version) - Posso assinar PDFs protegidos por senha? Sim—passe a senha ao criar o objeto
Signature. - Quantos formatos de código de barras são suportados? Mais de 30, incluindo Code128, QR, DataMatrix e Aztec.
- Qual o tamanho de heap recomendado para PDFs de 100 MB? Pelo menos
-Xmx2g(2 GB) para evitarOutOfMemoryError.
O que é uma assinatura de código de barras?
Uma assinatura de código de barras é um código de barras legível por máquina incorporado a um PDF que serve como um marcador à prova de adulteração e pode transportar dados personalizados, como IDs, timestamps ou URLs. Ela combina verificação visual com digitalização automatizada, tornando-a ideal para inventário, conformidade e automação de fluxos de trabalho de alto volume.
Por que adicionar assinatura de código de barras com GroupDocs.Signature Java?
GroupDocs.Signature suporta mais de 50 formatos de entrada e saída, processa PDFs com centenas de páginas sem carregar o arquivo inteiro na memória e fornece uma API Java fluente que permite ajustar finamente cada aspecto visual do código de barras. Em testes de benchmark, assinar um PDF de 150 páginas com um código de barras Code128 leva menos de 1,2 segundos em uma instância padrão de nuvem com 2 vCPU.
Pré-requisitos
Antes de começarmos, verifique se você possui o seguinte:
- Java Development Kit (JDK) 8 ou mais recente (JDK 11 ou 17 recomendado para suporte de longo prazo)
- IDE (IntelliJ IDEA, Eclipse ou VS Code com extensões Java)
- Ferramenta de build (Maven 3.6+ ou Gradle 7.0+)
- Biblioteca GroupDocs.Signature Java (mostraremos a configuração Maven e Gradle abaixo)
- Familiaridade básica com conceitos OOP de Java e estruturas de projetos Maven/Gradle
Bibliotecas e dependências necessárias
GroupDocs.Signature integra-se perfeitamente com Maven ou Gradle. Escolha a ferramenta de build que você já usa:
Maven Setup
```xml
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle Setup
```gradle
implementation 'com.groupdocs:groupdocs-signature:23.12'
Se preferir manipular JARs manualmente, baixe a versão mais recente em GroupDocs.Signature for Java releases e adicione-a ao seu classpath.
Etapas para aquisição de licença
GroupDocs oferece três modelos de licenciamento:
- Teste gratuito – Acesso total a recursos por 30 dias (marca d’água aplicada aos PDFs assinados)
- Licença temporária – Teste estendido sem limites de recursos (ideal para pipelines de desenvolvimento)
- Licença completa – Pronta para produção, inclui suporte prioritário e sem marcas d’água
Obtenha a licença apropriada em GroupDocs Licensing. Mesmo durante o teste, você pode executar o código localmente; apenas lembre‑se de substituir a chave de teste por uma permanente antes de colocar em produção.
Como adicionar uma assinatura de código de barras a um PDF usando GroupDocs.Signature Java?
A classe Signature é o ponto de entrada principal para trabalhar com documentos no GroupDocs.Signature.
A classe BarcodeSignOptions especifica os dados, o tipo e a aparência visual do código de barras.
Carregue seu PDF de origem com new Signature("source.pdf"), configure um objeto BarcodeSignOptions com os dados e o estilo visual desejados e, em seguida, chame signature.sign("output.pdf", options). Esse padrão de três etapas lida com I/O de arquivos, geração de código de barras e gravação de PDF em uma única chamada thread‑safe, e funciona para PDFs que variam de alguns kilobytes a várias centenas de megabytes.
Etapa 1: Inicializar o objeto Signature
A classe Signature é o ponto de entrada do GroupDocs.Signature para todas as operações de assinatura. Ela representa um único documento PDF na memória e fornece carregamento preguiçoso para manter o uso de memória baixo.
```java
import com.groupdocs.signature.Signature;
public class InitializeSignature {
public static void main(String[] args) {
Signature signature = new Signature("YOUR_DOCUMENT_DIRECTORY/sample.pdf");
System.out.println("GroupDocs.Signature initialized successfully.");
}
}
Explicação:
filePathaponta para o PDF de origem que você deseja assinar.outputFilePathé onde o PDF assinado será salvo, preservando o arquivo original.- O bloco
try‑catchgarante o tratamento adequado de erros de I/O, arquivos ausentes ou problemas de permissão.
Etapa 2: Configurar as opções de assinatura de código de barras
BarcodeSignOptions permite definir cada atributo do código de barras — tipo, dados, posição, cores, bordas e até se a imagem bruta do código de barras deve ser retornada.
```java
import com.groupdocs.signature.Signature;
import com.groupdocs.signature.exception.GroupDocsSignatureException;
import java.nio.file.Paths;
import java.io.File;
public class Feature1 {
public static void run() throws Exception {
String filePath = "YOUR_DOCUMENT_DIRECTORY/sample.pdf";
String outputFilePath = new File("YOUR_OUTPUT_DIRECTORY", "SignedOutputSample.pdf").getPath();
try {
Signature signature = new Signature(filePath);
System.out.println("Signature initialized and paths set.");
} catch (Exception e) {
throw new GroupDocsSignatureException(e.getMessage());
}
}
}
Divisão das principais configurações:
- Dados & Tipo –
"12345678"é a carga útil;BarcodeTypes.Code128funciona para strings alfanuméricas e é amplamente suportado por scanners. - Posicionamento –
setLeft(100)esetTop(100)deslocam o código de barras 100 px do canto superior esquerdo;VerticalAlignment.Top+HorizontalAlignment.Rightajustam o alinhamento relativo a esses deslocamentos. - Margens & Preenchimento – O objeto
Paddingadiciona um buffer de 20 px para evitar cortes nas bordas da página. - Estilização – Borda, fonte e pincel de fundo são totalmente personalizáveis; para produção você pode remover o gradiente para melhorar a velocidade de renderização.
- Retornar Conteúdo – Habilitar
setReturnContent(true)fornece o código de barras como umbyte[], útil para armazenar a imagem em um banco de dados ou exibi‑la em uma UI.
Configuração mínima pronta para produção
Para um documento legal limpo, normalmente você deseja um código de barras simples preto‑sobre‑branco sem bordas extras:
```java
import com.groupdocs.signature.domain.enums.*;
import com.groupdocs.signature.domain.Padding;
import com.groupdocs.signature.domain.Border;
import com.groupdocs.signature.domain.DashStyle;
import com.groupdocs.signature.domain.extensions.LinearGradientBrush;
import com.groupdocs.signature.domain.font.SignatureFont;
import java.awt.Color;
import com.groupdocs.signature.options.sign.BarcodeSignOptions;
public class Feature2 {
public static void configureBarcodeOptions() throws Exception {
BarcodeSignOptions signOptions = new BarcodeSignOptions("12345678");
signOptions.setEncodeType(BarcodeTypes.Code128);
signOptions.setLeft(100);
signOptions.setTop(100);
signOptions.setVerticalAlignment(VerticalAlignment.Top);
signOptions.setHorizontalAlignment(HorizontalAlignment.Right);
Padding padding = new Padding();
padding.setLeft(20);
padding.setTop(20);
signOptions.setMargin(padding);
Border border = new Border();
border.setColor(Color.GREEN);
border.setDashStyle(DashStyle.DashLongDashDot);
border.setWeight(2);
border.setTransparency(0.5);
border.setVisible(true);
signOptions.setBorder(border);
signOptions.setForeColor(Color.RED);
SignatureFont font = new SignatureFont();
font.setSize(12);
font.setFamilyName("Comic Sans MS");
signOptions.setFont(font);
signOptions.setCodeTextAlignment(CodeTextAlignment.Above);
Background background = new Background();
background.setColor(Color.GREEN);
background.setTransparency(0.5);
background.setBrush(new LinearGradientBrush(Color.GREEN, Color.DARK_GRAY, 0));
signOptions.setBackground(background);
signOptions.setReturnContent(true);
signOptions.setReturnContentType(FileType.PNG);
}
}
Etapa 3: Assinar o documento
O método sign aplica o código de barras configurado ao PDF e grava o resultado no caminho de destino.
```java
signOptions.setEncodeType(BarcodeTypes.QR); // QR codes for more data
signOptions.setForeColor(Color.BLACK);
signOptions.setBackgroundColor(Color.WHITE);
// Remove border and fancy styling for professional appearance
Nos bastidores:
signature.sign(outputFilePath, signOptions)grava o código de barras no PDF enquanto deixa a origem intacta.SignResultrelata quantas assinaturas foram adicionadas, quais páginas foram modificadas e quaisquer avisos gerados.- Para trabalhos em lote, envolva essa chamada em um
ExecutorServicepara paralelizar entre os núcleos da CPU.
Problemas comuns e soluções
Problema 1: FileNotFoundException na inicialização
Sintoma: A aplicação lança FileNotFoundException ao criar o objeto Signature.
Causas raiz:
- Caminho de arquivo incorreto (relativo vs. absoluto)
- Falta de permissões de leitura
- Arquivo bloqueado por outro processo (ex.: aberto no Acrobat)
Correção:
```java
import com.groupdocs.signature.Signature;
import com.groupdocs.signature.exception.GroupDocsSignatureException;
import com.groupdocs.signature.options.sign.BarcodeSignOptions;
import com.groupdocs.signature.domain.BaseSignature;
public class Feature3 {
public static void signDocument(String filePath, BarcodeSignOptions signOptions) throws Exception {
Signature signature = new Signature(filePath);
String outputFilePath = filePath.replace(".pdf", "_Signed.pdf");
try {
com.groupdocs.signature.domain.signatures.SignResult signResult = signature.sign(outputFilePath, signOptions);
System.out.println("Document signed successfully.");
} catch (Exception e) {
throw new GroupDocsSignatureException(e.getMessage());
}
}
}
Certifique‑se de que o caminho use barras normais (C:/Docs/sample.pdf) ou escape as barras invertidas (C:\\Docs\\sample.pdf). Verifique as permissões do SO e feche qualquer programa que possa bloquear o arquivo.
Problema 2: Código de barras não aparece na saída
Sintoma: A assinatura termina sem erros, mas o código de barras está invisível.
Razões típicas:
- O posicionamento coloca o código de barras fora da área imprimível.
- Transparência definida como
1.0(totalmente transparente). - Tamanho da fonte definido como
0.
Solução:
- Mantenha os valores de
setLeft/setTopdentro das dimensões da página (0‑600 px para A4 padrão). - Use um valor de transparência entre
0.0(opaco) e0.9. - Defina um tamanho de fonte legível, por exemplo,
12pt.
Problema 3: Erros de falta de memória com documentos grandes
Sintoma: OutOfMemoryError ao processar PDFs maiores que ~50 MB.
Remédios:
- Aumente o heap da JVM:
-Xmx2gou mais, dependendo do tamanho do documento. - Processar o PDF página por página usando a API de streaming do
Signature. - Feche explicitamente a instância
Signatureapós cada operação para liberar recursos nativos.
```java
import java.nio.file.Files;
import java.nio.file.Path;
Path filePath = Path.of("YOUR_DOCUMENT_DIRECTORY/sample.pdf");
if (!Files.exists(filePath)) {
throw new IllegalArgumentException("PDF file not found: " + filePath);
}
if (!Files.isReadable(filePath)) {
throw new SecurityException("Cannot read PDF file: " + filePath);
}
// Now safe to initialize
Signature signature = new Signature(filePath.toString());
Problema 4: Erro de dados de código de barras inválidos
Sintoma: A API lança uma exceção reclamando de caracteres não suportados.
Causa: Diferentes padrões de código de barras aceitam diferentes conjuntos de caracteres. Code128 permite alfanuméricos; QR pode lidar com Unicode; alguns códigos de barras 1D aceitam apenas dígitos.
Resolução: Escolha um tipo de código de barras que corresponda ao seu conjunto de dados, ou saneie a string antes de atribuí‑la a BarcodeSignOptions.
```java
String barcodeData = "ABC123"; // Your data
BarcodeTypes type = BarcodeTypes.Code128; // Alphanumeric support
// For numeric-only barcodes, validate first:
if (type == BarcodeTypes.EAN13 && !barcodeData.matches("\\d+")) {
throw new IllegalArgumentException("EAN13 requires numeric data only");
}
Melhores práticas para produção
1. Validar PDFs antes de assinar
Sempre confirme que o arquivo é um PDF bem‑formado para evitar erros de análise em tempo de execução.
```java
try (Signature signature = new Signature(filePath)) {
// If this succeeds, file is valid
signature.getDocumentInfo();
} catch (Exception e) {
// Handle invalid PDF
}
2. Use processamento assíncrono para cargas de trabalho de alto volume
Desloque a assinatura para um pool de threads em segundo plano; isso evita congelamentos da UI e melhora a taxa de transferência.
```java
ExecutorService executor = Executors.newFixedThreadPool(4);
List<String> pdfFiles = Arrays.asList("doc1.pdf", "doc2.pdf", "doc3.pdf");
pdfFiles.forEach(file -> {
executor.submit(() -> {
try {
signDocument(file, signOptions);
} catch (Exception e) {
// Log error
}
});
});
executor.shutdown();
3. Implementar registro estruturado
Registre cada solicitação de assinatura com caminho de entrada, caminho de saída, dados do código de barras e quaisquer exceções. Isso acelera drasticamente a análise pós‑mortem.
```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(YourClass.class);
try {
SignResult result = signature.sign(outputFilePath, signOptions);
logger.info("Document signed successfully: {}", outputFilePath);
logger.debug("Signatures added: {}", result.getSucceeded().size());
} catch (Exception e) {
logger.error("Failed to sign document: {}", filePath, e);
}
4. Otimizar as configurações de código de barras para velocidade
- Desative
setReturnContent(true)a menos que precise da imagem separadamente. - Prefira pincéis de fundo sólido em vez de gradientes.
- Omitir bordas para casos de uso de rastreamento simples.
5. Lidar graciosamente com a expiração de licença temporária
A classe License carrega e valida um arquivo de licença GroupDocs para a API.
Verifique o status da licença antes de cada operação de assinatura e recorra a um modo somente leitura ou alerte o administrador.
```java
try {
License license = new License();
license.setLicense(licensePath);
} catch (Exception e) {
logger.warn("License validation failed. Using trial mode.");
// Continue with trial limitations
}
Quando usar assinaturas de código de barras
Cenários ideais
- Inventário & Logística: Anexe um código de barras escaneável a manifestos de envio, listas de embalagem ou etiquetas de ativos.
- Conformidade regulatória: Indústrias como a farmacêutica exigem trilhas de auditoria legíveis por máquina.
- Pipelines de documentos automatizados: Combine assinaturas de código de barras com OCR para habilitar o processamento de ponta a ponta sem entrada manual de dados.
- Trabalhos em lote de alto volume: Códigos de barras são mais rápidos de verificar do que assinaturas digitais criptográficas ao escanear grandes arquivos de papel.
Quando preferir outros tipos de assinatura
- Contratos legais: Use assinaturas digitais baseadas em PKI (ex.: X.509) para não‑repúdio.
- PDFs voltados ao cliente: Códigos QR são mais reconhecíveis em dispositivos móveis.
- Documentos ultra‑seguros: Combine um código de barras com uma assinatura digital criptografada para segurança em camadas.
Dica profissional: Você pode incorporar múltiplos tipos de assinatura no mesmo PDF — adicione um código de barras para rastreamento e um certificado digital para validade legal.
Perguntas frequentes
Q: Como adiciono uma assinatura de código de barras a um PDF em Java sem dependências externas?
A: GroupDocs.Signature for Java é autônomo; após adicionar o artefato Maven/Gradle você obtém geração completa de códigos de barras e renderização de PDF sem bibliotecas de terceiros.
Q: Posso configurar opções de assinatura de código de barras em Java para gerar códigos QR?
A: Absolutamente. Troque o enum BarcodeTypes para QRCode e ajuste os parâmetros de tamanho conforme necessário.
```java
signOptions.setEncodeType(BarcodeTypes.QR);
Q: Qual é a configuração Maven recomendada para uso em produção?
A: Fixe a versão exata no pom.xml (ex.: 23.10.0) para evitar atualizações acidentais, e habilite o plugin Maven shade para produzir um único JAR executável.
```xml
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version> <!-- Don't use LATEST -->
</dependency>
Q: A biblioteca suporta PDFs protegidos por senha?
A: Sim. Forneça a senha ao construir o objeto Signature, então prossiga com a assinatura normalmente.
```java
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your_pdf_password");
Signature signature = new Signature(filePath, loadOptions);
Q: Quantas páginas posso assinar em uma única operação?
A: GroupDocs.Signature pode endereçar todas as páginas de um PDF de uma vez ou direcionar páginas específicas via setPageNumber(). O desempenho escala linearmente; um PDF de 200 páginas é assinado em ~2 segundos em uma VM de nuvem típica.
Q: Quais formatos de código de barras estão disponíveis além do Code128?
A: Mais de 30 formatos, incluindo QR, DataMatrix, Aztec, UPC‑A, EAN‑13, PDF417 e mais. Consulte o enum BarcodeTypes para a lista completa.
Q: Existe um limite para o comprimento dos dados do código de barras?
A: Os limites de comprimento dependem do tipo de código de barras; para Code128 o limite prático é 80 caracteres, enquanto códigos QR podem armazenar até 4 KB de dados.
Q: Posso recuperar a imagem do código de barras gerada após a assinatura?
A: Defina setReturnContent(true) e setReturnContentType(FileType.PNG); o SignResult conterá um byte[] que você pode gravar em disco ou em um banco de dados.
Última atualização: 2026-07-25
Testado com: GroupDocs.Signature 23.10 for Java
Autor: GroupDocs