[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M72A7E3ZDHT03HNJS012QTR7":3,"skill-same:01M72A7E3ZDHT03HNJS012QTR7":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":50,"commitSha":51,"skillDirectory":5,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":55,"install":56,"resources":69},"01M72A7E3ZDHT03HNJS012QTR7","smart-ocr",null,">","claude-office-skills\u002Fskills","claude-office-skills","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F258027507?v=4","01M729XQC9FBRQ54AQZS0KY3ZK","AGI Lab","01M729XQCYW6WF9GY762P9RNQJ",572,"MIT","https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills\u002Fblob\u002Fmain\u002Fsmart-ocr\u002FSKILL.md",[],[],"2026-11-10 18:39:20",false,"---\n# ═══════════════════════════════════════════════════════════════════════════════\n# CLAUDE OFFICE SKILL - Enhanced Metadata v2.0\n# ═══════════════════════════════════════════════════════════════════════════════\n\n# Basic Information\nname: smart-ocr\ndescription: \">\"\nversion: \"1.0\"\nauthor: claude-office-skills\nlicense: MIT\n\n# Categorization\ncategory: parsing\ntags:\n  - ocr\n  - extraction\n  - multilingual\n  - paddleocr\ndepartment: All\n\n# AI Model Compatibility\nmodels:\n  recommended:\n    - claude-sonnet-4\n    - claude-opus-4\n  compatible:\n    - claude-3-5-sonnet\n    - gpt-4\n    - gpt-4o\n\n# MCP Tools Integration\nmcp:\n  server: office-mcp\n  tools:\n    - extract_text_from_pdf\n\n# Skill Capabilities\ncapabilities:\n  - ocr_processing\n  - multilingual_support\n\n# Language Support\nlanguages:\n  - en\n  - zh\n---\n\n# Smart OCR Skill\n\n## Overview\n\nThis 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.\n\n## How to Use\n\n1. Provide the image or scanned document\n2. Optionally specify language(s) to detect\n3. I'll extract text with position and confidence data\n\n**Example prompts:**\n- \"Extract all text from this screenshot\"\n- \"OCR this scanned PDF document\"\n- \"Read the text from this business card photo\"\n- \"Extract Chinese and English text from this image\"\n\n## Domain Knowledge\n\n### PaddleOCR Fundamentals\n\n```python\nfrom 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})\")\n```\n\n### Supported Languages\n\n```python\n# 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\n```\n\n### Configuration Options\n\n```python\nfrom 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)\n```\n\n### Processing Different Sources\n\n#### Image Files\n```python\n# 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)\n```\n\n#### PDF Files (Scanned)\n```python\nfrom 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)\n```\n\n#### URLs and Bytes\n```python\nimport requests\nfrom io import BytesIO\n\n# From URL\nresponse = requests.get('https:\u002F\u002Fexample.com\u002Fimage.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))\n```\n\n### Result Processing\n\n```python\ndef 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']))\n```\n\n### Text Layout Reconstruction\n\n```python\ndef 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)\n```\n\n## Best Practices\n\n1. **Preprocess Images**: Improve quality before OCR\n2. **Choose Correct Language**: Specify language for better accuracy\n3. **Handle Multi-column**: Process columns separately\n4. **Filter Low Confidence**: Skip results below threshold\n5. **Batch Processing**: Process multiple images efficiently\n\n## Common Patterns\n\n### Image Preprocessing\n```python\nfrom 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\n```\n\n### Batch OCR with Progress\n```python\nfrom 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\n```\n\n## Examples\n\n### Example 1: Business Card Reader\n```python\nfrom 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\u002Ffirst 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']}\")\n```\n\n### Example 2: Receipt Scanner\n```python\nfrom 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+)$', 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:\u002F\u002Fgithub.com\u002FPaddlePaddle\u002FPaddleOCR)\n- [Model Zoo](https:\u002F\u002Fgithub.com\u002FPaddlePaddle\u002FPaddleOCR\u002Fblob\u002Frelease\u002F2.7\u002Fdoc\u002Fdoc_en\u002Fmodels_list_en.md)\n- [Multi-language Support](https:\u002F\u002Fgithub.com\u002FPaddlePaddle\u002FPaddleOCR\u002Fblob\u002Frelease\u002F2.7\u002Fdoc\u002Fdoc_en\u002Fmulti_languages_en.md)\n","# Smart OCR Skill\n\n## Overview\n\nThis 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.\n\n## How to Use\n\n1. Provide the image or scanned document\n2. Optionally specify language(s) to detect\n3. I'll extract text with position and confidence data\n\n**Example prompts:**\n- \"Extract all text from this screenshot\"\n- \"OCR this scanned PDF document\"\n- \"Read the text from this business card photo\"\n- \"Extract Chinese and English text from this image\"\n\n## Domain Knowledge\n\n### PaddleOCR Fundamentals\n\n```python\nfrom 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})\")\n```\n\n### Supported Languages\n\n```python\n# 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\n```\n\n### Configuration Options\n\n```python\nfrom 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)\n```\n\n### Processing Different Sources\n\n#### Image Files\n```python\n# 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)\n```\n\n#### PDF Files (Scanned)\n```python\nfrom 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)\n```\n\n#### URLs and Bytes\n```python\nimport requests\nfrom io import BytesIO\n\n# From URL\nresponse = requests.get('https:\u002F\u002Fexample.com\u002Fimage.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))\n```\n\n### Result Processing\n\n```python\ndef 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']))\n```\n\n### Text Layout Reconstruction\n\n```python\ndef 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)\n```\n\n## Best Practices\n\n1. **Preprocess Images**: Improve quality before OCR\n2. **Choose Correct Language**: Specify language for better accuracy\n3. **Handle Multi-column**: Process columns separately\n4. **Filter Low Confidence**: Skip results below threshold\n5. **Batch Processing**: Process multiple images efficiently\n\n## Common Patterns\n\n### Image Preprocessing\n```python\nfrom 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\n```\n\n### Batch OCR with Progress\n```python\nfrom 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\n```\n\n## Examples\n\n### Example 1: Business Card Reader\n```python\nfrom 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\u002Ffirst 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']}\")\n```\n\n### Example 2: Receipt Scanner\n```python\nfrom 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+)$', 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:\u002F\u002Fgithub.com\u002FPaddlePaddle\u002FPaddleOCR)\n- [Model Zoo](https:\u002F\u002Fgithub.com\u002FPaddlePaddle\u002FPaddleOCR\u002Fblob\u002Frelease\u002F2.7\u002Fdoc\u002Fdoc_en\u002Fmodels_list_en.md)\n- [Multi-language Support](https:\u002F\u002Fgithub.com\u002FPaddlePaddle\u002FPaddleOCR\u002Fblob\u002Frelease\u002F2.7\u002Fdoc\u002Fdoc_en\u002Fmulti_languages_en.md)\n",{"mcp":24,"name":5,"tags":28,"author":9,"models":33,"license":15,"version":41,"category":42,"languages":43,"department":46,"description":7,"capabilities":47},{"tools":25,"server":27},[26],"extract_text_from_pdf","office-mcp",[29,30,31,32],"ocr","extraction","multilingual","paddleocr",{"compatible":34,"recommended":38},[35,36,37],"claude-3-5-sonnet","gpt-4","gpt-4o",[39,40],"claude-sonnet-4","claude-opus-4","1.0","parsing",[44,45],"en","zh","All",[48,49],"ocr_processing","multilingual_support","main","9c4c7d5cd2813a8936bf2c9fdb174ea883b85a11",101,"https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills","https:\u002F\u002Fgithub.com\u002Fclaude-office-skills","2026-01-31 22:03:56",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add claude-office-skills\u002Fskills --skill smart-ocr",{"tool":62,"command":63},"bunx","bunx skills add claude-office-skills\u002Fskills --skill smart-ocr",{"tool":65,"command":66},"pnpm","pnpm dlx skills add claude-office-skills\u002Fskills --skill smart-ocr","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills\u002Fblob\u002Fmain\u002Fsmart-ocr\u002FSKILL.md",true,[],[71,78,84,91,98,105],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":19},"01M72A0X7X4TWS4ZWTEK8TJEC8","devops-automation","DevOps and IT Ops automation - CI\u002FCD, monitoring, incident management, and infrastructure workflows","https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills\u002Fblob\u002Fmain\u002Fdevops-automation\u002FSKILL.md",[],[],{"skillNo":79,"name":80,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M72A0VPXF4Q5F48TPDG6S10Q","dev-slides","https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills\u002Fblob\u002Fmain\u002Fdev-slides\u002FSKILL.md",[],[],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":19},"01M72A0Q1T0KN60CR3PAD93J6T","deep-research","Conduct comprehensive research on any topic. Synthesize information from multiple angles, provide structured analysis, and generate detailed research reports.","https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills\u002Fblob\u002Fmain\u002Fdeep-research\u002FSKILL.md",[],[],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":19},"01M72A0KWAYEWQJMDRGC0WTT7V","dcf-valuation","Build Discounted Cash Flow (DCF) valuation models. Calculate intrinsic value with customizable assumptions. Generate professional valuation reports.","https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills\u002Fblob\u002Fmain\u002Fdcf-valuation\u002FSKILL.md",[],[],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":19},"01M72A0GVWRZ3HZNXMW3RB5CF9","Database Sync","Automate database synchronization, replication, migration, and cross-platform data integration","https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills\u002Fblob\u002Fmain\u002Fdatabase-sync\u002FSKILL.md",[],[],{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":19},"01M72A0E16K862EDP0QYEAC9HJ","data-pipeline","Data pipeline and ETL automation - extract, transform, load workflows for data integration and analytics","https:\u002F\u002Fgithub.com\u002Fclaude-office-skills\u002Fskills\u002Fblob\u002Fmain\u002Fdata-pipeline\u002FSKILL.md",[],[]]