From 53c346f43f11a1cc24c09acea714de3b32c03f80 Mon Sep 17 00:00:00 2001 From: Andrey Mikhailov Date: Tue, 29 Aug 2023 20:01:24 +0800 Subject: [PATCH] TLDR-440: Tabby pdf cell properties (#319) * Add BBoxAnnotation to TabbyPDF reader * Fix import and add test * Remove unused import * Add cell properties * Fix add CellPropertyInfo * Fix invisible property * Fix colspan and row_span * Add test for tables with merged cells * Add data to test merged cells * Add BBoxAnnotation to TabbyPDF reader (#312) * Add BBoxAnnotation to TabbyPDF reader * Fix import and add test * Remove unused import * TLDR-444 added words bbox pdfminer (#313) * TLDR-444 added word supporting into pdfminer-reader * TLDR-444 added word extraction from pdfminer; pdfminer refactoring * TLDR-444 added tests (word bounding box) * TLDR-444 fixed code style * TLDR-444 fixed after review * TLDR-437 plain_text return format added (#314) * Change base image name and tesseract benchmark script (#315) * Change base image name and tesseract benchmark script * Benchmarks updated * Added error hint * Small fix * Add BBoxAnnotation to TabbyPDF reader * Fix import and add test * Remove unused import * Add BBoxAnnotation to TabbyPDF reader (#312) * Add BBoxAnnotation to TabbyPDF reader * Fix import and add test * Remove unused import * Fix import and add test * Remove unused import * Add test for tables with merged cells * Fix flake8 warnings * Resolve comments Add assert --------- Co-authored-by: Oksana Belyaeva Co-authored-by: Bogatenkova Anastasiya --- .../pdf_txtlayer_reader/pdf_tabby_reader.py | 38 ++++++++++++++---- .../tabbypdf/jars/ispras_tbl_extr.jar | Bin 147027 -> 147308 bytes .../test_api_format_pdf_tabby_reader.py | 17 ++++++++ .../big_table_with_merged_cells.pdf | Bin 0 -> 7453 bytes 4 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 tests/data/pdf_with_text_layer/big_table_with_merged_cells.pdf diff --git a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py index 3492e1a7..e8438f03 100644 --- a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py +++ b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py @@ -3,6 +3,7 @@ import math import os import subprocess +from collections import namedtuple from typing import List, Optional, Tuple import numpy as np @@ -34,6 +35,8 @@ from dedoc.utils.parameter_utils import get_param_page_slice from dedoc.utils.utils import calculate_file_hash +CellPropertyInfo = namedtuple("NamedTuple", "colspan, rowspan, invisible") + class PdfTabbyReader(PdfBaseReader): """ @@ -77,7 +80,7 @@ def read(self, path: str, document_type: Optional[str] = None, parameters: Optio Look to the documentation of :meth:`~dedoc.readers.BaseReader.read` to get information about the method's parameters. """ parameters = {} if parameters is None else parameters - lines, scan_tables = self.__extract(path=path) + lines, scan_tables, tables_cell_properties = self.__extract(path=path) warnings = [] document_metadata = None @@ -94,10 +97,12 @@ def read(self, path: str, document_type: Optional[str] = None, parameters: Optio lines = self.linker.link_objects(lines=lines, tables=scan_tables, images=[]) tables = [] - for scan_table in scan_tables: + assert len(scan_tables) == len(tables_cell_properties) + for scan_table, table_cells_property in zip(scan_tables, tables_cell_properties): + cell_properties = [[cellp for cellp in row] for row in table_cells_property] metadata = TableMetadata(page_id=scan_table.page_number, uid=scan_table.name) cells = [[cell for cell in row] for row in scan_table.matrix_cells] - table = Table(metadata=metadata, cells=cells) + table = Table(metadata=metadata, cells=cells, cells_properties=cell_properties) tables.append(table) attachments = [] @@ -112,23 +117,26 @@ def read(self, path: str, document_type: Optional[str] = None, parameters: Optio return self._postprocess(result) - def __extract(self, path: str, start_page: int = None, end_page: int = None) -> Tuple[List[LineWithMeta], List[ScanTable]]: + def __extract(self, path: str, start_page: int = None, end_page: int = None) -> Tuple[List[LineWithMeta], List[ScanTable], List[List[CellPropertyInfo]]]: file_hash = calculate_file_hash(path=path) document = self.__process_pdf(path=path, start_page=start_page, end_page=end_page) all_lines = [] all_tables = [] + all_cell_properties = [] for page in document.get("pages", []): lines = self.__get_lines_with_location(page, file_hash) if lines: all_lines.extend(lines) - tables = self.__get_tables(page, file_hash) + tables, cell_properties = self.__get_tables(page, file_hash) if tables: all_tables.extend(tables) + all_cell_properties.extend(cell_properties) - return all_lines, all_tables + return all_lines, all_tables, all_cell_properties def __get_tables(self, page: dict, file_hash: str) -> List[ScanTable]: tables = [] + cell_properties = [] page_number = page["number"] i = 0 for table in page["tables"]: @@ -139,12 +147,28 @@ def __get_tables(self, page: dict, file_hash: str) -> List[ScanTable]: y_bottom_right = y_top_left + table["height"] order = table["order"] rows = table["rows"] + cell_properties_json = table["cell_properties"] + cell_property_list = [] + + for cell_properties_row in cell_properties_json: + cell_property_row_list = [] + + for cell_property in cell_properties_row: + cell_property_info = CellPropertyInfo(cell_property["col_span"], + cell_property["row_span"], + bool(cell_property["invisible"])) + + cell_property_row_list.append(cell_property_info) + + cell_property_list.append(cell_property_row_list) + cells = [row for row in rows] bbox = BBox.from_two_points((x_top_left, y_top_left), (x_bottom_right, y_bottom_right)) tables.append(ScanTable(matrix_cells=cells, page_number=page_number, bbox=bbox, name=file_hash + str(page_number) + str(i), order=order)) + cell_properties.append(cell_property_list) - return tables + return tables, cell_properties def __get_lines_with_location(self, page: dict, file_hash: str) -> List[LineWithLocation]: lines = [] diff --git a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/tabbypdf/jars/ispras_tbl_extr.jar b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/tabbypdf/jars/ispras_tbl_extr.jar index 7899e2323c5d24caa2cfaa75150438e6743429fd..b3d5eae847a17d6f8cf05a058f9d49c210288020 100644 GIT binary patch delta 25780 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Ν32kbdGmgDxp- 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 diff --git a/tests/api_tests/test_api_format_pdf_tabby_reader.py b/tests/api_tests/test_api_format_pdf_tabby_reader.py index d9d046e9..ad02ad61 100644 --- a/tests/api_tests/test_api_format_pdf_tabby_reader.py +++ b/tests/api_tests/test_api_format_pdf_tabby_reader.py @@ -280,3 +280,20 @@ def test_pdf_annotations(self) -> None: self.assertIn(BoldAnnotation.name, annotation_names) self.assertIn(SpacingAnnotation.name, annotation_names) self.assertIn(BBoxAnnotation.name, annotation_names) + + def test_tables_with_merged_cells(self) -> None: + file_name = "big_table_with_merged_cells.pdf" + result = self._send_request(file_name, data=dict(pdf_with_text_layer="tabby")) + table = result["content"]["tables"][0] + cell_properties = table["metadata"]["cell_properties"] + + hidden_cells_big_table_with_colspan = [[(1, 0), 10], [(5, 5), 5]] + + for (i, j), k in hidden_cells_big_table_with_colspan: + self.assertFalse(cell_properties[i][j]["invisible"]) + self.assertEqual(cell_properties[i][j]["rowspan"], 1) + self.assertEqual(cell_properties[i][j]["colspan"], k) + + self.assertFalse(cell_properties[3][0]["invisible"]) + self.assertEqual(cell_properties[3][0]["rowspan"], 3) + self.assertEqual(cell_properties[3][0]["colspan"], 4) diff --git a/tests/data/pdf_with_text_layer/big_table_with_merged_cells.pdf b/tests/data/pdf_with_text_layer/big_table_with_merged_cells.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c1298ab4b5c200dd5d283c1821a2abc9f6d433dd GIT binary patch literal 7453 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 Mf`o-N^ff{M1B1EUy8r+H literal 0 HcmV?d00001