From aa01cdfc7ad495aa8f537cd11ed833284186b282 Mon Sep 17 00:00:00 2001 From: Matt Robinson Date: Wed, 3 May 2023 18:33:24 -0400 Subject: [PATCH] fix: group together text from the same bounding box in `partition_pdf` with fast strategy (#542) * switch to using PDF objects * linting, linting, linting * couple more tweaks * added test for chevron-page * version and changelog * linting, linting, linting * now processing 4 files --- CHANGELOG.md | 5 +- example-docs/chevron-page.pdf | Bin 0 -> 910813 bytes test_unstructured/partition/test_pdf.py | 15 ++++++ .../test-ingest-against-api.sh | 4 +- unstructured/__version__.py | 2 +- unstructured/partition/pdf.py | 47 +++++++++--------- 6 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 example-docs/chevron-page.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index e199c99c6..bef0a33c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.6.3-dev0 +## 0.6.3-dev1 ### Enhancements @@ -10,6 +10,9 @@ ### Fixes +* Updates the grouping logic in the `partition_pdf` fast strategy to group together text + in the same bounding box. + ## 0.6.2 diff --git a/example-docs/chevron-page.pdf b/example-docs/chevron-page.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a53aa23565b2cf23c1f7812e0e7f6427cef7411c GIT binary patch literal 910813 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