先说一个几乎每周都在发生的场景。

某人投简历。简历是拿老同事发的模板改的,改完导出 PDF,一封封投出去。HR 收到文件,在文档属性里看到:作者「张某某」,公司「XX科技有限公司」,最后修改者是另一个陌生名字,创建时间是三年前。

投简历的人姓李,简历里写的现任公司也不是 XX 科技。这份材料在第一眼就交代了两件事:这不是他自己做的,以及他改的东西来自哪。没人会因为这个直接刷掉一个候选人,但它是个减分项,而且是完全可以避免的减分项。

DOCX 本质上是个 ZIP

"Word 和 PDF 里的隐藏信息:作者名、公司、修订记录" — visual 1
DOCX 本质上是个 ZIP

.docx 改名成 .zip 解压,能看到里面的目录结构。元数据主要在两个文件里。

docProps/core.xml 存的是 Dublin Core 那套通用属性:

  • dc:creator — 作者,通常是创建这个文件的那台电脑上 Word 的用户名
  • cp:lastModifiedBy — 最后修改者,最容易出问题的字段,只要文件在别人机器上被打开保存过一次就会变成那个人
  • dc:title / dc:subject / dc:description — 标题、主题、备注
  • cp:keywords — 关键词
  • dcterms:created / dcterms:modified — 创建和修改时间,带时区
  • cp:revision — 修订次数,一个数字,能看出这文件被存过多少回
  • cp:category / cp:contentStatus

docProps/app.xml 存的是应用层统计:

  • Company — 公司名。这个字段来自 Office 安装时填的组织信息,很多人从来没改过,还是入职第一家公司时 IT 装机填的。
  • TotalTime — 累计编辑分钟数。一份"精心准备"的标书如果显示 TotalTime 是 12 分钟,观感很微妙。
  • Template — 用的模板文件名。XX集团标准公文模板.dotx 这种名字本身就是信息。
  • Manager — 经理姓名
  • Application / AppVersion — Word 版本
  • Pages / Words / Characters — 统计数字
  • TitlesOfParts — 文档各部分标题、样式名,有时会带出你没料到的内容

ODT(LibreOffice)结构类似,元数据在 meta.xml 里:meta:initial-creatormeta:editing-durationmeta:editing-cycles

真实会出事的几类场景

"Word 和 PDF 里的隐藏信息:作者名、公司、修订记录" — visual 2
真实会出事的几类场景

求职。 前面那个例子。补充一条更隐蔽的:如果你把在职公司的电脑上做的简历直接投出去,Company 字段就是现东家。万一 HR 认识那边的人,或者猎头顺手一查,你在找工作这件事就不再是秘密。

投标。 标书里最常见的翻车是模板残留。Template 字段写着上一个客户的名字,或者 dc:title 还是"某某项目技术方案 V3",而这个"某某"是采购方的竞争对手。评标环节有人真会去看这些。

法律文书。 律师函、合同草案发出去之前如果没关修订记录,对方能看到你们内部改了什么、删了什么、批注里讨论了什么底线。修订记录里的作者名还会暴露是团队里哪个人在坚持哪个条款。

匿名来源提供的文档,如果作者字段带着真名,保护就形同虚设。

"删了看不见但还在"的两个坑

Word 的修订与批注

接受所有修订、删除所有批注之后,文档看起来是干净的。但有几处可能还留着东西:

  • 未接受的修订藏在被折叠或隐藏的部分里——页眉页脚、文本框、脚注尾注、嵌套表格中的修订,"全部接受"有时覆盖不到某些对象。
  • 自定义 XML 部件——一些企业系统会往 DOCX 里塞业务数据,用户界面完全看不到
  • 嵌入对象:粘进来的 Excel 表格是完整工作簿,你只显示了一个区域,但整个文件都在里面,包括其他工作表和被隐藏的行列。这条踩的人不少。
  • 隐藏文字(设了"隐藏"格式的文本),屏幕上不显示,XML 里完整存在

Word 自带的"检查文档"(文件 → 信息 → 检查问题 → 检查文档)能查出大部分,值得在发送前跑一遍。

PDF 的黑框

这个坑非常经典,而且出过多次严重事故——政府机构公开文件时,把敏感段落用黑色矩形盖住导出 PDF,结果记者用鼠标框选那块区域,Ctrl+C,粘贴出来就是完整的原文。

原因很简单:PDF 里的黑框是一个绘图对象,画在文字图层上面。文字对象本身没有被删除,只是被视觉上遮住了。选中、复制、或者用任何文本提取工具,拿到的都是底层的原始文字。

同类问题还有:用图片盖住的内容,图片底下的原始对象还在;页面裁剪(crop)只改变显示区域,被裁掉的内容仍在文件里;图层隐藏同理。

真正的涂黑(redaction)必须把底层内容对象从文件里移除,而不是盖住。专业 PDF 工具有专门的 redaction 功能,执行后原文字被真删。如果没有这类工具,最稳妥的土办法是:涂黑后把 PDF 每页光栅化成图片再重新组成 PDF——变成纯图像,底下什么都没有了。代价是文件变大、不能搜索、不能选中。

PDF 自身的元数据在文档信息字典和 XMP 里:AuthorTitleSubjectKeywordsCreator(原始编辑软件)、Producer(生成 PDF 的那个组件)、CreationDateModDateProducer 经常出卖你——"Microsoft: Print To PDF"、某个国产 PDF 工具的名字、某个在线转换服务的水印式标识,都会写在里面。

清理的实际操作

DOCX 这边比较彻底。 元数据就是 ZIP 里的几个 XML 文件,重写这几个文件里的字段,或者直接把这些字段清空,结果是确定的、可以复查的。用任何解压工具打开清理后的文件,看 core.xmlapp.xml 里还剩什么,一目了然。img.diy 的文档工具做的就是这件事,处理全程在浏览器里完成,文件不上传。

PDF 这边要如实说:浏览器环境下的清理是尽力而为。 文档信息字典和 XMP 元数据可以清掉,这部分是可靠的。但 PDF 的结构比 DOCX 复杂得多——增量更新会把旧版本的数据保留在文件尾部、对象流里可能有嵌套的元数据、附件和嵌入文件、JavaScript 动作、表单字段的历史值、数字签名相关的信息。纯浏览器端做不到像专业桌面工具那样逐对象重建整个文档。

所以给个明确的分级:

  • 要清 PDF 的基本元数据(作者、标题、生成器):浏览器工具够用。
  • 文档涉及敏感涂黑或法律风险:用带 redaction 功能的专业工具,或者光栅化。别指望元数据清理解决内容层的问题。
  • 最保险的通用做法:把最终版重新"打印"成 PDF(Print to PDF),这会生成一个全新的文件结构,绝大部分历史数据不会带过去。缺点是书签、超链接、可访问性标签可能丢失。

发布前检查清单

按文件类型走一遍:

DOCX / ODT 1. 接受或拒绝所有修订,删除所有批注 2. 跑一次 Word 的"检查文档",处理它报出来的所有项 3. 检查页眉页脚、文本框、脚注里有没有漏掉的修订 4. 确认嵌入的 Excel/图表对象里没有多余数据 5. 清理 core.xmlapp.xml 的作者、最后修改者、公司、模板、编辑时长 6. 解压复查一遍(这一步真的值得做,尤其是重要文件)

PDF 1. 确认涂黑是真 redaction 不是画黑框——自己框选复制试一下 2. 检查有没有附件、表单字段残值 3. 清理文档属性(作者、标题、主题、关键词) 4. 高敏感场景:光栅化或重新打印生成

通用 - 文件名本身别带信息(标书_报价800万_底价750万.pdf 这种真见过) - 如果是从模板改的,把模板痕迹全清一遍 - 发之前用另一台设备或另一个工具打开看一次

元数据清理这件事的好处在于结果完全确定:字段清了就是清了,可以打开文件核对。这跟图片里那些藏在像素中、删不掉也验不准的东西不是一回事——那部分的技术边界另有一篇。文档这边,你花五分钟就能把该管的都管住。

顺带提醒,简历如果附了作品图,图片里的 EXIF 也一起看看,那篇清单里列了该查哪些字段。