Skill: zt1314p-design/tencentcloud-ocr-generalaccurate (version 1.0.1)

--- name: tencentcloud-ocr-generalaccurate description: 腾讯云通用文字识别（高精度版）(GeneralAccurateOCR) 技能包。支持图像整体文字的检测和识别，支持中文、英文、中英文、数字和特殊字符号的识别，并返回文字框位置和文字内容。适用于文字较多、版式复杂、对识别准召率要求较高的场景，如网络图片、街景店招牌、法律卷宗、多语种简历等场景。支持图片Base64和URL两种输入方式，同时支持PDF文件识别和单字信息返回。对于简历识别场景，提供专门的结构化解析指引（详见 references/resume-parsing.md）。 --- # 腾讯云通用文字识别（高精度版）(GeneralAccurateOCR) ## 用途 调用腾讯云OCR通用文字识别（高精度版）接口，对图片中的文字进行精准提取。 核心能力： - **文字识别**：高精度识别图片中的文字内容，返回完整识别文本 - **PDF支持**：支持对PDF文件进行文字识别（单页） - **单字信息**：可选返回每个单字的位置和置信度信息 - **多语种简历结构化识别**：基于 OCR 结果，对简历进行结构化提取与格式化输出（详见 `references/resume-parsing.md`） 官方文档：https://cloud.tencent.com/document/api/866/37831 ## 📚 可用资源 ### References（场景化指引） - `references/resume-parsing.md` - 多语种简历结构化识别指引（处理流程、Prompt模板、输出格式化模板、格式化规则） ## 使用时机 当用户提出以下需求时触发此技能： - 需要从图片或PDF中提取文字内容 - 需要对各类文档、图片等进行文字识别 - 涉及通用文字OCR识别的任何场景 - 需要从简历图片/PDF中识别并结构化提取简历信息（请参考 `references/resume-parsing.md` 指引） - 需要对多语种简历进行识别和格式化输出（请参考 `references/resume-parsing.md` 指引） ## 环境要求 - Python 3.6+ - 依赖：`tencentcloud-sdk-python`（通过 `pip install tencentcloud-sdk-python` 安装） - 环境变量： - `TENCENTCLOUD_SECRET_ID`：腾讯云API密钥ID - `TENCENTCLOUD_SECRET_KEY`：腾讯云API密钥Key ## 使用方式 运行 `scripts/main.py` 脚本完成文字识别。 ### 请求参数 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ImageBase64 | str | 否(二选一) | 图片Base64值，不超过10MB | | ImageUrl | str | 否(二选一) | 图片URL地址，优先使用 | | IsPdf | bool | 否 | 是否开启PDF识别，默认false | | PdfPageNumber | int | 否 | 需要识别的PDF页码，IsPdf为true时有效，默认1 | | IsWords | bool | 否 | 是否返回单字信息，默认false | | **UserAgent** | **str** | **否** | **请求来源标识(可选)，用于追踪调用来源，统一固定为`Skills`** | ### ⚠️ UserAgent参数使用指南 **`--user-agent`参数是可选参数**，统一固定为`Skills`，无需手动传递。用于标识API调用来源，便于追踪和统计： | 调用框架 | --user-agent 参数值 | 说明 | |---------|--------------|------| | 所有框架 | `Skills` | 统一固定值，不传递时也默认为此值 | **实现说明**： - 通过`--user-agent`命令行参数传递，SDK 会将其拼接为 `SDK_PYTHON_x.x.x; Skills` 注入到请求中 - 统一固定为`Skills`，未传递时也默认为此值 - 该标识会记录在ES日志的 `ReqBody.RequestClient` 字段中，可用于追踪来源 ### 输出格式 识别成功后返回 JSON 格式结果： ```json { "raw_text": "识别到的完整文字内容\n第二行文字\n第三行文字", "RequestId": "xxx" } ``` 无文字时返回： ```json { "raw_text": "", "message": "No text detected in the image.", "RequestId": "xxx" } ``` ### 调用示例 ```bash # 基础调用示例（--user-agent 默认为 Skills，可不传） python scripts/main.py --image-url "https://example.com/document.jpg" # 使用 Base64 文件调用 python scripts/main.py --image-base64 "/path/to/document.jpg" # 识别 PDF 文件中的文字 python scripts/main.py --image-url "https://example.com/doc.pdf" \ --is-pdf true --pdf-page-number 1 # 返回单字信息 python scripts/main.py --image-url "https://example.com/document.jpg" --is-words true ``` ## 密钥配置 ### Step 1: 获取/购买 OCR 服务 🔗 **[腾讯云文字识别 OCR 购买页](https://buy.cloud.tencent.com/iai_ocr)** 在购买页面中选择 **通用文字识别（高精度版）** 完成购买。 ### Step 2: 获取 API 密钥 🔗 **[腾讯云 API 密钥管理](https://console.cloud.tencent.com/cam/capi)** ### Step 3: 设置环境变量 **Linux / macOS：** ```bash export TENCENTCLOUD_SECRET_ID="你的SecretId" export TENCENTCLOUD_SECRET_KEY="你的SecretKey" ``` **Windows (PowerShell)：** ```powershell $env:TENCENTCLOUD_SECRET_ID = "你的SecretId" $env:TENCENTCLOUD_SECRET_KEY = "你的SecretKey" ```

path: scripts/main.py
content: #!/usr/bin/env python3
"""
腾讯云通用文字识别（高精度版）(GeneralAccurateOCR) 调用脚本

支持对图片中的文字进行高精度识别，返回识别到的文字内容。
需要环境变量: TENCENTCLOUD_SECRET_ID, TENCENTCLOUD_SECRET_KEY

用法:
    python main.py --image-url <url>
    python main.py --image-base64 <base64_or_filepath>
"""

import argparse
import base64
import json
import os
import sys

# SDK 最大图片限制 (10MB)
MAX_IMAGE_SIZE_BYTES = 10 * 1024 * 1024


def validate_env() -> tuple:
    """校验并返回腾讯云API密钥。"""
    secret_id = os.environ.get("TENCENTCLOUD_SECRET_ID")
    secret_key = os.environ.get("TENCENTCLOUD_SECRET_KEY")
    if not secret_id or not secret_key:
        print("错误: 请设置环境变量 TENCENTCLOUD_SECRET_ID 和 TENCENTCLOUD_SECRET_KEY", file=sys.stderr)
        sys.exit(1)
    return secret_id, secret_key


def load_image_base64(value: str) -> str:
    """
    加载 Base64 图片内容。
    如果 value 是一个存在的文件路径，则读取文件内容作为 Base64；
    否则直接视为 Base64 字符串。
    """
    if os.path.isfile(value):
        with open(value, "rb") as f:
            raw = f.read()
        # 如果文件内容本身就是Base64文本(如txt文件)，直接使用
        try:
            raw_str = raw.decode("utf-8").strip()
            base64.b64decode(raw_str, validate=True)
            return raw_str
        except (UnicodeDecodeError, ValueError):
            pass
        # 否则将二进制文件编码为Base64
        if len(raw) > MAX_IMAGE_SIZE_BYTES:
            print(f"错误: 图片文件大小超过 {MAX_IMAGE_SIZE_BYTES // (1024 * 1024)}MB 限制", file=sys.stderr)
            sys.exit(1)
        return base64.b64encode(raw).decode("utf-8")
    else:
        # 直接作为 Base64 字符串使用
        try:
            decoded = base64.b64decode(value, validate=True)
            if len(decoded) > MAX_IMAGE_SIZE_BYTES:
                print(f"错误: 图片大小超过 {MAX_IMAGE_SIZE_BYTES // (1024 * 1024)}MB 限制", file=sys.stderr)
                sys.exit(1)
        except ValueError:
            print("错误: 提供的 ImageBase64 不是合法的 Base64 编码，也不是有效的文件路径", file=sys.stderr)
            sys.exit(1)
        return value


def format_response(resp_json: dict) -> dict:
    """格式化响应结果，提取识别文本。"""
    text_detections = resp_json.get("TextDetections", [])

    if not text_detections:
        return {
            "raw_text": "",
            "message": "No text detected in the image.",
            "RequestId": resp_json.get("RequestId", ""),
        }

    raw_text = "\n".join(item.get("DetectedText", "") for item in text_detections)
    return {
        "raw_text": raw_text,
        "RequestId": resp_json.get("RequestId", ""),
    }


def call_general_accurate_ocr(args: argparse.Namespace) -> None:
    """调用腾讯云 GeneralAccurateOCR 接口。"""
    try:
        from tencentcloud.common import credential
        from tencentcloud.common.profile.client_profile import ClientProfile
        from tencentcloud.common.profile.http_profile import HttpProfile
        from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
        from tencentcloud.ocr.v20181119 import ocr_client, models
    except ImportError:
        print("错误: 缺少依赖 tencentcloud-sdk-python，请执行: pip install tencentcloud-sdk-python", file=sys.stderr)
        sys.exit(1)

    secret_id, secret_key = validate_env()

    # 构建客户端
    cred = credential.Credential(secret_id, secret_key)
    http_profile = HttpProfile()
    http_profile.endpoint = "ocr.tencentcloudapi.com"
    client_profile = ClientProfile()
    client_profile.httpProfile = http_profile
    client_profile.request_client = args.user_agent
    region = args.region if args.region else "ap-guangzhou"
    client = ocr_client.OcrClient(cred, region, client_profile)

    # 构建请求
    req = models.GeneralAccurateOCRRequest()

    if args.image_url:
        req.ImageUrl = args.image_url
    elif args.image_base64:
        req.ImageBase64 = load_image_base64(args.image_base64)
    else:
        print("错误: 必须提供 --image-url 或 --image-base64 之一", file=sys.stderr)
        sys.exit(1)

    if args.is_pdf is not None:
        req.IsPdf = args.is_pdf

    if args.pdf_page_number is not None:
        req.PdfPageNumber = args.pdf_page_number

    if args.is_words is not None:
        req.IsWords = args.is_words

    # 发起请求
    try:
        resp_json_str = client.call_json("GeneralAccurateOCR", req._serialize())
        resp_json = json.loads(resp_json_str)
    except TencentCloudSDKException as e:
        print(f"API调用失败 [{e.code}]: {e.message}", file=sys.stderr)
        if e.requestId:
            print(f"RequestId: {e.requestId}", file=sys.stderr)
        sys.exit(1)

    # 格式化输出
    result = format_response(resp_json)
    print(json.dumps(result, ensure_ascii=False, indent=2))


def build_parser() -> argparse.ArgumentParser:
    """构建命令行参数解析器。"""
    parser = argparse.ArgumentParser(
        description="腾讯云通用文字识别（高精度版）(GeneralAccurateOCR) 调用工具",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  # 基础调用（--user-agent 默认为 Skills，可不传）
  python main.py --image-url "https://example.com/document.jpg"

  # 使用 Base64 文件调用
  python main.py --image-base64 ./document.jpg

  # 识别 PDF 文件中的文字
  python main.py --image-url "https://example.com/doc.pdf" --is-pdf true --pdf-page-number 1

  # 返回单字信息
  python main.py --image-url "https://example.com/document.jpg" --is-words true
        """,
    )

    # 图片输入（二选一）
    img_group = parser.add_mutually_exclusive_group(required=True)
    img_group.add_argument(
        "--image-url",
        type=str,
        help="图片URL地址，支持 HTTP/HTTPS，图片大小不超过10MB",
    )
    img_group.add_argument(
        "--image-base64",
        type=str,
        help="图片Base64字符串，或图片/Base64文本文件的路径",
    )

    # 可选参数
    parser.add_argument(
        "--is-pdf",
        type=lambda x: x.lower() in ("true", "1", "yes"),
        default=None,
        help="是否开启PDF识别，开启后可同时支持图片和PDF的识别 (默认false)",
    )
    parser.add_argument(
        "--pdf-page-number",
        type=int,
        default=None,
        help="需要识别的PDF页面的对应页码，仅支持PDF单页识别，当上传文件为PDF且IsPdf参数值为true时有效，默认值为1",
    )
    parser.add_argument(
        "--is-words",
        type=lambda x: x.lower() in ("true", "1", "yes"),
        default=None,
        help="是否返回单字信息，默认关闭",
    )
    parser.add_argument(
        "--region",
        type=str,
        default=None,
        help="腾讯云地域，默认 ap-guangzhou",
    )
    parser.add_argument(
        "--user-agent",
        type=str,
        default="Skills",
        help="客户端标识，用于统计调用来源，统一固定为 Skills",
    )

    return parser


def main():
    parser = build_parser()
    args = parser.parse_args()
    call_general_accurate_ocr(args)


if __name__ == "__main__":
    main()


path: references/resume-parsing.md
content: # 多语种简历结构化识别指引

## 概述

本 reference 提供基于通用高精度 OCR 的多语种简历结构化识别能力。支持将中文、英文、日文、韩文、法文、德文、西班牙文等多语种简历图片/PDF 进行 OCR 识别与格式化解析，自动提取关键信息并输出排版精美的可读 Markdown 文本。

## 处理流程

```
用户上传简历图片/PDF
        │
        ▼
  调用 scripts/main.py 进行文字识别（通用高精度 OCR）
        │
        ▼
  获取 raw_text 原始文本
        │
        ▼
  大模型根据 Prompt 模板直接提取关键信息并格式化输出可读文本
```

**Step 1**：使用 `scripts/main.py` 对简历图片/PDF 进行 OCR 识别，获取 `raw_text`。

调用示例：

```bash
# 识别简历图片
python scripts/main.py --image-url "https://example.com/resume.jpg"

# 识别简历 PDF
python scripts/main.py --image-url "https://example.com/resume.pdf" \
  --is-pdf true --pdf-page-number 1

# 使用 Base64 文件调用
python scripts/main.py --image-base64 /path/to/resume.jpg
```

**Step 2**：根据下方的 **Prompt 模板** 从 `raw_text` 中一步完成字段提取与格式化输出。

## Prompt 模板

获取到 `raw_text` 后，请按照以下 Prompt 直接提取并格式化输出：

```
你是一个多语种简历解析专家。请根据以下 OCR 识别出的简历原始文本，提取关键信息并按照指定格式排版输出。

## 提取要求（极其重要）

1. **完整保留原文，禁止删减**：必须完整保留简历中每一条描述的全部内容，逐字逐句输出，绝对不能概括、缩写、省略或精简任何内容。每个工作职责、项目描述、技能说明都必须完整呈现原文的所有细节。
2. **语言检测**：先识别简历语言（中文/英文/日文/韩文/法文/德文/西班牙文等）
3. **保留原文语言**：字段值保留简历原文语言，不进行翻译
4. **日期格式**：统一为 "YYYY年MM月" 或 "YYYY.MM" 格式
5. **跳过空模块**：简历中未提及的信息模块直接跳过，不要展示空模块，也不要展示 "⚠️ 该部分信息未在简历中找到" 提示
6. **容错处理**：OCR 可能存在误差，不确定的内容标注在末尾备注中

## 需要提取的信息模块

按以下顺序依次提取（仅展示简历中实际包含的模块）：

1. **基本信息**：姓名、性别、出生日期、年龄、电话、邮箱、现居地、国籍、LinkedIn、个人网站/作品集、个人简介/自我评价
2. **教育经历**（按时间倒序）：学校名称、学位、专业、起止时间、GPA
3. **工作/实习经历**（按时间倒序）：公司名称、职位、起止时间（在职标注"至今"）、工作职责与业绩（逐条完整列出，必须保留原文每一条的全部描述文字，不得缩减）
4. **项目经历**：项目名称、角色、起止时间、项目描述（完整保留原文）、技术栈、项目成果（逐条完整列出）
5. **技能专长**：按类别分组（编程语言、框架、数据库、工具等），每个技能项的描述必须完整保留
6. **语言能力**：语言名称、熟练程度、相关证书
7. **证书资质**：证书名称、颁发机构、获得时间
8. **荣誉奖项**：奖项名称、获奖时间、说明
9. **论文发表**：论文标题、发表刊物/会议、发表时间
10. **兴趣爱好**

## 输出格式

请严格按照下方的 Markdown 排版模板输出可读性强的格式化文本，**不要输出 JSON**，**不要使用 ASCII 边框字符**。

OCR 原始文本：
---
{raw_text}
---

请完整提取所有信息并按照排版模板输出，不要删减任何内容。
```

## 输出格式化模板

完成信息提取后，**必须**将数据转换为以下 **Markdown 排版格式**展示给用户。**不要使用 ASCII 边框字符（如 ┌─┐│└┘├┤═ 等）**，因为中英文混排时这些字符无法对齐，会导致排版混乱。

```markdown
# 📄 简历信息

---

## 👤 基本信息

| 项目 | 内容 |
|------|------|
| 姓名 | {name} |
| 性别 | {gender} |
| 出生日期 | {date_of_birth} |
| 电话 | {phone} |
| 邮箱 | {email} |
| 现居 | {location} |
| LinkedIn | {linkedin} |
| 作品集 | {portfolio} |

> 📝 **个人简介**：{personal_summary}

---

## 🎓 教育经历

### 🏫 {institution} — {major} · {degree}

📅 {start_date} - {end_date} ｜ GPA: {gpa}

{description}

---

## 💼 工作/实习经历

### 🏢 {company} — {position}

📅 {start_date} - {end_date or "至今"}

**工作职责与业绩：**

- {responsibility_1 完整原文，不得删减}
- {responsibility_2 完整原文，不得删减}
- ...

---

### 🏢 {company_2} — {position_2}

📅 {start_date} - {end_date}

**工作职责与业绩：**

- {responsibility_1 完整原文}
- ...

---

## 🚀 项目经历

### 📌 {project_name} — {role}

📅 {start_date} - {end_date}

**项目描述：** {description 完整原文}

**技术栈：** {tech_stack}

**项目成果：**

- {achievement_1 完整原文}
- {achievement_2 完整原文}
- ...

---

## 🛠 技能专长

- **{category_1}**：{items 完整原文描述}
- **{category_2}**：{items 完整原文描述}
- ...

---

## 🌐 语言能力

- **{language_1}**：{proficiency} {certification}
- **{language_2}**：{proficiency} {certification}

---

## 📜 证书资质

- {certification_name} — {issuing_organization}（{date}）
- ...

---

## 🏆 荣誉奖项

- {award_name}（{date}）{description}
- ...

---

## 📚 论文发表

- **{title}** — 发表于 {publication}（{date}）
- ...

---

## 🎯 兴趣爱好

{interest_1}、{interest_2}、...

---

> 📌 **一句话摘要**：{summary}
>
> 💡 **备注**：{additional_info}（如有 OCR 不确定内容）
```

## 格式化规则

1. **完整性第一（最重要）**：必须完整保留简历中每一条描述的全部文字，逐字逐句输出，绝对禁止概括、缩写、省略、精简或改写任何内容。如果原文一条职责有 3 句话，输出也必须是完整的 3 句话
2. **仅展示非空模块**：如果某个信息模块在简历中完全不存在，则跳过该模块，不要展示空模块，不要显示 "⚠️ 该部分信息未在简历中找到" 之类的提示
3. **使用 Markdown 排版**：使用标准 Markdown 格式（标题、表格、列表、分隔线、引用等），**不要使用 ASCII 边框字符**（如 ┌─┐│└┘├┤═ 等），因为中英文混排时这些字符无法对齐
4. **日期格式化**：
   - `start_date` 有值但 `end_date` 为 null 时，显示为 "至今"
   - 日期格式统一为 "YYYY年MM月" 或 "YYYY.MM"
5. **列表项处理**：职责、成果、技能等列表项使用 Markdown 无序列表（`-`）逐条展示
6. **分隔线统一**：每个模块之间用 Markdown 分隔线 `---` 分隔
7. **特殊标注**：如果 OCR 识别存在误差或不确定内容，在末尾备注中说明
8. **一句话摘要**：在最末尾用引用格式输出一句话总结简历亮点

## 格式化输出示例

以下是一份简历的 OCR 结果经解析后，展示给用户的格式化输出示例（注意每条职责都完整保留了原文）：

```markdown
# 📄 简历信息

---

## 👤 基本信息

| 项目 | 内容 |
|------|------|
| 姓名 | 张明 |
| 性别 | 男 |
| 电话 | 138-0000-0000 |
| 邮箱 | [REDACTED_SECRET] |
| 现居 | 北京 |

> 📝 **个人简介**：5年后端开发经验，精通 Java 和 Go，具备大规模分布式系统设计能力，曾主导多个核心系统从0到1的架构设计与落地实施。

---

## 🎓 教育经历

### 🏫 北京大学 — 计算机科学与技术 · 硕士

📅 2017年09月 - 2020年06月 ｜ GPA: 3.8/4.0

---

## 💼 工作经历

### 🏢 某科技有限公司 — 高级后端工程师

📅 2020年07月 - 至今

**工作职责与业绩：**

- 负责核心微服务架构设计与优化，将服务可用性从99.9%提升至99.99%，完成从单体架构到微服务的全面迁移
- 主导数据库中间件的开发，支撑日均10亿级请求，通过读写分离和分库分表策略将查询性能提升300%
- 设计并实现分布式缓存方案，引入Redis Cluster集群，将热点数据访问延迟从50ms降至5ms

---

## 🛠 技能专长

- **编程语言**：精通Java、Go，熟悉Python、Shell脚本
- **框架与中间件**：Spring Boot、gRPC、Kafka、Redis、MySQL、MongoDB
- **DevOps**：Docker、Kubernetes、Jenkins、Prometheus、Grafana

---

## 🌐 语言能力

- **中文**：母语
- **English**：流利（TOEFL 105）

---

## 🎯 兴趣爱好

开源贡献、技术博客写作

---

> 📌 **一句话摘要**：5年后端经验，精通Java/Go，具备大规模分布式系统设计能力，主导核心系统架构升级，GitHub活跃贡献者。
```

## 注意事项

1. **完整性第一（最重要）**：必须完整保留简历原文的每一条内容，绝对禁止概括、删减、精简。每条职责、每条成果都要完整输出原文
2. **使用 Markdown 排版**：使用标准 Markdown 格式输出，禁止使用 ASCII 边框字符（┌─┐│└┘├┤═ 等），避免中英文混排导致的对齐问题
3. **跳过空模块**：简历中不存在的信息模块直接跳过，不要显示空模块或 "未找到" 提示
4. **语言检测优先**：在解析前先识别简历语言，不同语种的简历在版式、惯用写法上有差异
5. **保留原文语言**：字段值保留简历原文语言，不进行翻译，确保信息不失真
6. **容错处理**：OCR 可能存在识别误差，对于模糊或不确定的内容标注在末尾备注中
7. **隐私合规**：输出结果可能包含个人隐私信息，使用时需注意数据安全与合规
8. **最终输出格式**：**必须**输出 Markdown 格式的可读文本，**不要输出 JSON 数据**，**不要使用 ASCII 边框字符**


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal:  | SkillSpector: suspicious (CRITICAL)