Tệp PDF là định dạng tiêu chuẩn để trao đổi tài liệu qua internet. Các tài liệu như hóa đơn và hướng dẫn sản phẩm thường được chia sẻ dưới dạng PDF. Có thể có những trường hợp bạn có nhiều hóa đơn chứa dữ liệu dạng bảng mà bạn cần trích xuất và xử lý thêm. Sẽ hiệu quả hơn khi trích xuất dữ liệu này theo chương trình. Để kết thúc, bài viết này sẽ hướng dẫn bạn cách trích xuất dữ liệu từ bảng PDF bằng C ++.
- API C ++ để trích xuất dữ liệu từ bảng trong tệp PDF
- Trích xuất dữ liệu từ bảng PDF bằng C ++
- Trích xuất dữ liệu từ một bảng trong một khu vực cụ thể của trang PDF
API C ++ để trích xuất dữ liệu từ bảng trong tệp PDF
Aspose.PDF dành cho C ++ là thư viện C ++ cho phép bạn tạo, đọc và cập nhật các tệp PDF. Hơn nữa, API hỗ trợ trích xuất dữ liệu từ các bảng trong tệp PDF. Bạn có thể cài đặt API thông qua NuGet hoặc tải xuống trực tiếp từ phần tải xuống.
PM> Install-Package Aspose.PDF.Cpp
Trích xuất dữ liệu từ bảng PDF bằng C ++
Sau đây là các bước để trích xuất dữ liệu từ bảng PDF.
- Tải tài liệu PDF bằng lớp Tài liệu.
- Lặp lại các trang của tài liệu bằng phương thức Document-> getPages().
- Trong mỗi lần lặp, hãy tạo một phiên bản của lớp TableAbsorber và chỉ định trang để trích xuất bảng bằng cách sử dụng TableAbsorber-> Visit (System :: SharedPtr trang) phương pháp.
- Lấy các bảng bằng phương thức TableAbsorber-> getTableList() và lặp lại chúng.
- Đối với mỗi AbsorbedTable, hãy lặp lại các hàng bằng phương thức AbsorbedTable-> getRowList().
- Đối với mỗi AbsorbedRow, hãy lặp lại qua các ô bằng phương thức AbsorbedRow-> getCellList().
- Nhận TextFragmentCollection cho mỗi AbsorbedCell bằng cách sử dụng phương thức AbsorbedCell-> getTextFragment() và lặp qua nó.
- Nhận TextSegmentCollection cho mỗi TextFragment bằng cách sử dụng phương thức TextFragment-> getSegment() và lặp qua nó.
- Lấy văn bản từ mỗi TextSegment và in nó.
Đoạn mã mẫu sau đây cho thấy cách trích xuất dữ liệu từ bảng PDF bằng C ++.
// Tải tài liệu PDF
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input3.pdf");
// Lặp lại các trang của tài liệu
for (auto page : pdfDocument->get_Pages())
{
// Tạo một phiên bản của lớp TableAbsorber
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// Lặp lại các bảng
for (auto table : absorber->get_TableList())
{
Console::WriteLine(u"Table");
// Lặp lại qua các hàng
for (auto row : table->get_RowList())
{
// Lặp lại qua các ô
for (auto cell : row->get_CellList())
{
// Lặp lại các đoạn văn bản
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// Lặp lại các đoạn văn bản
for (auto seg : fragment->get_Segments())
{
// Nhận văn bản
string = String::Concat(string, seg->get_Text());
}
// In văn bản
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
Trích xuất dữ liệu từ một bảng trong một khu vực cụ thể của trang PDF
Để trích xuất dữ liệu từ một bảng trong một khu vực cụ thể của trang PDF, vui lòng thực hiện theo các bước dưới đây.
- Tải tài liệu PDF bằng lớp Tài liệu.
- Truy xuất trang chứa bảng bằng phương thức Document-> getPages() -> idxget (int32t index).
- Lặp lại các chú thích và nhận chú thích hình vuông.
- Tạo một phiên bản của lớp TableAbsorber và chỉ định trang để trích xuất bảng bằng cách sử dụng TableAbsorber-> Visit (System :: SharedPtr trang) phương pháp.
- Lấy các bảng bằng phương thức TableAbsorber-> getTableList() và lặp lại chúng.
- Nếu bảng nằm trong vùng, hãy thực hiện các bước sau:
- Lặp lại qua các hàng của AbsorbedTable bằng phương thức AbsorbedTable-> getRowList().
- Đối với mỗi AbsorbedRow, hãy lặp lại qua các ô bằng phương thức AbsorbedRow-> getCellList().
- Nhận TextFragmentCollection cho mỗi AbsorbedCell bằng cách sử dụng phương thức AbsorbedCell-> getTextFragment() và lặp qua nó.
- Nhận TextSegmentCollection cho mỗi TextFragment bằng cách sử dụng phương thức TextFragment-> getSegment() và lặp qua nó.
- Lấy văn bản từ mỗi TextSegment và in nó.
Đoạn mã mẫu sau đây trình bày cách trích xuất dữ liệu từ một bảng trong một khu vực cụ thể của trang PDF bằng C ++.
// Tải tài liệu PDF
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input4.pdf");
// Lấy trang đầu tiên của tài liệu
auto page = pdfDocument->get_Pages()->idx_get(1);
// Lặp lại các chú thích trên trang
for (auto annotation : page->get_Annotations())
{
// Kiểm tra loại chú thích
if (annotation->get_AnnotationType() == Annotations::AnnotationType::Square)
{
System::SharedPtr<SquareAnnotation> squareAnnotation = DynamicCast<SquareAnnotation>(annotation);
// Tạo một phiên bản của lớp TableAbsorber
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// Lặp lại các bảng
for (auto table : absorber->get_TableList())
{
// Kiểm tra xem bảng có nằm trong khu vực không
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())
)
{
// Lặp lại qua các hàng
for (auto row : table->get_RowList())
{
// Lặp lại qua các ô
for (auto cell : row->get_CellList())
{
// Lặp lại qua các đoạn văn bản
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// Lặp lại các đoạn văn bản
for (auto seg : fragment->get_Segments())
{
// Nhận văn bản
string = String::Concat(string, seg->get_Text());
}
// In văn bản
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
break;
}
}
Nhận giấy phép miễn phí
Để dùng thử API mà không có giới hạn đánh giá, bạn có thể yêu cầu giấy phép tạm thời miễn phí.
Sự kết luận
Trong bài này, bạn đã học cách trích xuất dữ liệu từ bảng PDF bằng C ++. Hơn nữa, bạn đã học cách trích xuất dữ liệu từ một bảng trong một vùng cụ thể của trang PDF. API Aspose.PDF cho C ++ cung cấp nhiều tính năng bổ sung để làm việc với các tệp PDF. Bạn có thể khám phá API chi tiết bằng cách truy cập tài liệu chính thức. Trong trường hợp có bất kỳ câu hỏi nào, vui lòng liên hệ với chúng tôi trên diễn đàn hỗ trợ miễn phí của chúng tôi.