{"product_id":"ocr-với-claude-trich-xuất-text-từ-hinh-ảnh-va-tai-liệu","title":"OCR với Claude — Trích xuất text từ hình ảnh và tài liệu","description":"\n\u003cp\u003eOCR (Optical Character Recognition) là bài toán cổ điển trong xử lý hình ảnh — nhận diện và trích xuất text từ ảnh. Các giải pháp OCR truyền thống như Tesseract hoạt động tốt với tài liệu in đều, nhưng gặp khó khăn với ảnh nghiêng, font chữ lạ, hoặc chữ viết tay.\u003c\/p\u003e\n\n\u003cp\u003eClaude Vision thay đổi cuộc chơi: không chỉ \u003cstrong\u003eđọc text\u003c\/strong\u003e mà còn \u003cstrong\u003ehiểu context\u003c\/strong\u003e — biết đây là hóa đơn, danh thiếp, hay biên bản họp, và trả về thông tin theo cấu trúc phù hợp.\u003c\/p\u003e\n\n\u003ch2\u003eTại sao Claude OCR tốt hơn Tesseract?\u003c\/h2\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n\u003cth\u003eTiêu chí\u003c\/th\u003e\n\u003cth\u003eTesseract (truyền thống)\u003c\/th\u003e\n\u003cth\u003eClaude Vision\u003c\/th\u003e\n\u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n\u003ctd\u003eẢnh nghiêng, xoay\u003c\/td\u003e\n\u003ctd\u003eCần pre-process\u003c\/td\u003e\n\u003ctd\u003eXử lý được trực tiếp\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eFont lạ, chữ tay\u003c\/td\u003e\n\u003ctd\u003eĐộ chính xác thấp\u003c\/td\u003e\n\u003ctd\u003eKhá tốt\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eTiếng Việt có dấu\u003c\/td\u003e\n\u003ctd\u003eCần cấu hình đặc biệt\u003c\/td\u003e\n\u003ctd\u003eNative support\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eHiểu cấu trúc tài liệu\u003c\/td\u003e\n\u003ctd\u003eKhông\u003c\/td\u003e\n\u003ctd\u003eCó (bảng, form, hóa đơn)\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eTrả về JSON có structure\u003c\/td\u003e\n\u003ctd\u003eKhông, chỉ raw text\u003c\/td\u003e\n\u003ctd\u003eCó thể yêu cầu\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eChi phí\u003c\/td\u003e\n\u003ctd\u003eMiễn phí, local\u003c\/td\u003e\n\u003ctd\u003eTính theo token\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eTốc độ với batch lớn\u003c\/td\u003e\n\u003ctd\u003eNhanh hơn\u003c\/td\u003e\n\u003ctd\u003eChậm hơn, có rate limit\u003c\/td\u003e\n\u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003e\u003cstrong\u003eKết luận:\u003c\/strong\u003e Dùng Tesseract cho batch lớn tài liệu in chuẩn. Dùng Claude khi cần độ chính xác cao với tài liệu phức tạp, hoặc khi cần structured output.\u003c\/p\u003e\n\n\u003ch2\u003eOCR cơ bản — Trích xuất raw text\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\nimport base64\n\ndef ocr_image(image_path: str, language: str = \"Vietnamese\") -\u0026gt; str:\n    \"\"\"\n    Trich xuat toan bo van ban tu mot anh.\n\n    Args:\n        image_path: Duong dan den file anh\n        language: Ngon ngu chinh trong anh\n\n    Returns:\n        Van ban duoc trich xuat\n    \"\"\"\n    with open(image_path, \"rb\") as f:\n        data = base64.standard_b64encode(f.read()).decode()\n\n    # Xac dinh media type\n    ext = image_path.lower().rsplit(\".\", 1)[-1]\n    media_types = {\n        \"jpg\": \"image\/jpeg\", \"jpeg\": \"image\/jpeg\",\n        \"png\": \"image\/png\", \"gif\": \"image\/gif\", \"webp\": \"image\/webp\"\n    }\n    media_type = media_types.get(ext, \"image\/jpeg\")\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=4096,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"image\",\n                        \"source\": {\"type\": \"base64\", \"media_type\": media_type, \"data\": data}\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": f\"\"\"Trich xuat toan bo van ban trong hinh anh nay.\nNgon ngu chinh: {language}.\n\nHuong dan:\n- Giu nguyen dinh dang nguyen ban (xuat xuong dong, tab, khoang trang)\n- Khong them nhan xet hay mo ta\n- Neu co phan nao khong ro, danh dau [KHONG RO]\n- Chi tra ve van ban, khong co gi them\"\"\"\n                    }\n                ]\n            }\n        ]\n    )\n    return message.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eOCR có cấu trúc — Trích xuất theo field\u003c\/h2\u003e\n\n\u003ch3\u003eĐọc hóa đơn \/ receipt\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003edef extract_receipt(image_path: str) -\u0026gt; dict:\n    \"\"\"Trich xuat thong tin tu hoa don mua sam.\"\"\"\n    with open(image_path, \"rb\") as f:\n        data = base64.standard_b64encode(f.read()).decode()\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=2048,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"image\",\n                        \"source\": {\"type\": \"base64\", \"media_type\": \"image\/jpeg\", \"data\": data}\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"\"\"Trich xuat thong tin tu hoa don nay va tra ve JSON voi format sau:\n\n{\n  \"store_name\": \"ten cua hang\",\n  \"date\": \"ngay (DD\/MM\/YYYY)\",\n  \"time\": \"gio (HH:MM)\",\n  \"items\": [\n    {\"name\": \"ten san pham\", \"quantity\": so_luong, \"unit_price\": don_gia, \"total\": thanh_tien}\n  ],\n  \"subtotal\": tong_truoc_thue,\n  \"tax\": tien_thue,\n  \"total\": tong_cuoi,\n  \"payment_method\": \"hinh_thuc_thanh_toan\",\n  \"cashier\": \"thu_ngan_neu_co\"\n}\n\nChi tra ve JSON, khong them gi khac.\"\"\"\n                    }\n                ]\n            }\n        ]\n    )\n\n    import json\n    try:\n        return json.loads(message.content[0].text)\n    except json.JSONDecodeError:\n        return {\"raw\": message.content[0].text}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eĐọc danh thiếp (business card)\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003edef extract_business_card(image_path: str) -\u0026gt; dict:\n    \"\"\"Trich xuat thong tin lien lac tu danh thiec.\"\"\"\n    with open(image_path, \"rb\") as f:\n        data = base64.standard_b64encode(f.read()).decode()\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=512,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"image\",\n                        \"source\": {\"type\": \"base64\", \"media_type\": \"image\/jpeg\", \"data\": data}\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"\"\"Trich xuat thong tin tu danh thiec nay, tra ve JSON:\n\n{\n  \"name\": \"ho ten day du\",\n  \"title\": \"chuc danh\",\n  \"company\": \"ten cong ty\",\n  \"email\": \"email hoac null\",\n  \"phone\": [\"so dien thoai 1\", \"so 2 neu co\"],\n  \"address\": \"dia chi hoac null\",\n  \"website\": \"website hoac null\",\n  \"social\": {\"linkedin\": \"...\", \"facebook\": \"...\"}\n}\n\nChi tra ve JSON.\"\"\"\n                    }\n                ]\n            }\n        ]\n    )\n\n    import json\n    try:\n        return json.loads(message.content[0].text)\n    except json.JSONDecodeError:\n        return {\"raw\": message.content[0].text}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eXử lý chữ viết tay\u003c\/h2\u003e\n\n\u003cp\u003eChữ viết tay là thách thức lớn với OCR truyền thống nhưng Claude xử lý khá tốt:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef transcribe_handwriting(\n    image_path: str,\n    context: str = \"\"\n) -\u0026gt; str:\n    \"\"\"\n    Chuyen chu viet tay thanh text.\n\n    Args:\n        image_path: Anh chua chu viet tay\n        context: Nguyen canh (e.g. \"don thuoc\", \"bien ban hop\", \"nhat ky\")\n    \"\"\"\n    with open(image_path, \"rb\") as f:\n        data = base64.standard_b64encode(f.read()).decode()\n\n    context_hint = f\"Day la {context}. \" if context else \"\"\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-opus-4-5\",  # Dung Opus cho handwriting phuc tap\n        max_tokens=4096,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"image\",\n                        \"source\": {\"type\": \"base64\", \"media_type\": \"image\/jpeg\", \"data\": data}\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": f\"\"\"{context_hint}Hay doc va chuyen chu viet tay trong anh thanh van ban dang.\n\nLuu y:\n- Co gang doc chinh xac tung chu\n- Giu nguyen cau truc doan van va xuong dong\n- Neu mot tu khong ro, doan hop ly va danh dau voi [?]\n- Dung doan moi khi co khoang trong lon trong anh\n- Tra ve van ban thuan tuy\"\"\"\n                    }\n                ]\n            }\n        ]\n    )\n    return message.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTiếng Việt — Xử lý dấu thanh\u003c\/h2\u003e\n\n\u003cp\u003eClaude đọc tiếng Việt tốt hơn Tesseract đáng kể vì được train trên lượng lớn text Việt. Tuy nhiên có một số lưu ý:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef ocr_vietnamese_document(image_path: str) -\u0026gt; str:\n    \"\"\"OCR cho tai lieu tieng Viet.\"\"\"\n    with open(image_path, \"rb\") as f:\n        data = base64.standard_b64encode(f.read()).decode()\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=4096,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"image\",\n                        \"source\": {\"type\": \"base64\", \"media_type\": \"image\/jpeg\", \"data\": data}\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"\"\"Day la tai lieu tieng Viet. Trich xuat toan bo noi dung.\n\nYeu cau quan trong:\n- Giu nguyen dau thanh dieu (a, a, a, a, a, v.v.)\n- Giu nguyen dac tu (d, d) va chu co dau mui ten (u, u, o, o, a, e)\n- Neu font kho doc dan den sai dau, hay su dung nguyen canh de suy luan\n- Khong thay the tieng Viet bang tieng Anh\n- Tra ve van ban thuan tuy, giu nguyen dinh dang\"\"\"\n                    }\n                ]\n            }\n        ]\n    )\n    return message.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBatch OCR — Xử lý nhiều trang\u003c\/h2\u003e\n\n\u003cp\u003eKhi cần OCR nhiều ảnh (ví dụ: tài liệu nhiều trang đã scan), xử lý tuần tự với rate limiting:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport time\nfrom pathlib import Path\n\ndef batch_ocr(\n    image_paths: list,\n    output_dir: str = \"ocr_output\",\n    delay: float = 0.5\n) -\u0026gt; dict:\n    \"\"\"\n    OCR nhieu anh, luu ket qua ra file.\n\n    Args:\n        image_paths: Danh sach duong dan anh\n        output_dir: Thu muc luu ket qua\n        delay: Delay giua cac request (giay)\n\n    Returns:\n        Dict {filename: extracted_text}\n    \"\"\"\n    Path(output_dir).mkdir(exist_ok=True)\n    results = {}\n\n    for i, path in enumerate(image_paths):\n        print(f\"Dang xu ly {i+1}\/{len(image_paths)}: {path}\")\n\n        try:\n            text = ocr_image(path)\n            results[path] = text\n\n            # Luu ra file rieng\n            out_path = Path(output_dir) \/ (Path(path).stem + \".txt\")\n            with open(out_path, \"w\", encoding=\"utf-8\") as f:\n                f.write(text)\n\n        except Exception as e:\n            print(f\"Loi khi xu ly {path}: {e}\")\n            results[path] = f\"ERROR: {e}\"\n\n        # Rate limiting\n        if i \u0026lt; len(image_paths) - 1:\n            time.sleep(delay)\n\n    return results\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTips để tăng độ chính xác OCR\u003c\/h2\u003e\n\n\u003ch3\u003e1. Pre-process ảnh trước khi gửi\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom PIL import Image, ImageEnhance, ImageFilter\n\ndef enhance_for_ocr(image_path: str) -\u0026gt; bytes:\n    \"\"\"Tang chat luong anh truoc khi OCR.\"\"\"\n    with Image.open(image_path) as img:\n        # Chuyen sang grayscale neu can\n        if img.mode not in (\"L\", \"RGB\"):\n            img = img.convert(\"RGB\")\n\n        # Tang contrast\n        enhancer = ImageEnhance.Contrast(img)\n        img = enhancer.enhance(2.0)\n\n        # Tang do sac net\n        img = img.filter(ImageFilter.SHARPEN)\n\n        # Luu vao buffer\n        import io\n        buf = io.BytesIO()\n        img.save(buf, format=\"JPEG\", quality=95)\n        return buf.getvalue()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003e2. Cung cấp context cho Claude\u003c\/h3\u003e\n\n\u003cp\u003eLuôn nói với Claude đây là loại tài liệu gì — điều này giúp nó suy luận đúng hơn khi gặp phần khó đọc:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Thay vi\n\"Trich xuat van ban\"\n\n# Nen dung\n\"Day la hoa don VAT cua mot cua hang ban le. Trich xuat toan bo noi dung.\"\n\n# Hoac\n\"Day la bien ban cuoc hop cua mot cong ty Viet Nam. Doc va chuyen chu viet tay thanh van ban.\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003e3. Chia nhỏ tài liệu lớn\u003c\/h3\u003e\n\n\u003cp\u003eVới tài liệu nhiều thông tin, chia nhỏ câu hỏi thay vì hỏi tất cả một lúc:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef extract_invoice_in_parts(image_path: str) -\u0026gt; dict:\n    \"\"\"Trich xuat hoa don theo tung phan.\"\"\"\n    # Phan 1: Thong tin chung\n    header = ask_about_image(image_path,\n        \"Chi trich xuat: so hoa don, ngay, ten ben ban, ten ben mua. JSON only.\")\n\n    # Phan 2: Line items\n    items = ask_about_image(image_path,\n        \"Chi trich xuat danh sach san pham\/dich vu voi gia. JSON array only.\")\n\n    # Phan 3: Tong ket\n    totals = ask_about_image(image_path,\n        \"Chi trich xuat: tong tien, thue, tong cuoi, hinh thuc thanh toan. JSON only.\")\n\n    return {\"header\": header, \"items\": items, \"totals\": totals}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKhi nào Claude OCR không phù hợp?\u003c\/h2\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eBatch hàng nghìn trang\u003c\/strong\u003e — Chi phí cao, dùng Tesseract hoặc Google Document AI\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eReal-time OCR\u003c\/strong\u003e — Latency API không phù hợp cho ứng dụng scan liên tục\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTài liệu in đều, font chuẩn\u003c\/strong\u003e — Tesseract đủ tốt và miễn phí\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCần on-premise, không gửi data ra ngoài\u003c\/strong\u003e — Claude là cloud API\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eTổng kết\u003c\/h2\u003e\n\n\u003cp\u003eClaude Vision là công cụ OCR mạnh mẽ khi bạn cần:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003eĐọc tài liệu phức tạp (ảnh nghiêng, font lạ, chữ tay)\u003c\/li\u003e\n  \u003cli\u003eTrả về structured data (JSON) thay vì raw text\u003c\/li\u003e\n  \u003cli\u003eHỗ trợ tiếng Việt có dấu\u003c\/li\u003e\n  \u003cli\u003eHiểu context tài liệu để suy luận chính xác hơn\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003cp\u003eTiếp theo: Xem \u003ca href=\"\/collections\/ung-dung\"\u003ePhân tích biểu đồ và slide deck\u003c\/a\u003e để ứng dụng Vision vào data analysis, hoặc \u003ca href=\"\/collections\/nang-cao\"\u003eCrop Tool\u003c\/a\u003e khi cần đọc tài liệu với text nhỏ ở nhiều vùng.\u003c\/p\u003e\n","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":66959028191277,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0763\/9531\/5245\/files\/ocr-v_i-claude-trich-xu_t-text-t_-hinh-_nh-va-tai-li_u_74b72e94-f6a0-4eb7-957a-eacf07f5d494.jpg?v=1782891848","url":"https:\/\/claudeae.com\/products\/ocr-v%e1%bb%9bi-claude-trich-xu%e1%ba%a5t-text-t%e1%bb%ab-hinh-%e1%ba%a3nh-va-tai-li%e1%bb%87u","provider":"Claude.vn","version":"1.0","type":"link"}