如何把 PDF 转为 Base64
- 把 PDF 拖到框中,或用文件选择器选择。一次处理多个 PDF 也没问题。
- 在 输出为 中选择格式。此页默认是 纯 Base64,大多数 API 需要的就是它。
- 只有当字符串要放进原始 MIME 邮件时,才勾选 每 76 字符换行。用于 JSON 和 HTML 时保持关闭。
- 按 复制输出。文档较大时请用 另存为 .txt,它会生成
yourfile.pdf.b64.txt。
信息栏显示文件名、大小和 MIME 类型,下方的计数器显示编码后的大小和额外开销。PDF 由你的浏览器读取,不会被上传;页面的内容安全策略只允许 Cloudflare 的浏览量统计这一项网络请求。
Base64 PDF 的使用场景
JSON 无法承载原始字节,所以在请求体中接收文档的服务都以 Base64 形式接收。电子签名平台、开票和财务系统、OCR 和文档解析服务,以及能阅读 PDF 的 AI 模型,用的都是这种模式。各 API 的字段名不同,但结构通常都是文件名、MIME 类型和一个 Base64 字符串。
能直接阅读 PDF 的 AI 模型通常以同样的方式接收文件:Base64 数据加上媒体类型 application/pdf,要么分成两个字段,要么合成一个 data URI。它们一般会限制文件大小和页数,所以长文档请在编码前拆分。
MIME 邮件中的附件是每行最多 76 个字符的 Base64。如果你在手工拼装邮件或测试 SMTP 库,每 76 字符换行 给出的正好是这样一个部分的正文:
Content-Type: application/pdf; name="invoice.pdf"
Content-Disposition: attachment; filename="invoice.pdf"
Content-Transfer-Encoding: base64
JVBERi0xLjcKJeLjz9MK...
接收 JSON 的邮件发送 API 则要求把不换行的附件放在一个字段中。更多内容见 电子邮件中的 Base64;EML 解码器 可以从原始邮件中提取附件。
要编码多个 PDF,拖入一批文件并按 全部复制为 JSON,即可得到一个数组,每个文档对应一个 {name, type, size, data} 对象,适合为测试数据库填充数据或批量导入。
对于下载链接,HTML <a download> 输出会生成一个点击即保存 PDF 的链接:
<a href="data:application/pdf;base64,JVBERi0xLjcK..." download="invoice.pdf">invoice.pdf</a>
这对单文件 HTML 报表很方便。不带 download 直接链接到 data URI 通常会失败:Chrome 会阻止页面发起的、在顶层窗口中导航到 data: URL 的操作,所以点击后什么也不打开,或者打开一个空白标签页。Firefox 对 PDF 网开一面,这就是同一个链接在一个浏览器中能用、在另一个中不能用的原因。
把一个小 PDF 存为 Base64 常量,单元测试就能覆盖上传或解析流程,而不需要旁边放一个测试文件。
PDF 的 Base64 以什么开头
每个 PDF 都以 %PDF- 和版本号开头,后面跟一个换行。在 Base64 中,这个头部很容易认出来:
| 文件头 | Base64 |
|---|---|
%PDF-1.4 + 换行 | JVBERi0xLjQK |
%PDF-1.5 + 换行 | JVBERi0xLjUK |
%PDF-1.7 + 换行 | JVBERi0xLjcK |
%PDF-2.0 + 换行 | JVBERi0yLjAK |
如果输出不是以 JVBERi0 开头,说明你选的文件不是 PDF,或者头部前面有多余内容。以 PCFET0NUWVBF(<!DOCTYPE)或 PGh0bWw(<html)开头的字符串是 HTML,这通常意味着下载链接把一个错误页面存成了 .pdf 文件。
编码后的 PDF 有多大
Base64 输出每 3 个字节对应 4 个字符,换行则每 76 个字符增加一个换行符:
| PDF 大小 | Base64 长度 | 每 76 字符换行 |
|---|---|---|
| 100 KB | 136,536 个字符 | 138,332 个字符 |
| 1 MB | 1,398,104 个字符 | 1,416,500 个字符 |
| 5 MB | 6,990,508 个字符 | 7,082,488 个字符 |
| 10 MB | 13,981,016 个字符 | 14,164,976 个字符 |
| 25 MB | 34,952,536 个字符 | 35,412,437 个字符 |
大小按二进制单位计算(1 MB = 1,048,576 字节)。请用编码后的大小而不是文件大小去对照 API 的请求大小限制。如果 API 也接受 multipart 上传或预签名 URL,走那条路可以省掉额外开销,更适合几十 MB 的文档。大小计算器 可以为任意大小做这个计算。
本工具能在浏览器中编码大型 PDF,但输出超过约 48 MB 时不会复制到剪贴板。这种情况请使用 另存为 .txt。
在代码中编码 PDF
Python,构造 JSON 请求体:
import base64, json
from pathlib import Path
path = Path("invoice.pdf")
data = base64.b64encode(path.read_bytes()).decode("ascii")
body = json.dumps({"filename": path.name, "content": data})
Node.js:
import { readFile } from "node:fs/promises";
const b64 = (await readFile("invoice.pdf")).toString("base64");
const payload = JSON.stringify({ filename: "invoice.pdf", content: b64 });
在装有 GNU coreutils 和 jq 的 shell 中(-w 0 关闭换行):
base64 -w 0 invoice.pdf > invoice.b64
jq -n --rawfile content invoice.b64 '{filename: "invoice.pdf", content: $content}'
filename 和 content 这两个键只是占位符,请使用 API 文档中规定的名称。更多选项见 Python 中的 Base64 和 Node.js 中的 Base64。
常见问题
- API 提示 Base64 无效。 最常见的原因是 API 要的是纯 Base64,却带上了
data:application/pdf;base64,前缀;或者残留了换行,来源可能是不带-w 0的base64、openssl base64(每 64 个字符换行)或 每 76 字符换行。有些 API 还会拒绝 URL 安全的 Base64。 - 解码出的 PDF 损坏或为空。 字符串在某处被截断了,常见原因是日志行长度限制、数据库字段太短或电子表格的单元格。请对照上表检查长度。PDF 的最后几个字节是
%%EOF,所以完整的编码解码后应以这个标记结尾。 - PDF 在你的电脑上能打开,接收方却看到空白页。 Base64 不会改变文档,所以问题出在 PDF 本身:缺少字体、PDF 版本少见或交叉引用表损坏。用 Base64 转 PDF 解码字符串并打开结果来测试。
- Base64 不是加密。 任何拿到字符串的人都能解码出文档。如果 PDF 是机密的,请保护传输通道或对其加密;参见 编码与加密的区别。
常见问题
怎样在 JSON 请求中发送 PDF?
把文件编码为纯 Base64,放进 API 文档规定的文件内容字段,通常还要附上文件名和 MIME 类型 application/pdf。JSON 输出会给出一个现成的对象,包含 name、type、size 和 data,按需修改即可。
受密码保护的 PDF 能转为 Base64 吗?
能。Base64 按原样编码这些字节,加密部分也包括在内。编码后的文件仍受保护,解码的人仍然需要密码才能打开。
怎样识别 Base64 编码的 PDF?
它以 JVBERi0 开头,即 %PDF- 的编码。后面的字符表示版本,例如 PDF 1.7 是 JVBERi0xLjc。
为什么我的 Base64 PDF 链接打开的是空白标签页?
Chrome 禁止页面把顶层窗口导航到 data: URL,其他浏览器也有类似限制。请使用 HTML <a download> 输出,它会保存文件而不是打开它;或者在 JavaScript 中构造 Blob URL。
PDF 转成 Base64 后有多大?
约为文件大小的 4/3:3 MB 的 PDF 会变成大约 4 MB 的文本。输出下方的额外开销计数器显示确切数值,Base64 转 PDF 可以把它还原。