PDF 水印(watermark)删除及防删除策略

现在几乎所有的公司都使用PDF文档。大多数这些公司的员工都需要与组织内外的个人共享包含敏感内容的文档。公司为了防止方式泄漏,帮助些别泄漏源等因素,通常将这些文档加上识别信息水印。本文将探讨用于水印删除与防删除的一些方法,欢迎大伙来喷。

在PDF文档中,通过用特定图像或文字覆盖文档的每个页面来实现水印。水印可以是一种有效的技术,但只有在正确实施的情况下才能实现。通常,在安全的情况下,水印将包含唯一标识个人或公司信息,这种保护是双重的:首先,它不鼓励员工泄露机密信息,其次,如果发生泄密,公司或组织可以轻松识别对违反保密规定负责的个人(在国内,加水印,只是为了防止被盗用)。这种水印的简单示例是覆盖的半透明文本片段,其包含最初被授予对文档的访问权的个人的名称或用户名。

添加这种水印的一种常见方式是向现有PDF文档的每个页面添加附加文本或图像层。这将创建一个看起来受保护的文档,但是,除非正确完成,否则实际上可能会产生一个很容易删除的水印。

下面是一个图片水印的例子:

189 0 obj
<</BBox[0.0 0.0 1440.0 810.0]/Group 212 0 R
/LastModified(D:20180913170604+08'00')
/Length 32
/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]
/OC 213 0 R
/PieceInfo
<</ADBE_CompoundType<</DocSettings 186 0 R/LastModified(D:20180913170604+08'00')/Private/Watermark>>>>
/Resources<</ProcSet[/PDF/ImageC]/XObject<</Im0 188 0 R>>>>
/Subtype/Form
/Type/XObject>>stream
q
1440 0 0 810 0 0 cm
/Im0 Do                                  % 引用图片名称
Q

endstream
endobj

文字水印:

215 0 obj
<</BBox[0.0 -24.0 168.0 2.40015]
/LastModified(D:20180913171135+08'00')
/Length 138
/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]
/OC 204 0 R
/PieceInfo
<</ADBE_CompoundType<</DocSettings 218 0 R/LastModified(D:20180913171135+08'00')/Private/Watermark>>>>
/Resources 216 0 R/Subtype/Form>>stream
0 g 0 G 0 i 0 J []0 d 0 j 1 w 10 M 0 Tc 0 Tw 100 Tz 0 TL 0 Tr 0 Ts
BT
/SimSun 24 Tf
0 g
0 -20.904 Td
<8BF4768465454E8B768498CE683C> Tj               % 输出文字
ET

endstream
endobj

还有一些比较早一些水印格式(通常是以Watermark 注释的形式)如下:

8 0 obj                                 % Watermark appearance
<<
/Length ...
/Subtype /Form
/Resources ...
/BBox ...
>>
stream
...
BT
/F1 1 Tf
36 0 0 36 0 -36 Tm
(Do Not Build) Tx
ET
...
endstream
endobj
9 0 obj                                  % Watermark annotation
<<
/Rect ...
/Type /Annot
/Subtype /Watermark
/FixedPrint 10 0 R
/AP <</N 8 0 R>>
>>
                                      % in the page dictionary
/Annots [9 0 R]
10 0 obj                              % Fixed print dictionary
<<
/Type /FixedPrint
/Matrix [1 0 0 1 72 -72]              % Translate one inch right and one inch down
/H 0
/V 1.0                                % Translate the full height of the page vertically
>>
endob

以上,这些通俗的做法,对于一些对PDF文件结构了解的人来说,很容易就能将这些水印去掉。

删除方法:

上面的例子中,水印对应的对象中带上水印(Watermark )这样显眼的字眼,这样明显就是告诉别人“我就是水印,快来删除我吧”, 只要将对应的水印对象置成空对象(null)或用空格替换,水印就被删除了(简单的令人发指)。

当然,有些公司通过特点的方法添加的水印,不会带上水印(Watermark )文字信息,他们会通过直接在页面上添加图片或form来完成,这样很大程度上避免了一些批量删除水印的工具的删除。

不过,对于PDF图片对象,form对象比较熟悉的人来说,由于每一页上都会添加一样的水印,只要查找图片对象或form对象中,哪个对象被重复引用(引用次数通常和文档页数相同),就可以快速的判断出来,然后还是上面的方法,把相应对象置成空对象,“哇噻,水印又没了!”。

那么,怎样的水印,才是安全的水印呢?(相对安全,俺的技术还达不到100%安全)

防删除方案:

1、将PDF文件的页面全部转换成图片,然后在图片上加水印,最后将加完水印的图片,组合生成PDF文件。

这个方案此方法可有效防止删除PDF水印。但是,有以下几个缺点:

第一个,会破坏PDF原始的结构,tagged PDF, 注释,Form,线性化,签名,层(layer)结构等一系列结构统统失效

第二个,文档中的文本不再像以前那样可搜索或复制

第三个,文档大小暴增(视文档页面数量及图片压缩格式)

2、将水印图片(嵌入式图片)或文字直接嵌入到content流中

该方案实施起来相对有点难度,但是对于破坏者来说,难度就更大了(哇哈哈,仰天长笑)。至于放到content流中的什么位置,自己看,只要不破坏原有centent流中的栈结构(q、Q)。

猜你喜欢

转载自blog.csdn.net/steve_cui/article/details/82692393