背景
使用 LaTeX 编写一本书。当用户购买该书时,将自动生成 PDF。
问题
PDF 应该带有包含此人的姓名和联系信息的水印。
问题
哪些软件符合以下标准:
- 将加密的、不可见的水印应用于 PDF
- 开源
- 独立于平台(Linux、Windows)
- 快速(1 秒内即可标记 200 页的 PDF)
- 批处理(仅由命令行驱动)
- 抗合谋攻击
- 非脆弱性(例如,PDF -> EPS -> PDF 仍然包含水印)
- 记录详实(展示示例用法)
想法与资源
一些想法和发现:
- 自然语言处理 (NLP) 水印。
- 对随机选择的图像应用隐写术。
- http://openstego.sourceforge.net/cmdline.html
NLP 的问题在于可能会引入语法错误。隐写术的问题在于图像来自图像缓存,因此使用带水印的图像重新创建该缓存会导致生成 PDF 时出现延迟(我可以从缓存中删除一个图像,但这不是一个优雅的解决方案)。
谢谢你!
答案1
几年前我做过类似的事情。它没有满足你所有的“硬”标准。它的工作原理如下:
我在任意 PDF 页面的某个边框上随机放置了一个几乎无法察觉的 2x2 点大小的“可点击”区域。它不太可能被意外发现(在 PDF 中存在大量其他非常明显的可点击热点的情况下……)。
如果您点击该链接,它会带您进入一个网页
http://my.own.site/project/87245e386722ad77b4212dbec4f0e912
,其中包含一些虚构的“勘误表”要点。(我是否提到过这87245e386722ad77b4212dbec4f0e912
是我存储在数据库表中的人员姓名 + 联系数据的 MD5 哈希值?:-)
显然,这无法防止打印+扫描+ocr 或 PDF“重印”循环。而且它还依赖于某种程度的“隐蔽性安全”。
以下是使用 Ghostscript 将这样一个可点击热点添加到 random-in.pdf 第 1 页左下角的方法:
gs \
-o random-out.pdf \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
-c "[ /Rect [1 1 3 3]" \
-c " /Color [1 1 1]" \
-c " /Page 1" \
-c " /Action <</Subtype /URI" \
-c " /URI (http://my.own.site/87245e386722ad77b4212dbec4f0e912)>>" \
-c " /Subtype /Link" \
-c " /ANN pdfmark" \
-f random-in.pdf
为了使可点击区域更大并且可见,请更改上述命令行参数,如下所示:
[....]
-c "[/Rect [1 1 50 50]" \
-c " /Color [1 0 0]" \
[....]
更简单的方法是生成 PDF 的 MD5 哈希并将其保存在数据库中。由于文档的 UUID 以及元数据中的 CreationDate 和 ModDate,因此对于您创建的每个 PDF,该哈希都是唯一的。当然,这也只允许以数字形式跟踪原始 PDF...
答案2
这个问题非常难,我不确定这是否能回答你的所有问题。
我不确定是否有一个一体化解决方案可以做到这一点或随机化。
然而,如果我负责这项任务,我会认为最简单的方法是将文档保存为中间格式,例如格式化的 HTML 或类似的格式。
使用打印 CSS 文件或类似文件,您可以获得与书籍相同的布局,并使用某种脚本来随机化图片、内容或任何内容,以及将文档重新组装回来的服务器端 PDF 组件。
那么 - 例如,当有人购买文档时,您的购买脚本可以随机选择一个标识保护机制的数字(例如第一张图片、第二张图片、某处的文本等),然后生成唯一的下载链接。
当调用该下载链接时,它会检查号码,执行操作并编译为pdf,然后将其下载到客户端。
再说一次,我知道这不会容易/直接,但你要求的并不是容易的事情,而这是我能想到的最好的方法。