From 72ce8cabf030e8690a9a5e07fea7e31423bcfce5 Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Tue, 15 Jul 2025 13:07:17 -0400 Subject: [PATCH 01/11] wip: add tiered fallback for pdf --- .../_hooks/custom/pdf_utils.py | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/unstructured_client/_hooks/custom/pdf_utils.py b/src/unstructured_client/_hooks/custom/pdf_utils.py index 8fb5916a..60de40f8 100644 --- a/src/unstructured_client/_hooks/custom/pdf_utils.py +++ b/src/unstructured_client/_hooks/custom/pdf_utils.py @@ -4,6 +4,8 @@ import logging from typing import cast, Optional, BinaryIO, Union +from email.parser import BytesParser +from email.policy import default from pypdf import PdfReader from pypdf.errors import FileNotDecryptedError, PdfReadError @@ -26,6 +28,51 @@ def __init__(self, message: str): def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: + reader = read_pdf_raw(pdf_file=pdf_file) + if reader: + return reader + + # TODO(klaijan) - remove once debugged + print("reader is None") + + # load raw bytes + # case bytes + if isinstance(pdf_file, bytes): + raw = pdf_file + # case BinaryIO + elif hasattr(pdf_file, "read"): + try: + pdf_file.seek(0) + raw = pdf_file.read() + except Exception as e: + raise IOError(f"Failed to read file stream: {e}") + else: + raise TypeError("Expected bytes or a file-like object with 'read()' method") + + # multipart extraction + try: + msg = BytesParser(policy=default).parsebytes(raw) + for part in msg.walk(): + if part.get_content_type() == "application/pdf": + pdf_bytes = part.get_payload(decode=True) + _check_pdf_bytes(pdf_bytes) + except Exception: + # TODO(klaijan) + pass + + # look for %PDF- + try: + start = raw.find(b"%PDF-") + if start != -1: + sliced = raw[start:] + _check_pdf_bytes(sliced) + return PdfReader(io.BytesIO(sliced), strict=False) + except Exception: + # TODO(klaijan) + pass + + +def read_pdf_raw(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: """Reads the given PDF file. Args: @@ -73,3 +120,14 @@ def check_pdf(pdf: PdfReader) -> PdfReader: raise PDFValidationError( f"File does not appear to be a valid PDF. Error: {e}", ) from e + + +def _check_pdf_bytes(pdf_bytes) -> PdfReader: + try: + pdf = PdfReader(io.BytesIO(pdf_bytes), strict=True) + pdf.root_object + list(pdf.pages) + return pdf + except: + # TODO(klaijan) exception + pass \ No newline at end of file From 5c70d088a97f51c3c30f7283e80a3b05e973ec07 Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Tue, 15 Jul 2025 14:37:39 -0400 Subject: [PATCH 02/11] feat: tiered fallback with exception raised --- .../_hooks/custom/pdf_utils.py | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/unstructured_client/_hooks/custom/pdf_utils.py b/src/unstructured_client/_hooks/custom/pdf_utils.py index 60de40f8..70c14760 100644 --- a/src/unstructured_client/_hooks/custom/pdf_utils.py +++ b/src/unstructured_client/_hooks/custom/pdf_utils.py @@ -33,7 +33,7 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: return reader # TODO(klaijan) - remove once debugged - print("reader is None") + pdf_logger.debug("Initial PdfReader parsing failed, attempting fallbacks.") # load raw bytes # case bytes @@ -55,21 +55,27 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: for part in msg.walk(): if part.get_content_type() == "application/pdf": pdf_bytes = part.get_payload(decode=True) - _check_pdf_bytes(pdf_bytes) - except Exception: - # TODO(klaijan) - pass + if not isinstance(pdf_bytes, bytes): + continue + pdf_bytes = cast(bytes, pdf_bytes) + pdf = PdfReader(io.BytesIO(pdf_bytes), strict=False) + return check_pdf(pdf) + except Exception as e: + pdf_logger.debug(f"Multipart extraction failed: {e}") # look for %PDF- try: start = raw.find(b"%PDF-") if start != -1: sliced = raw[start:] - _check_pdf_bytes(sliced) - return PdfReader(io.BytesIO(sliced), strict=False) - except Exception: - # TODO(klaijan) - pass + pdf = PdfReader(io.BytesIO(sliced), strict=False) + return check_pdf(pdf) + except Exception as e: + pdf_logger.debug(f"%PDF- slicing fallback failed: {e}") + + raise PDFValidationError( + "File does not appear to be a valid PDF after all fallback attempts." + ) def read_pdf_raw(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: @@ -120,14 +126,3 @@ def check_pdf(pdf: PdfReader) -> PdfReader: raise PDFValidationError( f"File does not appear to be a valid PDF. Error: {e}", ) from e - - -def _check_pdf_bytes(pdf_bytes) -> PdfReader: - try: - pdf = PdfReader(io.BytesIO(pdf_bytes), strict=True) - pdf.root_object - list(pdf.pages) - return pdf - except: - # TODO(klaijan) exception - pass \ No newline at end of file From 0aaa38a0cd37a7436beb51399f9bbfb159cad2f1 Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Tue, 15 Jul 2025 14:40:13 -0400 Subject: [PATCH 03/11] nit --- src/unstructured_client/_hooks/custom/pdf_utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/unstructured_client/_hooks/custom/pdf_utils.py b/src/unstructured_client/_hooks/custom/pdf_utils.py index 70c14760..f247438a 100644 --- a/src/unstructured_client/_hooks/custom/pdf_utils.py +++ b/src/unstructured_client/_hooks/custom/pdf_utils.py @@ -33,9 +33,9 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: return reader # TODO(klaijan) - remove once debugged - pdf_logger.debug("Initial PdfReader parsing failed, attempting fallbacks.") + pdf_logger.debug("Primary PdfReader parse failed, attempting multipart and raw extraction fallbacks.") - # load raw bytes + # Load raw bytes # case bytes if isinstance(pdf_file, bytes): raw = pdf_file @@ -49,7 +49,7 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: else: raise TypeError("Expected bytes or a file-like object with 'read()' method") - # multipart extraction + # This looks for multipart extraction try: msg = BytesParser(policy=default).parsebytes(raw) for part in msg.walk(): @@ -63,7 +63,7 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: except Exception as e: pdf_logger.debug(f"Multipart extraction failed: {e}") - # look for %PDF- + # This looks for %PDF- try: start = raw.find(b"%PDF-") if start != -1: From a0e0f047292d763dacedf54fb3a1bb5ae12761f8 Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Tue, 15 Jul 2025 14:51:58 -0400 Subject: [PATCH 04/11] return None at read_pdf --- src/unstructured_client/_hooks/custom/pdf_utils.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/unstructured_client/_hooks/custom/pdf_utils.py b/src/unstructured_client/_hooks/custom/pdf_utils.py index f247438a..589ae32a 100644 --- a/src/unstructured_client/_hooks/custom/pdf_utils.py +++ b/src/unstructured_client/_hooks/custom/pdf_utils.py @@ -73,9 +73,7 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: except Exception as e: pdf_logger.debug(f"%PDF- slicing fallback failed: {e}") - raise PDFValidationError( - "File does not appear to be a valid PDF after all fallback attempts." - ) + return None def read_pdf_raw(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: From 58626a05900f5b78f30fb0a64b14fb6157e8ad73 Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Tue, 15 Jul 2025 22:39:23 -0400 Subject: [PATCH 05/11] update multipart --- src/unstructured_client/_hooks/custom/pdf_utils.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/unstructured_client/_hooks/custom/pdf_utils.py b/src/unstructured_client/_hooks/custom/pdf_utils.py index 589ae32a..645339dc 100644 --- a/src/unstructured_client/_hooks/custom/pdf_utils.py +++ b/src/unstructured_client/_hooks/custom/pdf_utils.py @@ -4,8 +4,9 @@ import logging from typing import cast, Optional, BinaryIO, Union +from email.message import Message from email.parser import BytesParser -from email.policy import default +from email.policy import (default, Policy) from pypdf import PdfReader from pypdf.errors import FileNotDecryptedError, PdfReadError @@ -45,23 +46,22 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: pdf_file.seek(0) raw = pdf_file.read() except Exception as e: - raise IOError(f"Failed to read file stream: {e}") + raise IOError(f"Failed to read file stream: {e}") from e else: - raise TypeError("Expected bytes or a file-like object with 'read()' method") + raise IOError("Expected bytes or a file-like object with 'read()' method") # This looks for multipart extraction try: - msg = BytesParser(policy=default).parsebytes(raw) + msg = BytesParser(policy=cast(Policy[Message], default)).parsebytes(raw) for part in msg.walk(): if part.get_content_type() == "application/pdf": pdf_bytes = part.get_payload(decode=True) if not isinstance(pdf_bytes, bytes): continue - pdf_bytes = cast(bytes, pdf_bytes) pdf = PdfReader(io.BytesIO(pdf_bytes), strict=False) return check_pdf(pdf) except Exception as e: - pdf_logger.debug(f"Multipart extraction failed: {e}") + pdf_logger.debug("Multipart extraction failed: %s", e) # This looks for %PDF- try: @@ -71,7 +71,7 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: pdf = PdfReader(io.BytesIO(sliced), strict=False) return check_pdf(pdf) except Exception as e: - pdf_logger.debug(f"%PDF- slicing fallback failed: {e}") + pdf_logger.debug("%%PDF- slicing fallback failed: %s", e) return None From 5deb5a7244ad68aff58eb1781001940ff8197a45 Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Tue, 15 Jul 2025 22:45:39 -0400 Subject: [PATCH 06/11] lint --- src/unstructured_client/_hooks/custom/pdf_utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/unstructured_client/_hooks/custom/pdf_utils.py b/src/unstructured_client/_hooks/custom/pdf_utils.py index 645339dc..42e8b010 100644 --- a/src/unstructured_client/_hooks/custom/pdf_utils.py +++ b/src/unstructured_client/_hooks/custom/pdf_utils.py @@ -4,7 +4,6 @@ import logging from typing import cast, Optional, BinaryIO, Union -from email.message import Message from email.parser import BytesParser from email.policy import (default, Policy) from pypdf import PdfReader @@ -52,7 +51,7 @@ def read_pdf(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: # This looks for multipart extraction try: - msg = BytesParser(policy=cast(Policy[Message], default)).parsebytes(raw) + msg = BytesParser(policy=cast(Policy, default)).parsebytes(raw) for part in msg.walk(): if part.get_content_type() == "application/pdf": pdf_bytes = part.get_payload(decode=True) From 96745f27ff77c0dec387000e17cbbef77fb1da81 Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Wed, 16 Jul 2025 16:56:32 -0400 Subject: [PATCH 07/11] wip: test --- _sample_docs/valid-multipart-wrapped.pdf | Bin 0 -> 47860 bytes .../unit/test_pdf_utils.py | 9 ++++++ .../_hooks/custom/pdf_utils.py | 30 ++++++++---------- 3 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 _sample_docs/valid-multipart-wrapped.pdf diff --git a/_sample_docs/valid-multipart-wrapped.pdf b/_sample_docs/valid-multipart-wrapped.pdf new file mode 100644 index 0000000000000000000000000000000000000000..775df3fe11c8c837737610e896a86cb308927d60 GIT binary patch literal 47860 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 Optional[PdfReader]: else: raise IOError("Expected bytes or a file-like object with 'read()' method") - # This looks for multipart extraction - try: - msg = BytesParser(policy=cast(Policy, default)).parsebytes(raw) - for part in msg.walk(): - if part.get_content_type() == "application/pdf": - pdf_bytes = part.get_payload(decode=True) - if not isinstance(pdf_bytes, bytes): - continue - pdf = PdfReader(io.BytesIO(pdf_bytes), strict=False) - return check_pdf(pdf) - except Exception as e: - pdf_logger.debug("Multipart extraction failed: %s", e) - + # breakpoint() # This looks for %PDF- try: start = raw.find(b"%PDF-") + end = raw.find(b"%%EOF") + len(b"%%EOF") if start != -1: - sliced = raw[start:] + sliced = raw[start:end] pdf = PdfReader(io.BytesIO(sliced), strict=False) return check_pdf(pdf) except Exception as e: @@ -84,13 +73,20 @@ def read_pdf_raw(pdf_file: Union[BinaryIO, bytes]) -> Optional[PdfReader]: Returns: The PdfReader object if the file is a PDF, None otherwise. """ - try: if isinstance(pdf_file, bytes): content = cast(bytes, pdf_file) pdf_file = io.BytesIO(content) - return PdfReader(pdf_file, strict=False) - except (PdfReadError, UnicodeDecodeError): + reader = PdfReader(pdf_file, strict=False) + return check_pdf(reader) + except (PdfReadError, UnicodeDecodeError) as e: + pdf_logger.debug("Read pdf failed: %s", e) + return None + except PDFValidationError as e: + pdf_logger.debug("Check pdf failed: %s", e) + return None + except Exception as e: + pdf_logger.debug("An unexpected error occurred: %s", e) return None From 4c5bdf8447d567ae059df31abee3a95513fd80ba Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Thu, 17 Jul 2025 11:49:09 -0400 Subject: [PATCH 08/11] test --- _sample_docs/valid-multipart-wrapped.pdf | Bin 47860 -> 0 bytes .../unit/test_pdf_utils.py | 30 ++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) delete mode 100644 _sample_docs/valid-multipart-wrapped.pdf diff --git a/_sample_docs/valid-multipart-wrapped.pdf b/_sample_docs/valid-multipart-wrapped.pdf deleted file mode 100644 index 775df3fe11c8c837737610e896a86cb308927d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47860 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 Date: Thu, 17 Jul 2025 11:53:56 -0400 Subject: [PATCH 09/11] lint --- src/unstructured_client/_hooks/custom/pdf_utils.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/unstructured_client/_hooks/custom/pdf_utils.py b/src/unstructured_client/_hooks/custom/pdf_utils.py index b39b6c0e..66fe9473 100644 --- a/src/unstructured_client/_hooks/custom/pdf_utils.py +++ b/src/unstructured_client/_hooks/custom/pdf_utils.py @@ -4,8 +4,6 @@ import logging from typing import cast, Optional, BinaryIO, Union -from email.parser import BytesParser -from email.policy import (default, Policy) from pypdf import PdfReader from pypdf.errors import FileNotDecryptedError, PdfReadError From 9e9de913ad089c1988b54945d7153332897e3baf Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Thu, 17 Jul 2025 12:00:13 -0400 Subject: [PATCH 10/11] trigger ci From c88cbc3bddd112423d68b97a15e744e57765ddb5 Mon Sep 17 00:00:00 2001 From: Klaijan Sinteppadon Date: Thu, 17 Jul 2025 12:03:25 -0400 Subject: [PATCH 11/11] fix test --- _test_unstructured_client/unit/test_pdf_utils.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/_test_unstructured_client/unit/test_pdf_utils.py b/_test_unstructured_client/unit/test_pdf_utils.py index 837e214f..7f78ffac 100644 --- a/_test_unstructured_client/unit/test_pdf_utils.py +++ b/_test_unstructured_client/unit/test_pdf_utils.py @@ -23,6 +23,7 @@ def test_check_pdf_with_valid_pdf(): assert isinstance(result, PdfReader) +# TODO(klaijan) - add pdf file when file is ready @pytest.mark.parametrize( ("pdf_name", "expected_error_message"), [ @@ -38,13 +39,6 @@ def test_check_pdf_with_valid_pdf(): "failing-missing-pages.pdf", "File does not appear to be a valid PDF. Error: Invalid object in /Pages", ), - # TODO(klaijan) - add pdf file when file is ready - """ - ( - ".pdf", - "File does not appear to be a valid PDF. Error: Cannot find Root object in pdf" - ) - """ ], ) def test_check_pdf_raises_pdf_validation_error(