如何将 Base64 解码为 Word 文档
- 把 Base64 粘贴到 Base64 或 data URI,带不带
data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,前缀都可以。很长的字符串可以用 打开 .txt 文件 从文本文件载入。 - 在文件信息下方,文档文本 会显示文档的内容:每个段落一行,保留制表符和手动换行。
- 文本下方的条目列表列出了组成该 .docx 的各个部分,每一项都有 查看 和 保存。
- 点击 下载文件 保存 .docx。
预览使用浏览器的 XML 解析器读取 word/document.xml。不会作为网页渲染,不执行任何内容,文件也不会被发送到任何地方:页面的内容安全策略(CSP)会拦截除 Cloudflare 的浏览量统计以外的所有网络请求。
文本预览包含哪些内容
DOCX 是一个由 XML 文件组成的 ZIP 压缩包。预览只提取正文的文本,其余结构不做处理,因此最好了解一下各部分内容会出现在哪里:
| 文档中的内容 | 预览中的表现 |
|---|---|
| 正文段落和标题 | 每个一行,按文档顺序排列 |
| 表格 | 逐行处理,每个单元格的段落各占一行 |
| 修订 | 按全部接受显示:插入的文字会出现,删除的文字不出现 |
| 页码、日期等域 | 最后一次计算的结果;域代码不显示 |
| 文本框和形状 | 显示其中的文字,有时会重复(见常见问题) |
| 页眉、页脚、脚注、批注 | 不在文本区域中;请用 查看 打开对应的条目 |
| 格式、图片、页面布局 | 不显示 |
只包含图片或扫描页的文档会显示“此文档中未找到文本。”
提取图片和其他部分
由于文件是 ZIP 压缩包,每个部分都可以单独获取。图片位于 word/media/ 中,名为 image1.png、image2.jpeg 等:查看 显示图片,保存 以原文件名下载。想从生成的文档中取出 logo 或签名图片又不想打开 Word,这是个快捷的办法。docProps/core.xml 中的文档属性记录了保存该文件的程序写入的作者、标题和日期。
Base64 转 ZIP 页面更详细地介绍了条目列表、它的限制以及对压缩包的检查。
是 DOCX、DOC 还是别的格式
Base64 的开头就能告诉你手里是哪种文件:
| Base64 开头 | 文件 | 工具的处理 |
|---|---|---|
UEsDBBQABgAI | Microsoft Word 保存的 DOCX | 文本预览和条目列表 |
UEsDB 后跟其他字符 | 其他软件生成的 DOCX(LibreOffice 写出的是 UEsDBBQACAgI),或其他基于 ZIP 的文件 | 根据是否有 word/ 条目来判断 |
0M8R4KGxGuE | 旧版 .doc(Word 97–2003),或受密码保护的 .docx | 显示“这看起来不像 DOCX”,类型为 DOC/XLS/MSG(OLE) |
e1xydGYx | RTF({\rtf1) | 提示看起来是 RTF,并提供 下载为 .rtf |
JVBERi0 | 提示看起来是 PDF,并提供 下载为 .pdf |
OLE 的情况需要手动处理一步。工具无法区分 .doc 和加密的 .docx,因此 扩展名 保持为 docx。如果是旧版 Word 文件,请在点击 下载文件 之前把扩展名改为 doc;如果是受密码保护的文档,保留 docx,然后用密码在 Word 中打开。这两种情况都没有文本预览。
Base64 Word 文档从哪里来
文档生成和模板服务会填充 .docx,并把它放在 JSON 响应中返回。邮件系统以 Base64 MIME 部分传送 Word 附件;EML 解码器 可以打开整封邮件并列出附件。CRM 和工单系统的导出数据常常把附件以 Base64 文本的形式存放在记录旁边。要把文件转成这样的字符串,请使用 Word 转 Base64。
用 Python 解码 DOCX 并读取文本
只用标准库就能保存文件并打印各段落,效果和预览差不多:
import base64, io, zipfile
import xml.etree.ElementTree as ET
W = "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}"
with open("memo.b64") as f:
docx = base64.b64decode(f.read())
with open("memo.docx", "wb") as f:
f.write(docx)
with zipfile.ZipFile(io.BytesIO(docx)) as z:
body = ET.fromstring(z.read("word/document.xml"))
for p in body.iter(W + "p"):
print("".join(t.text or "" for t in p.iter(W + "t")))
和预览一样,这段代码只读取正文。页眉可以用同样的方法读取 word/header1.xml。分块解码大文件的方法见 Python 中的 Base64。
常见问题
怎么把 Base64 转换成 Word 文档?
把字符串粘贴到上方,然后点击 下载文件;结果会保存为 decoded.docx,如果 data URI 中带有文件名则使用该文件名。需要的话,可以先在 文件名 中改名。
能在这个页面上编辑文档吗?
不能。页面只显示文本供你阅读,下载的是逐字节相同的原始文件。请用 Word、LibreOffice Writer 或其他能打开 .docx 的程序编辑。
为什么文本框里的文字出现了两次?
Word 会把每个文本框保存成两种形式:一种是新格式,另一种是给旧版阅读器的后备格式,而预览会读取两者的文本。文档本身只包含一个文本框。
页眉、页脚和批注在哪里?
它们位于文件中单独的部分(word/header1.xml、word/footer1.xml、word/comments.xml)。在条目列表中点击对应条目旁边的 查看 即可阅读其 XML,文字在 <w:t> 元素中。