面向真实泰语文档的 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
- ชื่อผู้ซื้อ
- บริษัท กรุณาไทยe จำกัด
- ที่อยู่
- ๑๒๓ ซอยสุขุมวิท ๖๓ แขวงคลองตันเหนือ เขตวัฒนา กรุงเทพมหานคร ๑๐๑๑๐
- เลขประจำตัวผู้เสียภาษี
- 0 1055 61045 67 8
| ลำดับ | รายการ | จำนวนc | หน่วยละ | จำนวนเงิน |
|---|---|---|---|---|
| ๑ | เสื้อbโปโลพนักงานปักโลโก้ | ๑๒ | 120.00 | 1,440.00 |
| ๒ | แก้วเซรามิกพิมพ์ลาย | ๕ | 30.00 | 150.00 |
| ๓ | กล่องบรรจุภัณฑ์ | ๓ | 20.00 | 60.00 |
( หนึ่งพันเจ็ดร้อยหกสิบห้าบาทห้าสิบสตางค์ )a
这张税务发票难读在哪里#
这份样本依据《税收法典》第 86/4 条对完整税务发票规定的八项必备内容排版而成,没有使用任何照片。名称和金额均为虚构,栏目则来自法律规定。
没有词边界
大写金额是一串连续不断的字符,切分和识别必须同时进行。
最多四层垂直叠放
เสื้ 在同一列里叠放辅音、上方元音和声调符号,符号的顺序承载着意义。
两套数字
法律允许使用泰文数字或阿拉伯数字,真实的发票会在同一页上混用两者。
易混淆的字形
图像模糊时,连人类读者也会把 ฅ ค ต ศ ด 认混。多数收据所用的无圈字体让这几组字母更难区分。
无圈的 ณ
去掉圆圈后,它看起来像拉丁字母 u,模型就开始用错误的文字作答。
两种纪年
๒๕๖๙ 是佛历年份,同一个字段离开页面时必须变成 2026。
# บริษัท ศตวรรษการค้า จำกัด (สำนักงานใหญ่)
๙๙ ถนนพระราม ๙ แขวงห้วยขวาง เขตห้วยขวาง กรุงเทพมหานคร ๑๐๓๑๐
เลขประจำตัวผู้เสียภาษี 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 |
( หนึ่งพันเจ็ดร้อยหกสิบห้าบาทห้าสิบสตางค์ )- headingL1
บริษัท ศตวรรษการค้า จำกัด (สำนักงานใหญ่)
- paragraph
๙๙ ถนนพระราม ๙ แขวงห้วยขวาง เขตห้วยขวาง กรุงเทพมหานคร ๑๐๓๑๐
- paragraph
เลขประจำตัวผู้เสียภาษีอากร 0 1055 64078 12 7
- headingL1
ใบกำกับภาษี
- paragraph
TAX INVOICE
- paragraph
ต้นฉบับ
- paragraph
เล่มที่ 001 เลขที่ 0042
- paragraph
วันที่ ๓๐ มิถุนายน ๒๕๖๙
- paragraph
ชื่อผู้ซื้อ บริษัท กรุณาไทย จำกัด
- paragraph
ที่อยู่ ๑๒๓ ซอยสุขุมวิท ๖๓ แขวงคลองตันเหนือ เขตวัฒนา กรุงเทพมหานคร ๑๐๑๑๐
- paragraph
เลขประจำตัวผู้เสียภาษี 0 1055 61045 67 8
- table
模型还原出的表格 ลำดับ รายการ จำนวน หน่วยละ จำนวนเงิน ๑ เสื้อโปโลพนักงานปักโลโก้ ๑๒ 120.00 1,440.00 ๒ แก้วเซรามิกพิมพ์ลาย ๕ 30.00 150.00 ๓ กล่องบรรจุภัณฑ์ ๓ 20.00 60.00 - table
模型还原出的表格 รวมเงิน 1,650.00 ภาษีมูลค่าเพิ่ม 7% 115.50 จำนวนเงินรวมทั้งสิ้น 1,765.50 - paragraph
( หนึ่งพันเจ็ดร้อยหกสิบห้าบาทห้าสิบสตางค์ )
paxa-ocr-lite-v1 · 记录于 2026年9月12日 · 未经编辑
它如何扫描,又如何阅读#
光栅顺序并不等于阅读顺序。文档级基准测试记录下的失败模式正是这种结构错位:值都找到了,结构却丢了。
同一页面,读成字段#
Paxa Document Extraction 接收这份样本和一个由类型化字段组成的 schema,返回填好的 schema。每个值都是页面上印出的文字,按其类型读取,读不到时为 null 并附上原因。卖方的税号通过了校验位检查,日期为 ISO 格式,大写金额以数字返回。
您发送文档和一个 schema,写明字段名、每个字段的类型、哪些字段必填,以及分类字段的可选项。thai_id 是校验位已核验的十三位数字。无论页面印的是哪种纪年,日期都为 ISO 格式。大写金额会转成数字。页面上找不到依据的必填字段返回 null 并附固定原因,整个结果会被标记为不完整。如果请求证据,每个值都会附上它所依据的印刷文字。
{
"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"
}
}
}{
"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 系统。我们正在扩展它的评估,覆盖手写栏目、细粒度泰文字符、密集表格、阅读顺序,以及缺失或凭空生成的内容。我们将连同评估设置和失败分类一起公布分数。
我们用来测试的文档#
- ใบกำกับภาษี完整税务发票
- 第 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\"}"
import { readFile } from "node:fs/promises"; const document = (await readFile("invoice.pdf")).toString("base64"); const response = await fetch("https://api.paxalabs.com/v1/ocr", { method: "POST", headers: { Authorization: `Bearer ${process.env.PAXA_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ document, model: "paxa-ocr-lite-v1" }), // A multi-page document can run for minutes; give it room. signal: AbortSignal.timeout(300_000), }); if (!response.ok) throw new Error(`OCR failed: ${response.status}`); const { pages, usage } = await response.json(); console.log(pages[0].markdown, `${usage.credits} credits`);
import base64 import os import requests with open("invoice.pdf", "rb") as file: document = base64.b64encode(file.read()).decode() response = requests.post( "https://api.paxalabs.com/v1/ocr", headers={"Authorization": f"Bearer {os.environ['PAXA_API_KEY']}"}, json={"document": document, "model": "paxa-ocr-lite-v1"}, # A multi-page document can run for minutes; give it room. timeout=300, ) response.raise_for_status() body = response.json() print(body["pages"][0]["markdown"], body["usage"]["credits"], "credits")
读一页要多少钱#
无论页面上有什么,每页都是 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),供需要把读取结果送入处理流程的调用方使用。
准确度如何?
在实验室的评估公开之前,我们不公布自己的准确度数字。您可以在控制台中直接读取自己的文档,无需任何设置,这比任何单一数字更能回答这个问题。
能读哪些语言?
以泰语为先,其他语言按印刷原样读取,包括泰语与英语混排、泰文与阿拉伯数字混排的页面。这种混排正是模型的设计目标。
更新日志#
文档字段提取:根据页面填写 schema
Paxa Document Extraction(paxa-doc-extract-v1)通过 POST /v1/extract 读取 PDF 或图片,按您发送的类型化字段 schema 返回填好的结果。每个值都是页面上印出的文字,读不到时为 null 并附原因。叶字段不超过 50 个的 schema 每页 13 积分,更大的 schema 每页 19.5 积分,均包含读取费用。读取前扣费,请求失败自动退还。
OCR API 上线
Paxa OCR Lite(paxa-ocr-lite-v1)通过 POST /v1/ocr 读取 PDF 和图片,输出 Markdown 或类型化版面块,每页 6.5 积分,先扣费再读取,请求失败自动退还。
用您的第一份文档试试 OCR
先用 100 免费积分开始,足够读取 15 页。无需绑卡。
免费开始