PDF 转 Base64

把 PDF 文档编码为 Base64,用于接口请求、电子邮件或嵌入网页。内置查看器会显示 PDF 内容,复制结果之前可以先确认文件是否正确。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 将 PDF 拖到上传区域,或点击选择文件(最大 100 MB)。
  2. 查看预览,确认是正确的文档。
  3. 用于接口请求时选择纯 Base64,要嵌入网页则选择 Data URI。
  4. 复制结果,或下载为 .txt 文件。

通过 JSON 接口发送 PDF

JSON 没有二进制类型,所以接收文档的 REST 接口通常要求以 Base64 字符串提交。电子签名平台、开票和电子发票系统、打印邮寄服务、OCR 引擎以及文档归档系统都常用这种方式接收 PDF,字段名一般是 content、file 或 documentBase64,文件名放在另一个字段中。有些服务也用同样的方式返回 PDF,可以用 Base64 转 PDF 还原为文件。

除非接口文档另有说明,请提交不换行的纯 Base64,很多接口会拒绝仍带有 data:application/pdf;base64, 前缀的值。还要留意请求大小限制:7.5 MB 的 PDF 编码后约为 10 MB。

如何认出 Base64 格式的 PDF

PDF 文件以字符 %PDF- 加版本号开头,这几个字节编码为 Base64 后,总是以 JVBERi0 开头。如果在接口响应、数据库字段或日志文件中看到以 JVBER 开头的长字符串,基本可以确定它是 PDF。发送请求前也可以这样快速检查:如果字符串的开头不是这几个字符,可能编码了错误的数据,或者重复编码了两次。

在 HTML 中嵌入 PDF

借助 Data URI,可以把整个 PDF 放进 HTML 页面,无需另外托管文件:

<embed src="data:application/pdf;base64,JVBERi0..." type="application/pdf" width="100%" height="600">

<iframe src="data:application/pdf;base64,JVBERi0..." width="100%" height="600"></iframe>

这种方式适用于带有内置 PDF 查看器的桌面浏览器,但也有局限。很多移动浏览器根本不会在页面内显示 PDF。Chrome 等浏览器还会阻止网页把整个标签页跳转到 data: 网址,所以指向 data:application/pdf 的链接或 window.open 调用可能只会打开空白页,甚至毫无反应。如果要用 JavaScript 在新标签页中打开 PDF,请先把 Base64 转成 Blob URL。超过几 MB 的文档,通常还是使用普通的文件链接更合适。

在代码中编码 PDF

# Python:构造 JSON 请求体
import base64, json
from pathlib import Path

pdf_b64 = base64.b64encode(Path('invoice.pdf').read_bytes()).decode('ascii')
body = json.dumps({'filename': 'invoice.pdf', 'content': pdf_b64})

// 浏览器:file 来自 <input type="file">
const reader = new FileReader();
reader.onload = () => {
  const pdfBase64 = reader.result.split(',')[1]; // 去掉 Data URI 前缀
};
reader.readAsDataURL(file);

常见问题

为什么 PDF 的 Base64 字符串以 JVBERi0 开头?
这几个字符是 %PDF- 的 Base64 编码,而每个 PDF 文件都以这个文件头开始。看到它们,就说明字符串里装的是 PDF。
转换时 PDF 会被上传吗?

不会。文件的读取、编码和预览都在浏览器本地完成,合同、发票等机密文档不会离开你的设备。

编码会修改或压缩 PDF 吗?

不会。Base64 字符串解码后得到完全相同的字节,密码保护、数字签名、表单字段和元数据都会原样保留。编码后的文本比 PDF 大约多 33%,如果想减小体积,请先压缩 PDF 再编码。

需要开启换行吗?

只有在格式要求时才需要,例如手动构造 MIME 邮件时,附件每行不能超过 76 个字符。JSON 接口和 HTML 中的 Data URI 都需要连续不断行的字符串。

PDF 文件最大可以多大?

工具支持最大 100 MB 的文件。用于接口时,实际上限通常更低,请查看接口的最大请求大小,并记得 Base64 会增加约三分之一的体积。输出很长时在页面上显示可能较慢,处理大文档时请使用“下载”。