OCR 与文档字段提取

面向真实泰语文档的 OCR 与文档字段提取

注册即得 100 免费积分,无需绑定银行卡。

Paxa OCR Lite 把 PDF 或图片中的收据、税务发票、表单和报告读成 Markdown 或结构化版面块。Paxa Document Extraction 则把同一页面读进您的 schema 所定义的类型化字段。

格式
PDF、PNG、JPEG、WebP
每次请求
最多 50 页,10 MiB
每页
6.5 积分
模型
paxa-ocr-lite-v1

บริษัท ศตวรรษการค้าd จำกัด (สำนักงานใหญ่)

๙๙ ถนนพระราม ๙ แขวงห้วยขวาง เขตห้วยขวาง กรุงเทพมหานคร ๑๐๓๑๐

เลขประจำตัวผู้เสียภาษีอากร 0 1055 64078 12 7

ใบกำกับภาษี

TAX INVOICE

ต้นฉบับ

เล่มที่ 001 เลขที่ 0042

วันที่ ๓๐ มิถุนายน ๒๕๖๙f

ชื่อผู้ซื้อ
บริษัท กรุณาไทยe จำกัด
ที่อยู่
๑๒๓ ซอยสุขุมวิท ๖๓ แขวงคลองตันเหนือ เขตวัฒนา กรุงเทพมหานคร ๑๐๑๑๐
เลขประจำตัวผู้เสียภาษี
0 1055 61045 67 8
ใบกำกับภาษี
ลำดับรายการจำนวนcจำนวนเงิน
๑เสื้อbโปโลพนักงานปักโลโก้๑๒1,440.00
๒แก้วเซรามิกพิมพ์ลาย๕150.00
๓กล่องบรรจุภัณฑ์๓60.00
รวมเงิน1,650.00
ภาษีมูลค่าเพิ่ม 7%115.50
จำนวนเงินรวมทั้งสิ้น1,765.50

( หนึ่งพันเจ็ดร้อยหกสิบห้าบาทห้าสิบสตางค์ )a

这张税务发票难读在哪里#

这份样本依据《税收法典》第 86/4 条对完整税务发票规定的八项必备内容排版而成,没有使用任何照片。名称和金额均为虚构,栏目则来自法律规定。

来源:Revenue Code s.86/4(在新标签页中打开)rd.go.th(在新标签页中打开)

a

没有词边界

大写金额是一串连续不断的字符,切分和识别必须同时进行。

b

最多四层垂直叠放

เสื้ 在同一列里叠放辅音、上方元音和声调符号,符号的顺序承载着意义。

c

两套数字

法律允许使用泰文数字或阿拉伯数字,真实的发票会在同一页上混用两者。

d

易混淆的字形

图像模糊时,连人类读者也会把 ฅ ค ต ศ ด 认混。多数收据所用的无圈字体让这几组字母更难区分。

e

无圈的 ณ

去掉圆圈后,它看起来像拉丁字母 u,模型就开始用错误的文字作答。

f

两种纪年

๒๕๖๙ 是佛历年份,同一个字段离开页面时必须变成 2026。

模型读出的内容#

两份读取结果都是模型对上方样张的实际响应,原样呈现,未作修改。这里链接的图片正是它读取的内容。

模型实际读取的图像
模型返回的 Markdownoutput: "markdown"
# บริษัท ศตวรรษการค้า จำกัด (สำนักงานใหญ่)
๙๙ ถนนพระราม ๙ แขวงห้วยขวาง เขตห้วยขวาง กรุงเทพมหานคร ๑๐๓๑๐
เลขประจำตัวผู้เสียภาษี 0 1055 64078 12 7

# ใบกำกับภาษี
TAX INVOICE
ต้นฉบับ
เล่มที่ 001 เลขที่ 0042
วันที่ ๓๐ มิถุนายน ๒๕๖๙

ชื่อผู้ซื้อ | บริษัท กรุณาไทย จำกัด
--- | ---
ที่อยู่ | ๑๒๓ ซอยสุขุมวิท ๖๓ แขวงคลองตันเหนือ เขตวัฒนา กรุงเทพมหานคร ๑๐๑๑๐
เลขประจำตัวผู้เสียภาษี | 0 1055 61045 67 8

| ลำดับ | รายการ | จำนวน | หน่วยละ | จำนวนเงิน |
| --- | --- | --- | --- | --- |
| ๑ | เสื้อโปโลพนักงานปักโลโก้ | ๑๒ | 120.00 | 1,440.00 |
| ๒ | แก้วเซรามิกพิมพ์ลาย | ๕ | 30.00 | 150.00 |
| ๓ | กล่องบรรจุภัณฑ์ | ๓ | 20.00 | 60.00 |

| | | | รวมเงิน | 1,650.00 |
| --- | --- | --- | --- | --- |
| | | | ภาษีมูลค่าเพิ่ม 7% | 115.50 |
| | | | จำนวนเงินรวมทั้งสิ้น | 1,765.50 |

( หนึ่งพันเจ็ดร้อยหกสิบห้าบาทห้าสิบสตางค์ )
结构化块,按原页面重新排版output: "structured"
  1. headingL1

    บริษัท ศตวรรษการค้า จำกัด (สำนักงานใหญ่)

  2. paragraph

    ๙๙ ถนนพระราม ๙ แขวงห้วยขวาง เขตห้วยขวาง กรุงเทพมหานคร ๑๐๓๑๐

  3. paragraph

    เลขประจำตัวผู้เสียภาษีอากร 0 1055 64078 12 7

  4. headingL1

    ใบกำกับภาษี

  5. paragraph

    TAX INVOICE

  6. paragraph

    ต้นฉบับ

  7. paragraph

    เล่มที่ 001 เลขที่ 0042

  8. paragraph

    วันที่ ๓๐ มิถุนายน ๒๕๖๙

  9. paragraph

    ชื่อผู้ซื้อ บริษัท กรุณาไทย จำกัด

  10. paragraph

    ที่อยู่ ๑๒๓ ซอยสุขุมวิท ๖๓ แขวงคลองตันเหนือ เขตวัฒนา กรุงเทพมหานคร ๑๐๑๑๐

  11. paragraph

    เลขประจำตัวผู้เสียภาษี 0 1055 61045 67 8

  12. table
    模型还原出的表格
    ลำดับรายการจำนวนหน่วยละจำนวนเงิน
    ๑เสื้อโปโลพนักงานปักโลโก้๑๒120.001,440.00
    ๒แก้วเซรามิกพิมพ์ลาย๕30.00150.00
    ๓กล่องบรรจุภัณฑ์๓20.0060.00
  13. table
    模型还原出的表格
    รวมเงิน1,650.00
    ภาษีมูลค่าเพิ่ม 7%115.50
    จำนวนเงินรวมทั้งสิ้น1,765.50
  14. paragraph

    ( หนึ่งพันเจ็ดร้อยหกสิบห้าบาทห้าสิบสตางค์ )

paxa-ocr-lite-v1 · 记录于 2026年9月12日 · 未经编辑

它如何扫描,又如何阅读#

光栅顺序并不等于阅读顺序。文档级基准测试记录下的失败模式正是这种结构错位:值都找到了,结构却丢了。

扫描顺序扫描沿着像素带逐行向下。卖方名称和标题交错在一起,表格单元格被压成条带,没有哪一行知道自己是什么。
阅读顺序阅读结果按块返回,顺序与模型返回的一致。每一栏都保持完整,表格仍是表格,每个值都在它的字段下面。

同一页面,读成字段#

Paxa Document Extraction 接收这份样本和一个由类型化字段组成的 schema,返回填好的 schema。每个值都是页面上印出的文字,按其类型读取,读不到时为 null 并附上原因。卖方的税号通过了校验位检查,日期为 ISO 格式,大写金额以数字返回。

您发送文档和一个 schema,写明字段名、每个字段的类型、哪些字段必填,以及分类字段的可选项。thai_id 是校验位已核验的十三位数字。无论页面印的是哪种纪年,日期都为 ISO 格式。大写金额会转成数字。页面上找不到依据的必填字段返回 null 并附固定原因,整个结果会被标记为不完整。如果请求证据,每个值都会附上它所依据的印刷文字。

发送的 schemaPOST /v1/extract
{
  "fields": {
    "seller": {
      "type": "object",
      "fields": {
        "name": {
          "type": "string",
          "required": true
        },
        "tax_id": {
          "type": "thai_id",
          "required": true
        },
        "address": {
          "type": "string"
        }
      }
    },
    "buyer": {
      "type": "object",
      "fields": {
        "name": {
          "type": "string",
          "required": true
        },
        "tax_id": {
          "type": "thai_id"
        },
        "address": {
          "type": "string"
        }
      }
    },
    "book_number": {
      "type": "string"
    },
    "invoice_number": {
      "type": "string",
      "required": true
    },
    "issue_date": {
      "type": "date",
      "required": true
    },
    "items": {
      "type": "array",
      "max_items": 9,
      "items": {
        "type": "object",
        "fields": {
          "description": {
            "type": "string",
            "required": true
          },
          "quantity": {
            "type": "number"
          },
          "unit_price": {
            "type": "number"
          },
          "amount": {
            "type": "number",
            "required": true
          }
        }
      }
    },
    "subtotal": {
      "type": "number"
    },
    "vat": {
      "type": "number",
      "required": true
    },
    "total": {
      "type": "number",
      "required": true
    },
    "total_in_words": {
      "type": "amount_words"
    }
  }
}
响应原文200 · status: complete
{
  "status": "complete",
  "fields": {
    "seller": {
      "name": "บริษัท ศตวรรษการค้า จำกัด",
      "tax_id": "0105564078127",
      "address": "๙๙ ถนนพระราม ๙ แขวงห้วยขวาง เขตห้วยขวาง กรุงเทพมหานคร ๑๐๓๑๐"
    },
    "buyer": {
      "name": "บริษัท กรุณาไทย จำกัด",
      "tax_id": "0105561045678",
      "address": "๑๒๓ ซอยสุขุมวิท ๖๓ แขวงคลองตันเหนือ เขตวัฒนา กรุงเทพมหานคร ๑๐๑๑๐"
    },
    "book_number": "001",
    "invoice_number": "0042",
    "issue_date": "2026-06-30",
    "items": [
      {
        "description": "เสื้อโปโลพนักงานปักโลโก้",
        "quantity": 12,
        "unit_price": 120,
        "amount": 1440
      },
      {
        "description": "แก้วเซรามิกพิมพ์ลาย",
        "quantity": 5,
        "unit_price": 30,
        "amount": 150
      },
      {
        "description": "กล่องบรรจุภัณฑ์",
        "quantity": 3,
        "unit_price": 20,
        "amount": 60
      }
    ],
    "subtotal": 1650,
    "vat": 115.5,
    "total": 1765.5,
    "total_in_words": 1765.5
  },
  "missing": [],
  "unverified": [],
  "truncated": [],
  "assumed": [],
  "usage": {
    "pages": 1,
    "leaves": 49,
    "credits": 13
  }
}

paxa-doc-extract-v1 · 记录于 2026年9月12日 · 未经编辑

两张卡片都是这份样本的实际请求与响应,原样呈现,未作修改。叶字段不超过 50 个的 schema 每页 13 积分,51 到 100 个的每页 19.5 积分,均已包含读取费用。

根据收据和税务发票记账

卖方、税号、日期、商品明细、增值税和总额,以类型化的值进入会计系统。写入一行之前会先核验校验位。

申报时处理预扣税证明

付款方、收款方、所得类型、预扣金额和开具日期,从印刷的表格读进申报所需的字段。错误的编号无法通过校验,返回 null。

开户时处理表单和证件

从申请表或证件中读取姓名、地址、十三位证件号码和日期,边读边校验。结果会注明哪些必填字段没有找到。有缺漏的案例会转交人工处理。

逐字段填好的表单,以及 schema 可用的全部类型,都在文档字段提取页面上。

文档字段提取如何工作

为什么泰语 OCR 很难#

泰语页面由一层层符号叠成。

เสื้อ

base ส · vowel ◌ื · tone ◌้

层层叠放

泰文字形最多可垂直叠放四层,Unicode 要求各符号按存储顺序由内向外显示。这个顺序承载着意义,与排版样式无关。

ฅ ค ต ศ ด

形近字母

在一项经同行评审的易读性研究中,35 名读者看到经过模糊处理的字形时,会把这些字母相互混淆。现代泰文印刷以无圈字体为主,而圆圈恰恰是区分它们的特征。

ณ

vs u

拉丁字母 u

这是该基准测试自己的观察:ณ 的无圈写法与拉丁字母 u 极为相似,识别结果会开始滑向错误的文字。

来源:ADR (2017)(在新标签页中打开)Typotheque(在新标签页中打开)ThaiOCRBench (2025)(在新标签页中打开)Unicode 16.0 ch.16(在新标签页中打开)

我们的研究目标:面向泰语文档、准确度最高的 OCR#

Typhoon OCR V1.5 展示了专注泰语的研究能够做到什么。在其覆盖六类泰语文档的留出评估中,它的 2B 模型报告的平均 ROUGE-L 为 0.774,高于同一评估中 Gemini 2.5 Pro 的 0.743。它在书籍、政府表格和财务报告上得分更高,Gemini 则在信息图和手写表格上仍然占优。

ThaiOCRBench 衡量的是更大的差距。在 2,808 个人工标注样本、13 项任务上,Gemini 2.5 Pro 的总分为 0.777。论文中最强的开源模型 Qwen2.5-VL 72B 得分 0.615。细粒度泰文识别和手写识别的分数下降最明显。Typhoon OCR 尚未公布 ThaiOCRBench 分数,其论文将这项评估列为未来工作。

Paxa Labs 正以一个研究目标把握这个机会:让 Paxa OCR Lite 成为面向真实泰语文档、准确度最高的 OCR 系统。我们正在扩展它的评估,覆盖手写栏目、细粒度泰文字符、密集表格、阅读顺序,以及缺失或凭空生成的内容。我们将连同评估设置和失败分类一起公布分数。

来源:ThaiOCRBench (2025)(在新标签页中打开)arXiv (2026)(在新标签页中打开)

我们用来测试的文档#

ใบกำกับภาษี完整税务发票
第 86/4 条规定的八项必备内容,须使用泰语和泰铢,可用泰文或阿拉伯数字。上方样本即依据这份清单排版。
หนังสือรับรองการหักภาษี ณ ที่จ่าย (ใบ 50 ทวิ)预扣税证明
依第 50 条之二开具一式两份。这是一份标签与数值密集排列的表格,它自己名称中的 ณ,正是模型会误认成 u 的那个字母。
บัตรประจำตัวประชาชน泰国身份证
一张卡片,两种文字,阿拉伯数字和泰文数字并排出现。

为什么在 2026 年,连数字文档也仍然需要 OCR#

泰国的业务流程很少从干净的文本开始。它们的起点是扫描件、手机照片、由纸质表格生成的 PDF,或者一份文本层缺失、损坏或被困在版面里的数字文档。

OCR 把无法作为文本复制的纸张和数字文件,转换成可用于搜索、审阅、翻译和自动化的内容与结构。

实验室做了什么

一个按页面本意来阅读泰语页面的模型:字段、表格和合计,无论它们用哪种文字和数字印刷。

在看不见边界的情况下切分,与实验室语音方向已在攻克的是同一个问题。语音方向在音频里遇到它,OCR 在纸面上遇到它。上方样本中的大写金额是一串连续不断的字符,直到读者判断出词在哪里分开。

Paxa OCR Lite 能读取不同印刷和扫描质量的页面、密集的版面,以及泰语与英语或其他文字混排的页面,并已在上述文档上测试。

背后的平台#

一个余额
积分在所有 Paxa API 之间通用:语音、转写、OCR 和翻译都从同一个钱包扣费,使用同一个 API 密钥。
不会重复扣费
请求失败时,积分会自动退还。如果因连接中断而重新发送同一请求,不会被重复扣费。
同一个难题
读没有空格的泰语,就是实验室语音研究已在攻克的切分问题。语音在音频里遇到它,OCR 在页面上遇到它。

一次请求,一个按页价格#

阅读文档
发送 base64,每页都返回
以 base64 发送文件,每一页都会以 Markdown 或类型化版面块返回。
output: "markdown" | "structured"
扣费前先数页数
页数从文档本身读取,读取失败时积分自动退还。
model: "paxa-ocr-lite-v1"
同一页面,读成字段
把同一份文档连同 schema 一起发送,即可取回 schema 所命名的字段,并按类型给出值。
/v1/extract
# Encode without line wrapping: wrapped base64 breaks the JSON string.
DOC=$(base64 < invoice.pdf | tr -d '\n')
# --max-time covers a multi-page document; curl defaults to no limit.
curl -X POST https://api.paxalabs.com/v1/ocr \
  --max-time 300 \
  -H "Authorization: Bearer $PAXA_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"document\": \"$DOC\", \"model\": \"paxa-ocr-lite-v1\"}"

读一页要多少钱#

无论页面上有什么,每页都是 6.5 积分。一页指一个 PDF 页面或一张图片,在扣费前从文档中计数。

每页积分
6.5
一次满额请求,50 页
$0.33325 积分
1,000 页
$6.506,500 积分

积分在所有 Paxa API 之间通用。

先用 100 免费积分开始,可读 15 页,无需绑卡。

查看套餐与充值

常见问题,直接回答#

能读取哪些文件?

PDF、PNG、JPEG 和 WebP,格式根据文件字节判断。每次请求最多接受 50 页、解码后 10 MiB,一张图片算一页。加密的 PDF 会在扣费前被拒绝。

如何计费?

每页正好 6.5 积分。页数在扣费前从文档中读取,扣费发生在读取之前,读取失败自动退还。

两种输出有什么区别?

两者包含相同的读取内容。默认的“markdown”把每一页返回为 GitHub 风格的 Markdown,可直接渲染。“structured”返回类型化块(heading、paragraph、list、table、figure),供需要把读取结果送入处理流程的调用方使用。

准确度如何?

在实验室的评估公开之前,我们不公布自己的准确度数字。您可以在控制台中直接读取自己的文档,无需任何设置,这比任何单一数字更能回答这个问题。

能读哪些语言?

以泰语为先,其他语言按印刷原样读取,包括泰语与英语混排、泰文与阿拉伯数字混排的页面。这种混排正是模型的设计目标。

更新日志#

  1. 文档字段提取:根据页面填写 schema

    Paxa Document Extraction(paxa-doc-extract-v1)通过 POST /v1/extract 读取 PDF 或图片,按您发送的类型化字段 schema 返回填好的结果。每个值都是页面上印出的文字,读不到时为 null 并附原因。叶字段不超过 50 个的 schema 每页 13 积分,更大的 schema 每页 19.5 积分,均包含读取费用。读取前扣费,请求失败自动退还。

  2. OCR API 上线

    Paxa OCR Lite(paxa-ocr-lite-v1)通过 POST /v1/ocr 读取 PDF 和图片,输出 Markdown 或类型化版面块,每页 6.5 积分,先扣费再读取,请求失败自动退还。

用您的第一份文档试试 OCR

先用 100 免费积分开始,足够读取 15 页。无需绑卡。

免费开始