From ec403e245c06384b092db852dcb78d8c8aafc247 Mon Sep 17 00:00:00 2001 From: Angus Sinclair <108497+arms3@users.noreply.github.com> Date: Thu, 15 Jun 2023 12:52:44 -0700 Subject: [PATCH] fix malformed pptx issue (#761) * fix malformed pptx issue Added a new test to check for the ability to partition a malformed PowerPoint file. Modified the `partition_pptx` function to skip processing shapes that are not on the actual slide, but only if they have top and left positions. Also modified `_order_shapes` function to handle cases where shapes do not have top or left positions. * update changelog * fix lint issue SIM102 nested ifs * fix black linting --- CHANGELOG.md | 2 ++ example-docs/fake-power-point-malformed.pptx | Bin 0 -> 37138 bytes test_unstructured/partition/test_pptx.py | 8 ++++++++ unstructured/partition/pptx.py | 5 +++-- 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 example-docs/fake-power-point-malformed.pptx diff --git a/CHANGELOG.md b/CHANGELOG.md index bd419c2fb..5653fd1a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ * Page number defaults to `None` instead of `1` when page number is not present in the metadata. A page number of `None` indicates that page numbers are not being tracked for the document or that page numbers do not apply to the element in question.. +* Fixes an issue with some pptx files. Assume pptx shapes are found in top left position of slide + in case the shape.top and shape.left attributes are `None`. ## 0.7.5 diff --git a/example-docs/fake-power-point-malformed.pptx b/example-docs/fake-power-point-malformed.pptx new file mode 100644 index 0000000000000000000000000000000000000000..ef9e943b697d63669fde90763bb6663ee996809a GIT binary patch literal 37138 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 Ra!cS39`JFn68PiY{{tE=XdM6m literal 0 HcmV?d00001 diff --git a/test_unstructured/partition/test_pptx.py b/test_unstructured/partition/test_pptx.py index d62f4480b..445b65356 100644 --- a/test_unstructured/partition/test_pptx.py +++ b/test_unstructured/partition/test_pptx.py @@ -190,3 +190,11 @@ def test_partition_pptx_many_pages(): # The page_number of PageBreak is None assert set(filter(None, (elt.metadata.page_number for elt in elements))) == {1, 2} + + +def test_partition_pptx_malformed(): + filename = os.path.join(EXAMPLE_DOCS_DIRECTORY, "fake-power-point-malformed.pptx") + elements = partition_pptx(filename=filename) + + assert elements[0].text == "Problem Date Placeholder" + assert elements[1].text == "Test Slide" diff --git a/unstructured/partition/pptx.py b/unstructured/partition/pptx.py index 9160351ef..aaa781ef6 100644 --- a/unstructured/partition/pptx.py +++ b/unstructured/partition/pptx.py @@ -84,7 +84,8 @@ def partition_pptx( if not shape.has_text_frame: continue # NOTE(robinson) - avoid processing shapes that are not on the actual slide - if shape.top < 0 or shape.left < 0: + # NOTE - skip check if no top or left position (shape displayed top left) + if (shape.top and shape.left) and (shape.top < 0 or shape.left < 0): continue for paragraph in shape.text_frame.paragraphs: text = paragraph.text @@ -107,7 +108,7 @@ def partition_pptx( def _order_shapes(shapes): """Orders the shapes from top to bottom and left to right.""" - return sorted(shapes, key=lambda x: (x.top, x.left)) + return sorted(shapes, key=lambda x: (x.top or 0, x.left or 0)) def _is_bulleted_paragraph(paragraph) -> bool: