{"record":{"id":"cea64c095f21daa4","repo":"iflytek/astron-agent","slug":"servicelocalerror","errorCode":"ServiceLocalError","errorMessage":"起始页号应该小于等于结束页号","messagePattern":"起始页号应该小于等于结束页号","errorType":"error_code","errorClass":"ServiceException","httpStatus":null,"severity":"error","filePath":"core/plugin/aitools/service/ocr_llm/req_ase_ability_ocr_service.py","lineNumber":432,"sourceCode":"    page_start: int = DOCUMENT_PAGE_UNLIMITED,\n    page_end: int = DOCUMENT_PAGE_UNLIMITED,\n) -> Tuple[Dict[int, bytes], Dict[int, str]]:\n    \"\"\"\n    PDF convert to PNG.\n\n    Args:\n        pdf_content: PDF content in bytes.\n        page_start: Start page number. -1 means all pages.\n        page_end: End page number. -1 means all pages.\n\n    Returns:\n        A tuple of two dictionaries. The first dictionary contains the page number as key and the corresponding PNG image in bytes as value. The second dictionary contains the page number as key and the corresponding text in the page as value.\n    \"\"\"\n    if (\n        page_start > page_end != DOCUMENT_PAGE_UNLIMITED\n        and page_start != DOCUMENT_PAGE_UNLIMITED\n    ):\n        raise ServiceException.from_error_code(\n            CodeEnums.ServiceLocalError, extra_message=\"起始页号应该小于等于结束页号\"\n        )\n\n    if not pdf_content.startswith(b\"%PDF-\"):\n        raise ServiceException.from_error_code(\n            CodeEnums.ServiceLocalError, extra_message=\"PDF 内容格式错误\"\n        )\n\n    pngs = {}\n    texts = {}\n    with fitz.Document(stream=pdf_content, filetype=\"pdf\") as pdf:\n        for i, page in enumerate(pdf):\n            if page_start != DOCUMENT_PAGE_UNLIMITED and i < page_start:\n                continue\n            if page_end != DOCUMENT_PAGE_UNLIMITED and i > page_end:\n                break\n            # rotate = int(0)\n            # Each size zoom factor is 2, which will generate an image with a resolution of 4.","sourceCodeStart":414,"sourceCodeEnd":450,"githubUrl":"https://github.com/iflytek/astron-agent/blob/5e758547a83371a5a4b29dadf4ac03e8dd527635/core/plugin/aitools/service/ocr_llm/req_ase_ability_ocr_service.py#L414-L450","documentation":"pdf_convert_png validates the requested page range before converting. If page_start > page_end and page_end is not the unlimited sentinel (DOCUMENT_PAGE_UNLIMITED) and page_start is also not unlimited, it raises ServiceLocalError saying the start page must be <= end page.","triggerScenarios":"Calling pdf_convert_png with e.g. page_start=5, page_end=2, or page_start=3, page_end=0 when both are concrete numbers.","commonSituations":"Swapped arguments at the call site; computing page indices from UI 1-based vs 0-based values; defaulting page_end to 0 instead of the unlimited sentinel.","solutions":["Ensure page_start <= page_end (or set page_end to DOCUMENT_PAGE_UNLIMITED for open-ended ranges)","Check argument order at the call site (start, end)","Use DOCUMENT_PAGE_UNLIMITED for unbounded ranges instead of 0/-1/None","Validate the range from user input before invoking"],"exampleFix":"// before\npdf_convert_png(pdf_bytes, page_start=5, page_end=2)\n// after\nif page_start > page_end:\n    page_start, page_end = page_end, page_start\npdf_convert_png(pdf_bytes, page_start=page_start, page_end=page_end)","handlingStrategy":"validation","validationCode":"if page_start > page_end != DOCUMENT_PAGE_UNLIMITED and page_start != DOCUMENT_PAGE_UNLIMITED:\n    page_start, page_end = min(page_start, page_end), max(page_start, page_end)","typeGuard":null,"tryCatchPattern":"try:\n    pngs, texts = pdf_convert_png(pdf_bytes, page_start, page_end)\nexcept ServiceException as e:\n    if e.code == CodeEnums.ServiceLocalError.code:\n        log.error('bad page range: %s', e.message)\n        pngs, texts = pdf_convert_png(pdf_bytes, DOCUMENT_PAGE_UNLIMITED, DOCUMENT_PAGE_UNLIMITED)","preventionTips":["Sanitize/swap user-supplied page ranges before calling","Use DOCUMENT_PAGE_UNLIMITED for open-ended ranges, not 0 or -1","Add a regression test for swapped start/end arguments"],"tags":["validation","pdf","page-range"],"backgroundTag":"invalid-argument-value","analyzedSha":"5e758547a83371a5a4b29dadf4ac03e8dd527635","analyzedAt":"2026-09-12T08:03:51.356Z","contentChangedAt":"2026-09-12T08:03:51.356Z","schemaVersion":2},"datasetVersion":"2026-09-19T12:17:13.211Z"}