Como ler tabelas em documentos com C

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

IronOCR permite que desenvolvedores C# extraiam dados de tabelas em PDFs e imagens usando modelos avançados de aprendizado de máquina, lidando tanto com tabelas simples com células básicas quanto com estruturas complexas como faturas com células mescladas usando o método ReadDocumentAdvanced.

Extrair dados de tabelas usando o Tesseract puro pode ser um desafio, pois o texto geralmente reside em células e está disperso de forma esparsa pelo documento. No entanto, nossa biblioteca inclui um modelo de aprendizado de máquina treinado e ajustado para detectar e extrair dados de tabelas com precisão. Seja para processar relatórios financeiros, listas de estoque ou dados de faturas, o IronOCR fornece as ferramentas para analisar dados estruturados com eficiência.

Para tabelas simples, confie na detecção de tabela direta usando a classe padrão OcrInput. Para estruturas mais complexas, nosso método exclusivo ReadDocumentAdvanced fornece resultados robustos, analisando tabelas de forma eficaz e entregando dados. Este método avançado utiliza aprendizado de máquina para entender layouts de tabelas, células mescladas e formatação complexa com as quais o OCR tradicional geralmente tem dificuldades.

Início Rápido: Extrair Células Complexas de Tabelas em Uma Única Chamada

Comece em minutos—este exemplo mostra como uma única chamada IronOCR usando ReadDocumentAdvanced fornece a você dados detalhados de células de tabela de um documento complexo. O sistema demonstra facilidade de uso ao carregar um PDF, aplicar detecção avançada de tabelas e retornar diretamente uma lista de informações das células.

  1. Instale IronOCR com o Gerenciador de Pacotes NuGet

    PM > Install-Package IronOcr
  2. Copie e execute este trecho de código.

    var cells = new IronTesseract().ReadDocumentAdvanced(new OcrInput().LoadPdf("invoiceTable.pdf")).Tables.First().CellInfos;
  3. Implante para testar em seu ambiente de produção.

    Comece a usar IronOCR em seu projeto hoje com uma avaliação gratuita

    arrow pointer

Os passos a seguir orientam você nos primeiros passos para ler tabelas usando o IronOCR:


Como extrair dados de tabelas simples?

Configurar a propriedade ReadDataTables como verdadeira permite a detecção de tabela usando Tesseract. Essa abordagem funciona bem para tabelas básicas com limites de células bem definidos e sem células mescladas. Criei um PDF com uma tabela simples para testar essa funcionalidade, que você pode baixar aqui: ' simple-table.pdf '. Tabelas simples sem células mescladas podem ser detectadas usando este método. Para tabelas mais complexas, consulte o método descrito abaixo.

O método padrão de detecção de tabelas é particularmente eficaz para:

  • Exportação de planilhas
  • Tabelas de dados básicas com estrutura de linhas/colunas consistente
  • Relatórios com dados tabulares
  • Listas de inventário simples

Se você trabalha com extração de texto OCR em PDFs em geral, esse método se integra perfeitamente aos recursos mais amplos de processamento de documentos do IronOCR.

:path=/static-assets/ocr/content-code-examples/how-to/read-table-in-document-with-tesseract.cs
using IronOcr;
using System;
using System.Data;

// Instantiate OCR engine
var ocr = new IronTesseract();

// Enable table detection
ocr.Configuration.ReadDataTables = true;

using var input = new OcrPdfInput("simple-table.pdf");
var result = ocr.Read(input);

// Retrieve the data
var table = result.Tables[0].DataTable;

// Print out the table data
foreach (DataRow row in table.Rows)
{
    foreach (var item in row.ItemArray)
    {
        Console.Write(item + "\t");
    }
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

Como posso ler tabelas de faturas complexas?

Um dos tipos de tabelas complexas mais comuns em ambientes empresariais são as faturas. As faturas são tabelas complexas com linhas e colunas de dados, frequentemente apresentando células mescladas, larguras de coluna variáveis ​​e estruturas aninhadas. Com IronOCR, utilizamos o método ReadDocumentAdvanced para lidar com eles de maneira eficaz. O processo envolve a digitalização do documento, a identificação da estrutura da tabela e a extração dos dados. Neste exemplo, usamos o arquivo ' invoiceTable.pdf ' para demonstrar como o IronOCR recupera todas as informações da fatura.

O método ReadDocumentAdvanced requer que o pacote IronOcr.Extensions.AdvancedScan seja instalado junto com o pacote base IronOCR. Esta extensão fornece recursos avançados de aprendizado de máquina, especificamente treinados para layouts de documentos complexos.

Observe
Para usar a verificação avançada no .NET Framework, é necessário que o projeto seja executado em uma arquitetura x64. Para isso, acesse a configuração do projeto e desmarque a opção "Preferir 32 bits". Saiba mais no seguinte guia de solução de problemas: " Verificação avançada no .NET Framework ".
)}]

:path=/static-assets/ocr/content-code-examples/how-to/read-table-in-document-with-ml.cs
using IronOcr;
using System.Linq;

// Instantiate OCR engine
var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("invoiceTable.pdf");

// Perform OCR
var result = ocr.ReadDocumentAdvanced(input);

var cellList = result.Tables.First().CellInfos;
$vbLabelText   $csharpLabel

Este método separa os dados textuais do documento em duas categorias: uma delimitada por bordas e outra sem bordas. Para o conteúdo delimitado por bordas, a biblioteca o divide ainda em subseções com base na estrutura da tabela. O método se destaca no tratamento de:

  • Itens de linha da fatura com descrições variadas
  • Detalhamento de preços em várias colunas
  • Blocos de endereço de entrega e cobrança
  • Seções de cálculo de impostos e totais
  • Informações de cabeçalho e rodapé

Os resultados são apresentados abaixo. Como esse método se concentra nas informações delimitadas por bordas, quaisquer células mescladas que abranjam várias linhas serão tratadas como uma única célula.

Qual é a aparência dos dados extraídos?

O IronSoftware OCR extrai dados de tabelas de faturas de envio para um formato hierárquico estruturado.

Como faço para organizar e processar as células extraídas da tabela?

Na implementação atual, as células extraídas ainda não estão organizadas corretamente. No entanto, cada célula contém informações valiosas, como coordenadas X e Y, dimensões e muito mais. Utilizando esses dados, podemos criar uma classe auxiliar para diversas finalidades. As informações da célula incluem:

  • Coordenadas X/Y precisas para posicionamento
  • Dimensões de largura e altura
  • Conteúdo do texto
  • Pontuações de confiança
  • Relações celulares

Essas informações detalhadas permitem reconstruir a estrutura da tabela programaticamente e aplicar lógica personalizada para extração de dados. Você também pode usar essas coordenadas para definir regiões específicas para processamento OCR direcionado em operações subsequentes.

Abaixo estão alguns métodos auxiliares básicos:

using System;
using System.Collections.Generic;
using System.Linq;

// A helper class to process table data by sorting cells based on coordinates
public static class TableProcessor
{
    // Method to organize cells by their coordinates (Y top to bottom, X left to right)
    public static List<CellInfo> OrganizeCellsByCoordinates(List<CellInfo> cells)
    {
        // Sort cells by Y (top to bottom), then by X (left to right)
        var sortedCells = cells
            .OrderBy(cell => cell.CellRect.Y)
            .ThenBy(cell => cell.CellRect.X)
            .ToList();

        return sortedCells;
    }

    // Example method demonstrating how to process multiple tables
    public static void ProcessTables(Tables tables)
    {
        foreach (var table in tables)
        {
            var sortedCells = OrganizeCellsByCoordinates(table.CellInfos);

            Console.WriteLine("Organized Table Cells:");

            // Initialize previous Y coordinate
            int previousY = sortedCells.Any() ? sortedCells.First().CellRect.Y : 0;

            foreach (var cell in sortedCells)
            {
                // Print a new line if the Y-coordinate changes, indicating a new row
                if (Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8)
                {
                    Console.WriteLine();  // Start a new row
                    previousY = cell.CellRect.Y;
                }

                // Print the cell text followed by a tab
                Console.Write($"{cell.CellText}\t");
            }

            Console.WriteLine("\n--- End of Table ---");  // End of a table
        }
    }

    // Method to extract a specific row by the given index
    public static List<CellInfo> ExtractRowByIndex(TableInfo table, int rowIndex)
    {
        if (table == null || table.CellInfos == null || !table.CellInfos.Any())
        {
            throw new ArgumentException("Table is empty or invalid.");
        }

        var sortedCells = OrganizeCellsByCoordinates(table.CellInfos);
        List<List<CellInfo>> rows = new List<List<CellInfo>>();

        // Group cells into rows based on Y coordinates
        int previousY = sortedCells.First().CellRect.Y;
        List<CellInfo> currentRow = new List<CellInfo>();

        foreach (var cell in sortedCells)
        {
            if (Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8)
            {
                // Store the completed row and start a new one
                rows.Add(new List<CellInfo>(currentRow));
                currentRow.Clear();

                previousY = cell.CellRect.Y;
            }

            currentRow.Add(cell);
        }

        // Add the last row if it wasn't added yet
        if (currentRow.Any())
        {
            rows.Add(currentRow);
        }

        // Retrieve the specified row
        if (rowIndex < 0 || rowIndex >= rows.Count)
        {
            throw new IndexOutOfRangeException($"Row index {rowIndex} is out of range.");
        }

        return rows[rowIndex];
    }
}
using System;
using System.Collections.Generic;
using System.Linq;

// A helper class to process table data by sorting cells based on coordinates
public static class TableProcessor
{
    // Method to organize cells by their coordinates (Y top to bottom, X left to right)
    public static List<CellInfo> OrganizeCellsByCoordinates(List<CellInfo> cells)
    {
        // Sort cells by Y (top to bottom), then by X (left to right)
        var sortedCells = cells
            .OrderBy(cell => cell.CellRect.Y)
            .ThenBy(cell => cell.CellRect.X)
            .ToList();

        return sortedCells;
    }

    // Example method demonstrating how to process multiple tables
    public static void ProcessTables(Tables tables)
    {
        foreach (var table in tables)
        {
            var sortedCells = OrganizeCellsByCoordinates(table.CellInfos);

            Console.WriteLine("Organized Table Cells:");

            // Initialize previous Y coordinate
            int previousY = sortedCells.Any() ? sortedCells.First().CellRect.Y : 0;

            foreach (var cell in sortedCells)
            {
                // Print a new line if the Y-coordinate changes, indicating a new row
                if (Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8)
                {
                    Console.WriteLine();  // Start a new row
                    previousY = cell.CellRect.Y;
                }

                // Print the cell text followed by a tab
                Console.Write($"{cell.CellText}\t");
            }

            Console.WriteLine("\n--- End of Table ---");  // End of a table
        }
    }

    // Method to extract a specific row by the given index
    public static List<CellInfo> ExtractRowByIndex(TableInfo table, int rowIndex)
    {
        if (table == null || table.CellInfos == null || !table.CellInfos.Any())
        {
            throw new ArgumentException("Table is empty or invalid.");
        }

        var sortedCells = OrganizeCellsByCoordinates(table.CellInfos);
        List<List<CellInfo>> rows = new List<List<CellInfo>>();

        // Group cells into rows based on Y coordinates
        int previousY = sortedCells.First().CellRect.Y;
        List<CellInfo> currentRow = new List<CellInfo>();

        foreach (var cell in sortedCells)
        {
            if (Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8)
            {
                // Store the completed row and start a new one
                rows.Add(new List<CellInfo>(currentRow));
                currentRow.Clear();

                previousY = cell.CellRect.Y;
            }

            currentRow.Add(cell);
        }

        // Add the last row if it wasn't added yet
        if (currentRow.Any())
        {
            rows.Add(currentRow);
        }

        // Retrieve the specified row
        if (rowIndex < 0 || rowIndex >= rows.Count)
        {
            throw new IndexOutOfRangeException($"Row index {rowIndex} is out of range.");
        }

        return rows[rowIndex];
    }
}
$vbLabelText   $csharpLabel

Melhores práticas para extração de tabelas

Ao trabalhar com extração de tabelas no IronOCR, considere estas boas práticas:

  1. Qualidade do documento : Documentos com resolução mais alta produzem melhores resultados. Para documentos digitalizados, assegure-se de uma resolução mínima de 300 DPI.

  2. Pré-processamento : Para documentos com baixa qualidade ou tabelas distorcidas, considere usar os recursos de correção de imagem do IronOCR antes do processamento.

  3. Desempenho : Para documentos grandes com várias tabelas, considere usar multithreading e suporte assíncrono para processar páginas em paralelo.

  4. Opções de saída : Após extrair os dados da tabela, você pode exportar os resultados em vários formatos. Saiba mais sobre as opções de saída de dados e como criar PDFs pesquisáveis ​​a partir dos seus documentos processados.

  5. Processamento de fluxo : Para aplicações web ou cenários que trabalham com documentos em memória, considere usar OCR para fluxos de PDF para evitar operações no sistema de arquivos.

Resumo

O IronOCR oferece recursos poderosos de extração de tabelas por meio de detecção padrão baseada em Tesseract e métodos avançados de aprendizado de máquina. A abordagem padrão funciona bem para tabelas simples, enquanto o método ReadDocumentAdvanced se destaca em documentos complexos como faturas. Com os métodos auxiliares fornecidos, você pode organizar e processar os dados extraídos de acordo com suas necessidades específicas.

Explore mais recursos do IronOCR para aprimorar seus fluxos de trabalho de processamento de documentos e aproveitar todo o potencial do reconhecimento óptico de caracteres em seus aplicativos .NET.

Perguntas frequentes

Como posso extrair dados de tabelas de PDFs e imagens em C#?

O IronOCR permite que desenvolvedores C# extraiam dados de tabelas de PDFs e imagens usando modelos avançados de aprendizado de máquina. Para tabelas simples, use a classe OcrInput com a propriedade ReadDataTables definida como true. Para tabelas complexas com células mescladas, use o método ReadDocumentAdvanced para obter resultados mais precisos.

Qual a diferença entre extração de tabelas simples e complexas?

A extração simples de tabelas no IronOCR utiliza a propriedade ReadDataTables com o Tesseract e funciona bem para tabelas básicas com limites de células bem definidos. A extração de tabelas complexas requer o método ReadDocumentAdvanced, que utiliza aprendizado de máquina para lidar com células mescladas, faturas e formatação complexa.

Como posso extrair dados rapidamente de tabelas complexas?

Utilize o método ReadDocumentAdvanced do IronOCR em uma única chamada: var cells = new IronTesseract().ReadDocumentAdvanced(new OcrInput().LoadPdf('invoiceTable.pdf')).Tables.First().CellInfos; Isso aproveita o aprendizado de máquina para entender layouts de tabelas e formatação complexa.

Que tipos de documentos funcionam melhor com a detecção simples de tabelas?

O método simples de detecção de tabelas do IronOCR funciona particularmente bem com exportações de planilhas, tabelas de dados básicas com estrutura consistente de linhas/colunas, relatórios com dados tabulares e listas de inventário simples sem células mescladas.

Como faço para habilitar a detecção de tabelas para tabelas básicas?

Para habilitar a detecção de tabelas no IronOCR para tabelas básicas, defina a propriedade ReadDataTables como true. Isso utiliza os recursos de detecção de tabelas do Tesseract e funciona bem para tabelas com limites de células bem definidos e sem células mescladas.

A biblioteca consegue processar faturas e relatórios financeiros com layouts complexos?

Sim, o método ReadDocumentAdvanced do IronOCR foi projetado especificamente para lidar com documentos complexos, como faturas e relatórios financeiros. Ele utiliza modelos de aprendizado de máquina treinados para detectar e extrair dados de tabelas com células mescladas e formatação complexa.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais
Analisado por
Jeff Fritz
Jeffrey T. Fritz
Gerente de Programa Principal - Equipe da Comunidade .NET
Jeff também é Gerente de Programa Principal das equipes do .NET e do Visual Studio. Ele é o produtor executivo da série de conferências virtuais .NET Conf e apresenta o "Fritz and Friends", uma transmissão ao vivo para desenvolvedores que vai ao ar duas vezes por semana, onde ele conversa sobre tecnologia e escreve código junto com os espectadores. Jeff cria workshops, apresentações e planeja conteúdo para os maiores eventos de desenvolvedores da Microsoft, incluindo o Microsoft Build, o Microsoft Ignite, a .NET Conf e o Microsoft MVP Summit.
Pronto para começar?
Nuget Downloads 5,525,971 | Versão: 2026.3 acaba de ser lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package IronOcr
executar um exemplo Veja sua imagem se transformar em texto pesquisável.