PDF OCR + Experiment Extraction
The Python wrapper validates a PDF, uploads it to the AMiner PDF OCR open platform, handles queue backoff, polls the asynchronous job, downloads the temporary result ZIP, and writes compatible local artifacts. The Agent then reads result.md and follows references/experiment_prompt.md to create experiments.json.
Pre-flight
- Confirm
AMINER_API_KEYexists (same token as other AMiner skills). If missing, stop and send the user to https://open.aminer.cn/open/board?tab=control. Never print its value.OPEN_PLATFORM_TOKENis accepted only as a deprecated fallback. - Install
requestsandpypdffromrequirements.txt. - Confirm the input is a local PDF or an HTTP(S) URL. The open platform accepts only unencrypted PDFs of 1-30 pages and at most 10 MiB. Refuse localhost / private-network URLs.
Run
bashpython3 "${CLAUDE_PLUGIN_ROOT}/scripts/ocr.py" --input "/abs/path/to/paper.pdf"
Options include --output-dir, --request-timeout, --poll-timeout, --max-upload-attempts, --no-save-images, and --output. The old local parser, backend, page-range, formula, and table options are not supported.
API contract
- Endpoints:
POST /api/v3/paper/pdfocr/uploadandGET /api/v3/paper/pdfocr/resultonhttps://datacenter.aminer.cn/gateway/open_platform. - Upload and polling use the same token (
AMINER_API_KEY) and sendAuthorization,X-Platform(current host:claude-code/cursor/codex/openclaw;unknownif it cannot be determined),X-Skill-Name: aminer-pdf-ocr, andX-Skill-Version(this file's frontmatterversion). - Upload
code: 202means queued, not completed. A reused upload may returncode: 200; always use its returnedjob_id. - Do not use
success, HTTP status, orcodealone to decide success. Inspectdata.statusanddata.is_finish. preparing,queued, andrunningare polled.successdownloads the ZIP.failed,timeout,queue_timeout,expired, andunknownstop.data.queue_fullis retried with bounded backoff usingretry_after_seconds.- The temporary download URL is fetched directly without Authorization and is not saved in
response.json. - ZIP entries are discovered by
.mdand_middle.jsonsuffixes;document/is not a protocol.
Experiment extraction
Unless OCR-only is explicitly requested, read the complete result.md, follow references/experiment_prompt.md, write one JSON object to experiments.json, and show the same full JSON in the response. Do not add justification fields or invent unsupported experiments, datasets, metrics, or scores. If OCR fails, report the error and do not fabricate extraction output.
Real example
The default local sample is data/pdf/applsci-14-11736.pdf (untracked; place it yourself). The live test is opt-in: set RUN_PDFOCR_LIVE=1 together with AMINER_API_KEY. It is skipped by default and never runs without both the credential and fixture.


