Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion docs/document.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1480,7 +1480,7 @@ For details on **embedded files** refer to Appendix 3.

.. method:: delete_page(pno=-1)

PDF only: Delete a page given by its 0-based number in `-∞ < pno < page_count - 1`.
PDF only: Delete a page given by its 0-based number in `-∞ < pno < page_count`.

* Changed in v1.18.14: support Python's `del` statement.

Expand Down
35 changes: 8 additions & 27 deletions src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3865,28 +3865,7 @@ def del_xml_metadata(self):
def delete_page(self, pno: int =-1):
""" Delete one page from a PDF.
"""
if not self.is_pdf:
raise ValueError("is no PDF")
if self.is_closed:
raise ValueError("document closed")

page_count = self.page_count
while pno < 0:
pno += page_count

if pno >= page_count:
raise ValueError("bad page number(s)")

# remove TOC bookmarks pointing to deleted page
toc = self.get_toc()
ol_xrefs = self.get_outline_xrefs()
for i, item in enumerate(toc):
if item[2] == pno + 1:
self._remove_toc_item(ol_xrefs[i])

self._remove_links_to(frozenset((pno,)))
self._delete_page(pno)
self._reset_page_refs()
return self.delete_pages(pno)

def delete_pages(self, *args, **kw):
"""Delete pages from a PDF.
Expand All @@ -3896,6 +3875,7 @@ def delete_pages(self, *args, **kw):
specify the first/last page to delete.
Or a list/tuple/range object, which can contain arbitrary
page numbers.
Or a single integer page number.
"""
if not self.is_pdf:
raise ValueError("is no PDF")
Expand Down Expand Up @@ -3928,12 +3908,13 @@ def delete_pages(self, *args, **kw):
if not f <= t < page_count:
raise ValueError("bad page number(s)")
numbers = tuple(range(f, t + 1))
elif isinstance(args[0], int):
pno = args[0]
while pno < 0:
pno += page_count
numbers = (pno,)
else:
r = args[0]
if type(r) is int:
return self.delete_page(r)
else:
numbers = tuple(r)
numbers = tuple(args[0])

numbers = list(map(int, set(numbers))) # ensure unique integers
if numbers == []:
Expand Down
5 changes: 3 additions & 2 deletions tests/test_textextract.py
Original file line number Diff line number Diff line change
Expand Up @@ -374,8 +374,9 @@ def get_all_page_from_pdf(document, last_page=None):

assert texts1 == texts0

wt = pymupdf.TOOLS.mupdf_warnings()
assert wt == 'Actualtext with no position. Text may be lost or mispositioned.\n... repeated 434 times...'
if pymupdf.mupdf_version_tuple < (1, 27):
wt = pymupdf.TOOLS.mupdf_warnings()
assert wt == 'Actualtext with no position. Text may be lost or mispositioned.\n... repeated 434 times...'

def test_3650():
path = os.path.normpath(f'{__file__}/../../tests/resources/test_3650.pdf')
Expand Down