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#
- Pesquise e extraia texto de uma página específica em um documento PDF usando C#
- Pesquise e extraia texto de uma região específica da página PDF usando C#
- Pesquise ou extraia texto específico de arquivo PDF com expressões regulares usando C#
- Extrair texto de células de tabela em documento PDF usando C#
- Pesquise e extraia texto destacado de um documento PDF usando C#
- Extrair texto PDF com baixo consumo de memória usando C#
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:
- Carregar documento PDF
- Criar objeto TextAbsorber
- Aceite o absorvedor para todas as páginas
- 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:
- Carregar documento PDF
- Criar objeto TextAbsorber
- Aceite o absorvedor para uma página específica
- 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:
- Carregar documento PDF de origem
- Criar objeto TextAbsorber
- Defina TextSearchOptions e especifique as coordenadas retangulares
- Aceite o absorvedor para a página específica
- 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:
- Carregar arquivo PDF de origem
- Crie um objeto da classe TableAbsorber
- Iterar por AbsorbedTable
- 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#:
- Carregar documento de origem
- Percorrer todas as anotações
- Filtrar TextMarkupAnnotation
- 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:
- Carregar documento PDF de origem
- Especifique TextEditOptions
- Leia TextFragment
- Chame o método Reset()
- 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:
- Carregar arquivo PDF de origem
- Criar objeto TextDevice
- Definir TextExtractionOptions
- 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.