假设我想生成 100 个看似相同的 PDF 文件,并在其中隐藏某种密钥,以便将它们分发给 100 个不同的人。现在我检测到该文档的在线共享副本,我需要跟踪这 100 人中谁上传了它。
我的第一个方法是以某种方式编译它们(也许通过命令行传递参数?) 例如在其hyperref
PDF 关键字中包含一些“UserNr001”、“UserNr002”... 标签。
我想要的是一种更微妙的方式来标记.tex
文件中的 PDF。
可能相关:电子签名和如何创建可以数字签名的 PDF 文件?。
答案1
PDF 信息条目
可以通过 设置附加条目hyperref
,例如:
\hypersetup{
pdfinfo={
User={John Doe},
% ...
},
}
一些 PDF 查看器无法显示非标准条目,但其他查看器可以(据我所知较新的 AR/Win 版本)。
向 PDF 数据结构添加数据
键值对可以放入字典中,例如:
\pdfcatalog{/User (John Doe)}
甚至可以制作一个物体:
\immediate\pdfobj{(John Doe)}
\pdfcatalog{/User \the\pdflastobj\space 0 R}
重要问题包括:
- 它应该是有效的 PDF 代码,否则 PDF 查看器可能会抱怨。该示例使用名称对象作为键“/User”,并使用 PDF 字符串
(John Doe)
作为值。 - 数据应链接到现有的使用对象。后一个示例将创建的对象链接
\pdfobj
到目录。否则,可以通过后期处理删除未使用的对象。
使用/修改现有数据
\pdfcreationdate
可以通过为用户分配不同的秒数来更改文档的创建日期。
改变输出
之前的方法在将 PDF 文档打印成新的 PDF 文档后无法继续使用。因此,输出可能会略有变化,例如,针对不同版本在某些地方将单词间距调大/调小。
数据保护
我不会使用上面例子中的纯代码(为了简单起见),而是使用某种 MD5/SHA/... 或数据的加密版本,并将它们安全地添加为十六进制转储。
然后,如果您找到在线副本,您可以验证嵌入的数据是否正确且未被上传者更改。否则上传者可能会恶意更改数据以声称是他人所为。
PS:示例代码针对的是 pdfTeX,如果其他驱动程序支持相同功能,则需要其他命令/特殊命令。
答案2
如果您想以一种谨慎且难以改变的方式来做到这一点,我建议在您的 PDF 中添加一张图像,在其中使用隐写术(使用图像像素中的低阶位)隐藏您想要的信息。
然后,当给定分布式版本时,您可以再次提取所述图像并查看像素值以解码隐藏的信息。