一份 PDF 有多少 token?4 家厂商、4 套规则,每页 15 到 2,100
目录
把 PDF 作为文件发给模型,各家厂商的计费规则都不一样。GPT-6 按页面文本的 token 数计费,每页再加约 15 个。Claude 在文本之外,每页加收 1,558 个 token。Gemini 每页固定计为 515 个 token,文本不计费。Qwen 3.8 则在文本之外,每页加收 2,098 个。我们逐步增加同一组页面上的文本量,用实测找出这些规则。随后又把十份文档发给十五个模型,比较每类文档怎样发送最便宜,同时还能答对问题。
TL;DR
- PDF 作为文件发送时,GPT-6 每页在文本之外增加 15 个 token,Claude 增加 1,558 个,Qwen 3.8 增加 2,098 个。Gemini 固定按 515 个计费,文本免费。
- 使用提取出的文本,150 道图表题和 105 道扫描文档题均答对 0 道。
- 按页选择发送方式后,混合文档在 Claude Sonnet 5.5 上的输入量从 17,228 个 token 降到 6,543 个,12 道题全部答对。
- 从 120 页 PDF 中选出 4 页发送,Claude Sonnet 5.5 的输入量从 253,822 个 token 降到 8,758 个。
怎么把文档发给模型?
有三种方式:直接发文件,把页面转成图片发送,或者先提取文本再发送。
import base64
import pymupdf # pip install pymupdf
doc = pymupdf.open("report.pdf")
b64 = lambda data: base64.b64encode(data).decode() # binary written as text, so it fits in JSON
# 1. As a file. The vendor decides how to read it.
as_file = [{"type": "file", "file": {"filename": "report.pdf", # OpenAI-compatible chat
"file_data": "data:application/pdf;base64," + b64(open("report.pdf", "rb").read())}}]
as_document = [{"type": "document", "source": {"type": "base64", # Anthropic Messages API
"media_type": "application/pdf", "data": b64(open("report.pdf", "rb").read())}}]
# 2. As page images. You render each page; any model that accepts images takes these.
as_images = [{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64," +
b64(page.get_pixmap(dpi=72).tobytes("jpeg"))}} for page in doc]
# 3. As text. The text layer is the selectable text stored in a PDF. A scan has none.
as_text = "\n\n".join(page.get_text() for page in doc)
十五个模型在 chat 端点上支持的输入方式如下:
| 模型 | PDF 文件 | 页面图片 | 文本 |
|---|---|---|---|
| GPT-6.1 Sol、GPT-6 Luna | 支持 | 支持,每次请求最多 50 张 | 支持 |
| Claude Opus 5.5、Sonnet 5.5、Haiku 5.5 | 支持 | 支持 | 支持 |
| Gemini 3.1 Pro、Gemini 3.8 Flash | 支持 | 支持 | 支持 |
| Qwen 3.8 Max、Qwen 3.8 Flash | 支持 | 支持 | 支持 |
| Qwen 3.6 35B(开放权重)、DeepSeek V4.1 Flash、GLM 5.3 Flash、Kimi K3 | 不支持 | 支持 | 支持 |
| GLM 5.3、DeepSeek V4 Pro | 不支持 | 不支持 | 支持 |
所有视觉模型都能接收页面图片,包括那四个已公开权重、但不接受文件的模型。在我们使用的端点上,Gemini 模型接收的是放在图片内容块中的 PDF data URL;Google 自己的 API 则通过内联数据接收 PDF。
怎么确认模型真的读了文件?
问一个只有文件里才有答案的问题,再检查输入 token 数。不支持的输入有时会返回 400 错误,有时会被直接丢弃,模型照样回答。在我们的探测中,两个不支持视觉的模型忽略了图片内容块,对一份两页文档分别只报告了 27 和 98 个输入 token。另一个模型收到的是 URL 而不是文件,回答时编造了文档内容。
r = client.chat.completions.create(model=model, messages=[{"role": "user", "content": as_file + [question]}])
read_it = "MF-OPS-2291" in r.choices[0].message.content # a string found only in the document
plausible = r.usage.prompt_tokens > 200 * len(doc) # a dropped file leaves a few dozen tokens
判断页面类型不需要调用模型,后面的按页路由也依赖这个判断:
def kind(page) -> str:
if len(page.get_text().strip()) < 40:
return "scan" # no text layer: needs OCR or an image
if page.get_images() or len(page.get_drawings()) > 60:
return "visual" # a picture or a chart drawn on the page
return "text"
各家厂商怎么计算 PDF 文件的 token 数?
有四套不同的规则。我们制作了六页 PDF,每页分别放入 0、80、250、500 和约 670 个单词,又制作了每页都带图表的版本。每个版本都分别以文件和提取文本的形式发送。
| 厂商 | PDF 作为文件发送时的 token 数 |
|---|---|
| GPT-6 | 文本 token 数加每页 14.5 个。页面带图片时,另加约 650 到 1,700 个 |
| Claude | 文本 token 数加每页 1,558 个,数值固定。页面带图表不会增加 token |
| Gemini | 无论页面内容是什么,每页都是 515 个。文本不计入 |
| Qwen 3.8 | 约为文本 token 数的 0.94 倍,再加每页 2,098 个。图表会另加约 770 个 |
token 是模型计费的单位,大约相当于四分之三个英文单词。同一系列模型的计数基本一致,差异只有几个 token。
至少在我们测试的接入路径上,有两套规则与厂商文档不同。Google 文档写的是每页 258 个 token,PDF 自带文本不收费;我们测得每页 515 个,文本确实不收费。OpenAI 文档说,PDF 会以提取文本和页面图片的形式传给模型;但这里的纯文本页面没有产生图片费用。Anthropic 文档说,每页都会按文本和图片处理,通常需要 1,500 到 3,000 个 token,与实测吻合。
这些规则意味着:
- Claude 和 Qwen 处理文本稀少的页面很贵。只有一行字的页面,作为文件发送要花 1,558 或 2,098 个 token,作为文本发送只需十来个。
- Gemini 处理文字密集的页面很便宜。约 670 个单词的页面与空白页一样,都只需 515 个 token,而单独发送文本约需 800 个。
- GPT-6 的文件费用基本等于文本费用,直到页面出现图片。扫描页整页都是图片,实测需要 2,868 个 token。
一份 12 页的纯文本报告,每页约 250 个单词,作为文件发送时,在 GPT-6.1 Sol 上为 6,028 个 token,在 Gemini 3.8 Flash 上为 6,441 个,在 Claude Sonnet 5.5 上为 27,297 个,在 Qwen 3.8 Flash 上为 30,934 个。提取文本后,十五个模型的输入量为 5,924 到 8,716 个 token。
什么情况下提取文本会失效?
只要答案不在文本层里,提取文本就不够用。我们按回答所需的信息给每道题分类,并汇总了十五个模型的结果:
| 发送方式 | 正文 | 表格单元格 | 图表 | 扫描页 |
|---|---|---|---|---|
| 提取文本 | 300 道中答对 297 道 | 170 道中答对 168 道 | 150 道中答对 0 道 | 105 道中答对 0 道 |
| 先做 OCR,再发文本 | 105 道中答对 104 道 | |||
| PDF 文件 | 186 道中答对 186 道 | 103 道中答对 103 道 | 90 道中答对 90 道 | 63 道中答对 62 道 |
| 页面图片,110 dpi | 260 道中答对 258 道 | 148 道中答对 148 道 | 130 道中答对 130 道 | 91 道中答对 89 道 |
| 页面图片,72 dpi | 260 道中答对 257 道 | 148 道中答对 142 道 | 130 道中答对 130 道 | 91 道中答对 88 道 |
dpi 表示每英寸的点数,也就是页面渲染的分辨率。按 72 dpi 渲染时,一张美式 Letter 纸对应 612 × 792 像素。OCR 是光学字符识别,用软件从图片中识别文字;我们在本地运行了开源的 Tesseract。
使用提取文本时,所有模型在图表和扫描文档上的得分都是零,因为所需数字不在文本里。OCR 能以文本输入的价格还原扫描报告,但不能解决图表问题:对一份 15 页的图表幻灯片做 OCR,再交给两个模型,两者都只答对了 7 道题中的 0 道。这次表格提取成功,是因为我们用的是简单网格。合并单元格和列内换行更难处理,需要用自己的文档测试。
怎么降低文档处理费用?
有七种方法,其中六种经过实测。
1. 根据计费规则选择发送方式。纯文本页面发文本。其他页面在 Gemini 上发文件,在其余模型上发 72 dpi 页面图片,因为无论页面上印了多少内容,页面图片的费用都一样。一份文字密集的 6 页 IRS 表格,在 Claude Sonnet 5.5 上以文本发送需要 13,635 个 token,以文件发送需要 22,871 个,以 72 dpi 图片发送需要 4,015 个。三种方式都答对了全部三道题。
2. 按页选择发送方式。真实文档往往混有多种页面,上面的 kind 函数可以分类:纯文本页发文本,带图片的页面发 72 dpi 图片,扫描页先做 OCR。我们用一份九页文档测试了 12 道题,其中有四页文本、三页图表和两页扫描件:
| 模型 | 文件 | 按页选择发送方式 | 全部转为 72 dpi 图片 |
|---|---|---|---|
| GPT-6 Luna | 15,106,答对 12 道 | 5,140,答对 12 道 | 5,750,答对 9 道 |
| Claude Sonnet 5.5 | 17,228,答对 12 道 | 6,543,答对 12 道 | 6,257,答对 12 道 |
| Qwen 3.8 Flash | 25,036,答对 12 道 | 5,313,答对 12 道 | 4,710,答对 12 道 |
| Gemini 3.8 Flash | 5,043,答对 12 道 | 7,110,答对 12 道 | 10,278,答对 12 道 |
在三家厂商上,按页选择发送方式比直接发文件减少了 62% 到 79% 的输入量,且所有答案仍然正确。Gemini 上直接发文件已经最便宜。
3. 降低图片分辨率,但正文页不能降得太低。页面图片的 token 数会随像素数下降,Gemini 除外,它在所有尺寸下的计费都一样。标签字号较大的图表幻灯片,在 36 dpi 下仍能读清;我们测试的六个模型都至少答对了 7 道题中的 6 道。15 页幻灯片在 Claude Haiku 5.5 上只需 2,874 个 token,而文件需要 23,949 个。正文需要 72 dpi:降到 50 dpi 时,Claude Haiku 5.5 和 Gemini 仍答对了全部 7 道题,GLM 5.3 Flash 则降到 7 道中答对 2 道。GPT-6 Luna 在低于 96 dpi 的所有页面图片测试中都出现了答错,因此应给它发文件或文本。
4. 在 OpenAI 上处理图片页时,把 detail 设为 low。Responses API 支持为 PDF 文件设置 detail 字段。设为 low 后,GPT-6 Luna 读取 15 页幻灯片只需 9,985 个 token,默认设置需要 22,155 个;读取扫描报告需要 11,387 个,默认需要 34,396 个。所有问题都答对了。纯文本页面的 token 数没有变化。
5. 只发送需要的页面。对于一份 120 页手册,我们先让 GPT-6 Luna 读取提取文本(46,420 个 token),指出四道题各自需要哪一页。随后把这些页面组成一份 4 页 PDF,交给 Claude Sonnet 5.5,输入量为 8,758 个 token,四道题全部答对。完整文件在 Claude 上需要 253,822 个 token;计入第一轮筛选后,输入费用仍从 $0.508 降到了 $0.022。
6. 让便宜模型提取内容,让大模型推理。一个便宜的视觉模型把 15 页图表幻灯片转成 Markdown 表格,费用为 $0.002 到 $0.011。然后 Claude Opus 5.5 根据约 2,000 个 token 的转写文本答对了全部七道题,费用为 $0.010。直接发文件需要 23,949 个 token,输入费用为 $0.096。转写文本还可以保存下来,供后续提问复用。
7. 缓存文档,能等的请求走批处理。在 PDF 上设置缓存断点(Anthropic API 中的 cache_control 标记)后,向 Claude Sonnet 5.5 提问六次的费用从 $0.461 降到 $0.117:第一次将 38,364 个 token 写入缓存,后面五次读取缓存,每次约 $0.004。批处理是唯一没有实测的方法。OpenAI、Anthropic 和 Google 都公布了半价的 batch API,结果会在 24 小时内返回;Anthropic 表示,这个折扣可以与缓存折扣叠加。
需要留意一个计费门槛:120 页 PDF 在 Claude 上超过 250,000 个 token,而 Claude Haiku 5.5 对超过 100,000 个 token 的 prompt 按五倍价格计费。同一份手册提取后的文本只有 68,382 个 token。
Word 文件怎么处理?
先转换格式。我们测试的六个模型中,只有 GPT-6.1 Sol 和 GPT-6 Luna 接受 .docx 文件,而且只读取其中的文本,这与 OpenAI 对非 PDF 文件的说明一致。对于文本和表格,用 pandoc 转成 Markdown 就够了:一份九页合同只需 3,144 个 token,每个模型都答对了全部 7 道题。一份嵌有图表的备忘录用这种方式只答对了 5 道中的 2 道,用 LibreOffice 转成 PDF 后则答对了全部 5 道;在 Gemini 3.8 Flash 上需要 1,217 个 token,在 Claude Sonnet 5.5 上需要 3,827 个。
测试方法
我们使用了十份文档:七份自行生成的文档(一份 12 页报告、8 页财务表格、一份 15 页图表幻灯片、报告的扫描版、一份 120 页手册、一份 Word 合同和一份 Word 备忘录),以及三份公开文档(论文《Attention Is All You Need》、IRS Form W-9 和 NIST 的 AI Risk Management Framework)。每份文档配有三到七道题,每道题都有唯一且可核验的答案。
主测试将每份文档按每种发送方式交给每个模型,每次请求处理整份文档:2026 年 10 月 10 日共发送 568 次请求,其中 566 次成功(GPT-6 Luna 两次拒绝了 120 张页面图片)。计费规则和费用测试在同一天额外发送了 176 次请求,每家厂商选用一个低价模型。除缓存测试使用 Messages API、detail 测试使用 Responses API 外,所有请求都经过 Synthorai 网关的 OpenAI 兼容 chat 端点。美元费用按标价计算。
token 数以这条接入路径上的端点返回值为准。同一个模型通过其他服务商接入时,文件预处理方式可能不同,因此在依赖某条规则前,先在自己的接入路径上跑一遍六页测试。每份文档只有三到七道题,全部答对只能说明这种发送方式能读懂文档,不能证明信息没有损失。
常见问题
一页 PDF 有多少 token?
取决于厂商。作为文件发送时,GPT-6 按文本加约 15 个 token 计费,Claude 按文本加 1,558 个计费,Gemini 固定收取 515 个且文本免费,Qwen 3.8 则按文本加约 2,098 个计费。扫描页在 GPT-6.1 Sol 上实测为 2,868 个 token,在 Claude Sonnet 5.5 上为 1,579 个。
发送 PDF 还是提取文本更便宜?
对于纯文本页,除 Gemini 外,所有模型上提取文本都更便宜,或费用相同。Gemini 不计算文本 token,因此文字密集的页面作为文件发送反而更省 token。在 GPT-6.1 Sol 上,文件和文本的费用几乎相同。提取文本无法回答图表或扫描页中的问题。
LLM 能读扫描版 PDF 吗?
能,前提是以文件或页面图片的形式发送。扫描件提取出的文本为空,在我们的测试中,105 道题答对了 0 道。在本地运行 OCR 后发送识别结果,105 道中答对了 104 道,并且只按文本计费。这是处理印刷文本扫描件最便宜的方式。
哪些模型可以直接接收 PDF 文件?
在我们的测试中,支持的模型有 GPT-6.1 Sol、GPT-6 Luna、三个 Claude 5.5 模型、Gemini 3.1 Pro、Gemini 3.8 Flash、Qwen 3.8 Max 和 Qwen 3.8 Flash。DeepSeek V4.1 Flash、GLM 5.3 Flash、Kimi K3 和 Qwen 3.6 35B 可以接收页面图片,但不能接收文件。
怎么降低长 PDF 的费用?
减少发送页数,为每页选择最便宜的发送方式,并复用已发送的内容。先用便宜模型筛选相关页面,让 120 页文档在 Claude Sonnet 5.5 上的输入量从 253,822 个 token 降到了 8,758 个。按页面类型选择发送方式,让混合文档的输入量减少了 62% 到 79%。缓存则让同一文档六次提问的费用从 $0.461 降到了 $0.117。
延伸阅读
- 一张图片有多少 token?:页面图片发送方式所遵循的图片计费规则。
- Claude Haiku 5.5 定价:长 PDF 容易跨过的 100,000 个 token 计费门槛。
- 提示词缓存写入费用:缓存文档时,第一次请求需要支付的费用。