Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9db355f
BUG: Change logic when adding a page
j-t-1 Nov 20, 2025
561d999
Add a test for an out-of-bounds index
j-t-1 Nov 20, 2025
a7b3f0f
Remove trailing whitespace
j-t-1 Nov 20, 2025
e5dfa38
Use indexed page if width or height is negative
j-t-1 Nov 20, 2025
1924d04
Refactor if statement
j-t-1 Nov 21, 2025
6085e16
Improve tests
j-t-1 Nov 21, 2025
854a1cc
Fix test
j-t-1 Nov 21, 2025
e89785e
Add test
j-t-1 Nov 27, 2025
0d48ea5
Use variable
j-t-1 Nov 28, 2025
4624b59
Fix test
j-t-1 Feb 20, 2026
a8f7f4e
Fix error
j-t-1 Feb 20, 2026
e76778a
Fix tests
j-t-1 Feb 20, 2026
0325c56
Update function and tests
j-t-1 Feb 24, 2026
3a479bd
Apply code review changes
j-t-1 Mar 3, 2026
aadd1a6
Refactor code blocks to match
j-t-1 Mar 3, 2026
00eb1f0
Refactor from per code review
j-t-1 Mar 4, 2026
bab1b90
Raise IndexError
j-t-1 Mar 5, 2026
c248677
Merge branch 'main' into insert
j-t-1 Mar 5, 2026
c41247b
Merge branch 'main' into insert
j-t-1 Mar 6, 2026
3d17c8e
Merge branch 'main' into insert
stefan6419846 Mar 6, 2026
8937106
Add code review feedback
j-t-1 Mar 9, 2026
58c1740
Change message
j-t-1 Mar 9, 2026
f18c03f
Fix errors in match string
j-t-1 Mar 9, 2026
e7bc8f8
Fix regex
j-t-1 Mar 9, 2026
5f33988
Use a raw string literal
j-t-1 Mar 9, 2026
09863a6
Modify a test
j-t-1 Mar 9, 2026
188013c
Apply code review suggestion
j-t-1 Mar 9, 2026
29369f2
Fix assert
j-t-1 Mar 9, 2026
5f6a07c
Modify IndexError
j-t-1 Mar 9, 2026
08743bd
Use re.escape
j-t-1 Mar 9, 2026
4ac83d1
Test valid index 0 < index < num_pages
j-t-1 Mar 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions pypdf/_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -699,10 +699,8 @@ def insert_blank_page(
If no page size is specified for a dimension, use the size of the last page.

Args:
width: The width of the new page expressed in default user
space units.
height: The height of the new page expressed in default
user space units.
width: The width of the new page in default user space units.
height: The height of the new page in default user space units.
index: Position to add the page.

Returns:
Expand All @@ -711,12 +709,20 @@ def insert_blank_page(
Raises:
PageSizeNotDefinedError: if width and height are not defined
and previous page does not exist.
IndexError: Index is outside of [-self.get_num_pages(), self.get_num_pages()]
"""
num_pages = self.get_num_pages()
if abs(index) <= num_pages:
# Use the chosen index, but do not exceed the available pages
fixed_index = min(index, num_pages - 1)
mediabox = self.pages[fixed_index].mediabox
if width is None or width <= 0:
width = mediabox.width
if height is None or height <= 0:
height = mediabox.height
else:
raise IndexError(f"Index should be in range [-{num_pages}, {num_pages}]")

"""
if width is None or (height is None and index < self.get_num_pages()):
oldpage = self.pages[index]
width = oldpage.mediabox.width
height = oldpage.mediabox.height
page = PageObject.create_blank_page(self, width, height)
self.insert_page(page, index)
return page
Expand Down
86 changes: 86 additions & 0 deletions tests/test_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,10 @@ def writer_operate(writer: PdfWriter) -> None:
writer.page_mode = NameObject("/UseOC")
assert writer._get_page_mode() == "/UseOC"
writer.insert_blank_page(width=100, height=100)
page = writer.insert_blank_page(width=100)
assert page.mediabox.height == 100
page = writer.insert_blank_page(height=100)
assert page.mediabox.width == 100
writer.insert_blank_page() # without parameters

writer.remove_images()
Expand All @@ -251,6 +255,88 @@ def writer_operate(writer: PdfWriter) -> None:
assert k in objects_hash, f"Missing {v}"


def test_insert_blank_page():
writer = PdfWriter(clone_from=RESOURCE_ROOT / "crazyones.pdf")

old_page_count = len(writer.pages)

old_page = writer.pages[0]
page = writer.insert_blank_page(index=0)
assert len(writer.pages) == old_page_count + 1
assert page.mediabox.width == old_page.mediabox.width
assert page.mediabox.height == old_page.mediabox.height

old_page = writer.pages[0]
page = writer.insert_blank_page(width=10, index=0)
assert len(writer.pages) == old_page_count + 2
assert page.mediabox.width == 10
assert page.mediabox.height == old_page.mediabox.height

old_page = writer.pages[0]
page = writer.insert_blank_page(width=-10, index=0)
assert len(writer.pages) == old_page_count + 3
assert page.mediabox.width == old_page.mediabox.width
assert page.mediabox.height == old_page.mediabox.height

old_page = writer.pages[0]
page = writer.insert_blank_page(height=20, index=0)
assert len(writer.pages) == old_page_count + 4
assert page.mediabox.width == old_page.mediabox.width
assert page.mediabox.height == 20

old_page = writer.pages[0]
page = writer.insert_blank_page(height=-20, index=0)
assert len(writer.pages) == old_page_count + 5
assert page.mediabox.width == old_page.mediabox.width
assert page.mediabox.height == old_page.mediabox.height

page = writer.insert_blank_page(width=30, height=40, index=0)
assert len(writer.pages) == old_page_count + 6
assert page.mediabox.width == 30
assert page.mediabox.height == 40

old_page = writer.pages[0]
page = writer.insert_blank_page(width=-30, height=-40, index=0)
assert len(writer.pages) == old_page_count + 7
assert page.mediabox.width == old_page.mediabox.width
assert page.mediabox.height == old_page.mediabox.height

page = writer.insert_blank_page(width=50, height=60, index=len(writer.pages))
assert len(writer.pages) == old_page_count + 8
assert page.mediabox.width == 50
assert page.mediabox.height == 60

old_page = writer.pages[0]
page = writer.insert_blank_page(width=-50, height=-60, index=-len(writer.pages))
assert len(writer.pages) == old_page_count + 9
assert page.mediabox.width == old_page.mediabox.width
assert page.mediabox.height == old_page.mediabox.height

page = writer.insert_blank_page(width=70, height=80, index=len(writer.pages) // 2)
assert len(writer.pages) == old_page_count + 10
assert page.mediabox.width == 70
assert page.mediabox.height == 80

page = writer.insert_blank_page(width=70, height=80, index=-len(writer.pages) // 2)
assert len(writer.pages) == old_page_count + 11
assert page.mediabox.width == 70
assert page.mediabox.height == 80

num_pages = len(writer.pages)

with pytest.raises(
IndexError,
match=re.escape(f"Index should be in range [-{num_pages}, {num_pages}]"),
):
page = writer.insert_blank_page(width=90, height=100, index=len(writer.pages) + 1)

with pytest.raises(
IndexError,
match=re.escape(f"Index should be in range [-{num_pages}, {num_pages}]"),
):
page = writer.insert_blank_page(width=-90, height=-100, index=-len(writer.pages) - 1)


@pytest.mark.parametrize(
("convert", "needs_cleanup"),
[
Expand Down