我需要删除一些愚蠢的电子邮件水印,这些水印会扩展到一本公共领域书籍的所有页面上。我查看了 pdftk 手册页和一些示例,但仍然无法弄清楚如何删除水印。感谢您的提示。
答案1
执行的任务非常简单:
使用 sed:
sed -e "s/watermarktextstring/ /g" <input.pdf >unwatermarked.pdf
但之后一定要维修结果输出 pdf
pdftk unwatermarked.pdf output fixed.pdf && mv fixed.pdf unwatermarked.pdf
全部合并到一个命令中:
sed -e "s/watermarktextstring/ /g" <input.pdf >unwatermarked.pdf && pdftk unwatermarked.pdf output fixed.pdf && mv fixed.pdf unwatermarked.pdf
文本水印只不过是 pdf 压缩代码中两个标签之间的文本
答案2
对 Dingo 的答案进行了一点补充,因为它对我来说不起作用:
我必须先解压 PDF 文档,才能找到水印并将其替换为sed
。第一步是使用以下方法解压 PDF 文档pdftk
:
pdftk original.pdf output uncompressed.pdf uncompress
现在,uncompressed.pdf
可以按照 Dingo 的回答使用:
sed -e "s/watermarktextstring/ /" uncompressed.pdf > unwatermarked.pdf
然后我修复并重新压缩该文档:
pdftk unwatermarked.pdf output fixed.pdf compress
答案3
Philippe 对 Dingo 的答案的附加内容的另一个补充......
我需要删除的水印是一个流对象(它是多行代码块),而不是单行,所以单行 sed 命令对我来说不起作用。
我需要使用文本编辑器来查找并删除它。
我首先使用 Philippe 的解决方案来解压缩 PDF。
然后用我最喜欢的文本编辑器打开 uncompressed.pdf,我发现一段超过 50 行长的文本,我可以看出这显然是水印的代码。
水印作为 PDF 流对象包含在文档中。**(见下文)
我需要删除的定义流对象的行以仅包含以下内容的行开头:
<num> 0 obj
其中<num>
,行首的数字用于标识特定对象。
我需要删除这一行以及从这一行开始直到第一个
endstream
endobj
紧接着 obj 行,即整个流对象定义。
endobj 行后面跟着接下来的<num> 0 obj
两行。
我很容易就能看出哪个流对象是水印代码,因为它贴心地包含了“水印”这个词:-)
您可能没有这么有用的文字,但如果你有耐心:
备份原始未压缩的 PDF
创建未压缩 PDF 的临时副本
从临时副本中查找并删除对象流
将您的更改保存到临时副本。
在 PDF 查看器中打开临时副本
检查刚刚移除的对象流是否是水印
如果不是,请返回步骤 2,冲洗并重复,每次移除不同的对象,直到移除水印对象。
** 我了解了流对象,包括通过在网上搜索“PDF 对象流”查看示例。 https://blog.didierstevens.com/2008/05/19/pdf-stream-objects/ 有一个很好的总结,而在 O'Reilly 网站上可供查看的 Leonard Rosenthol 所著的“使用 PDF 进行开发”的“第 1 章 PDF 语法”则有更详细的介绍。
答案4
从 pdf 中删除水印
- 在 notepad++ 或 textpad 中打开 PDF
- 搜索所需的水印文本并使用“查找和替换”选项将其替换为无内容(空白)
- 保存文件
- 在标准 Adobe Reader 中打开
会抛出类似“文件损坏,需要修复”的错误
- 退出时会提示你保存文件
保存