From fd566cc558fa6e6ba406da41996331a0c6c30a05 Mon Sep 17 00:00:00 2001 From: "Jorj X. McKie" Date: Wed, 11 Jun 2025 11:11:52 -0400 Subject: [PATCH 1/5] Table Cell Markdown Support --- src/table.py | 130 +++++++++++++++++++++++++- tests/resources/test-styled-table.pdf | Bin 0 -> 74725 bytes tests/test_tables.py | 10 ++ 3 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 tests/resources/test-styled-table.pdf diff --git a/src/table.py b/src/table.py index 4d95ffe57..a2a34944a 100644 --- a/src/table.py +++ b/src/table.py @@ -89,18 +89,130 @@ Matrix, TEXTFLAGS_TEXT, TEXT_FONT_BOLD, + TEXT_FONT_ITALIC, + TEXT_FONT_MONOSPACED, TEXT_FONT_SUPERSCRIPT, + TEXT_COLLECT_STYLES, TOOLS, EMPTY_RECT, sRGB_to_pdf, Point, message, + mupdf, ) EDGES = [] # vector graphics from PyMuPDF CHARS = [] # text characters from PyMuPDF TEXTPAGE = None +TEXT_BOLD = mupdf.FZ_STEXT_BOLD +TEXT_STRIKEOUT = mupdf.FZ_STEXT_STRIKEOUT +FLAGS = TEXTFLAGS_TEXT | TEXT_COLLECT_STYLES + white_spaces = set(string.whitespace) # for checking white space only cells + + +def extract_cells(textpage, cell, markdown=False): + """Extract text from a rect-like 'cell' as plain or MD style text. + + This function should ultimately be used to extract text from a table cell. + Markdown output will only work correctly if extraction flag bit + TEXT_COLLECT_STYLES is set. + + Args: + textpage: A PyMuPDF TextPage object. Must have been created with + TEXTFLAGS_TEXT | TEXT_COLLECT_STYLES. + cell: A tuple (x0, y0, x1, y1) defining the cell's bbox. + markdown: If True, return text formatted for Markdown. + + Returns: + A string with the text extracted from the cell. + """ + text = "" + for block in textpage.extractRAWDICT()["blocks"]: + if block["type"] != 0: + continue + block_bbox = block["bbox"] + if ( + 0 + or block_bbox[0] > cell[2] + or block_bbox[2] < cell[0] + or block_bbox[1] > cell[3] + or block_bbox[3] < cell[1] + ): + continue # skip block outside cell + line_count = len(block["lines"]) + for line in block["lines"]: + lbbox = line["bbox"] + if ( + 0 + or lbbox[0] > cell[2] + or lbbox[2] < cell[0] + or lbbox[1] > cell[3] + or lbbox[3] < cell[1] + ): + continue # skip line outside cell + + if text: # must be a new line in the cell + text += "
" if markdown else "\n" + + # strikeout detection only works with horizontal text + horizontal = line["dir"] == (0, 1) or line["dir"] == (1, 0) + + for span in line["spans"]: + sbbox = span["bbox"] + if ( + 0 + or sbbox[0] > cell[2] + or sbbox[2] < cell[0] + or sbbox[1] > cell[3] + or sbbox[3] < cell[1] + ): + continue # skip spans outside cell + + # only include chars with more than 50% bbox overlap + span_text = "" + for char in span["chars"]: + bbox = Rect(char["bbox"]) + if abs(bbox & cell) > 0.5 * abs(bbox): + span_text += char["c"] + + if not span_text: + continue # skip empty span + + if not markdown: # no MD styling + text += span_text + continue + + prefix = "" + suffix = "" + if horizontal and span["char_flags"] & TEXT_STRIKEOUT: + prefix += "~~" + suffix = "~~" + suffix + if span["char_flags"] & TEXT_BOLD: + prefix += "**" + suffix = "**" + suffix + if span["flags"] & TEXT_FONT_ITALIC: + prefix += "_" + suffix = "_" + suffix + if span["flags"] & TEXT_FONT_MONOSPACED: + prefix += "`" + suffix = "`" + suffix + + if len(span["chars"]) > 2: + span_text = span_text.rstrip() + + # if span continues previous styling: extend cell text + if (ls := len(suffix)) and text.endswith(suffix): + text = text[:-ls] + span_text + suffix + else: # append the span with new styling + if not span_text.strip(): + text += " " + else: + text += prefix + span_text + suffix + + return text.strip() + + # ------------------------------------------------------------------- # End of PyMuPDF interface code # ------------------------------------------------------------------- @@ -1382,7 +1494,18 @@ def to_markdown(self, clean=False, fill_empty=True): output = "|" rows = self.row_count cols = self.col_count - cells = self.extract()[:] # make local copy of table text content + + # cell coordinates + cell_boxes = [[c for c in r.cells] for r in self.rows] + + # cell text strings + cells = [[None for i in range(cols)] for j in range(rows)] + for i, row in enumerate(cell_boxes): + for j, cell in enumerate(row): + if cell is not None: + cells[i][j] = extract_cells( + TEXTPAGE, cell_boxes[i][j], markdown=True + ) if fill_empty: # fill "None" cells where possible @@ -1420,7 +1543,8 @@ def to_markdown(self, clean=False, fill_empty=True): for i, cell in enumerate(row): # replace None cells with empty string # use HTML line break tag - cell = "" if not cell else cell.replace("\n", "
") + if cell is None: + cell = "" if clean: # remove sensitive syntax cell = html.escape(cell.replace("-", "-")) line += cell + "|" @@ -1944,7 +2068,7 @@ def make_chars(page, clip=None): page_number = page.number + 1 page_height = page.rect.height ctm = page.transformation_matrix - TEXTPAGE = page.get_textpage(clip=clip, flags=TEXTFLAGS_TEXT) + TEXTPAGE = page.get_textpage(clip=clip, flags=FLAGS) blocks = page.get_text("rawdict", textpage=TEXTPAGE)["blocks"] doctop_base = page_height * page.number for block in blocks: diff --git a/tests/resources/test-styled-table.pdf b/tests/resources/test-styled-table.pdf new file mode 100644 index 0000000000000000000000000000000000000000..67f7e8a49c5ddc161963921ad0003589965d9ac2 GIT binary patch literal 74725 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 W*NP5S~~Hier kommt Zeile 2.~~|Zelle (1,1)|~~Strikeout (1,2)~~|\n|**`Bold-monospaced`**
**`(2,0)`**|_Italic (2,1)_|**_Bold-italic_**
**_(2,2)_**|\n|Zelle (3,0)|~~**Bold-strikeout**~~
~~**(3,1)**~~|Zelle (3,2)|\n\n""" + assert tabs.to_markdown() == text From 50d978f776e88c2607b6be9e497cd61beb42e6c1 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Mon, 23 Jun 2025 14:42:35 +0100 Subject: [PATCH 2/5] tests/test_pylint.py: disable R1726: (simplifiable-condition) Causes unhelpful spurious test failures. --- tests/test_pylint.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_pylint.py b/tests/test_pylint.py index 0f0c40fa9..a3b48ae6f 100644 --- a/tests/test_pylint.py +++ b/tests/test_pylint.py @@ -37,6 +37,7 @@ def test_pylint(): W1309: Using an f-string that does not have any interpolated variables (f-string-without-interpolation) R1734: Consider using [] instead of list() (use-list-literal) R1727: Boolean condition '0 and g_exceptions_verbose' will always evaluate to '0' (condition-evals-to-constant) + R1726: (simplifiable-condition) ''' ) From 2ea78c1d25cedd048521ab4d18268ef54c0faba6 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Mon, 23 Jun 2025 14:44:03 +0100 Subject: [PATCH 3/5] src/table.py: removed variable setting that has no effect. --- src/table.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/table.py b/src/table.py index a2a34944a..3de8b2c86 100644 --- a/src/table.py +++ b/src/table.py @@ -140,7 +140,6 @@ def extract_cells(textpage, cell, markdown=False): or block_bbox[3] < cell[1] ): continue # skip block outside cell - line_count = len(block["lines"]) for line in block["lines"]: lbbox = line["bbox"] if ( From f871ceaec5ff7cfcb31d727e33614c3adb7e2e6d Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Thu, 26 Jun 2025 12:59:17 +0100 Subject: [PATCH 4/5] tests/conftest.py: also check that tests do not modify pymupdf._globals. This is causing obscure test failure of new test_md_styles(). --- tests/conftest.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 7e123435e..4017de580 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,4 @@ +import copy import os import platform import sys @@ -45,6 +46,17 @@ def get_fds(): JM_annot_id_stem = pymupdf.JM_annot_id_stem + def get_members(a): + ret = dict() + for n in dir(a): + if not n.startswith('_'): + v = getattr(a, n) + ret[n] = v + return ret + + # Allow post-test checking that pymupdf._globals has not changed. + _globals_pre = get_members(pymupdf._globals) + # Run the test. rep = yield @@ -59,6 +71,11 @@ def get_fds(): assert not pymupdf.TOOLS.set_small_glyph_heights() + _globals_post = get_members(pymupdf._globals) + if _globals_post != _globals_pre: + print(f'Test has changed pymupdf._globals from {_globals_pre=} to {_globals_post=}') + assert 0 + log_items = pymupdf._log_items() assert not log_items, f'log() was called; {len(log_items)=}.' @@ -84,3 +101,22 @@ def get_fds(): if next_fd_after != next_fd_before: print(f'Test has leaked fds, {next_fd_before=} {next_fd_after=}. {args=} {kwargs=}.') #assert 0, f'Test has leaked fds, {next_fd_before=} {next_fd_after=}. {args=} {kwargs=}.' + + if 0: + # This code can be useful to track down test failures caused by other + # tests modifying global state. + # + # We run a particular test menually after each test returns. + sys.path.insert(0, os.path.dirname(__file__)) + try: + import test_tables + finally: + del sys.path[0] + print(f'### Calling test_tables.test_md_styles().') + try: + test_tables.test_md_styles() + except Exception as e: + print(f'### test_tables.test_md_styles() failed: {e}') + raise + else: + print(f'### test_tables.test_md_styles() passed.') From 8456d74f83f86d3a6b7d272c0f2cce146887ae71 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Thu, 26 Jun 2025 13:00:18 +0100 Subject: [PATCH 5/5] tests/test_font.py:test_3677: don't modify global state. This was breaking new test_tables.test_md_styles() test. We now always restore state of by calling pymupdf.TOOLS.set_subset_fontnames(False). --- tests/test_font.py | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/tests/test_font.py b/tests/test_font.py index 4d5958cd9..d9f38f5d8 100644 --- a/tests/test_font.py +++ b/tests/test_font.py @@ -139,25 +139,28 @@ def test_mupdf_subset_fonts2(): def test_3677(): pymupdf.TOOLS.set_subset_fontnames(True) - path = os.path.abspath(f'{__file__}/../../tests/resources/test_3677.pdf') - font_names_expected = [ - 'BCDEEE+Aptos', - 'BCDFEE+Aptos', - 'BCDGEE+Calibri-Light', - 'BCDHEE+Calibri-Light', - ] - font_names = list() - with pymupdf.open(path) as document: - for page in document: - for block in page.get_text('dict')['blocks']: - if block['type'] == 0: - if 'lines' in block.keys(): - for line in block['lines']: - for span in line['spans']: - font_name=span['font'] - print(font_name) - font_names.append(font_name) - assert font_names == font_names_expected, f'{font_names=}' + try: + path = os.path.abspath(f'{__file__}/../../tests/resources/test_3677.pdf') + font_names_expected = [ + 'BCDEEE+Aptos', + 'BCDFEE+Aptos', + 'BCDGEE+Calibri-Light', + 'BCDHEE+Calibri-Light', + ] + font_names = list() + with pymupdf.open(path) as document: + for page in document: + for block in page.get_text('dict')['blocks']: + if block['type'] == 0: + if 'lines' in block.keys(): + for line in block['lines']: + for span in line['spans']: + font_name=span['font'] + print(font_name) + font_names.append(font_name) + assert font_names == font_names_expected, f'{font_names=}' + finally: + pymupdf.TOOLS.set_subset_fontnames(False) def test_3933():