Pliki PDF to standardowy format wymiany dokumentów przez Internet. Dokumenty, takie jak faktury i przewodniki po produktach, są zwykle udostępniane w formie plików PDF. Mogą wystąpić sytuacje, w których masz wiele faktur zawierających dane tabelaryczne, które musisz wyodrębnić i przetworzyć dalej. Programowe wyodrębnienie tych danych będzie bardziej wydajne. W tym celu w tym artykule dowiesz się, jak wyodrębnić dane z tabel PDF za pomocą C++.
- C++ API do wyodrębniania danych z tabel w plikach PDF
- Wyodrębnij dane z tabel PDF za pomocą C++
- Wyodrębnij dane z tabeli w określonym obszarze strony PDF
C++ API do wyodrębniania danych z tabel w plikach PDF
Aspose.PDF for C++ to biblioteka C++, która umożliwia tworzenie, odczytywanie i aktualizowanie plików PDF. Ponadto API obsługuje wyodrębnianie danych z tabel w plikach PDF. Możesz zainstalować API przez NuGet lub pobrać bezpośrednio z sekcji downloads.
PM> Install-Package Aspose.PDF.Cpp
Wyodrębnij dane z tabel PDF za pomocą C++
Poniżej przedstawiono kroki, aby wyodrębnić dane z tabel PDF.
- Załaduj dokument PDF za pomocą klasy Document.
- Przejrzyj strony dokumentu za pomocą metody Document->getPages().
- W każdej iteracji utwórz instancję klasy TableAbsorber i określ stronę do wyodrębniania tabel za pomocą TableAbsorber->Visit(System::SharedPtr strona) metoda.
- Pobierz tabele za pomocą metody TableAbsorber->getTableList() i wykonaj iterację.
- Dla każdej AbsorbedTable wykonaj iterację wierszy przy użyciu metody AbsorbedTable->getRowList().
- Dla każdego AbsorbedRow wykonaj iterację komórek przy użyciu metody AbsorbedRow->getCellList().
- Uzyskaj TextFragmentCollection dla każdej komórki AbsorbedCell za pomocą metody AbsorbedCell->getTextFragments() i przejdź przez nią.
- Pobierz TextSegmentCollection dla każdego TextFragment za pomocą metody TextFragment->getSegments() i przejdź przez nią.
- Pobierz tekst z każdego TextSegment i wydrukuj go.
Poniższy przykładowy kod pokazuje, jak wyodrębnić dane z tabel PDF przy użyciu języka C++.
// Załaduj dokument PDF
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input3.pdf");
// Iteruj przez strony dokumentu
for (auto page : pdfDocument->get_Pages())
{
// Utwórz instancję klasy TableAbsorber
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// Iteruj po tabelach
for (auto table : absorber->get_TableList())
{
Console::WriteLine(u"Table");
// Iteruj przez wiersze
for (auto row : table->get_RowList())
{
// Iteruj przez komórki
for (auto cell : row->get_CellList())
{
// Iteruj przez fragmenty tekstu
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// Iteruj przez segmenty tekstu
for (auto seg : fragment->get_Segments())
{
// Pobierz tekst
string = String::Concat(string, seg->get_Text());
}
// Wydrukuj tekst
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
Wyodrębnij dane z tabeli w określonym obszarze strony PDF
Aby wyodrębnić dane z tabeli w określonym obszarze strony PDF, wykonaj poniższe czynności.
- Załaduj dokument PDF za pomocą klasy Document.
- Pobierz stronę zawierającą tabelę za pomocą metody Document->getPages()->idxget(int32t index).
- Przejrzyj adnotacje i uzyskaj kwadratową adnotację.
- Utwórz instancję klasy TableAbsorber i określ stronę do wyodrębniania tabel przy użyciu metody TableAbsorber->Visit(System::SharedPtr strona) metoda.
- Pobierz tabele za pomocą metody TableAbsorber->getTableList() i wykonaj iterację.
- Jeśli tabela znajduje się w regionie, wykonaj następujące czynności:
- Przejrzyj wiersze tabeli AbsorbedTable za pomocą metody AbsorbedTable->getRowList().
- Dla każdego AbsorbedRow wykonaj iterację komórek przy użyciu metody AbsorbedRow->getCellList().
- Uzyskaj TextFragmentCollection dla każdej komórki AbsorbedCell za pomocą metody AbsorbedCell->getTextFragments() i przejdź przez nią.
- Uzyskaj TextSegmentCollection dla każdego TextFragment za pomocą metody TextFragment->getSegments() i przejdź przez nią.
- Pobierz tekst z każdego TextSegment i wydrukuj go.
Poniższy przykładowy kod ilustruje sposób wyodrębniania danych z tabeli w określonym obszarze strony PDF przy użyciu języka C++.
// Załaduj dokument PDF
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input4.pdf");
// Pobierz pierwszą stronę dokumentu
auto page = pdfDocument->get_Pages()->idx_get(1);
// Przejrzyj adnotacje na stronie
for (auto annotation : page->get_Annotations())
{
// Sprawdź typ adnotacji
if (annotation->get_AnnotationType() == Annotations::AnnotationType::Square)
{
System::SharedPtr<SquareAnnotation> squareAnnotation = DynamicCast<SquareAnnotation>(annotation);
// Utwórz instancję klasy TableAbsorber
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// Iteruj po tabelach
for (auto table : absorber->get_TableList())
{
// Sprawdź, czy tabela znajduje się w regionie
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())
)
{
// Iteruj przez wiersze
for (auto row : table->get_RowList())
{
// Iteruj przez komórki
for (auto cell : row->get_CellList())
{
// Iteruj przez fragmenty tekstu
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// Iteruj przez segmenty tekstu
for (auto seg : fragment->get_Segments())
{
// Pobierz tekst
string = String::Concat(string, seg->get_Text());
}
// Wydrukuj tekst
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
break;
}
}
Uzyskaj bezpłatną licencję
Aby wypróbować interfejs API bez ograniczeń ewaluacyjnych, możesz poprosić o bezpłatną licencję tymczasową.
Wniosek
W tym artykule nauczyłeś się, jak wyodrębniać dane z tabel PDF za pomocą C++. Ponadto nauczyłeś się, jak wyodrębniać dane z tabeli w określonym obszarze strony PDF. Aspose.PDF for C++ API zapewnia wiele dodatkowych funkcji do pracy z plikami PDF. Możesz szczegółowo zapoznać się z interfejsem API, odwiedzając oficjalną dokumentację. W przypadku jakichkolwiek pytań prosimy o kontakt z nami na naszym bezpłatnym forum pomocy technicznej.