Pesquisar Páginas Específicas de Código de Barras em Documentos Usando Java
Introdução
Já passou horas verificando assinaturas manualmente em centenas de documentos? Você não está sozinho. Seja construindo um sistema de gerenciamento de contratos, automatizando o processamento de faturas ou protegendo registros de saúde, rastrear e validar assinaturas de código de barras manualmente é tedioso e propenso a erros.
Neste guia, mostraremos como pesquisar páginas específicas de código de barras em seus documentos de forma programática com Java e GroupDocs.Signature. Ao final, você será capaz de detectar assinaturas nas páginas selecionadas, monitorar o progresso da pesquisa em tempo real e lidar com diversos formatos de código de barras — tudo com código limpo e fácil de manter.
O que você aprenderá
- Configurar o GroupDocs.Signature em um projeto Java (≈5 minutos)
- Inscrever‑se em eventos de pesquisa para acompanhamento em tempo real
- Configurar opções de pesquisa inteligente para direcionar páginas específicas
- Executar a pesquisa e processar resultados de forma eficiente
Respostas Rápidas
- Qual biblioteca ajuda a pesquisar páginas específicas de código de barras? GroupDocs.Signature para Java
- Tempo típico de configuração? Cerca de 5 minutos para adicionar a dependência Maven/Gradle e uma licença
- Posso limitar a pesquisa às primeira e última páginas? Sim – use
PagesSetuppara especificar páginas exatas - Quais formatos de código de barras são suportados? QR Code, Code128, Code39, DataMatrix, EAN/UPC e mais
- Preciso de licença paga para produção? Uma licença completa é necessária para produção; uma versão de avaliação funciona para testes
O que é “pesquisar páginas específicas de código de barras”?
Pesquisar páginas específicas de código de barras significa instruir o motor de assinatura a procurar assinaturas de código de barras apenas nas páginas que interessam — por exemplo, a primeira página, a última página ou qualquer intervalo personalizado. Essa abordagem focada acelera o processamento, reduz o uso de memória e permite criar feedback de UI responsivo.
Por que usar o GroupDocs.Signature para esta tarefa?
O GroupDocs.Signature fornece uma API de alto nível que abstrai a decodificação de código de barras, renderização de páginas e manipulação de formatos de documento. Ele funciona com PDF, DOCX, XLSX e muitos outros formatos prontamente, permitindo que você se concentre na lógica de negócios em vez de analisar arquivos.
Pré‑requisitos
- JDK 8+ instalado
- Maven ou Gradle para gerenciamento de dependências
- Familiaridade básica com classes, métodos e tratamento de exceções em Java
- Acesso a uma licença do GroupDocs.Signature (avaliação ou completa)
Configurando o GroupDocs.Signature para Java
Configuração Maven
Adicione a dependência ao seu pom.xml:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Configuração Gradle
Ou inclua em build.gradle:
implementation 'com.groupdocs:groupdocs-signature:23.12'
Prefere downloads manuais? Você pode obter a versão mais recente diretamente na página de download do GroupDocs.
Obtendo sua Licença
- Teste Gratuito – comece imediatamente, sem compromisso
- Licença Temporária – acesso total aos recursos para avaliação
- Licença Completa – pronta para produção, uso ilimitado
Verifique a instalação com um trecho de inicialização rápido:
import com.groupdocs.signature.Signature;
public class SignatureSetup {
public static void main(String[] args) {
// Initialize the Signature instance with the document path
Signature signature = new Signature("YOUR_DOCUMENT_PATH");
System.out.println("GroupDocs.Signature for Java initialized successfully.");
}
}
Dica de especialista: Substitua
"YOUR_DOCUMENT_PATH"por um arquivo PDF, DOCX ou XLSX real. Se o console imprimir a mensagem de sucesso, você está pronto para prosseguir.
Entendendo os Tipos de Assinatura de Código de Barras
Códigos de barras incorporam dados legíveis por máquina dentro de um documento. Diferentemente de assinaturas manuscritas, eles podem armazenar IDs, timestamps, URLs ou payloads JSON, tornando‑os ideais para verificação automatizada.
| Tipo de Código de Barras | Melhor Uso | Comprimento Típico de Dados |
|---|---|---|
| QR Code | Dados de alta densidade, URLs, texto multilinha | Até 4.296 caracteres |
| Code128 | Números de rastreamento alfanuméricos | Variável |
| Code39 | Códigos legados simples | Até 43 caracteres |
| DataMatrix | Rótulos pequenos, registros de saúde | Até 2.335 caracteres |
| EAN/UPC | Identificação de produtos, varejo | 8‑13 dígitos |
Você usará códigos de barras quando precisar de leitura rápida por máquina, dados estruturados ou assinatura à prova de adulteração.
Como Pesquisar Páginas Específicas de Código de Barras
Dividiremos a implementação em três recursos focados.
Recurso 1: Inscrevendo‑se em Eventos de Pesquisa de Documento
Por que isso importa
Ao processar lotes grandes, feedback em tempo real (por exemplo, barras de progresso) melhora a UX e ajuda a detectar travamentos precocemente.
Implementação
Signature signature = new Signature("YOUR_DOCUMENT_PATH");
signature.SearchStarted.add(new ProcessStartEventHandler() {
public void invoke(Signature sender, ProcessStartEventArgs args) {
System.out.println("Search process started at " + args.getStarted()
+ " with " + args.getTotalSignatures() + " total signatures to be put in document");
}
});
signature.SearchProgress.add(new ProcessProgressEventHandler() {
public void invoke(Signature sender, ProcessProgressEventArgs args) {
System.out.println("Search progress. Processed " + args.getProcessedSignatures()
+ " signatures. Time spent " + args.getTicks() + " mlsec");
}
});
signature.SearchCompleted.add(new ProcessCompleteEventHandler() {
public void invoke(Signature sender, ProcessCompleteEventArgs args) {
System.out.println("Search process completed at " + args.getCompleted()
+ " with " + args.getTotalSignatures() + " total signatures. Process took "
+ args.getTicks() + " mlsec");
}
});
Esses três manipuladores fornecem tempo de início, progresso ao vivo e estatísticas finais — perfeitos para logs ou atualizações de UI.
Recurso 2: Configurando Opções de Pesquisa de Código de Barras para Páginas Específicas
Por que o controle granular importa
Escanear todas as páginas de um contrato de 200 páginas desperdiça ciclos de CPU. Focar apenas nas primeiras e últimas páginas pode reduzir o tempo de execução em 80 %.
Implementação
import com.groupdocs.signature.domain.enums.TextMatchType;
import com.groupdocs.signature.options.search.BarcodeSearchOptions;
BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setAllPages(false); // Opt‑in selective page searching
options.setPageNumber(1); // Starting page (optional)
import com.groupdocs.signature.options.PagesSetup;
PagesSetup pagesSetup = new PagesSetup();
pagesSetup.setFirstPage(true); // Include first page
pagesSetup.setLastPage(true); // Include last page
pagesSetup.setOddPages(false); // Skip odd pages
pagesSetup.setEvenPages(false); // Skip even pages
options.setPagesSetup(pagesSetup);
options.setMatchType(TextMatchType.Contains);
options.setText("12345");
- Tipos de correspondência permitem ajustar a pesquisa de texto (
Contains,Exact,StartsWith,EndsWith). - Ajuste
setAllPagesePagesSetuppara pesquisar apenas páginas específicas de código de barras.
Recurso 3: Executando a Pesquisa e Processando Resultados
Por que este passo importa
Encontrar códigos de barras é apenas metade da história — você precisa agir sobre os dados (por exemplo, validar, armazenar ou acionar fluxos de trabalho).
Implementação
import java.util.List;
import com.groupdocs.signature.domain.signatures.BarcodeSignature;
try {
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
System.out.println("Source document contains following signatures.");
for (BarcodeSignature barcodeSignature : signatures) {
System.out.println("Barcode signature found at page " + barcodeSignature.getPageNumber()
+ " with type " + barcodeSignature.getEncodeType() + " and text " + barcodeSignature.getText());
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
Agora você tem uma lista de objetos BarcodeSignature, cada um expondo:
getPageNumber()– onde o código de barras está localizadogetEncodeType()– QR, Code128, etc.getText()– payload decodificado- Posição (
getLeft(),getTop()) e tamanho (getWidth(),getHeight())
Exemplo: Processar apenas códigos QR na última página
for (BarcodeSignature barcodeSignature : signatures) {
if (barcodeSignature.getPageNumber() == lastPageNumber
&& barcodeSignature.getEncodeType().equals("QRCode")) {
// Process only QR codes from the final page
processApprovalCode(barcodeSignature.getText());
}
}
Aplicações no Mundo Real
| Cenário | Como a pesquisa de páginas específicas de código de barras ajuda |
|---|---|
| Verificação de contrato legal | Auto‑validar hashes de certificado codificados em QR na página de assinatura |
| Rastreamento na cadeia de suprimentos | Localizar IDs de envio Code128 nas primeiras/últimas páginas de manifestos |
| Formulários de consentimento em saúde | Extrair IDs de paciente DataMatrix da página final de consentimento |
| Automação de faturas | Encontrar códigos com prefixo “APPR‑” em qualquer parte da fatura e encaminhar |
Problemas Comuns e Soluções
Problema 1 – Nenhum resultado apesar de códigos de barras visíveis
// Ensure you are not limiting pages too aggressively
options.setAllPages(true);
Se o código de barras estiver embutido como imagem raster, considere usar o GroupDocs.Image para detecção baseada em imagem.
Problema 2 – Desempenho lento em arquivos grandes
PagesSetup pagesSetup = new PagesSetup();
pagesSetup.setLastPage(true); // Most signatures are on the last page
pagesSetup.setFirstPage(true);
options.setPagesSetup(pagesSetup);
Páginas direcionadas reduzem drasticamente o tempo de processamento.
Problema 3 – TextMatchType não encontra códigos de barras esperados
String searchText = "12345".trim().toLowerCase();
options.setText(searchText);
options.setMatchType(TextMatchType.StartsWith); // Try a more permissive mode
Problema 4 – Vazamentos de memória em loops de longa duração
try (Signature signature = new Signature("document.pdf")) {
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
// Process signatures
}
O bloco try‑with‑resources descarta a instância Signature automaticamente.
Melhores Práticas para Produção
Tratamento robusto de erros
try {
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
} catch (com.groupdocs.signature.exception.GroupDocsSignatureException e) {
logger.error("GroupDocs error: " + e.getMessage());
} catch (Exception e) {
logger.error("Unexpected error: " + e.getMessage(), e);
}
Cache de resultados quando documentos são imutáveis
Map<String, List<BarcodeSignature>> cache = new ConcurrentHashMap<>();
public List<BarcodeSignature> getCachedSignatures(String docId) {
return cache.computeIfAbsent(docId, id -> performSearch(id));
}
Use eventos de progresso para feedback de UI
signature.SearchProgress.add(new ProcessProgressEventHandler() {
public void invoke(Signature sender, ProcessProgressEventArgs args) {
int percent = (args.getProcessedSignatures() * 100) / args.getTotalSignatures();
updateProgressBar(percent);
}
});
Valide payloads de código de barras
for (BarcodeSignature barcodeSignature : signatures) {
String text = barcodeSignature.getText();
if (!text.matches("APPR-\\d{4}-\\d{3}")) {
logger.warn("Invalid format: " + text);
continue;
}
if (!validateChecksum(text)) {
logger.error("Checksum failed for: " + text);
flagForManualReview(document);
}
}
Otimize a seleção de páginas por tipo de documento
PagesSetup contractsSetup = new PagesSetup();
contractsSetup.setLastPage(true); // Contracts usually signed on last page
options.setPagesSetup(contractsSetup);
Filtre por tipo de código de barras após a pesquisa (se precisar apenas de QR)
for (BarcodeSignature sig : signatures) {
if ("QRCode".equals(sig.getEncodeType())) {
// Process QR code
}
}
Extraia dimensões da imagem do código de barras (se necessário para renderização)
for (BarcodeSignature sig : signatures) {
int width = sig.getWidth();
int height = sig.getHeight();
// Use dimensions for overlay or thumbnail generation
}
Perguntas Frequentes
Q: Posso pesquisar múltiplos formatos de código de barras em uma única chamada?
A: Sim. BarcodeSearchOptions pesquisa todos os formatos suportados por padrão. Filtre os resultados por getEncodeType() se precisar apenas de tipos específicos.
Q: Como lido com documentos que contêm assinaturas de código de barras e de imagem?
A: Execute pesquisas separadas — use BarcodeSignature.class para códigos de barras e ImageSignature.class para assinaturas de imagem, depois combine os resultados conforme necessário.
Q: Qual o impacto de desempenho ao pesquisar todas as páginas versus páginas específicas?
A: Escanear todas as páginas de um PDF de 50 páginas pode levar 3–5 segundos. Limitar às primeiras + últimas páginas geralmente termina em menos de 1 segundo.
Q: Isso funciona com PDFs escaneados (imagens raster)?
A: Apenas se o código de barras foi adicionado como objeto de assinatura digital. Para códigos de barras apenas raster, será necessário um reconhecedor baseado em imagem (por exemplo, GroupDocs.Barcode).
Q: Como posso verificar se uma assinatura de código de barras não foi adulterada?
A: Incorpore um hash ou assinatura digital dentro do payload do código de barras, então recalcule o hash nos dados originais e compare. Isso requer a chave de assinatura ou certificado original.
Última atualização: 2026-01-29
Testado com: GroupDocs.Signature 23.12 para Java
Autor: GroupDocs