diff --git a/pypdf/_writer.py b/pypdf/_writer.py index 9c268b908..b343af217 100644 --- a/pypdf/_writer.py +++ b/pypdf/_writer.py @@ -424,6 +424,28 @@ def _get_num_pages(self) -> int: pages = cast(Dict[str, Any], self.get_object(self._pages)) return int(pages[NameObject("/Count")]) + def _get_page_number_by_indirect( + self, indirect_reference: Union[None, int, NullObject, IndirectObject] + ) -> Optional[int]: + """ + Generate _page_id2num. + + Args: + indirect_reference: + + Returns: + The page number or None + """ + # to provide same function as in PdfReader + if indirect_reference is None or isinstance(indirect_reference, NullObject): + return None + if isinstance(indirect_reference, int): + indirect_reference = IndirectObject(indirect_reference, 0, self) + obj = indirect_reference.get_object() + if isinstance(obj, PageObject): + return obj.page_number + return None + @property def pages(self) -> List[PageObject]: """ diff --git a/tests/test_writer.py b/tests/test_writer.py index 89c79f681..12110e766 100644 --- a/tests/test_writer.py +++ b/tests/test_writer.py @@ -2011,3 +2011,16 @@ def test_reattach_fields(): assert isinstance(writer.pages[0]["/Annots"][0], IndirectObject) del writer.pages[1]["/Annots"] assert len(writer.reattach_fields(writer.pages[1])) == 0 + + +def test_get_pagenumber_from_indirectobject(): + """Test test_get_pagenumber_from_indirectobject""" + pdf_path = RESOURCE_ROOT / "crazyones.pdf" + writer = PdfWriter(clone_from=pdf_path) + assert writer._get_page_number_by_indirect(None) is None + assert writer._get_page_number_by_indirect(NullObject()) is None + + ind = writer.pages[0].indirect_reference + assert writer._get_page_number_by_indirect(ind) == 0 + assert writer._get_page_number_by_indirect(ind.idnum) == 0 + assert writer._get_page_number_by_indirect(ind.idnum + 1) is None