From 9d251d0d10ac0a2c98ae96f7f16d5fe5aa25703f Mon Sep 17 00:00:00 2001 From: Kyle Goben Date: Thu, 1 Dec 2022 22:23:36 -0600 Subject: [PATCH 01/11] modified dest occurences and dest_ref occurences to pagedest and pagedest_ref in pdfwriter.add_outline_item_destination and pdfwriter.add_named_destination_object --- PyPDF2/_writer.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PyPDF2/_writer.py b/PyPDF2/_writer.py index 12539900d..a78fba2a8 100644 --- a/PyPDF2/_writer.py +++ b/PyPDF2/_writer.py @@ -1157,17 +1157,17 @@ def getNamedDestRoot(self) -> ArrayObject: # pragma: no cover def add_outline_item_destination( self, - dest: Union[PageObject, TreeObject], + pagedest: Union[PageObject, TreeObject], parent: Union[None, TreeObject, IndirectObject] = None, ) -> IndirectObject: if parent is None: parent = self.get_outline_root() parent = cast(TreeObject, parent.get_object()) - dest_ref = self._add_object(dest) - parent.add_child(dest_ref, self) + pagedest_ref = self._add_object(pagedest) + parent.add_child(pagedest_ref, self) - return dest_ref + return pagedest_ref def add_bookmark_destination( self, @@ -1337,12 +1337,12 @@ def add_outline(self) -> None: "This method is not yet implemented. Use :meth:`add_outline_item` instead." ) - def add_named_destination_object(self, dest: PdfObject) -> IndirectObject: - dest_ref = self._add_object(dest) + def add_named_destination_object(self, pagedest: PdfObject) -> IndirectObject: + pagedest_ref = self._add_object(pagedest) nd = self.get_named_dest_root() - nd.extend([dest["/Title"], dest_ref]) # type: ignore - return dest_ref + nd.extend([pagedest["/Title"], pagedest_ref]) # type: ignore + return pagedest_ref def addNamedDestinationObject( self, dest: PdfObject From f59dccc212ceabc9d8f80104087ba7874dcae3c3 Mon Sep 17 00:00:00 2001 From: Kyle Goben Date: Thu, 1 Dec 2022 22:29:18 -0600 Subject: [PATCH 02/11] modified indirect_reference and id to indirect_ref in pdfreader._get_object_from_stream and pdfwriter.get_object --- PyPDF2/_reader.py | 8 ++++---- PyPDF2/_writer.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/PyPDF2/_reader.py b/PyPDF2/_reader.py index 65586d7d5..ea9ca0b7e 100644 --- a/PyPDF2/_reader.py +++ b/PyPDF2/_reader.py @@ -1110,11 +1110,11 @@ def _flatten( self.flattened_pages.append(page_obj) # type: ignore def _get_object_from_stream( - self, indirect_reference: IndirectObject + self, indirect_ref: IndirectObject ) -> Union[int, PdfObject, str]: # indirect reference to object in object stream # read the entire object stream into memory - stmnum, idx = self.xref_objStm[indirect_reference.idnum] + stmnum, idx = self.xref_objStm[indirect_ref.idnum] obj_stm: EncodedStreamObject = IndirectObject(stmnum, 0, self).get_object() # type: ignore # This is an xref to a stream, so its type better be a stream assert cast(str, obj_stm["/Type"]) == "/ObjStm" @@ -1130,7 +1130,7 @@ def _get_object_from_stream( offset = NumberObject.read_from_stream(stream_data) read_non_whitespace(stream_data) stream_data.seek(-1, 1) - if objnum != indirect_reference.idnum: + if objnum != indirect_ref.idnum: # We're only interested in one object continue if self.strict and idx != i: @@ -1148,7 +1148,7 @@ def _get_object_from_stream( # Adobe Reader doesn't complain, so continue (in strict mode?) logger_warning( f"Invalid stream (index {i}) within object " - f"{indirect_reference.idnum} {indirect_reference.generation}: " + f"{indirect_ref.idnum} {indirect_ref.generation}: " f"{exc}", __name__, ) diff --git a/PyPDF2/_writer.py b/PyPDF2/_writer.py index a78fba2a8..fa1d90d8e 100644 --- a/PyPDF2/_writer.py +++ b/PyPDF2/_writer.py @@ -200,10 +200,10 @@ def _add_object(self, obj: PdfObject) -> IndirectObject: self._objects.append(obj) return IndirectObject(len(self._objects), 0, self) - def get_object(self, ido: IndirectObject) -> PdfObject: - if ido.pdf != self: + def get_object(self, indirect_ref: IndirectObject) -> PdfObject: + if indirect_ref.pdf != self: raise ValueError("pdf must be self") - return self._objects[ido.idnum - 1] # type: ignore + return self._objects[indirect_ref.idnum - 1] # type: ignore def getObject(self, ido: IndirectObject) -> PdfObject: # pragma: no cover """ From 4ea4f0e39a3ee8ee43cea2485ae68bca0a7fc810 Mon Sep 17 00:00:00 2001 From: Kyle Goben Date: Thu, 1 Dec 2022 22:32:21 -0600 Subject: [PATCH 03/11] modified pdfwriter.encrypt to use user_password and owner_password instead of user_pwd and owner_pwd --- PyPDF2/_writer.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PyPDF2/_writer.py b/PyPDF2/_writer.py index fa1d90d8e..8bcd735c1 100644 --- a/PyPDF2/_writer.py +++ b/PyPDF2/_writer.py @@ -775,17 +775,17 @@ def cloneDocumentFromReader( def encrypt( self, - user_pwd: str, - owner_pwd: Optional[str] = None, + user_password: str, + owner_password: Optional[str] = None, use_128bit: bool = True, permissions_flag: UserAccessPermissions = ALL_DOCUMENT_PERMISSIONS, ) -> None: """ Encrypt this PDF file with the PDF Standard encryption handler. - :param str user_pwd: The "user password", which allows for opening + :param str user_password: The "user password", which allows for opening and reading the PDF file with the restrictions provided. - :param str owner_pwd: The "owner password", which allows for + :param str owner_password: The "owner password", which allows for opening the PDF files without any restrictions. By default, the owner password is the same as the user password. :param bool use_128bit: flag as to whether to use 128bit @@ -799,8 +799,8 @@ def encrypt( control annotations, 9 for form fields, 10 for extraction of text and graphics. """ - if owner_pwd is None: - owner_pwd = user_pwd + if owner_password is None: + owner_password = user_password if use_128bit: V = 2 rev = 3 @@ -810,15 +810,15 @@ def encrypt( rev = 2 keylen = int(40 / 8) P = permissions_flag - O = ByteStringObject(_alg33(owner_pwd, user_pwd, rev, keylen)) # type: ignore[arg-type] + O = ByteStringObject(_alg33(owner_password, user_password, rev, keylen)) # type: ignore[arg-type] ID_1 = ByteStringObject(md5((repr(time.time())).encode("utf8")).digest()) ID_2 = ByteStringObject(md5((repr(random.random())).encode("utf8")).digest()) self._ID = ArrayObject((ID_1, ID_2)) if rev == 2: - U, key = _alg34(user_pwd, O, P, ID_1) + U, key = _alg34(user_password, O, P, ID_1) else: assert rev == 3 - U, key = _alg35(user_pwd, rev, keylen, O, P, ID_1, False) # type: ignore[arg-type] + U, key = _alg35(user_password, rev, keylen, O, P, ID_1, False) # type: ignore[arg-type] encrypt = DictionaryObject() encrypt[NameObject(SA.FILTER)] = NameObject("/Standard") encrypt[NameObject("/V")] = NumberObject(V) From ee40afce409f94eea9faee27adfbc373e548d781 Mon Sep 17 00:00:00 2001 From: Kyle Goben Date: Thu, 1 Dec 2022 23:12:15 -0600 Subject: [PATCH 04/11] updated user_pwd and owner_pwd to user_password and owner_password to reflect changes to pdfWriter class --- tests/test_writer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_writer.py b/tests/test_writer.py index 70adf3ba2..b6f0772fb 100644 --- a/tests/test_writer.py +++ b/tests/test_writer.py @@ -397,10 +397,10 @@ def test_fill_form(): @pytest.mark.parametrize( - ("use_128bit", "user_pwd", "owner_pwd"), + ("use_128bit", "user_password", "owner_password"), [(True, "userpwd", "ownerpwd"), (False, "userpwd", "ownerpwd")], ) -def test_encrypt(use_128bit, user_pwd, owner_pwd): +def test_encrypt(use_128bit, user_password, owner_password): reader = PdfReader(RESOURCE_ROOT / "form.pdf") writer = PdfWriter() @@ -408,7 +408,7 @@ def test_encrypt(use_128bit, user_pwd, owner_pwd): orig_text = page.extract_text() writer.add_page(page) - writer.encrypt(user_pwd=user_pwd, owner_pwd=owner_pwd, use_128bit=use_128bit) + writer.encrypt(user_password=user_password, owner_password=owner_password, use_128bit=use_128bit) # write "output" to PyPDF2-output.pdf tmp_filename = "dont_commit_encrypted.pdf" From c5af0cea905910906520a9fd81aaa00b5b291d32 Mon Sep 17 00:00:00 2001 From: Kyle Goben Date: Mon, 5 Dec 2022 22:46:08 -0600 Subject: [PATCH 05/11] changed pagedest and indirect_ref to unshortened snake case variable names --- PyPDF2/_reader.py | 36 ++++++++++++++++++------------------ PyPDF2/_writer.py | 44 ++++++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/PyPDF2/_reader.py b/PyPDF2/_reader.py index 49e7bdabb..b2b2a33a3 100644 --- a/PyPDF2/_reader.py +++ b/PyPDF2/_reader.py @@ -304,7 +304,7 @@ def __init__( self.xref_index = 0 self._page_id2num: Optional[ Dict[Any, Any] - ] = None # map page indirect_ref number to Page Number + ] = None # map page indirect_reference number to Page Number if hasattr(stream, "mode") and "b" not in stream.mode: # type: ignore logger_warning( "PdfReader stream/file object is not in binary mode. " @@ -815,20 +815,20 @@ def threads(self) -> Optional[ArrayObject]: return None def _get_page_number_by_indirect( - self, indirect_ref: Union[None, int, NullObject, IndirectObject] + self, indirect_reference: Union[None, int, NullObject, IndirectObject] ) -> int: """Generate _page_id2num""" if self._page_id2num is None: self._page_id2num = { - x.indirect_ref.idnum: i for i, x in enumerate(self.pages) # type: ignore + x.indirect_reference.idnum: i for i, x in enumerate(self.pages) # type: ignore } - if indirect_ref is None or isinstance(indirect_ref, NullObject): + if indirect_reference is None or isinstance(indirect_reference, NullObject): return -1 - if isinstance(indirect_ref, int): - idnum = indirect_ref + if isinstance(indirect_reference, int): + idnum = indirect_reference else: - idnum = indirect_ref.idnum + idnum = indirect_reference.idnum assert self._page_id2num is not None, "hint for mypy" ret = self._page_id2num.get(idnum, -1) return ret @@ -841,7 +841,7 @@ def get_page_number(self, page: PageObject) -> int: an instance of :class:`PageObject` :return: the page number or -1 if page not found """ - return self._get_page_number_by_indirect(page.indirect_ref) + return self._get_page_number_by_indirect(page.indirect_reference) def getPageNumber(self, page: PageObject) -> int: # pragma: no cover """ @@ -904,10 +904,10 @@ def _build_destination( if self.strict: raise # create a link to first Page - tmp = self.pages[0].indirect_ref - indirect_ref = NullObject() if tmp is None else tmp + tmp = self.pages[0].indirect_reference + indirect_reference = NullObject() if tmp is None else tmp return Destination( - title, indirect_ref, TextStringObject("/Fit") # type: ignore + title, indirect_reference, TextStringObject("/Fit") # type: ignore ) def _build_outline_item(self, node: DictionaryObject) -> Optional[Destination]: @@ -1081,7 +1081,7 @@ def _flatten( self, pages: Union[None, DictionaryObject, PageObject] = None, inherit: Optional[Dict[str, Any]] = None, - indirect_ref: Optional[IndirectObject] = None, + indirect_reference: Optional[IndirectObject] = None, ) -> None: inheritable_page_attributes = ( NameObject(PG.RESOURCES), @@ -1109,7 +1109,7 @@ def _flatten( for page in pages[PA.KIDS]: # type: ignore addt = {} if isinstance(page, IndirectObject): - addt["indirect_ref"] = page + addt["indirect_reference"] = page self._flatten(page.get_object(), inherit, **addt) elif t == "/Page": for attr_in, value in list(inherit.items()): @@ -1117,18 +1117,18 @@ def _flatten( # parent's value: if attr_in not in pages: pages[attr_in] = value - page_obj = PageObject(self, indirect_ref) + page_obj = PageObject(self, indirect_reference) page_obj.update(pages) # TODO: Could flattened_pages be None at this point? self.flattened_pages.append(page_obj) # type: ignore def _get_object_from_stream( - self, indirect_ref: IndirectObject + self, indirect_reference: IndirectObject ) -> Union[int, PdfObject, str]: # indirect reference to object in object stream # read the entire object stream into memory - stmnum, idx = self.xref_objStm[indirect_ref.idnum] + stmnum, idx = self.xref_objStm[indirect_reference.idnum] obj_stm: EncodedStreamObject = IndirectObject(stmnum, 0, self).get_object() # type: ignore # This is an xref to a stream, so its type better be a stream assert cast(str, obj_stm["/Type"]) == "/ObjStm" @@ -1144,7 +1144,7 @@ def _get_object_from_stream( offset = NumberObject.read_from_stream(stream_data) read_non_whitespace(stream_data) stream_data.seek(-1, 1) - if objnum != indirect_ref.idnum: + if objnum != indirect_reference.idnum: # We're only interested in one object continue if self.strict and idx != i: @@ -1162,7 +1162,7 @@ def _get_object_from_stream( # Adobe Reader doesn't complain, so continue (in strict mode?) logger_warning( f"Invalid stream (index {i}) within object " - f"{indirect_ref.idnum} {indirect_ref.generation}: " + f"{indirect_reference.idnum} {indirect_reference.generation}: " f"{exc}", __name__, ) diff --git a/PyPDF2/_writer.py b/PyPDF2/_writer.py index e71655c79..ef617850e 100644 --- a/PyPDF2/_writer.py +++ b/PyPDF2/_writer.py @@ -201,10 +201,10 @@ def _add_object(self, obj: PdfObject) -> IndirectObject: self._objects.append(obj) return IndirectObject(len(self._objects), 0, self) - def get_object(self, indirect_ref: IndirectObject) -> PdfObject: - if indirect_ref.pdf != self: + def get_object(self, indirect_reference: IndirectObject) -> PdfObject: + if indirect_reference.pdf != self: raise ValueError("pdf must be self") - return self._objects[indirect_ref.idnum - 1] # type: ignore + return self._objects[indirect_reference.idnum - 1] # type: ignore def getObject(self, ido: IndirectObject) -> PdfObject: # pragma: no cover """ @@ -456,7 +456,7 @@ def open_destination(self, dest: Union[None, str, Destination, PageObject]) -> N elif isinstance(dest, PageObject): self._root_object[NameObject("/OpenAction")] = Destination( "Opening", - dest.indirect_ref if dest.indirect_ref is not None else NullObject(), + dest.indirect_reference if dest.indirect_reference is not None else NullObject(), TextStringObject("/Fit"), ).dest_array @@ -1024,15 +1024,15 @@ def _sweep_indirect_references( # Update old hash value to new hash value for old_hash in update_hashes: - indirect_ref = self._idnum_hash.pop(old_hash, None) + indirect_reference = self._idnum_hash.pop(old_hash, None) - if indirect_ref is not None: - indirect_ref_obj = indirect_ref.get_object() + if indirect_reference is not None: + indirect_reference_obj = indirect_reference.get_object() - if indirect_ref_obj is not None: + if indirect_reference_obj is not None: self._idnum_hash[ - indirect_ref_obj.hash_value() - ] = indirect_ref + indirect_reference_obj.hash_value() + ] = indirect_reference def _resolve_indirect_object(self, data: IndirectObject) -> IndirectObject: """ @@ -1181,17 +1181,17 @@ def getNamedDestRoot(self) -> ArrayObject: # pragma: no cover def add_outline_item_destination( self, - pagedest: Union[PageObject, TreeObject], + page_destination: Union[PageObject, TreeObject], parent: Union[None, TreeObject, IndirectObject] = None, ) -> IndirectObject: if parent is None: parent = self.get_outline_root() parent = cast(TreeObject, parent.get_object()) - pagedest_ref = self._add_object(pagedest) - parent.add_child(pagedest_ref, self) + page_destination_ref = self._add_object(page_destination) + parent.add_child(page_destination_ref, self) - return pagedest_ref + return page_destination_ref def add_bookmark_destination( self, @@ -1377,12 +1377,12 @@ def add_outline(self) -> None: "This method is not yet implemented. Use :meth:`add_outline_item` instead." ) - def add_named_destination_object(self, pagedest: PdfObject) -> IndirectObject: - pagedest_ref = self._add_object(pagedest) + def add_named_destination_object(self, page_destination: PdfObject) -> IndirectObject: + page_destination_ref = self._add_object(page_destination) nd = self.get_named_dest_root() - nd.extend([pagedest["/Title"], pagedest_ref]) # type: ignore - return pagedest_ref + nd.extend([page_destination["/Title"], page_destination_ref]) # type: ignore + return page_destination_ref def addNamedDestinationObject( self, dest: PdfObject @@ -1697,7 +1697,7 @@ def addURI( def add_link( self, pagenum: int, # deprecated, but method is deprecated already - pagedest: int, + page_destination: int, rect: RectangleObject, border: Optional[ArrayObject] = None, fit: FitType = "/Fit", @@ -1720,7 +1720,7 @@ def add_link( annotation = AnnotationBuilder.link( rect=rect, border=border, - target_page_index=pagedest, + target_page_index=page_destination, fit=fit, fit_args=args, ) @@ -1729,7 +1729,7 @@ def add_link( def addLink( self, pagenum: int, # deprecated, but method is deprecated already - pagedest: int, + page_destination: int, rect: RectangleObject, border: Optional[ArrayObject] = None, fit: FitType = "/Fit", @@ -1743,7 +1743,7 @@ def addLink( deprecate_with_replacement( "addLink", "add_annotation(AnnotationBuilder.link(...))", "4.0.0" ) - return self.add_link(pagenum, pagedest, rect, border, fit, *args) + return self.add_link(pagenum, page_destination, rect, border, fit, *args) _valid_layouts = ( "/NoLayout", From fdd84a545456c2bbd19c19be44f90e9a29ad6273 Mon Sep 17 00:00:00 2001 From: Kyle Goben Date: Mon, 5 Dec 2022 22:53:07 -0600 Subject: [PATCH 06/11] updated test writer with indirect_reference --- tests/test_writer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_writer.py b/tests/test_writer.py index 2e7390c57..2fc06b73a 100644 --- a/tests/test_writer.py +++ b/tests/test_writer.py @@ -826,10 +826,10 @@ def test_startup_dest(): pdf_file_writer.open_destination = pdf_file_writer.pages[9] # checked also using Acrobrat to verify the good page is opened op = pdf_file_writer._root_object["/OpenAction"] - assert op[0] == pdf_file_writer.pages[9].indirect_ref + assert op[0] == pdf_file_writer.pages[9].indirect_reference assert op[1] == "/Fit" op = pdf_file_writer.open_destination - assert op.raw_get("/Page") == pdf_file_writer.pages[9].indirect_ref + assert op.raw_get("/Page") == pdf_file_writer.pages[9].indirect_reference assert op["/Type"] == "/Fit" pdf_file_writer.open_destination = op assert pdf_file_writer.open_destination == op From a0683c66c64e3d5e03cc0068eada0812cf17a3ef Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Sat, 10 Dec 2022 14:20:43 +0100 Subject: [PATCH 07/11] Apply suggestions from code review --- PyPDF2/_writer.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/PyPDF2/_writer.py b/PyPDF2/_writer.py index ef617850e..c483de64b 100644 --- a/PyPDF2/_writer.py +++ b/PyPDF2/_writer.py @@ -201,7 +201,16 @@ def _add_object(self, obj: PdfObject) -> IndirectObject: self._objects.append(obj) return IndirectObject(len(self._objects), 0, self) - def get_object(self, indirect_reference: IndirectObject) -> PdfObject: + def get_object(self, indirect_reference: Optional[IndirectObject]=None, ido: Optional[IndirectObject]=None) -> PdfObject: + if ido is not None: + if indirect_reference is not None: + raise ValueError("Please only set 'indirect_reference'. The 'ido' argument is deprecated.") + else: + indirect_reference = ido + warnings.warn( + "The parameter 'ido' is depreciated and will be removed in PyPDF2 3.0.0.", + DeprecationWarning, + ) if indirect_reference.pdf != self: raise ValueError("pdf must be self") return self._objects[indirect_reference.idnum - 1] # type: ignore From 0701b737ae1ff1f470a6f03f844a96212a22415a Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Sat, 10 Dec 2022 15:06:53 +0100 Subject: [PATCH 08/11] Rename Page.indirect_reference temporarily back to Page.indirect_ref This change should allow me to merge this PR. --- PyPDF2/_reader.py | 6 +++--- tests/test_writer.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/PyPDF2/_reader.py b/PyPDF2/_reader.py index b2b2a33a3..a994b9ee1 100644 --- a/PyPDF2/_reader.py +++ b/PyPDF2/_reader.py @@ -820,7 +820,7 @@ def _get_page_number_by_indirect( """Generate _page_id2num""" if self._page_id2num is None: self._page_id2num = { - x.indirect_reference.idnum: i for i, x in enumerate(self.pages) # type: ignore + x.indirect_ref.idnum: i for i, x in enumerate(self.pages) # type: ignore } if indirect_reference is None or isinstance(indirect_reference, NullObject): @@ -841,7 +841,7 @@ def get_page_number(self, page: PageObject) -> int: an instance of :class:`PageObject` :return: the page number or -1 if page not found """ - return self._get_page_number_by_indirect(page.indirect_reference) + return self._get_page_number_by_indirect(page.indirect_ref) def getPageNumber(self, page: PageObject) -> int: # pragma: no cover """ @@ -904,7 +904,7 @@ def _build_destination( if self.strict: raise # create a link to first Page - tmp = self.pages[0].indirect_reference + tmp = self.pages[0].indirect_ref indirect_reference = NullObject() if tmp is None else tmp return Destination( title, indirect_reference, TextStringObject("/Fit") # type: ignore diff --git a/tests/test_writer.py b/tests/test_writer.py index 0e63b0aba..1edc1aa5e 100644 --- a/tests/test_writer.py +++ b/tests/test_writer.py @@ -830,10 +830,10 @@ def test_startup_dest(): pdf_file_writer.open_destination = pdf_file_writer.pages[9] # checked also using Acrobrat to verify the good page is opened op = pdf_file_writer._root_object["/OpenAction"] - assert op[0] == pdf_file_writer.pages[9].indirect_reference + assert op[0] == pdf_file_writer.pages[9].indirect_ref assert op[1] == "/Fit" op = pdf_file_writer.open_destination - assert op.raw_get("/Page") == pdf_file_writer.pages[9].indirect_reference + assert op.raw_get("/Page") == pdf_file_writer.pages[9].indirect_ref assert op["/Type"] == "/Fit" pdf_file_writer.open_destination = op assert pdf_file_writer.open_destination == op From a8a40c156952db53e558733c56949d83ca5214bf Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Sat, 10 Dec 2022 15:09:14 +0100 Subject: [PATCH 09/11] flake8 fix --- PyPDF2/_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyPDF2/_writer.py b/PyPDF2/_writer.py index b52e4ae95..4f94c1574 100644 --- a/PyPDF2/_writer.py +++ b/PyPDF2/_writer.py @@ -201,7 +201,7 @@ def _add_object(self, obj: PdfObject) -> IndirectObject: self._objects.append(obj) return IndirectObject(len(self._objects), 0, self) - def get_object(self, indirect_reference: Optional[IndirectObject]=None, ido: Optional[IndirectObject]=None) -> PdfObject: + def get_object(self, indirect_reference: Optional[IndirectObject] = None, ido: Optional[IndirectObject] = None) -> PdfObject: if ido is not None: if indirect_reference is not None: raise ValueError("Please only set 'indirect_reference'. The 'ido' argument is deprecated.") From a33d1b4e420cb5597bd1683d2f620fe4dd4792bc Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Sat, 10 Dec 2022 15:14:34 +0100 Subject: [PATCH 10/11] Apply suggestions from code review --- PyPDF2/_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyPDF2/_writer.py b/PyPDF2/_writer.py index 4f94c1574..7e3f250b0 100644 --- a/PyPDF2/_writer.py +++ b/PyPDF2/_writer.py @@ -465,7 +465,7 @@ def open_destination(self, dest: Union[None, str, Destination, PageObject]) -> N elif isinstance(dest, PageObject): self._root_object[NameObject("/OpenAction")] = Destination( "Opening", - dest.indirect_reference if dest.indirect_reference is not None else NullObject(), + dest.indirect_ref if dest.indirect_ref is not None else NullObject(), TextStringObject("/Fit"), ).dest_array From ea4a29d4eb87662b64a87cd97da800df9f5bf0a3 Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Sat, 10 Dec 2022 15:22:37 +0100 Subject: [PATCH 11/11] Update PyPDF2/_writer.py --- PyPDF2/_writer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PyPDF2/_writer.py b/PyPDF2/_writer.py index 7e3f250b0..0c5e77b90 100644 --- a/PyPDF2/_writer.py +++ b/PyPDF2/_writer.py @@ -211,6 +211,7 @@ def get_object(self, indirect_reference: Optional[IndirectObject] = None, ido: O "The parameter 'ido' is depreciated and will be removed in PyPDF2 3.0.0.", DeprecationWarning, ) + assert indirect_reference is not None # the None value is only there to keep the deprecated name if indirect_reference.pdf != self: raise ValueError("pdf must be self") return self._objects[indirect_reference.idnum - 1] # type: ignore