From 561b1b07e149fdd45f78f5263ea7ca1a01b9bd06 Mon Sep 17 00:00:00 2001 From: Robert Fotino Date: Sun, 7 Apr 2024 01:27:43 -0700 Subject: [PATCH] BUG: Fix merge_page sometimes generating unknown operator 'QQ' (#2588) Fixes #2587 --- pypdf/generic/_data_structures.py | 2 +- tests/test_page.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pypdf/generic/_data_structures.py b/pypdf/generic/_data_structures.py index d7d9facc9..3ca761403 100644 --- a/pypdf/generic/_data_structures.py +++ b/pypdf/generic/_data_structures.py @@ -1256,7 +1256,7 @@ def isolate_graphics_state(self) -> None: self._operations.insert(0, ([], "q")) self._operations.append(([], "Q")) elif self._data: - self._data = b"q\n" + b_(self._data) + b"Q\n" + self._data = b"q\n" + b_(self._data) + b"\nQ\n" # This overrides the parent method: def write_to_stream( diff --git a/tests/test_page.py b/tests/test_page.py index 0f257ac39..2a3cc4fe6 100644 --- a/tests/test_page.py +++ b/tests/test_page.py @@ -1268,6 +1268,19 @@ def test_pdf_pages_missing_type(): writer.pages[0] +@pytest.mark.enable_socket() +def test_merge_with_stream_wrapped_in_save_restore(): + """Test for issue #2587""" + url = "https://github.com/py-pdf/pypdf/files/14895914/blank_portrait.pdf" + name = "blank_portrait.pdf" + reader = PdfReader(BytesIO(get_data_from_url(url, name=name))) + page_one = reader.pages[0] + assert page_one.get_contents().get_data() == b"q Q" + page_two = reader.pages[0] + page_one.merge_page(page_two) + assert b"QQ" not in page_one.get_contents().get_data() + + @pytest.mark.samples() def test_compression(): """Test for issue #1897"""