{"record":{"id":"9e1238a6a5032f15","repo":"opendataloader-project/opendataloader-pdf","slug":"unsupported-reading-order-s-supported-values","errorCode":null,"errorMessage":"Unsupported reading order '%s'. Supported values: %s","messagePattern":"Unsupported reading order '(.+?)'\\. Supported values: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"java/opendataloader-pdf-core/src/main/java/org/opendataloader/pdf/api/Config.java","lineNumber":469,"sourceCode":"\n    /**\n     * Gets the reading order, that states in which order content should be processed.\n     *\n     * @return The specified order.\n     */\n    public String getReadingOrder() {\n        return readingOrder;\n    }\n\n    /**\n     * Sets the reading order, that states in which order content should be processed.\n     *\n     * @param readingOrder The specified order (off or xycut).\n     * @throws IllegalArgumentException if the order is not supported.\n     */\n    public void setReadingOrder(String readingOrder) {\n        if (readingOrder != null && !isValidReadingOrder(readingOrder)) {\n            throw new IllegalArgumentException(\n                String.format(\"Unsupported reading order '%s'. Supported values: %s\",\n                    readingOrder, getReadingOrderOptions(\", \")));\n        }\n        this.readingOrder = readingOrder != null ? readingOrder.toLowerCase(Locale.ROOT) : READING_ORDER_XYCUT;\n    }\n\n    /**\n     * Gets the list of reading order options.\n     *\n     * @param delimiter The delimiter to use between options.\n     * @return The string with reading orders separated by the delimiter.\n     */\n    public static String getReadingOrderOptions(CharSequence delimiter) {\n        return String.join(delimiter, readingOrderOptions);\n    }\n\n    /**\n     * Checks if the given reading order is valid.","sourceCodeStart":451,"sourceCodeEnd":487,"githubUrl":"https://github.com/opendataloader-project/opendataloader-pdf/blob/a7789b8e77dd05e2b8659eb3ea12fc458f80bfb8/java/opendataloader-pdf-core/src/main/java/org/opendataloader/pdf/api/Config.java#L451-L487","documentation":"Config.setReadingOrder rejects any value not in {off, xycut}. The check is case-insensitive (lowercased) but does not trim whitespace, so \"off \" fails. null is accepted and defaults to xycut. IllegalArgumentException is thrown before assignment.","triggerScenarios":"config.setReadingOrder(\"xy\") or CLI --reading-order z-order; also a whitespace-padded value from env.","commonSituations":"Typo; using a reading-order name from a different library; config generated for another version; untrimmed value from YAML.","solutions":["Use one of the supported values: off or xycut.","Trim externally sourced values before passing.","Pre-validate with Config.isValidReadingOrder(value)."],"exampleFix":"// before: config.setReadingOrder(\"z-order\");\n// after:  config.setReadingOrder(\"xycut\");","handlingStrategy":"validation","validationCode":"String order = externalValue == null ? null : externalValue.trim();\nif (order != null && !Config.isValidReadingOrder(order)) {\n    throw new IllegalArgumentException(\n        \"Bad --reading-order '\" + order + \"'. Valid: \" + Config.getReadingOrderOptions(\", \"));\n}\nconfig.setReadingOrder(order);","typeGuard":"static boolean isSupportedReadingOrder(String s) {\n    return s != null && Config.isValidReadingOrder(s.trim());\n}","tryCatchPattern":"try {\n    config.setReadingOrder(raw);\n} catch (IllegalArgumentException e) {\n    config.setReadingOrder(null); // default xycut\n}","preventionTips":["Trim externally sourced values; the setter lowercases but does not trim.","Validate against Config.isValidReadingOrder before assigning."],"tags":["configuration","validation","reading-order"],"backgroundTag":null,"analyzedSha":"a7789b8e77dd05e2b8659eb3ea12fc458f80bfb8","analyzedAt":"2026-08-14T05:22:03.953Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}