Na era dos negócios online, o uso de faturas e recibos digitais aumentou muito. Da mesma forma, a extração eficiente de dados dessas faturas digitais também é exigente. Neste artigo, você saberá como extrair dados de faturas ou recibos em PDF programaticamente em Java. Anteriormente, vimos a extração de dados de fatura usando C# em uma das postagens anteriores.

Extrair dados de faturas ou recibos em PDF

API Java de análise de documentos e extração de dados

Usarei GroupDocs.Parser for Java para analisar faturas em PDF e extrair valores de dados dentro do aplicativo Java. Essa API também permite extrair texto, imagens e metadados de documentos, imagens, apresentações, arquivos, e-mail e muitos outros formatos de documento suportados.

Baixe ou configure

Na seção de downloads, você pode baixar o arquivo JAR ou apenas obter as configurações de repositório e dependência para o pox.xml de seus aplicativos Java baseados em maven.

Como extrair dados de fatura em PDF em Java

As etapas a seguir permitirão que você extraia facilmente os dados das faturas em PDF usando Java.

  • Crie um modelo.
  • Analise a fatura em PDF de acordo com o modelo criado.
  • Extraia as informações do PDF analisado.

Criar modelo para a fatura

Abaixo está o modelo que é criado de acordo com a fatura. Você também pode baixar a fatura usada dos arquivos de amostra disponíveis no repositório do GitHub.

// Criar modelo para analisar dados da fatura usando Java
// Primeiro crie itens de modelo
TemplateItem[] templateItems = new TemplateItem[]
{
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 135), new Size(100, 10))), "FromCompany"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 150), new Size(100, 35))), "FromAddress"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 190), new Size(150, 2))), "FromEmail"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 250), new Size(100, 2))), "ToCompany"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 260), new Size(100, 15))), "ToAddress"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 290), new Size(150, 2))), "ToEmail"),
    new TemplateField(new TemplateRegexPosition("Invoice Number"), "InvoiceNumber"),
    new TemplateField(new TemplateLinkedPosition(
            "InvoiceNumber",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "InvoiceNumberValue"),
    new TemplateField(new TemplateRegexPosition("Order Number"), "InvoiceOrder"),
    new TemplateField(new TemplateLinkedPosition(
            "InvoiceOrder",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "InvoiceOrderValue"),
    new TemplateField(new TemplateRegexPosition("Invoice Date"), "InvoiceDate"),
    new TemplateField(new TemplateLinkedPosition(
            "InvoiceDate",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "InvoiceDateValue"),
    new TemplateField(new TemplateRegexPosition("Due Date"), "DueDate"),
    new TemplateField(new TemplateLinkedPosition(
            "DueDate",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "DueDateValue"),
    new TemplateField(new TemplateRegexPosition("Total Due"), "TotalDue"),
    new TemplateField(new TemplateLinkedPosition(
            "TotalDue",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "TotalDueValue")
};
// Transforme em modelo
Template template = new Template(Arrays.asList(templateItems));

Analisar fatura/recibo em PDF para extração de dados

As linhas a seguir analisarão a fatura em PDF de acordo com o modelo criado e extrairão os dados da fatura usando código Java simples.

// Analise a fatura em PDF usando o modelo definido em Java
Parser parser = new Parser("filePath/invoice.pdf");
DocumentData data = parser.parseByTemplate(template);
// Imprima os dados extraídos
for (int i = 0; i < data.getCount(); i++) {
    // Imprimindo Nome do Campo
    System.out.print(data.get(i).getName() + ": ");
    // Converta o valor da propriedade PageArea para PageTextArea
    // pois definimos apenas campos de texto no modelo
    PageTextArea area = data.get(i).getPageArea() instanceof PageTextArea
            ? (PageTextArea) data.get(i).getPageArea()
            : null;
    System.out.println(area == null ? "Not a template field" : area.getText());
}

A saída

A seguir está a saída do código acima após a extração dos dados da fatura.

**FROMCOMPANY:**    DEMO - Sliced Invoices
**FROMADDRESS:**    Suite 5A-1204
123 Somewhere Street
Your City AZ 12345
**FROMEMAIL:**     admin@slicedinvoices.com
**TOCOMPANY:**    Test Business
**TOADDRESS:**    123 Somewhere St
Melbourne, VIC 3000
**INVOICENUMBER:**             Invoice Number
**INVOICENUMBERVALUE:** NV-3337
**INVOICEORDER:**                Order Number
**INVOICEORDERVALUE:**    12345
**INVOICEDATE:**                    Invoice Date
**INVOICEDATEVALUE:**        January 25, 2016
**DUEDATE:**                           Due Date
**DUEDATEVALUE:**               January 31, 2016
**TOTALDUE:**                         Total Due
**TOTALDUEVALUE:**             $93.50

Existem muitos outros exemplos de código aberto disponíveis em GitHub Repository. Você pode baixar o código e executar rapidamente os exemplos. Para obter mais orientações e algumas outras maneiras de usar modelos para análise e extração de dados em Java, visite o guia do desenvolvedor na documentação. Em caso de qualquer dificuldade adicional, contate a equipe de suporte gratuitamente, a qualquer momento no fórum.

Veja também