Delete pages from a PDF. Args: Either keywords 'from_page'/'to_page', or two integers to 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
(self, *args, **kw)
| 4353 | return self.delete_pages(pno) |
| 4354 | |
| 4355 | def delete_pages(self, *args, **kw): |
| 4356 | """Delete pages from a PDF. |
| 4357 | |
| 4358 | Args: |
| 4359 | Either keywords 'from_page'/'to_page', or two integers to |
| 4360 | specify the first/last page to delete. |
| 4361 | Or a list/tuple/range object, which can contain arbitrary |
| 4362 | page numbers. |
| 4363 | Or a single integer page number. |
| 4364 | """ |
| 4365 | if not self.is_pdf: |
| 4366 | raise ValueError("is no PDF") |
| 4367 | if self.is_closed: |
| 4368 | raise ValueError("document closed") |
| 4369 | |
| 4370 | page_count = self.page_count # page count of document |
| 4371 | f = t = -1 |
| 4372 | if kw: # check if keywords were used |
| 4373 | if args: # then no positional args are allowed |
| 4374 | raise ValueError("cannot mix keyword and positional argument") |
| 4375 | f = kw.get("from_page", -1) # first page to delete |
| 4376 | t = kw.get("to_page", -1) # last page to delete |
| 4377 | while f < 0: |
| 4378 | f += page_count |
| 4379 | while t < 0: |
| 4380 | t += page_count |
| 4381 | if not f <= t < page_count: |
| 4382 | raise ValueError("bad page number(s)") |
| 4383 | numbers = tuple(range(f, t + 1)) |
| 4384 | else: |
| 4385 | if len(args) > 2 or args == []: |
| 4386 | raise ValueError("need 1 or 2 positional arguments") |
| 4387 | if len(args) == 2: |
| 4388 | f, t = args |
| 4389 | if not (type(f) is int and type(t) is int): |
| 4390 | raise ValueError("both arguments must be int") |
| 4391 | if f > t: |
| 4392 | f, t = t, f |
| 4393 | if not f <= t < page_count: |
| 4394 | raise ValueError("bad page number(s)") |
| 4395 | numbers = tuple(range(f, t + 1)) |
| 4396 | elif isinstance(args[0], int): |
| 4397 | pno = args[0] |
| 4398 | while pno < 0: |
| 4399 | pno += page_count |
| 4400 | numbers = (pno,) |
| 4401 | else: |
| 4402 | numbers = tuple(args[0]) |
| 4403 | |
| 4404 | numbers = list(map(int, set(numbers))) # ensure unique integers |
| 4405 | if numbers == []: |
| 4406 | message("nothing to delete") |
| 4407 | return |
| 4408 | numbers.sort() |
| 4409 | if numbers[0] < 0 or numbers[-1] >= page_count: |
| 4410 | raise ValueError("bad page number(s)") |
| 4411 | frozen_numbers = frozenset(numbers) |
| 4412 | toc = self.get_toc() |