From f28d23cf03d059619d1d3482594596ab7c87d197 Mon Sep 17 00:00:00 2001 From: Martin Wind Date: Mon, 16 Jun 2025 10:44:30 +0200 Subject: [PATCH] fix: pptx line break and space handling (#1664) Signed-off-by: Martin Wind --- docling/backend/mspowerpoint_backend.py | 160 +++++++----------- .../docling_v2/powerpoint_bad_text.pptx.itxt | 3 + .../docling_v2/powerpoint_bad_text.pptx.json | 86 ++++++++++ .../docling_v2/powerpoint_bad_text.pptx.md | 1 + tests/data/pptx/powerpoint_bad_text.pptx | Bin 0 -> 35632 bytes 5 files changed, 148 insertions(+), 102 deletions(-) create mode 100644 tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.itxt create mode 100644 tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.json create mode 100644 tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.md create mode 100644 tests/data/pptx/powerpoint_bad_text.pptx diff --git a/docling/backend/mspowerpoint_backend.py b/docling/backend/mspowerpoint_backend.py index 5091b0c..63aa9e9 100644 --- a/docling/backend/mspowerpoint_backend.py +++ b/docling/backend/mspowerpoint_backend.py @@ -20,6 +20,7 @@ from docling_core.types.doc.document import ContentLayer from PIL import Image, UnidentifiedImageError from pptx import Presentation from pptx.enum.shapes import MSO_SHAPE_TYPE, PP_PLACEHOLDER +from pptx.oxml.text import CT_TextLineBreak from docling.backend.abstract_backend import ( DeclarativeDocumentBackend, @@ -120,136 +121,91 @@ class MsPowerpointDocumentBackend(DeclarativeDocumentBackend, PaginatedDocumentB return prov - def handle_text_elements(self, shape, parent_slide, slide_ind, doc, slide_size): # noqa: C901 - is_a_list = False + def handle_text_elements(self, shape, parent_slide, slide_ind, doc, slide_size): is_list_group_created = False enum_list_item_value = 0 new_list = None - bullet_type = "None" - list_label = GroupLabel.LIST doc_label = DocItemLabel.LIST_ITEM prov = self.generate_prov(shape, slide_ind, shape.text.strip(), slide_size) - # Identify if shape contains lists - for paragraph in shape.text_frame.paragraphs: - # Check if paragraph is a bullet point using the `element` XML + def is_list_item(paragraph): + """Check if the paragraph is a list item.""" p = paragraph._element if ( p.find(".//a:buChar", namespaces={"a": self.namespaces["a"]}) is not None ): - bullet_type = "Bullet" - is_a_list = True + return (True, "Bullet") elif ( p.find(".//a:buAutoNum", namespaces={"a": self.namespaces["a"]}) is not None ): - bullet_type = "Numbered" - is_a_list = True - else: - is_a_list = False - - if paragraph.level > 0: + return (True, "Numbered") + elif paragraph.level > 0: # Most likely a sub-list - is_a_list = True - - if is_a_list: - # Determine if this is an unordered list or an ordered list. - # Set GroupLabel.ORDERED_LIST when it fits. - if bullet_type == "Numbered": - list_label = GroupLabel.ORDERED_LIST - - if is_a_list: - _log.debug("LIST DETECTED!") + return (True, "None") else: - _log.debug("No List") - - # If there is a list inside of the shape, create a new docling list to assign list items to - # if is_a_list: - # new_list = doc.add_group( - # label=list_label, name=f"list", parent=parent_slide - # ) + return (False, "None") # Iterate through paragraphs to build up text for paragraph in shape.text_frame.paragraphs: - # p_text = paragraph.text.strip() + is_a_list, bullet_type = is_list_item(paragraph) p = paragraph._element - enum_list_item_value += 1 - inline_paragraph_text = "" - inline_list_item_text = "" - for e in p.iterfind(".//a:r", namespaces={"a": self.namespaces["a"]}): - if len(e.text.strip()) > 0: - e_is_a_list_item = False - is_numbered = False - if ( - p.find(".//a:buChar", namespaces={"a": self.namespaces["a"]}) - is not None - ): - bullet_type = "Bullet" - e_is_a_list_item = True - elif ( - p.find(".//a:buAutoNum", namespaces={"a": self.namespaces["a"]}) - is not None - ): - bullet_type = "Numbered" - is_numbered = True - e_is_a_list_item = True - else: - e_is_a_list_item = False + # Convert line breaks to spaces and accumulate text + p_text = "" + for e in p.content_children: + if isinstance(e, CT_TextLineBreak): + p_text += " " + else: + p_text += e.text - if e_is_a_list_item: - if len(inline_paragraph_text) > 0: - # output accumulated inline text: - doc.add_text( - label=doc_label, - parent=parent_slide, - text=inline_paragraph_text, - prov=prov, - ) - # Set marker and enumerated arguments if this is an enumeration element. - inline_list_item_text += e.text - # print(e.text) - else: - # Assign proper label to the text, depending if it's a Title or Section Header - # For other types of text, assign - PARAGRAPH - doc_label = DocItemLabel.PARAGRAPH - if shape.is_placeholder: - placeholder_type = shape.placeholder_format.type - if placeholder_type in [ - PP_PLACEHOLDER.CENTER_TITLE, - PP_PLACEHOLDER.TITLE, - ]: - # It's a title - doc_label = DocItemLabel.TITLE - elif placeholder_type == PP_PLACEHOLDER.SUBTITLE: - DocItemLabel.SECTION_HEADER - enum_list_item_value = 0 - inline_paragraph_text += e.text + if is_a_list: + enum_marker = "" + enumerated = bullet_type == "Numbered" + + if not is_list_group_created: + new_list = doc.add_group( + label=GroupLabel.ORDERED_LIST + if enumerated + else GroupLabel.LIST, + name="list", + parent=parent_slide, + ) + is_list_group_created = True + enum_list_item_value = 0 + + if enumerated: + enum_list_item_value += 1 + enum_marker = str(enum_list_item_value) + "." + + doc.add_list_item( + marker=enum_marker, + enumerated=enumerated, + parent=new_list, + text=p_text, + prov=prov, + ) + else: # is paragraph not a list item + # Assign proper label to the text, depending if it's a Title or Section Header + # For other types of text, assign - PARAGRAPH + doc_label = DocItemLabel.PARAGRAPH + if shape.is_placeholder: + placeholder_type = shape.placeholder_format.type + if placeholder_type in [ + PP_PLACEHOLDER.CENTER_TITLE, + PP_PLACEHOLDER.TITLE, + ]: + # It's a title + doc_label = DocItemLabel.TITLE + elif placeholder_type == PP_PLACEHOLDER.SUBTITLE: + DocItemLabel.SECTION_HEADER - if len(inline_paragraph_text) > 0: # output accumulated inline text: doc.add_text( label=doc_label, parent=parent_slide, - text=inline_paragraph_text, - prov=prov, - ) - - if len(inline_list_item_text) > 0: - enum_marker = "" - if is_numbered: - enum_marker = str(enum_list_item_value) + "." - if not is_list_group_created: - new_list = doc.add_group( - label=list_label, name="list", parent=parent_slide - ) - is_list_group_created = True - doc.add_list_item( - marker=enum_marker, - enumerated=is_numbered, - parent=new_list, - text=inline_list_item_text, + text=p_text, prov=prov, ) return diff --git a/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.itxt b/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.itxt new file mode 100644 index 0000000..eea064d --- /dev/null +++ b/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.itxt @@ -0,0 +1,3 @@ +item-0 at level 0: unspecified: group _root_ + item-1 at level 1: chapter: group slide-0 + item-2 at level 2: title: X-Library The fully customisable ... llection exclusively for our customers \ No newline at end of file diff --git a/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.json b/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.json new file mode 100644 index 0000000..d94bfb7 --- /dev/null +++ b/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.json @@ -0,0 +1,86 @@ +{ + "schema_name": "DoclingDocument", + "version": "1.3.0", + "name": "powerpoint_bad_text", + "origin": { + "mimetype": "application/vnd.ms-powerpoint", + "binary_hash": 1443005848482130016, + "filename": "powerpoint_bad_text.pptx" + }, + "furniture": { + "self_ref": "#/furniture", + "children": [], + "content_layer": "furniture", + "name": "_root_", + "label": "unspecified" + }, + "body": { + "self_ref": "#/body", + "children": [ + { + "$ref": "#/groups/0" + } + ], + "content_layer": "body", + "name": "_root_", + "label": "unspecified" + }, + "groups": [ + { + "self_ref": "#/groups/0", + "parent": { + "$ref": "#/body" + }, + "children": [ + { + "$ref": "#/texts/0" + } + ], + "content_layer": "body", + "name": "slide-0", + "label": "chapter" + } + ], + "texts": [ + { + "self_ref": "#/texts/0", + "parent": { + "$ref": "#/groups/0" + }, + "children": [], + "content_layer": "body", + "label": "title", + "prov": [ + { + "page_no": 1, + "bbox": { + "l": 1041400.0, + "t": 4582390.0, + "r": 8083550.0, + "b": 1689099.0, + "coord_origin": "BOTTOMLEFT" + }, + "charspan": [ + 0, + 118 + ] + } + ], + "orig": "X-Library The fully customisable and copyright-free standard content template collection exclusively for our customers", + "text": "X-Library The fully customisable and copyright-free standard content template collection exclusively for our customers" + } + ], + "pictures": [], + "tables": [], + "key_value_items": [], + "form_items": [], + "pages": { + "1": { + "size": { + "width": 12190413.0, + "height": 6858000.0 + }, + "page_no": 1 + } + } +} \ No newline at end of file diff --git a/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.md b/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.md new file mode 100644 index 0000000..66c0c3d --- /dev/null +++ b/tests/data/groundtruth/docling_v2/powerpoint_bad_text.pptx.md @@ -0,0 +1 @@ +# X-Library The fully customisable and copyright-free standard content template collection exclusively for our customers \ No newline at end of file diff --git a/tests/data/pptx/powerpoint_bad_text.pptx b/tests/data/pptx/powerpoint_bad_text.pptx new file mode 100644 index 0000000000000000000000000000000000000000..c0a7c6063848e4ec8d4350680cc6b31b3fb488bf GIT binary patch literal 35632 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 literal 0 HcmV?d00001