From 2263dcb9919e9518bfcb8775eddbffe3e7199209 Mon Sep 17 00:00:00 2001 From: Grzegorz Makarewicz Date: Tue, 11 Feb 2025 11:24:26 +0100 Subject: [PATCH] BUG: Fix object count for incremental writer (#3117) Closes #3116. --------- Co-authored-by: m32 --- pypdf/_writer.py | 4 ++-- tests/test_writer.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/pypdf/_writer.py b/pypdf/_writer.py index 9fb460b56..17d8feae5 100644 --- a/pypdf/_writer.py +++ b/pypdf/_writer.py @@ -1190,8 +1190,8 @@ def clone_reader_document_root(self, reader: PdfReader) -> None: """ self._info_obj = None if self.incremental: - self._objects = [None] * cast(int, reader.trailer["/Size"]) - for i in range(len(self._objects) - 1): + self._objects = [None] * (cast(int, reader.trailer["/Size"]) - 1) + for i in range(len(self._objects)): o = reader.get_object(i + 1) if o is not None: self._objects[i] = o.replicate(self) diff --git a/tests/test_writer.py b/tests/test_writer.py index 939e2f847..e6be27d22 100644 --- a/tests/test_writer.py +++ b/tests/test_writer.py @@ -2618,3 +2618,37 @@ def test_insert_filtered_annotations__annotations_are_none(): assert writer._insert_filtered_annotations( annots=None, page=PageObject(), pages={}, reader=reader ) == [] + + +def test_incremental_read(): + """Test for #3116""" + writer = PdfWriter() + writer.add_blank_page(72, 72) + stream0 = BytesIO() + writer.write(stream0) + + reader = PdfReader(stream0) + # 1 = Catalog, 2 = Pages, 3 = New Page, 4 = Info, Size == 5 + assert reader.trailer["/Size"] == 5 + + stream0.seek(0, 0) + writer = PdfWriter(stream0, incremental=True) + assert len(writer._objects) == 4 + assert writer._objects[-1] is not None + stream1 = BytesIO() + writer.write(stream1) + + # nothing modified, so nothing added = ideal situation + assert stream1.getvalue() == stream1.getvalue() + + stream0.seek(0, 0) + writer = PdfWriter(stream0, incremental=True) + assert len(writer._objects) == 4 + assert writer._objects[-1] is not None + writer.add_blank_page(72, 72) + assert len(writer._objects) == 5 + stream1 = BytesIO() + writer.write(stream1) + # 2 = Pages, 5 = New Page, 6 = XRef, Size == 7 + # XRef is created on write and not counted + assert len(writer._objects) == 5