From 02f92cef2905a9d05783f4cfbf90598e2e60236a Mon Sep 17 00:00:00 2001 From: Dante Calderon Date: Mon, 5 Dec 2022 21:04:16 -0500 Subject: [PATCH 1/8] Support open protected file --- py_pdf_parser/loaders.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/py_pdf_parser/loaders.py b/py_pdf_parser/loaders.py index b7352a4e..12ad5076 100644 --- a/py_pdf_parser/loaders.py +++ b/py_pdf_parser/loaders.py @@ -45,6 +45,7 @@ def load( pdf_file: IO, pdf_file_path: Optional[str] = None, la_params: Optional[Dict] = None, + password: str = None, **kwargs: Any, ) -> PDFDocument: """ @@ -69,7 +70,7 @@ def load( la_params = {**DEFAULT_LA_PARAMS, **la_params} pages: Dict[int, Page] = {} - for page in extract_pages(pdf_file, laparams=LAParams(**la_params)): + for page in extract_pages(pdf_file, laparams=LAParams(**la_params), password=password): elements = [element for element in page if isinstance(element, LTTextBox)] # If all_texts=True then we may get some text from inside figures From 44aab605e88d583968846c2c636fb75faca4c385 Mon Sep 17 00:00:00 2001 From: Dante Calderon Date: Mon, 5 Dec 2022 21:08:18 -0500 Subject: [PATCH 2/8] Add test for load protected file --- tests/data/pdfs/test_protected.pdf | Bin 0 -> 36560 bytes tests/test_loaders.py | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 tests/data/pdfs/test_protected.pdf diff --git a/tests/data/pdfs/test_protected.pdf b/tests/data/pdfs/test_protected.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cc80d0457302ffc8c5905a2a2bcc4fef2c873ba3 GIT binary patch literal 36560 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 literal 0 HcmV?d00001 diff --git a/tests/test_loaders.py b/tests/test_loaders.py index ef116a74..bc0c34fa 100644 --- a/tests/test_loaders.py +++ b/tests/test_loaders.py @@ -11,6 +11,11 @@ def test_load_file(self): document = load_file(file_path) self.assertIsInstance(document, PDFDocument) + def test_load_protected_file(self): + file_path = os.path.join(os.path.dirname(__file__), "data", "pdfs", "test_protected.pdf") + document = load_file(file_path) + self.assertIsInstance(document, PDFDocument) + def test_load(self): file_path = os.path.join(os.path.dirname(__file__), "data", "pdfs", "test.pdf") with open(file_path, "rb") as in_file: From 1b7fa23edfbac6d51ce7fa286bdc8707d391c831 Mon Sep 17 00:00:00 2001 From: Dante Calderon Date: Mon, 5 Dec 2022 21:10:21 -0500 Subject: [PATCH 3/8] Fix optional type format --- py_pdf_parser/loaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py_pdf_parser/loaders.py b/py_pdf_parser/loaders.py index 12ad5076..11cd7930 100644 --- a/py_pdf_parser/loaders.py +++ b/py_pdf_parser/loaders.py @@ -45,7 +45,7 @@ def load( pdf_file: IO, pdf_file_path: Optional[str] = None, la_params: Optional[Dict] = None, - password: str = None, + password: Optional[str] = None, **kwargs: Any, ) -> PDFDocument: """ From 715e319ed7488d267bcbd6d714678b41d39df720 Mon Sep 17 00:00:00 2001 From: Dante Calderon Date: Mon, 5 Dec 2022 21:14:45 -0500 Subject: [PATCH 4/8] Fix trailing whitespace --- tests/test_loaders.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_loaders.py b/tests/test_loaders.py index bc0c34fa..14917f25 100644 --- a/tests/test_loaders.py +++ b/tests/test_loaders.py @@ -13,8 +13,8 @@ def test_load_file(self): def test_load_protected_file(self): file_path = os.path.join(os.path.dirname(__file__), "data", "pdfs", "test_protected.pdf") - document = load_file(file_path) - self.assertIsInstance(document, PDFDocument) + document = load_file(file_path, password="p4ssword") + self.assertIsInstance(document, PDFDocument) def test_load(self): file_path = os.path.join(os.path.dirname(__file__), "data", "pdfs", "test.pdf") From 86840fb9afcb0ae738a82693716a726f1c99ebd2 Mon Sep 17 00:00:00 2001 From: Dante Calderon Date: Mon, 5 Dec 2022 21:24:03 -0500 Subject: [PATCH 5/8] Fix format --- py_pdf_parser/loaders.py | 4 +++- tests/test_loaders.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/py_pdf_parser/loaders.py b/py_pdf_parser/loaders.py index 11cd7930..0eb24bb8 100644 --- a/py_pdf_parser/loaders.py +++ b/py_pdf_parser/loaders.py @@ -70,7 +70,9 @@ def load( la_params = {**DEFAULT_LA_PARAMS, **la_params} pages: Dict[int, Page] = {} - for page in extract_pages(pdf_file, laparams=LAParams(**la_params), password=password): + for page in extract_pages( + pdf_file, laparams=LAParams(**la_params), password=password + ): elements = [element for element in page if isinstance(element, LTTextBox)] # If all_texts=True then we may get some text from inside figures diff --git a/tests/test_loaders.py b/tests/test_loaders.py index 14917f25..cab06cfd 100644 --- a/tests/test_loaders.py +++ b/tests/test_loaders.py @@ -12,7 +12,9 @@ def test_load_file(self): self.assertIsInstance(document, PDFDocument) def test_load_protected_file(self): - file_path = os.path.join(os.path.dirname(__file__), "data", "pdfs", "test_protected.pdf") + file_path = os.path.join( + os.path.dirname(__file__), "data", "pdfs", "test_protected.pdf" + ) document = load_file(file_path, password="p4ssword") self.assertIsInstance(document, PDFDocument) From b845c2979cec3389d0401964f40dfbd76bfc0a85 Mon Sep 17 00:00:00 2001 From: Dante Calderon Date: Mon, 5 Dec 2022 21:30:49 -0500 Subject: [PATCH 6/8] Should fail if password not passed --- tests/test_loaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_loaders.py b/tests/test_loaders.py index cab06cfd..b12ea419 100644 --- a/tests/test_loaders.py +++ b/tests/test_loaders.py @@ -15,7 +15,7 @@ def test_load_protected_file(self): file_path = os.path.join( os.path.dirname(__file__), "data", "pdfs", "test_protected.pdf" ) - document = load_file(file_path, password="p4ssword") + document = load_file(file_path) self.assertIsInstance(document, PDFDocument) def test_load(self): From febd712a0912cd1ae0633f250eaaaf33e083b76d Mon Sep 17 00:00:00 2001 From: Dante Calderon <18385321+dantehemerson@users.noreply.github.com> Date: Thu, 9 Nov 2023 19:47:58 -0500 Subject: [PATCH 7/8] Revert "Should fail if password not passed" This reverts commit 798c20f87469202603f534faba0e0280d173b036. --- tests/test_loaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_loaders.py b/tests/test_loaders.py index b12ea419..cab06cfd 100644 --- a/tests/test_loaders.py +++ b/tests/test_loaders.py @@ -15,7 +15,7 @@ def test_load_protected_file(self): file_path = os.path.join( os.path.dirname(__file__), "data", "pdfs", "test_protected.pdf" ) - document = load_file(file_path) + document = load_file(file_path, password="p4ssword") self.assertIsInstance(document, PDFDocument) def test_load(self): From 4fcca50e34c8bdd5869e0610d376aa6015bc89b1 Mon Sep 17 00:00:00 2001 From: Dante Calderon <18385321+dantehemerson@users.noreply.github.com> Date: Thu, 9 Nov 2023 20:37:37 -0500 Subject: [PATCH 8/8] Add test: test_load_protected_file_wrong_password --- py_pdf_parser/loaders.py | 8 +++++--- tests/test_loaders.py | 9 +++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/py_pdf_parser/loaders.py b/py_pdf_parser/loaders.py index 0eb24bb8..1449f5a4 100644 --- a/py_pdf_parser/loaders.py +++ b/py_pdf_parser/loaders.py @@ -44,8 +44,8 @@ def load_file( def load( pdf_file: IO, pdf_file_path: Optional[str] = None, - la_params: Optional[Dict] = None, password: Optional[str] = None, + la_params: Optional[Dict] = None, **kwargs: Any, ) -> PDFDocument: """ @@ -53,13 +53,15 @@ def load( Args: pdf_file (io): The PDF file. + pdf_file_path (str, optional): Passed to `PDFDocument`. See the documentation + for `PDFDocument`. + password (str, optional): Password for the encrypted PDF. Required if the + PDF is encrypted. la_params (dict): The layout parameters passed to PDF Miner for analysis. See the PDFMiner documentation here: https://pdfminersix.readthedocs.io/en/latest/reference/composable.html#laparams. Note that py_pdf_parser will re-order the elements it receives from PDFMiner so options relating to element ordering will have no effect. - pdf_file_path (str, optional): Passed to `PDFDocument`. See the documentation - for `PDFDocument`. kwargs: Passed to `PDFDocument`. See the documentation for `PDFDocument`. Returns: diff --git a/tests/test_loaders.py b/tests/test_loaders.py index cab06cfd..123f9436 100644 --- a/tests/test_loaders.py +++ b/tests/test_loaders.py @@ -1,6 +1,8 @@ import os from unittest import TestCase +from pdfminer.pdfdocument import PDFPasswordIncorrect + from py_pdf_parser.components import PDFDocument from py_pdf_parser.loaders import load, load_file @@ -18,6 +20,13 @@ def test_load_protected_file(self): document = load_file(file_path, password="p4ssword") self.assertIsInstance(document, PDFDocument) + def test_load_protected_file_wrong_password(self): + file_path = os.path.join( + os.path.dirname(__file__), "data", "pdfs", "test_protected.pdf" + ) + with self.assertRaises(PDFPasswordIncorrect): + load_file(file_path, password="wrong_password") + def test_load(self): file_path = os.path.join(os.path.dirname(__file__), "data", "pdfs", "test.pdf") with open(file_path, "rb") as in_file: