opendataloader-project/opendataloader-pdf · error · IllegalArgumentException

Invalid page range '%s': start page cannot be greater than e

Error message

Invalid page range '%s': start page cannot be greater than end page

What it means

parseRange rejects a range where the start bound parses and is positive but is greater than the end bound (e.g. 5-2). The message names the offending range token, not the full input. This is distinct from a non-positive or non-numeric bound.

Source

Thrown at java/opendataloader-pdf-core/src/main/java/org/opendataloader/pdf/api/Config.java:779

        return result;
    }

    private static void parseRange(String range, String fullInput, List<Integer> result) {
        String[] parts = range.split("-", SPLIT_KEEP_EMPTY_TRAILING);
        if (parts.length != 2 || parts[0].isEmpty() || parts[1].isEmpty()) {
            throw new IllegalArgumentException(String.format(INVALID_PAGE_RANGE_FORMAT, fullInput));
        }

        try {
            int start = Integer.parseInt(parts[0].trim());
            int end = Integer.parseInt(parts[1].trim());

            if (start < 1 || end < 1) {
                throw new IllegalArgumentException(
                    String.format("Page numbers must be positive: '%s'", fullInput));
            }
            if (start > end) {
                throw new IllegalArgumentException(
                    String.format("Invalid page range '%s': start page cannot be greater than end page", range));
            }

            for (int i = start; i <= end; i++) {
                result.add(i);
            }
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException(String.format(INVALID_PAGE_RANGE_FORMAT, fullInput));
        }
    }

    private static void parseSinglePage(String page, String fullInput, List<Integer> result) {
        try {
            int pageNum = Integer.parseInt(page);
            if (pageNum < 1) {
                throw new IllegalArgumentException(
                    String.format("Page numbers must be positive: '%s'", fullInput));
            }

View on GitHub (pinned to a7789b8e77)

Solutions

  1. Order the range so start <= end.
  2. When constructing from two page numbers, normalize: min + "-" + max.

Example fix

// before: config.setPages(high + "-" + low);
// after:  config.setPages(Math.min(low, high) + "-" + Math.max(low, high));
Defensive patterns

Strategy: validation

Validate before calling

for (String t : pages.split(",")) {
    if (t.contains("-")) {
        String[] h = t.split("-", -1);
        int a = Integer.parseInt(h[0].trim()), b = Integer.parseInt(h[1].trim());
        if (a > b) throw new IllegalArgumentException("Range start > end: " + t);
    }
}
config.setPages(pages);

Try / catch

try { config.setPages(raw); }
catch (IllegalArgumentException e) { /* normalize order or reprompt */ }

Prevention

When it happens

Trigger: config.setPages("5-2"), config.setPages("10-9").

Common situations: User swaps start/end; range built from min/max variables assigned in the wrong order.

Related errors


AI-assisted analysis of opendataloader-project/opendataloader-pdf@a7789b8e77 (2026-08-14). Data as JSON: /api/errors/23d3ac5796038364. Report an issue: GitHub.