Extrair texto PDF csharp

O formato de arquivo PDF é popular porque o conteúdo do arquivo não pode ser modificado facilmente, em comparação com outros formatos de arquivo de processamento de texto. No entanto, em C# você pode extrair texto de documentos PDF com Aspose.PDF para .NET API. Neste artigo, vamos explorar algumas das muitas possibilidades para pesquisar e extrair texto de arquivos PDF usando C#. A seguir está uma lista de recursos que discutiremos neste blog:

Extrair texto de um documento PDF inteiro usando C#

A leitura do conteúdo do texto de um documento PDF é um recurso usado com frequência. Usando C#, você pode extrair todo o texto de todas as páginas do documento seguindo as etapas abaixo:

  1. Carregar documento PDF
  2. Criar objeto TextAbsorber
  3. Aceite o absorvedor para todas as páginas
  4. Escreva o texto extraído em um arquivo e salve-o

O trecho de código abaixo segue estas etapas e mostra como extrair texto de um documento PDF inteiro usando C#:

// Abrir documento PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Criar objeto TextAbsorber para extrair texto
TextAbsorber textAbsorber = new TextAbsorber();
// Aceite o absorvedor para todas as páginas
pdfDocument.Pages.Accept(textAbsorber);
// Obtenha o texto extraído
string extractedText = textAbsorber.Text;
// Crie um gravador e abra o arquivo
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Escreva uma linha de texto no arquivo
tw.WriteLine(extractedText);
// Fechar o fluxo
tw.Close();

Pesquise e extraia texto de uma página específica em PDF em C#

Depois de explorar a extração de texto no nível do documento, vamos extrair o texto de uma página específica de um documento PDF. Basta seguir as etapas abaixo para atender às suas necessidades:

  1. Carregar documento PDF
  2. Criar objeto TextAbsorber
  3. Aceite o absorvedor para uma página específica
  4. Escreva o texto extraído em um arquivo e salve-o

O trecho de código a seguir segue estas etapas para ler o texto de qualquer página de um arquivo PDF usando C#:

// Abrir documento PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Acesse a página necessária no documento PDF
Page page = pdfDocument.Pages[1];
// Criar objeto TextAbsorber para extrair texto
TextAbsorber textAbsorber = new TextAbsorber();
// Aceite o absorvedor para a página especificada
page.Accept(textAbsorber);
// Obtenha o texto extraído
string extractedText = textAbsorber.Text;
// Crie um gravador e abra o arquivo
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Escreva uma linha de texto no arquivo
tw.WriteLine(extractedText);
// Fechar o fluxo
tw.Close();

Pesquisar e extrair texto de uma região específica da página PDF em C#

Vamos levar essa extração de texto mais um passo adiante. Considere encontrar algum texto de uma área específica da página. É importante entender aqui que a unidade de medida básica no Aspose.PDF para .NET é ponto, onde 72 pontos equivalem a 1 polegada. Além disso, o canto inferior esquerdo é considerado a origem (0,0) da página. A seguir estão as etapas para ler o texto de uma área ou seção específica da Página em um documento PDF:

  1. Carregar documento PDF de origem
  2. Criar objeto TextAbsorber
  3. Defina TextSearchOptions e especifique as coordenadas retangulares
  4. Aceite o absorvedor para a página específica
  5. Gravar texto extraído em um arquivo

O trecho de código abaixo demonstra essas etapas para extrair texto de uma região específica usando C#:

// Abrir documento
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Criar objeto TextAbsorber para extrair texto
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// Aceite o absorvedor para a primeira página
pdfDocument.Pages[1].Accept(absorber);
// Obtenha o texto extraído
string extractedText = absorber.Text;
// Crie um gravador e abra o arquivo
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Escreva uma linha de texto no arquivo
tw.WriteLine(extractedText);
// Fechar o fluxo
tw.Close();

Pesquise ou extraia texto específico do arquivo PDF com expressões regulares usando C#

Você pode extrair um texto específico de um documento PDF que corresponda a algum padrão. Por exemplo, você pode querer extrair algumas palavras ou números específicos. Para isso, você precisaria projetar uma expressão regular. A API utilizará essa regex para encontrar o texto correspondente no documento PDF. As etapas abaixo são as diretrizes para pesquisar e extrair texto específico de arquivos PDF:

  • Carregar documento PDF de entrada
  • Criar objeto TextAbsorber
  • Projete e defina uma expressão regular para corresponder a algum texto
  • Percorra cada fragmento de texto extraído

O trecho de código C# a seguir usa um regex que pesquisa o texto que contém 4 dígitos, por exemplo, 1999,2000 etc. em todas as páginas do documento.

// documento aberto
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// crie o objeto TextAbsorber para encontrar todas as instâncias da frase de pesquisa de entrada
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// aceite o absorvedor para todas as páginas
pdfDocument.Pages.Accept(textFragmentAbsorber);
// obter os fragmentos de texto extraídos
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// loop através dos fragmentos
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

Extrair texto de células de tabela em documento PDF usando C#

Extrair texto de Tabelas em uma página PDF é um pouco diferente. Temos trabalhado com a classe TextAbsorber em exemplos anteriores, mas extrair texto de uma Tabela é um pouco diferente. Portanto, você precisa seguir as etapas abaixo para extrair texto de objetos Table:

  1. Carregar arquivo PDF de origem
  2. Crie um objeto da classe TableAbsorber
  3. Iterar por AbsorbedTable
  4. Faça um loop em cada célula em cada linha da Tabela

O trecho de código abaixo segue estas etapas e extrai com eficiência o texto das células da tabela no documento PDF usando C#:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

Pesquise e extraia texto destacado de um documento PDF usando C#

O texto realçado está presente como Anotação em arquivos PDF. Eles contêm Texto Marcado, o que os torna diferentes do texto convencional em um documento. As etapas abaixo descrevem como ler o texto destacado usando C#:

  1. Carregar documento de origem
  2. Percorrer todas as anotações
  3. Filtrar TextMarkupAnnotation
  4. Recuperar fragmentos de texto destacados

O seguinte é um trecho de código baseado nas etapas acima, ele pode ser usado para obter texto de destaque de arquivos PDF:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Percorrer todas as anotações
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // Filter TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Recuperar fragmentos de texto destacados
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Exibir texto destacado
            Console.WriteLine(tf.Text);
        }
    }
}

Extrair texto PDF com baixo consumo de memória usando C#

A seguir estão duas abordagens diferentes para otimizar o consumo de memória ao extrair texto de documentos PDF usando a linguagem C#.

i) Usando o método Reset() e FreeMemory()

Às vezes, a extração de texto pode consumir muita memória e processador. Possivelmente quando o arquivo de entrada é enorme e contém muito texto. Porque o objeto TextFragmentAbsorber armazena todos os fragmentos de texto encontrados na memória.

Portanto, a solução que recomendamos aqui é chamar o método absorber.Reset() após processar cada página. Além disso, se você estiver fazendo apenas operações de leitura, também poderá liberar a memória mantida pelos objetos de página, com o método page.FreeMemory(). Portanto, você precisa seguir as etapas abaixo para utilizar recursos mínimos:

  1. Carregar documento PDF de origem
  2. Especifique TextEditOptions
  3. Leia TextFragment
  4. Chame o método Reset()
  5. Chame o método FreeMemory()

O trecho de código a seguir demonstra a extração de texto de documentos PDF usando C#:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //Leia algo de fragmentos
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

Testamos este trecho de código com um arquivo de amostra enorme contendo 450 páginas, 24.500 fragmentos de texto e muitas imagens raster e vetoriais. O processo consumiu meros 500 MB de memória. Outra dica aqui é que você pode cobrar o coletor de lixo .NET para diminuir o consumo máximo de memória para cerca de 250 MB com um custo adicional de 10 segundos de tempo de processamento.

ii) Usando a enumeração MemorySaving

Aspose.PDF para .NET API suporta a configuração do modo de economia de memória durante a leitura de texto de um arquivo PDF. A enumeração TextExtractionOptions.TextFormattingMode serve ao propósito de consumo ideal de recursos. As etapas a seguir resumem as etapas que você precisa seguir para essa abordagem:

  1. Carregar arquivo PDF de origem
  2. Criar objeto TextDevice
  3. Definir TextExtractionOptions
  4. Extrair texto e escrever texto em um arquivo

O trecho de código abaixo demonstra a abordagem de economia de memória usando C#:

// Abrir documento
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// String para armazenar o texto extraído
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Criar dispositivo de texto
        TextDevice textDevice = new TextDevice();

        // Definir opções de extração de texto - defina o modo de extração de texto (Raw ou Pure)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Converta uma página específica e salve o texto no fluxo
        textDevice.Process(pdfPage, textStream);
        // Converta uma página específica e salve o texto no fluxo
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Fechar fluxo de memória
        textStream.Close();
        // Obter texto do fluxo de memória
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Salve o texto extraído em arquivo de texto
File.WriteAllText(dataDir, builder.ToString());

Conclusão

Exploramos alguns dos muitos casos de uso úteis neste artigo, existem infinitas possibilidades de extrair texto de documentos PDF usando C# com Aspose.PDF para .NET API. Você pode saber mais em documentação da API. Em caso de dúvidas, entre em contato conosco em Fóruns de suporte gratuito.

Veja também