如何使用 pdftk 从 pdf 中去除水印?

如何使用 pdftk 从 pdf 中去除水印?

我需要删除一些愚蠢的电子邮件水印,这些水印会扩展到一本公共领域书籍的所有页面上。我查看了 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两行。

我很容易就能看出哪个流对象是水印代码,因为它贴心地包含了“水印”这个词:-)

您可能没有这么有用的文字,但如果你有耐心:

  1. 备份原始未压缩的 PDF

  2. 创建未压缩 PDF 的临时副本

  3. 从临时副本中查找并删除对象流

  4. 将您的更改保存到临时副本。

  5. 在 PDF 查看器中打开临时副本

  6. 检查刚刚移除的对象流是否是水印

如果不是,请返回步骤 2,冲洗并重复,每次移除不同的对象,直到移除水印对象。

** 我了解了流对象,包括通过在网上搜索“PDF 对象流”查看示例。 https://blog.didierstevens.com/2008/05/19/pdf-stream-objects/ 有一个很好的总结,而在 O'Reilly 网站上可供查看的 Leonard Rosenthol 所著的“使用 PDF 进行开发”的“第 1 章 PDF 语法”则有更详细的介绍。

答案4

从 pdf 中删除水印

  1. 在 notepad++ 或 textpad 中打开 PDF
  2. 搜索所需的水印文本并使用“查找和替换”选项将其替换为无内容(空白)
  3. 保存文件
  4. 在标准 Adob​​e Reader 中打开

会抛出类似“文件损坏,需要修复”的错误

  1. 退出时会提示你保存文件

保存

相关内容