| name | paddleocr-text-recognition |
| description | Use this skill whenever the user wants text extracted from images, photos, scans, screenshots, or scanned PDFs. Returns exact machine-readable strings with line-level text and optional bbox coordinates. Strong accuracy for CJK, small print, and handwritten text. Trigger terms: OCR, 文字识别, 图片转文字, 截图识字, 提取图中文字, 扫描识字, 识字, 纯文字, plain text extraction, 坐标, 检测框, bbox, bounding box, image to text, screenshot, photo scan, recognize text. |
| license | Apache-2.0 |
| metadata | {"openclaw":{"requires":{"env":"[Truncated]"},"primaryEnv":"PADDLEOCR_ACCESS_TOKEN","emoji":"🔤"}} |
PaddleOCR Text Recognition
When to Use This Skill
Use this skill for:
- Extract text from images (screenshots, photos, scans)
- Extract text from PDFs or document images when the goal is line/box-level text
- Extract text from URLs or local files that point to images/PDFs
Do not use for:
- Documents with tables, formulas, charts, or complex layouts — use Document Parsing instead
Usage
Method 1: Python API (Recommended)
Run a Python script to call the PaddleOCR API directly:
import json, os, requests, sys, time
JOB_URL = "https://paddleocr.aistudio-app.com/api/v2/ocr/jobs"
TOKEN = os.environ.get("PADDLEOCR_ACCESS_TOKEN")
MODEL = "PaddleOCR-VL-1.6"
headers = {"Authorization": f"bearer {TOKEN}"}
optional_payload = {
"useDocOrientationClassify": False,
"useDocUnwarping": False,
"useChartRecognition": False,
}
headers["Content-Type"] = "application/json"
payload = {"fileUrl": file_url, "model": MODEL, "optionalPayload": optional_payload}
job_response = requests.post(JOB_URL, json=payload, headers=headers)
data = {"model": MODEL, "optionalPayload": json.dumps(optional_payload)}
with open(file_path, "rb") as f:
job_response = requests.post(JOB_URL, headers=headers, data=data, files={"file": f})
jobId = job_response.json()["data"]["jobId"]
while True:
result = requests.get(f"{JOB_URL}/{jobId}", headers=headers).json()["data"]
if result["state"] == "done":
break
elif result["state"] == "failed":
print(f"Job failed: {result['errorMsg']}")
sys.exit()
time.sleep(5)
jsonl_url = result["resultUrl"]["jsonUrl"]
lines = requests.get(jsonl_url).text.strip().split('\n')
for line in lines:
page_result = json.loads(line)["result"]
for res in page_result["layoutParsingResults"]:
print(res["markdown"]["text"])
Method 2: CLI
paddleocr api \
--model_type ocr \
--file_path "./document.pdf"
Important Notes
- Always use
PADDLEOCR_ACCESS_TOKEN env var for auth, never hardcode tokens
- For flat images (screenshots, properly scanned docs), disable preprocessing for speed:
useDocOrientationClassify: False, useDocUnwarping: False
- Display full extracted content, don't truncate with "..." unless exceeding 10,000 chars
- Handle errors gracefully: auth issues, rate limits, blank images