diff --git a/src/ocrmypdf/_validation.py b/src/ocrmypdf/_validation.py index 9354a629..a6ee9a08 100644 --- a/src/ocrmypdf/_validation.py +++ b/src/ocrmypdf/_validation.py @@ -13,7 +13,7 @@ import sys import unicodedata from pathlib import Path from shutil import copyfileobj -from typing import Tuple +from typing import List, Set, Tuple, Union import pikepdf import PIL @@ -136,10 +136,10 @@ def check_options_preprocessing(options): raise BadArgsError(str(e)) -def _pages_from_ranges(ranges): +def _pages_from_ranges(ranges: str) -> Set[int]: if is_iterable_notstr(ranges): return set(ranges) - pages = [] + pages: List[int] = [] page_groups = ranges.replace(' ', '').split(',') for g in page_groups: if not g: @@ -150,9 +150,18 @@ def _pages_from_ranges(ranges): pages.append(int(g) - 1) else: try: - pages.extend(range(int(start) - 1, int(end))) + new_pages = list(range(int(start) - 1, int(end))) + if not new_pages: + raise BadArgsError(f"invalid page subrange '{start}-{end}'") + pages.extend(new_pages) except ValueError: - raise BadArgsError("invalid page range") + raise BadArgsError("invalid page range") from None + + if not pages: + raise BadArgsError( + f"The string of page ranges '{ranges}' did not contain any recognizable " + f"page ranges." + ) if not monotonic(pages): log.warning( diff --git a/tests/test_page_numbers.py b/tests/test_page_numbers.py index 28f59416..71f06a0d 100644 --- a/tests/test_page_numbers.py +++ b/tests/test_page_numbers.py @@ -28,6 +28,12 @@ from ocrmypdf.pdfinfo import PdfInfo ['1,3,-11', BadArgsError], ['1-,', BadArgsError], ['start-end', BadArgsError], + ['1-0', BadArgsError], + ['99-98', BadArgsError], + ['0-0', BadArgsError], + ['1-0,3-4', BadArgsError], + [',', BadArgsError], + ['', BadArgsError], ], ) def test_pages(pages, result):