Smart OCR Skill Overview This skill enables intelligent text extraction from images and scanned documents using PaddleOCR - a leading OCR engine supporting 100+ languages. Extract text from photos, screenshots, scanned PDFs, and handwritten documents with high accuracy. How to Use 1. Provide the image or scanned document 2. Optionally specify language(s) to detect 3. I'll extract text with position and confidence data Example prompts: - "Extract all text from this screenshot" - "OCR this scanned PDF document" - "Read the text from this business card photo" - "Extract Chinese and English text…

, text)\n if item_match:\n receipt['items'].append({\n 'name': item_match.group(1).strip(),\n 'price': float(item_match.group(2).replace(',', ''))\n })\n \n return receipt\n\nreceipt_data = scan_receipt('receipt.jpg')\nprint(f\"Items: {len(receipt_data['items'])}\")\nprint(f\"Total: ${receipt_data['total']}\")\n```\n\n### Example 3: Multi-language Document\n```python\nfrom paddleocr import PaddleOCR\n\ndef ocr_multilingual(image_path, languages=['en', 'ch']):\n \"\"\"OCR document with multiple languages.\"\"\"\n \n all_results = {}\n \n for lang in languages:\n ocr = PaddleOCR(use_angle_cls=True, lang=lang)\n result = ocr.ocr(image_path)\n \n texts = []\n for line in result[0]:\n texts.append({\n 'text': line[1][0],\n 'confidence': line[1][1]\n })\n \n all_results[lang] = texts\n \n # Merge results, keeping highest confidence\n merged = {}\n for lang, texts in all_results.items():\n for item in texts:\n text = item['text']\n conf = item['confidence']\n \n if text not in merged or merged[text]['confidence'] \u003c conf:\n merged[text] = {'confidence': conf, 'language': lang}\n \n return merged\n\nresult = ocr_multilingual('bilingual_document.png')\nfor text, info in result.items():\n print(f\"[{info['language']}] {text} ({info['confidence']:.2f})\")\n```\n\n## Limitations\n\n- Handwritten text accuracy varies\n- Very small text may not be detected\n- Complex backgrounds reduce accuracy\n- Rotated text needs angle classification\n- GPU recommended for best performance\n\n## Installation\n\n```bash\n# CPU version\npip install paddlepaddle paddleocr\n\n# GPU version (CUDA 11.x)\npip install paddlepaddle-gpu paddleocr\n\n# Additional dependencies\npip install pdf2image Pillow\n```\n\n## Resources\n\n- [PaddleOCR GitHub](https://github.com/PaddlePaddle/PaddleOCR)\n- [Model Zoo](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/doc/doc_en/models_list_en.md)\n- [Multi-language Support](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/doc/doc_en/multi_languages_en.md)","attachment_filenames":[],"attachments":[],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Smart OCR Skill","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Overview","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill enables intelligent text extraction from images and scanned documents using ","type":"text"},{"text":"PaddleOCR","type":"text","marks":[{"type":"strong"}]},{"text":" - a leading OCR engine supporting 100+ languages. Extract text from photos, screenshots, scanned PDFs, and handwritten documents with high accuracy.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"How to Use","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Provide the image or scanned document","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optionally specify language(s) to detect","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"I'll extract text with position and confidence data","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example prompts:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Extract all text from this screenshot\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"OCR this scanned PDF document\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Read the text from this business card photo\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Extract Chinese and English text from this image\"","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Domain Knowledge","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"PaddleOCR Fundamentals","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from paddleocr import PaddleOCR\n\n# Initialize OCR engine\nocr = PaddleOCR(use_angle_cls=True, lang='en')\n\n# Run OCR on image\nresult = ocr.ocr('image.png', cls=True)\n\n# Result structure: [[box, (text, confidence)], ...]\nfor line in result[0]:\n box = line[0] # [[x1,y1], [x2,y2], [x3,y3], [x4,y4]]\n text = line[1][0] # Extracted text\n conf = line[1][1] # Confidence score\n print(f\"{text} ({conf:.2f})\")","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Supported Languages","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"# Common language codes\nlanguages = {\n 'en': 'English',\n 'ch': 'Chinese (Simplified)',\n 'cht': 'Chinese (Traditional)',\n 'japan': 'Japanese',\n 'korean': 'Korean',\n 'french': 'French',\n 'german': 'German',\n 'spanish': 'Spanish',\n 'russian': 'Russian',\n 'arabic': 'Arabic',\n 'hindi': 'Hindi',\n 'vi': 'Vietnamese',\n 'th': 'Thai',\n # ... 100+ languages supported\n}\n\n# Use specific language\nocr = PaddleOCR(lang='ch') # Chinese\nocr = PaddleOCR(lang='japan') # Japanese\nocr = PaddleOCR(lang='multilingual') # Auto-detect","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Configuration Options","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from paddleocr import PaddleOCR\n\nocr = PaddleOCR(\n # Detection settings\n det_model_dir=None, # Custom detection model\n det_limit_side_len=960, # Max side length for detection\n det_db_thresh=0.3, # Binarization threshold\n det_db_box_thresh=0.5, # Box score threshold\n \n # Recognition settings\n rec_model_dir=None, # Custom recognition model\n rec_char_dict_path=None, # Custom character dictionary\n \n # Angle classification\n use_angle_cls=True, # Enable angle classification\n cls_model_dir=None, # Custom classification model\n \n # Language\n lang='en', # Language code\n \n # Performance\n use_gpu=True, # Use GPU if available\n gpu_mem=500, # GPU memory limit (MB)\n enable_mkldnn=True, # CPU optimization\n \n # Output\n show_log=False, # Suppress logs\n)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Processing Different Sources","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Image Files","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"# Single image\nresult = ocr.ocr('image.png')\n\n# Multiple images\nimages = ['img1.png', 'img2.png', 'img3.png']\nfor img in images:\n result = ocr.ocr(img)\n process_result(result)","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"PDF Files (Scanned)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from pdf2image import convert_from_path\n\ndef ocr_pdf(pdf_path):\n \"\"\"OCR a scanned PDF.\"\"\"\n # Convert PDF pages to images\n images = convert_from_path(pdf_path)\n \n all_text = []\n for i, img in enumerate(images):\n # Save temp image\n temp_path = f'temp_page_{i}.png'\n img.save(temp_path)\n \n # OCR the image\n result = ocr.ocr(temp_path)\n \n # Extract text\n page_text = '\\n'.join([line[1][0] for line in result[0]])\n all_text.append(f\"--- Page {i+1} ---\\n{page_text}\")\n \n os.remove(temp_path)\n \n return '\\n\\n'.join(all_text)","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"URLs and Bytes","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"import requests\nfrom io import BytesIO\n\n# From URL\nresponse = requests.get('https://example.com/image.png')\nresult = ocr.ocr(BytesIO(response.content))\n\n# From bytes\nwith open('image.png', 'rb') as f:\n img_bytes = f.read()\nresult = ocr.ocr(BytesIO(img_bytes))","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Result Processing","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"def process_ocr_result(result):\n \"\"\"Process OCR result into structured data.\"\"\"\n \n lines = []\n for line in result[0]:\n box = line[0]\n text = line[1][0]\n confidence = line[1][1]\n \n # Calculate bounding box\n x_coords = [p[0] for p in box]\n y_coords = [p[1] for p in box]\n \n lines.append({\n 'text': text,\n 'confidence': confidence,\n 'bbox': {\n 'left': min(x_coords),\n 'top': min(y_coords),\n 'right': max(x_coords),\n 'bottom': max(y_coords),\n },\n 'raw_box': box\n })\n \n return lines\n\n# Sort by position (top to bottom, left to right)\ndef sort_by_position(lines):\n return sorted(lines, key=lambda x: (x['bbox']['top'], x['bbox']['left']))","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Text Layout Reconstruction","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"def reconstruct_layout(result, line_threshold=10):\n \"\"\"Reconstruct text layout from OCR results.\"\"\"\n \n lines = process_ocr_result(result)\n lines = sort_by_position(lines)\n \n # Group into logical lines\n text_lines = []\n current_line = []\n current_y = None\n \n for line in lines:\n y = line['bbox']['top']\n \n if current_y is None or abs(y - current_y) \u003c line_threshold:\n current_line.append(line)\n current_y = y\n else:\n # New line\n text_lines.append(' '.join([l['text'] for l in current_line]))\n current_line = [line]\n current_y = y\n \n # Add last line\n if current_line:\n text_lines.append(' '.join([l['text'] for l in current_line]))\n \n return '\\n'.join(text_lines)","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Best Practices","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Preprocess Images","type":"text","marks":[{"type":"strong"}]},{"text":": Improve quality before OCR","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Choose Correct Language","type":"text","marks":[{"type":"strong"}]},{"text":": Specify language for better accuracy","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Handle Multi-column","type":"text","marks":[{"type":"strong"}]},{"text":": Process columns separately","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Filter Low Confidence","type":"text","marks":[{"type":"strong"}]},{"text":": Skip results below threshold","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Batch Processing","type":"text","marks":[{"type":"strong"}]},{"text":": Process multiple images efficiently","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Common Patterns","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Image Preprocessing","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from PIL import Image, ImageEnhance, ImageFilter\n\ndef preprocess_image(image_path):\n \"\"\"Preprocess image for better OCR.\"\"\"\n img = Image.open(image_path)\n \n # Convert to grayscale\n img = img.convert('L')\n \n # Enhance contrast\n enhancer = ImageEnhance.Contrast(img)\n img = enhancer.enhance(2.0)\n \n # Sharpen\n img = img.filter(ImageFilter.SHARPEN)\n \n # Save preprocessed\n preprocessed_path = 'preprocessed.png'\n img.save(preprocessed_path)\n \n return preprocessed_path","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Batch OCR with Progress","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from tqdm import tqdm\nfrom concurrent.futures import ThreadPoolExecutor\n\ndef batch_ocr(image_paths, max_workers=4):\n \"\"\"OCR multiple images in parallel.\"\"\"\n \n results = {}\n \n def process_single(img_path):\n result = ocr.ocr(img_path)\n return img_path, result\n \n with ThreadPoolExecutor(max_workers=max_workers) as executor:\n futures = [executor.submit(process_single, p) for p in image_paths]\n \n for future in tqdm(futures, desc=\"Processing OCR\"):\n path, result = future.result()\n results[path] = result\n \n return results","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Examples","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Example 1: Business Card Reader","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from paddleocr import PaddleOCR\nimport re\n\ndef read_business_card(image_path):\n \"\"\"Extract contact info from business card.\"\"\"\n \n ocr = PaddleOCR(use_angle_cls=True, lang='en')\n result = ocr.ocr(image_path)\n \n # Extract all text\n all_text = []\n for line in result[0]:\n all_text.append(line[1][0])\n \n full_text = '\\n'.join(all_text)\n \n # Parse contact info\n contact = {\n 'name': None,\n 'email': None,\n 'phone': None,\n 'company': None,\n 'title': None,\n 'raw_text': full_text\n }\n \n # Email pattern\n email_match = re.search(r'[\\w\\.-]+@[\\w\\.-]+\\.\\w+', full_text)\n if email_match:\n contact['email'] = email_match.group()\n \n # Phone pattern\n phone_match = re.search(r'[\\+\\d][\\d\\s\\-\\(\\)]{8,}', full_text)\n if phone_match:\n contact['phone'] = phone_match.group().strip()\n \n # Name is usually the largest/first text\n if all_text:\n contact['name'] = all_text[0]\n \n return contact\n\ncard_info = read_business_card('business_card.jpg')\nprint(f\"Name: {card_info['name']}\")\nprint(f\"Email: {card_info['email']}\")\nprint(f\"Phone: {card_info['phone']}\")","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Example 2: Receipt Scanner","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from paddleocr import PaddleOCR\nimport re\n\ndef scan_receipt(image_path):\n \"\"\"Extract items and total from receipt.\"\"\"\n \n ocr = PaddleOCR(use_angle_cls=True, lang='en')\n result = ocr.ocr(image_path)\n \n lines = []\n for line in result[0]:\n text = line[1][0]\n y_pos = line[0][0][1]\n lines.append({'text': text, 'y': y_pos})\n \n # Sort by vertical position\n lines.sort(key=lambda x: x['y'])\n \n receipt = {\n 'items': [],\n 'subtotal': None,\n 'tax': None,\n 'total': None\n }\n \n for line in lines:\n text = line['text']\n \n # Look for total\n if 'total' in text.lower():\n amount = re.search(r'\\$?([\\d,]+\\.?\\d*)', text)\n if amount:\n if 'sub' in text.lower():\n receipt['subtotal'] = float(amount.group(1).replace(',', ''))\n else:\n receipt['total'] = float(amount.group(1).replace(',', ''))\n \n # Look for tax\n elif 'tax' in text.lower():\n amount = re.search(r'\\$?([\\d,]+\\.?\\d*)', text)\n if amount:\n receipt['tax'] = float(amount.group(1).replace(',', ''))\n \n # Look for items (line with price)\n else:\n item_match = re.search(r'(.+?)\\s+\\$?([\\d,]+\\.?\\d+)

Smart OCR Skill Overview This skill enables intelligent text extraction from images and scanned documents using PaddleOCR - a leading OCR engine supporting 100+ languages. Extract text from photos, screenshots, scanned PDFs, and handwritten documents with high accuracy. How to Use 1. Provide the image or scanned document 2. Optionally specify language(s) to detect 3. I'll extract text with position and confidence data Example prompts: - "Extract all text from this screenshot" - "OCR this scanned PDF document" - "Read the text from this business card photo" - "Extract Chinese and English text…

, text)\n if item_match:\n receipt['items'].append({\n 'name': item_match.group(1).strip(),\n 'price': float(item_match.group(2).replace(',', ''))\n })\n \n return receipt\n\nreceipt_data = scan_receipt('receipt.jpg')\nprint(f\"Items: {len(receipt_data['items'])}\")\nprint(f\"Total: ${receipt_data['total']}\")","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Example 3: Multi-language Document","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from paddleocr import PaddleOCR\n\ndef ocr_multilingual(image_path, languages=['en', 'ch']):\n \"\"\"OCR document with multiple languages.\"\"\"\n \n all_results = {}\n \n for lang in languages:\n ocr = PaddleOCR(use_angle_cls=True, lang=lang)\n result = ocr.ocr(image_path)\n \n texts = []\n for line in result[0]:\n texts.append({\n 'text': line[1][0],\n 'confidence': line[1][1]\n })\n \n all_results[lang] = texts\n \n # Merge results, keeping highest confidence\n merged = {}\n for lang, texts in all_results.items():\n for item in texts:\n text = item['text']\n conf = item['confidence']\n \n if text not in merged or merged[text]['confidence'] \u003c conf:\n merged[text] = {'confidence': conf, 'language': lang}\n \n return merged\n\nresult = ocr_multilingual('bilingual_document.png')\nfor text, info in result.items():\n print(f\"[{info['language']}] {text} ({info['confidence']:.2f})\")","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Limitations","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Handwritten text accuracy varies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Very small text may not be detected","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Complex backgrounds reduce accuracy","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rotated text needs angle classification","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GPU recommended for best performance","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Installation","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# CPU version\npip install paddlepaddle paddleocr\n\n# GPU version (CUDA 11.x)\npip install paddlepaddle-gpu paddleocr\n\n# Additional dependencies\npip install pdf2image Pillow","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Resources","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"PaddleOCR GitHub","type":"text","marks":[{"type":"link","attrs":{"href":"https://github.com/PaddlePaddle/PaddleOCR","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Model Zoo","type":"text","marks":[{"type":"link","attrs":{"href":"https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/doc/doc_en/models_list_en.md","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Multi-language Support","type":"text","marks":[{"type":"link","attrs":{"href":"https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/doc/doc_en/multi_languages_en.md","title":null}}]}]}]}]}]},"metadata":{"mcp":{"tools":["extract_text_from_pdf"],"server":"office-mcp"},"date":"2026-11-02","name":"smart-ocr","tags":["ocr","extraction","multilingual","paddleocr"],"author":"claude-office-skills","models":{"compatible":["claude-3-5-sonnet","gpt-4","gpt-4o"],"recommended":["claude-sonnet-4","claude-opus-4"]},"source":{"stars":558,"repo_name":"skills","origin_url":"https://github.com/claude-office-skills/skills/blob/HEAD/smart-ocr/SKILL.md","repo_owner":"claude-office-skills","body_sha256":"638ce63334fa81873929e905a328aa83e63d4c17ac7c0eb9a32a729255431f16","cluster_key":"e2dbf3e02fa1460b9a6e6fe87724ebdafd8d11c5937e43d63493176195b1c3d8","clean_bundle":{"format":"clean-skill-bundle-v1","source":"claude-office-skills/skills/smart-ocr/SKILL.md","text_bytes":0,"source_commit":"9c4c7d5cd2813a8936bf2c9fdb174ea883b85a11","skills_sh_rank":2872,"attachment_count":0,"text_attachments":0,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"smart-ocr/SKILL.md","import_metadata":{"date":"2026-11-02","author":"claude-office-skills","version":"1.0","category":"documents-office","category_label":"Documents"},"exact_dupes_collapsed_into_this":0},"license":"MIT","version":"1.0","category":"documents-office","languages":["en","zh"],"department":"All","import_tag":"skills-sh-top20k-2026-11","description":"This skill enables intelligent text extraction from images and scanned documents using PaddleOCR - a leading OCR engine supporting 100+ languages. Extract text from photos, screenshots, scanned PDFs, and handwritten documents with high accuracy.","capabilities":["ocr_processing","multilingual_support"]}},"renderedAt":1793666053849}

Smart OCR Skill Overview This skill enables intelligent text extraction from images and scanned documents using PaddleOCR - a leading OCR engine supporting 100+ languages. Extract text from photos, screenshots, scanned PDFs, and handwritten documents with high accuracy. How to Use 1. Provide the image or scanned document 2. Optionally specify language(s) to detect 3. I'll extract text with position and confidence data Example prompts: - "Extract all text from this screenshot" - "OCR this scanned PDF document" - "Read the text from this business card photo" - "Extract Chinese and English text…