From a70f08818d41436348ff187fae5fcb0fe222e75e Mon Sep 17 00:00:00 2001 From: Richard Millson <8217613+richardmillson@users.noreply.github.com> Date: Sun, 29 Aug 2021 15:32:14 -0400 Subject: [PATCH] Fix 594 use null id when encrypted but no id given (#595) Co-authored-by: Pieter Marsman --- CHANGELOG.md | 1 + pdfminer/pdfdocument.py | 9 ++++++++- samples/encryption/encrypted_doc_no_id.pdf | Bin 0 -> 13696 bytes tests/test_pdfdocument.py | 13 ++++++++++++- 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 samples/encryption/encrypted_doc_no_id.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ed10eb..3f1e1c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Support for Paeth PNG filter compression (predictor value = 4) ([#537](https://github.com/pdfminer/pdfminer.six/pull/537)) ### Fixed +- `KeyError` when `'Encrypt'` but not `'ID'` present in `trailer` ([#594](https://github.com/pdfminer/pdfminer.six/pull/594)) - Fix issue of ValueError and KeyError rasied in PDFdocument and PDFparser ([#573](https://github.com/pdfminer/pdfminer.six/pull/574)) - Fix issue of TypeError: cannot unpack non-iterable PDFObjRef object, when unpacking the value of 'DW2' ([#529](https://github.com/pdfminer/pdfminer.six/pull/529)) - `PermissionError` when creating temporary filepaths on windows when running tests ([#469](https://github.com/pdfminer/pdfminer.six/issues/469)) diff --git a/pdfminer/pdfdocument.py b/pdfminer/pdfdocument.py index 2da93c8..8233281 100644 --- a/pdfminer/pdfdocument.py +++ b/pdfminer/pdfdocument.py @@ -583,7 +583,14 @@ class PDFDocument: continue # If there's an encryption info, remember it. if 'Encrypt' in trailer: - self.encryption = (list_value(trailer['ID']), + if 'ID' in trailer: + id_value = list_value(trailer['ID']) + else: + # Some documents may not have a /ID, use two empty + # byte strings instead. Solves + # https://github.com/pdfminer/pdfminer.six/issues/594 + id_value = (b'', b'') + self.encryption = (id_value, dict_value(trailer['Encrypt'])) self._initialize_password(password) if 'Info' in trailer: diff --git a/samples/encryption/encrypted_doc_no_id.pdf b/samples/encryption/encrypted_doc_no_id.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bdab7dc4d845047aefa265dbb7e3b9dce9b7cca0 GIT binary patch literal 13696 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