Os arquivos PDF são um formato padrão para troca de documentos pela Internet. Documentos como faturas e guias de produtos geralmente são compartilhados na forma de PDFs. Pode haver situações em que você tenha várias faturas contendo dados tabulares que você precisa extrair e processar ainda mais. Será mais eficiente extrair esses dados programaticamente. Para isso, este artigo ensinará como extrair dados de tabelas PDF usando C++.
- API C++ para extrair dados de tabelas em arquivos PDF
- Extrair dados de tabelas PDF usando C++
- Extrair dados de uma tabela em uma área específica de uma página PDF
API C++ para extrair dados de tabelas em arquivos PDF
Aspose.PDF for C++ é uma biblioteca C++ que permite criar, ler e atualizar arquivos PDF. Além disso, a API suporta a extração de dados de tabelas em arquivos PDF. Você pode instalar a API por meio do NuGet ou baixá-la diretamente da seção downloads.
PM> Install-Package Aspose.PDF.Cpp
Extrair dados de tabelas PDF usando C++
A seguir estão as etapas para extrair dados de tabelas PDF.
- Carregue o documento PDF usando a classe Document.
- Itere através das páginas do documento usando o método Document->getPages().
- Em cada iteração, crie uma instância da classe TableAbsorber e especifique a página para extrair tabelas usando o TableAbsorber->Visit(System::SharedPtr página) método.
- Obtenha as tabelas usando o método TableAbsorber->getTableList() e itere sobre elas.
- Para cada AbsorbedTable, itere pelas linhas usando o método AbsorbedTable->getRowList().
- Para cada AbsorbedRow, itere pelas células usando o método AbsorbedRow->getCellList().
- Obtenha TextFragmentCollection para cada AbsorbedCell usando o método AbsorbedCell->getTextFragments() e faça um loop por ele.
- Obtenha TextSegmentCollection para cada TextFragment usando o método TextFragment->getSegments() e faça um loop por ele.
- Recupere o texto de cada TextSegment e imprima-o.
O código de exemplo a seguir mostra como extrair dados de tabelas PDF usando C++.
// Carregar o documento PDF
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input3.pdf");
// Iterar pelas páginas do documento
for (auto page : pdfDocument->get_Pages())
{
// Crie uma instância da classe TableAbsorber
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// Iterar pelas tabelas
for (auto table : absorber->get_TableList())
{
Console::WriteLine(u"Table");
// Iterar pelas linhas
for (auto row : table->get_RowList())
{
// Iterar pelas células
for (auto cell : row->get_CellList())
{
// Iterar através dos fragmentos de texto
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// Iterar pelos segmentos de texto
for (auto seg : fragment->get_Segments())
{
// Obtenha o texto
string = String::Concat(string, seg->get_Text());
}
// Imprima o texto
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
Extrair dados de uma tabela em uma área específica de uma página PDF
Para extrair dados de uma tabela em uma área específica de uma página PDF, siga as etapas abaixo.
- Carregue o documento PDF usando a classe Document.
- Recupere a página que contém a tabela usando o método Document->getPages()->idxget(int32t index).
- Percorra as anotações e obtenha a anotação quadrada.
- Crie uma instância da classe TableAbsorber e especifique a página para extrair tabelas usando o TableAbsorber->Visit(System::SharedPtr página).
- Obtenha as tabelas usando o método TableAbsorber->getTableList() e itere sobre elas.
- Se a tabela estiver na região, execute as seguintes etapas:
- Itere pelas linhas da AbsorbedTable usando o método AbsorbedTable->getRowList().
- Para cada AbsorbedRow, itere pelas células usando o método AbsorbedRow->getCellList().
- Obtenha TextFragmentCollection para cada AbsorbedCell usando o método AbsorbedCell->getTextFragments() e faça um loop por ele.
- Obtenha TextSegmentCollection para cada TextFragment usando o método TextFragment->getSegments() e faça um loop por ele.
- Recupere o texto de cada TextSegment e imprima-o.
O código de exemplo a seguir demonstra como extrair dados de uma tabela em uma área específica de uma página PDF usando C++.
// Carregar o documento PDF
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input4.pdf");
// Obter a primeira página do documento
auto page = pdfDocument->get_Pages()->idx_get(1);
// Iterar pelas anotações na página
for (auto annotation : page->get_Annotations())
{
// Verifique o tipo de anotação
if (annotation->get_AnnotationType() == Annotations::AnnotationType::Square)
{
System::SharedPtr<SquareAnnotation> squareAnnotation = DynamicCast<SquareAnnotation>(annotation);
// Crie uma instância da classe TableAbsorber
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// Iterar pelas tabelas
for (auto table : absorber->get_TableList())
{
// Verifique se a mesa está na região
if ((squareAnnotation->get_Rect()->get_LLX() < table->get_Rectangle()->get_LLX()) &&
(squareAnnotation->get_Rect()->get_LLY() < table->get_Rectangle()->get_LLY()) &&
(squareAnnotation->get_Rect()->get_URX() > table->get_Rectangle()->get_URX()) &&
(squareAnnotation->get_Rect()->get_URY() > table->get_Rectangle()->get_URY())
)
{
// Iterar pelas linhas
for (auto row : table->get_RowList())
{
// Iterar pelas células
for (auto cell : row->get_CellList())
{
// Iterar através dos fragmentos de texto
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// Iterar pelos segmentos de texto
for (auto seg : fragment->get_Segments())
{
// Obtenha o texto
string = String::Concat(string, seg->get_Text());
}
// Imprima o texto
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
break;
}
}
Obtenha uma licença gratuita
Para experimentar a API sem limitações de avaliação, você pode solicitar uma licença temporária gratuita.
Conclusão
Neste artigo, você aprendeu como extrair dados de tabelas PDF usando C++. Além disso, você aprendeu como extrair dados de uma tabela em uma região específica da página do PDF. Aspose.PDF para C++ API fornece muitos recursos adicionais para trabalhar com arquivos PDF. Você pode explorar a API em detalhes visitando a documentação oficial. Em caso de dúvidas, sinta-se à vontade para entrar em contato conosco em nosso fórum de suporte gratuito.