<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Watermark on OHTLY Blog</title>
    <link>https://blog.ohtly.com/tags/watermark/</link>
    <description>Recent content in Watermark on OHTLY Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sun, 19 Jul 2026 11:05:35 +0800</lastBuildDate>
    <atom:link href="https://blog.ohtly.com/tags/watermark/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PDF 水印四层结构的分析与移除</title>
      <link>https://blog.ohtly.com/posts/2026-07-19-pdf-watermark-removal/</link>
      <pubDate>Sun, 19 Jul 2026 11:00:43 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-19-pdf-watermark-removal/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;一本 A4 尺寸的扫描版 PDF，A4 尺寸的扫描版 PDF。每页底部固定出现水印图样，并包含一个可点击的矩形区域，点击后跳转到外部站点。原始 PDF 使用 Adobe Acrobat Pro DC 17 Paper Capture 生成，具备完整的 OCR 文字层。&lt;/p&gt;&#xA;&lt;p&gt;目标：彻底移除水印，保留清晰的纯阅读版 PDF。&lt;/p&gt;&#xA;&lt;h2 id=&#34;诊断水印的四层结构&#34;&gt;&#xA;  诊断：水印的四层结构&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%af%8a%e6%96%ad%e6%b0%b4%e5%8d%b0%e7%9a%84%e5%9b%9b%e5%b1%82%e7%bb%93%e6%9e%84&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;解剖 PDF 内部结构后发现，水印并非单一图层，而是同时嵌入了四个层面：&lt;/p&gt;&#xA;&lt;div class=&#34;mermaid&#34;&gt;&#xA;flowchart TB&#xA;    P[&#34;一本扫描版 PDF&lt;br/&gt;多页&#34;] --&gt; L1[&#34;Layer 1: Resources/XObject&lt;br/&gt;图片对象引用 /Im1&#34;]&#xA;    P --&gt; L2[&#34;Layer 2: 内容流&lt;br/&gt;渲染命令 /Im1 Do&#34;]&#xA;    P --&gt; L3[&#34;Layer 3: 文本层&lt;br/&gt;OCR 可选的水印文字&#34;]&#xA;    P --&gt; L4[&#34;Layer 4: /Annots&lt;br/&gt;Link 注释 /URI 外部链接&#34;]&#xA;&#xA;    L1 --&gt; R1[&#34;绝大多数页含此引用&#34;]&#xA;    L2 --&gt; R2[&#34;绝大多数页含此命令&#34;]&#xA;    L3 --&gt; R3[&#34;约 绝大多数页含此文本&#34;]&#xA;    L4 --&gt; R4[&#34;绝大多数页含此注释&#34;]&#xA;&#xA;    style L1 fill:#e3f2fd&#xA;    style L2 fill:#e3f2fd&#xA;    style L3 fill:#e3f2fd&#xA;    style L4 fill:#e3f2fd&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer 1&lt;/strong&gt;: 每页的 &lt;code&gt;Resources&lt;/code&gt; 字典引用了名为 &lt;code&gt;/Im1&lt;/code&gt; 的 XObject 图片（xreference → 文件尾部存储的 PNG 图像）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer 2&lt;/strong&gt;: 页面内容流中插入了 &lt;code&gt;q cm /Im1 Do Q&lt;/code&gt; 指令序列，负责将图片渲染到页面上&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer 3&lt;/strong&gt;: OCR 引擎将水印图片上的文字识别为可选文本，嵌入到内容流中&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer 4&lt;/strong&gt;: 页面的 &lt;code&gt;/Annots&lt;/code&gt; 数组中定义了一个 Link 注释，框选范围覆盖水印区域，URI 指向外部站点&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;只有四层全部清除，才算真正移除水印。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
