生成或更新PDF以包含加密的隐藏水印?


10

背景

用LaTeX写一本书。当用户购买书籍时,将自动生成PDF。

问题

PDF应包含水印,其中包含此人的姓名和联系信息。

什么软件符合以下标准:

  • 将加密的不可见水印应用于PDF
  • 开源
  • 独立于平台(Linux,Windows)
  • 快速(在1秒内标记200页PDF)
  • 批处理(仅限命令行驱动)
  • 共谋攻击抗性
  • 非脆弱的(例如,PDF - > EPS - > PDF仍然包含水印)
  • 记录完整(显示示例用法)

想法和资源

一些想法和发现:

NLP的问题在于可以引入语法错误。隐写术的问题在于图像来自图像缓存,因此用水印图像重新创建缓存会在生成PDF时产生延迟(我可以从缓存中删除一个图像,但这不是一个优雅的解决方案)。

谢谢!


请稍微修改一下您的要求说明,否则不清楚。“无法察觉的水印”显然不是你想要的......否则,如果你需要,你会如何自己发现它们?
Kurt Pfeifle 2010年

有点不清楚您构思系统的确切目的是什么:检测PDF是否传递给另一个用户,即使您的许可证禁止这样做?检测PDF是否打印在纸上,即使您的许可证禁止这样做?通过互联网跟踪特定PDF的方式并跟踪它何时打开?或者是其他东西?
Kurt Pfeifle 2010年

@pipitas:如果未经许可将PDF的注册版本发布到野外,我想知道是谁发布了它。但是如果人们可以看到PDF有水印,那么水印变得更容易规避。
Dave Jarvis 2010年

Answers:


6

几年前我做了类似的事情。它没有达到你所有的“硬”标准。它的工作方式如下:

  • 我在随机PDF页面的一个边框上的某个随机位置放置了几乎不可检测的2x2点大小的“可点击”区域。它不太可能被偶然发现(无论如何,在PDF中其他非常明显可点击的热点的负载中......)。

  • 如果您点击链接,它会带您进入一个网页http://my.own.site/project/87245e386722ad77b4212dbec4f0e912,其中包含一些制作的“勘误”要点。(我是否提到87245e386722ad77b4212dbec4f0e912过这个人名的MD5哈希值+我保存在数据库表中的联系人数据?:-)

显然,这不能防止打印+扫描+ ocring或PDF“refrying”循环。它还依赖于某种程度的“默默无闻”。

以下是使用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都将是uniq。当然,这也只允许以数字形式跟踪原始PDF ...


您是否曾在野外找到PDF并使用此技术追溯它?
Dave Jarvis 2010年

@Dave Jarvis:是的,我确实在某种程度上......但这不是一个“严肃”的事情,我对跟踪没有任何实际兴趣。我只将其作为概念证明,大约6个月后我关闭了“跟踪”Web服务器。这是一个网络PDF服务器,我在客户的公司内部设置。“跟踪器”与上述类似,但使用了整个可点击区域。我只是跟踪了apache日志文件中“点击”的数量....
Kurt Pfeifle 2010年

不错的想法,但请注意,在这样的PDF上运行GhostScript会降低它包含的任何采样图像,因为GhostScript不支持不对它们进行解压缩(这会丢失输入中JPEG样式压缩的图像中的信息)并倾向于将JPEG风格的压缩应用于所有图像(甚至是刚刚解压缩的图像)...
SamB 2011年

@SamB:我认为您可以添加-dJPEQ=100 -dQFActor=1.0到Ghostscript命令行,以确保您保持100%的现有JPEG质量。但不,我没有注意到我的文件中的图像质量有任何降低,如果我使用-dPDFSETTINGS=/prepress通过Ghostscript重新提取任何PDF 的通用设置....
Kurt Pfeifle

[续]不,不仅仅是Ghostscript图像的JPEG压缩 - 您可以使用-dColorImageFilter=/FlateEncode(无损ZIP)来覆盖=/DCTEncode旧版GS中的默认(有损JPEG)。从GS v7.21开始默认是=/FlateEncode无论如何......对于颜色是相同的-dGrayImageFilter=...(默认-dMonoImageFilter=...使用/CCITTFaxEncode)。
Kurt Pfeifle

1

很难,我不确定这会回答你所有的问题。

我不确定一个解决方案可以做到这一点,或随机。

但是,如果我的任务是,我认为最简单的方法是将文档保持为格式化HTML或类似格式的中间格式。

使用打印CSS文件或类似文件,您可以使布局与书籍相同,并使用某种脚本来随机化图片,内容或任何内容以及将文档组装回来的服务器端PDF组件。

那么 - 例如,当有人购买文件时,你的购买脚本可以随机选择一个识别保护机制的号码(例如第一张图片,第二张图片,文本某处等),然后生成一个独特的下载链接。

当调用该下载链接时,它会检查编号,执行操作并编译为pdf,然后将其下载到客户端。

再一次,我知道这不容易/直接,但你不是要求一些简单的东西,这是我能想到的最好的方式。


@Dave Jarvis - 我完全理解你要做的事......正如我所说,我不确定最好的解决方案,但我所说的至少应该工作......远非易事。
威廉希尔苏姆2010年

@Dave Jarvis - 我试图说/得到的是我从来没有见过一个/一个简单的方法来做你想要的,但使用PHP / ASP.Net,更容易编写脚本/调用第三方组件。我认为,如果你的HTML格式正确/格式化整个文档,使用PDF组件转换将非常容易....例如,让我们说第31页有100页和一张图片,你可以将1-30页作为PDF,将页面32-100作为PDF,第31页将生成并格式化为html(按照本书其余部分的样式),然后您可以使用1/2
William Hilsum

pdf组件将获得第一个PDF,隐藏html页面,获取第二个PDF并生成一个新的pdf,将所有这些组合在一起。生成的页面可以调用脚本,可以执行隐写术(动词不确定!)或其他任何你想要的东西......有很多(免费和付费)pdf组件 - 例如这是一个... componentone.com/SuperProducts / PDF我希望这能让我更清楚地了解我想要解决的问题 - 只是很难解释。2/2
William Hilsum 2010年

@Dave Jarvis - 呃,不完全......正如我所说,很难解释......有些PDF组件与CSS /打印样式一起令人惊叹。例如,看看Moodle。可以完全格式化网页,使打印输出看起来像书/遵循风格。然后,您可以使用PDF组件进行完全导出/保存,就像它应该如何查看最终结果一样。您可以轻松生成所需的图片并获取文本,并将其(无缝地组合到最终用户)作为单个PDF文件进行组合。我只提到web / php / asp.net,因为我认为这是达到你想要的最简单方法。
William Hilsum 2010年

@Dave Jarvis:我猜你是不是在使用pdfTeX呢?(或者您是否更担心用户在进行pdf-> ps-> pdf转换并降低过程中的样本图像?)。无论如何,PS-> PDF转换通常会降低图像,因为GhostScript的是不是足够聪明,以压缩形式保存的JPEG影像风格,而且往往自动应用JPEG式压缩在输入上出现的任何图像。(Distiller显然可以指示单独留下JPEG风格的图像,但实际上有人有吗?)
SamB 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.