新人 免费注册,送 10 次调用,最高 $1,无需绑卡。

一份 PDF 有多少 token?4 家厂商、4 套规则,每页 15 到 2,100

目录
  1. 怎么把文档发给模型?
  2. 怎么确认模型真的读了文件?
  3. 各家厂商怎么计算 PDF 文件的 token 数?
  4. 什么情况下提取文本会失效?
  5. 怎么降低文档处理费用?
  6. Word 文件怎么处理?
  7. 测试方法
  8. 常见问题
  9. 一页 PDF 有多少 token?
  10. 发送 PDF 还是提取文本更便宜?
  11. LLM 能读扫描版 PDF 吗?
  12. 哪些模型可以直接接收 PDF 文件?
  13. 怎么降低长 PDF 的费用?
  14. 延伸阅读

把 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 数随页面单词数变化的折线图。Qwen 3.8 从 2,098 起步,Claude 从 1,558 起步,两者都随文本量增加;GPT-6 从 14 起步,基本沿着提取文本的虚线变化;Gemini 固定为 515

厂商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 dpi260 道中答对 258 道148 道中答对 148 道130 道中答对 130 道91 道中答对 89 道
页面图片,72 dpi260 道中答对 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 Luna15,106,答对 12 道5,140,答对 12 道5,750,答对 9 道
Claude Sonnet 5.517,228,答对 12 道6,543,答对 12 道6,257,答对 12 道
Qwen 3.8 Flash25,036,答对 12 道5,313,答对 12 道4,710,答对 12 道
Gemini 3.8 Flash5,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。

延伸阅读

← 返回博客