# PDF 水印

一份写着自己去了哪里的扫描件，就没法悄悄再去别的地方。

> 在浏览器里给 PDF 的每一页加上水印：给谁的、日期、名字，任意角度和透明度，任何语言。什么都不上传，页面本身不动，结果会先核对再给你下载。

This is an interactive browser tool at https://httcup.github.io/tools/watermark-pdf/. Files are processed on the device running that browser. Any deliberate sharing or optional network feature is described on the page. What follows is its written explanation; open the address to use it.

## Your 文档 are **processed in your browser**. No processing upload.

你选的那份文档，打开、盖章、写回，全都在这台机器的内存里完成，用的是从这个地址发来的代码。水印上的字是你自己的浏览器画的。这里根本没有能做上传的东西，这一页的另一头也没有服务器可以接收。

- ✗ 不上传
- ✗ 不注册
- ✓ 断网可用
- ✓ 开源
- ✓ 文件留在你的设备上

## 怎么给 PDF 加水印

1. **选那份 PDF。** 一次一份文档。浏览器直接从你的硬盘上把它读进来，在这里打开。要密码的文档会被退回，附一个去解锁那一页的链接；其他的，包括扫描件，原样收下。
2. **打上那行字。** 这份副本是给谁的、什么时候给的：「仅供某某银行使用 · 2026 年 9 月 12 日」就是能干活的样子。任何语言、任何文字，字是你自己的浏览器画的，你能打出来的，水印就能说出来。
3. **调它怎么放，看着预览。** 大小、是沿着页面对角线还是平放、是在中间出现一次还是铺满整页、有多淡、什么颜色，以及是每一页都盖还是只盖第一页。预览是一张跟你第一页一样形状的空白页，水印就压在文件会把它放的位置上。
4. **盖上去，然后读那句写着「已核对」的话。** 那张图会被加进文档一次，每一页各得到一条画它的指令。接着做好的文件会在这里被重新打开，每一页都必须带着水印回来，页数跟原来一样，否则你不会拿到下载，只会拿到一句说明。

## The longer version

[如何为 PDF 加水印，印记究竟有什么用](https://httcup.github.io/tools/guides/watermark-a-pdf/): 贷款机构和房东为何要求扫描写名字，印记能防什么、不能防什么，写什么，以及怎样在浏览器中无需上传完成。

## Also in the box

- [PDF 涂黑](https://httcup.github.io/tools/redact-pdf/): 字从文件里删掉，然后再搜一遍这个文件来证明。
- [PDF 转 CSV](https://httcup.github.io/tools/pdf-to-csv/): 将检测到的 PDF 文本表格转换成电子表格可打开的行。
- [收据与发票识别](https://httcup.github.io/tools/receipt-invoice-extractor/): 读取照片，检查字段和裁剪结果，准备供邮件应用使用的压缩附件和合计。
- [图片转 PDF](https://httcup.github.io/tools/images-to-pdf/): 把你的图片装进一个文档。

## Questions

### 水印能被去掉吗？

能，任何一个有 PDF 编辑器的人都能，这一页不会告诉你别的。水印不是保护。它做的是让一份副本说出自己去了哪里：一份盖着「仅供某某银行使用」的扫描件出现在另一家贷款机构，就带着它泄露出去的那个地方的名字，这正是贷款机构、房东和律师要求盖章的原因。如果这份文档根本不能被错误的人读到，那要的是密码，本站的 [PDF 加密](https://httcup.github.io/protect-pdf/)能加上一个。

### 水印可以是中文、阿拉伯文或者别的语言吗？

可以，你能打出来的都可以。字是你的浏览器用你自己机器上的字体画的，作为一张图压在每一页上，所以水印不像 PDF 里没有嵌字体的文字那样只限于拉丁字母。代价是做完之后这些字不能被选中、不能被搜索，对水印来说这反而是对的。

### 为什么预览里看不到我的文档？

因为本站没有 PDF 渲染器，这是有意的。要忠实地画出一页 PDF，得有字体引擎和完整的图形模型，一个浏览器那么大的引擎，而背上它会改变这里每一个工具的性质。所以预览显示的是它能诚实显示的东西：一张跟你第一页大小形状完全一样的空白页，水印压在文件会把它放的位置上，用的是写文件的同一段代码。用任何一个阅读器打开结果，就能看到两者合在一起的样子。

### 水印底下的文档看上去会不一样吗？

不会。页面自己的绘制没有被读取，更没有被改动：每一条指令、每一个嵌入字体、每一张图片都原样复制过去，水印以你选的透明度画在上面。文字还能选、还能搜，扫描件还是原来的分辨率，什么都不会移位。文件会大一张图的大小，每一页共用这一张，几个字的水印也就几十 KB。

### 扫描件和横着存的页面能用吗？

都能。扫描件就是一页上放着一张图，水印跟盖在别的东西上一样盖在图上。横着存的页面，也就是带着旋转、显示出来是横向的那种，会按它显示出来的样子盖：屏幕上的对角线就是屏幕上的对角线，不是扫描仪以为的那张纸的对角线。

### 带签名的文档会怎么样？

它的签名会失效，而且没有办法绕过去。签名覆盖的是它当初签的那个文件的确切字节，所以任何改动，任何程序做的，都会让它失效。这个工具写的是一个新文件，发现原件带签名时会在结果里说明。把你的原件留着：那一份仍然是签过名的。

### 带密码的 PDF 能加水印吗？

不能直接加，也不是在这里输密码：这一页不问密码。先在同一个浏览器里用 [PDF 解锁](https://httcup.github.io/unlock-pdf/)把密码去掉，再把解锁后的副本拿到这里盖章，然后想要的话用 [PDF 加密](https://httcup.github.io/protect-pdf/)把密码加回去。只带着限制的文件，也就是谁都打得开、却不肯打印的那种，同样会被退回，因为盖章意味着重写，而重写会把那些限制丢掉。

### 我的文档或者我打的字会被上传到什么地方吗？

不会。文件是你自己的浏览器在你自己的硬件上读取、盖章、写出的，字也是它画的。这个工具没有服务器那一端，页面的 `Content-Security-Policy` 列出了它可以联系的每一个地址，其中没有一个属于本站。最简单的验证办法，是把网线拔掉，照样用这一页。

### 我怎么知道每一页真的都盖上了？

因为这个工具会在你的机器上核对，并且把结果给你看。文件写好之后，它会被交给本站其他 PDF 工具用的同一个读取器，每一页回来时都必须在它的资源里带着水印的名字、并且以画出水印的那条指令收尾，页数跟原来一样。有任何一页不是这样，这次运行就报告为失败，什么都不会给你下载。

### 有大小限制吗？要钱吗？

工具里没有写死任何限制。限制是你自己的机器：文档在处理的时候是放在内存里的，几百兆的量，一台笔记本吃得下，再往上就会吃力。它是免费的，不注册、不登录，也没有试用期。本站带广告，那是养活它的东西；广告拿不到任何关于你文档的内容。

### 断网能用吗？

能。把页面加载一次，然后断开网络，它照样能用。这也是证明什么都没被上传的最简单的办法：一个把你的文档发出去盖章的工具，你一拔网线它就停了。

## How the privacy claim is verifiable

- **人们要加水印的文档，正是他们最不想上传的那份。** 给房东的护照扫描件。给贷款经纪的对账单。不能泄露的合同草稿。给一份文档盖上「这是给谁的」，理由就是它马上要离开你的手，而每一个提供盖章的在线工具都要你先把它交给一台陌生的服务器，那恰恰是水印要防的事。这一页做不到那件事。文件是你自己的浏览器读的，字是你自己的浏览器画的，盖好章的副本在内存里写出，页面的 `Content-Security-Policy` 列出了这一页可以联系的每一个地址，其中没有一个属于本站。把网络断掉它照样能用。
- **水印说的是一份副本去了哪里。它拦不住有人复制。** 这就是这件事诚实的大小。每一页上都压着「仅供某某银行使用，2026 年 9 月 12 日」，意味着一份出现在别处的扫描件带着它泄露出去的那个地方的名字，这正是银行、律师和房东要求盖章的原因，也是这件事值得做的原因。它不是保护：任何一个有 PDF 编辑器的人都能把水印再去掉，一个告诉你别的说法的页面是在推销什么。如果这份文档根本不能被错误的人读到，那就用 [PDF 加密](https://httcup.github.io/protect-pdf/)给它加上密码，结果下面那一排「接着去」的链接直接通到那里。
- **水印是一张图，所以任何语言、任何字体都行。** 一份 PDF 只能用它自己带着的字体、或者每个阅读器都默认有的那十四种字体来画文字，而那十四种是拉丁字母。这里没有去嵌一个字体，那要好几兆，还要一个本站决定不去背的引擎，而是让你的浏览器用你自己机器上的字体把字画一次，你打什么文字都行，然后作为一张带透明遮罩的图压在每一页上。画的分辨率打印机看不出区别。代价是做完之后这些字不能被选中、不能被搜索，对水印来说这反而是对的：它是给人看的，不是给人复制出去的。
- **页面本身不会被读取、重新渲染或者重排。** 这个工具往文档里加的是三个小对象，那张图、它的遮罩和一个透明度设置，往每一页加的是两条极小的绘制指令，一条在页面原有内容之前，一条在之后。页面自己的内容没有被解码，更没有被改动：每一条绘制指令、每一个嵌入字体、每一张图片都按原样写回去，所以扫描件还是扫描时的分辨率，文字还能选、还能搜，什么都不会移位。唯一会变的是任何一次重写都会变的东西：早先编辑留下的、已经被取代的旧对象不再带过来。
- **预览画的是位置，不是你文档的渲染。** 本站没有 PDF 渲染器，这是有意的，它也不假装有。预览显示的是一张跟你第一页大小形状完全一样的空白页，水印压在文件会把它放的位置上，用的是写文件的同一套算法，所以两者不可能不一致。你自己页面上的内容不会被画出来，因为画它需要一个浏览器那么大的引擎，而一个靠猜的预览比没有预览更糟。
- **做好的文件在交给你之前，会在这里重新打开一次。** 在那之前，上面这些话都只是这个工具在给自己判卷。所以那些马上就要变成你下载的字节，会被交给本站每一个 PDF 工具用的同一个读取器，而每一页回来时都必须在它的资源里带着水印的名字、并且以画出水印的那条指令收尾，页数跟原来一样。过不了这一关的文件会报告为失败，也不会有下载。
- **数字签名过不了这一关，有签名的时候页面会说。** 签名覆盖的是它当初签的那个文件的确切字节，所以任何重写都会让它失效，这正是签名的用处。这个工具写的是一个新文件，所以你拿回去的那份是没有签名的；发现文件带着签名时，它会在结果里说明。你的原件仍然是那份签过名的。
- **锁着的文档会先被送到隔壁。** 要密码才能打开的文件，不打开就没法盖章，而这一页不问密码。它会把这样的文件退回，附一个去 [PDF 解锁](https://httcup.github.io/unlock-pdf/)的链接，在同一个浏览器里把保护去掉；解锁后的副本拿回这里盖章，之后再用 [PDF 加密](https://httcup.github.io/protect-pdf/)把密码加回去。
- **Google 加载了什么，又没拿到什么。** 广告和统计脚本来自 Google。这两个都没有拿到关于你文档的任何东西：不是文件，不是某一页，不是文件名、大小、页数，也不是水印上的字。每一行读取、盖章或者写出 PDF 的代码都由这个源站发出，并且列在代码仓库里。
- **打赏按钮加载了什么，又没拿到什么。** 页眉上那个「Buy me a coffee」按钮，是由 cdnjs.buymeacoffee.com 的一段脚本画出来的，字体取自 Google Fonts。它就是一个链接，仅此而已：它不上报访问，也拿不到任何关于你或者你文档的东西。你不点它就什么都不会发生，而点下去要去的是别人的网站。
- **断网也能用。** 把网络断掉，这一页上的所有功能照常。这是最简单的一个证明：一个把你的文档发出去盖章的工具，这时候就停了。

**Check it yourself.** None of the above has to be taken on trust. This page is generated from the templates and config in the repository by a build script you can read and run yourself, and the result is committed to the `dist` branch — so you can diff what is served against what a build of the sources produces: https://github.com/httcup/tools

The files worth reading first are `config/site.toml` for the Content-Security-Policy，水印落在页面哪里看 `src/stamp.js`，字是怎么变成一张图的看 `src/render.js`，往文档里加的三个对象和往每一页加的两个看 `src/apply.js`。这几个都够不着网络，旁边负责读和写的部分也一样。
