Skip to content

Commit

Permalink
BUG: Fix object count for incremental writer (#3117)
Browse files Browse the repository at this point in the history
Closes #3116.

---------

Co-authored-by: m32 <grzegorz.makarewicz@gmail.com>
  • Loading branch information
m32 and m32 authored Feb 11, 2025
1 parent 66f9bb7 commit 2263dcb
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
4 changes: 2 additions & 2 deletions pypdf/_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
34 changes: 34 additions & 0 deletions tests/test_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 2263dcb

Please sign in to comment.