Base64 转 PDF

粘贴来自接口响应、电子邮件或数据库的 Base64,把它还原为 PDF。先在内嵌查看器中阅读,再保存为普通的 .pdf 文件。

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

使用方法

  1. 将 Base64 字符串,或以 data:application/pdf;base64, 开头的 Data URI 粘贴到输入框中。
  2. 确认文件被识别为 PDF,并在查看器中阅读内容。
  3. 下载 PDF,保存到你的设备上。

从接口响应中复制 Base64

生成发票、快递面单、报表或已签署合同的服务,经常把 PDF 放在 JSON 里返回,例如 {"filename": "label.pdf", "data": "JVBERi0..."}。只需复制字段名后面引号之间的文本,并注意以下几点:

  • 转义的斜杠。有些 JSON 编码器(例如 PHP 的 json_encode)会把每个 / 写成 \/。/ 本身就是 Base64 的普通字符,所以粘贴前要把 \/ 替换为 /,或者先解析 JSON 再复制字段值。
  • 引号和逗号。不要复制两端的引号和末尾的逗号。
  • 换行。Base64 中的空格和真正的换行(例如按 76 个字符分行的值)不影响解码,不必删除。原始 JSON 里字面上的 \n 或 \r\n 则不同,它们是反斜杠字符,必须删掉。

在浏览器开发者工具中,从解析后的视图里复制字段值,就能避开以上所有转义问题。

从电子邮件中提取 PDF 附件

邮件附件以 Base64 形式保存在原始邮件中。打开邮件源代码(Gmail 中为“显示原始邮件”,Thunderbird 中为“消息源代码”,Apple Mail 中为“原始来源”),找到邮件头包含 Content-Type: application/pdf(或文件名为 .pdf 的 application/octet-stream)以及 Content-Transfer-Encoding: base64 的部分。复制这些邮件头下方空行之后的整段文本,直到下一个以 -- 开头的行为止,那一行是 MIME 分隔符。直接粘贴到这里即可,换行会被忽略。

在自己的网页应用中显示 Base64 PDF

如果前端收到 Base64 格式的 PDF 并需要显示,使用 Blob URL 比 Data URI 更可靠,因为有些浏览器拒绝在新标签页中打开 Data URI:

const bytes = Uint8Array.from(atob(base64), c => c.charCodeAt(0));
const blob = new Blob([bytes], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
window.open(url); // 也可以设为 <iframe> 的 src

文档不再需要时,调用 URL.revokeObjectURL(url) 释放内存。另外,atob 只接受标准 Base64 字母表,URL 安全格式(含 - 和 _)需要先转换。

常见问题

为什么我的 Base64 没有被识别为 PDF?
Base64 格式的 PDF 以 JVBERi0 开头,这是 %PDF- 的编码。如果开头是引号、字段名或其他文字,请先删掉。如果以 SlZCRVJ 开头,说明 PDF 被编码了两次:先用 Base64 解码解一次,再把结果粘贴到这里。其他情况下,数据可能是别的文件类型,可以用 Base64 转文件识别。
PDF 能下载但打不开,是哪里出了问题?

最常见的原因是 Base64 被截断了。日志、控制台和数据库工具经常截断很长的值,而 PDF 用来定位各页内容的交叉引用表位于文件末尾附近,缺少结尾的 PDF 无法读取。请重新复制完整的值,最好把原始响应直接保存为文件。

手机上预览是空白的,文件坏了吗?

不一定。有些移动浏览器无法在页面内显示 PDF。下载文件后用 PDF 阅读器打开,就能确认文件是否完好。

可以解码有密码保护的 PDF 吗?

可以。解码会逐字节还原文件,加密也会原样保留。预览可能会要求输入密码,也可能显示为空白;下载后的文件在任何 PDF 阅读器中输入密码即可打开。

文档会被上传到别处吗?

不会。解码和预览都在浏览器中进行,合同、工资单、病历等机密 PDF 都只留在你的设备上。