PDF 加水印

文字/图片/平铺

435 次访问
PDF WATERMARK

PDF 加水印

文字水印 · 自定义字体颜色透明度角度 · 浏览器本地处理

💧
点击 / 拖拽 PDF 文件

水印使用场景

商业机密:"机密"/"CONFIDENTIAL" - 内部分发文档

草稿标识:"DRAFT"/"草稿" - 未定稿版本

版权保护:公司名 + 日期 - 防止盗用

追溯标识:阅读者姓名 + 日期 - 追踪泄露源

关于本工具

了解工具定位 · 使用场景 · 对比优势

给 PDF 文档添加文字或图片水印,支持平铺排列,防止文件被未经授权使用。适合需要保护合同、设计稿、报告版权的个人或企业,或给内部文档标注“草稿”“仅供预览”等状态。上传 PDF 后选择水印内容、位置和透明度,后端处理完成后即可下载。文件仅用于临时处理,不会长期留存。

使用场景

📄

合同文档防篡改

法务或行政人员在发送电子合同时,担心对方修改条款或金额。使用本工具将合同 PDF 加上包含公司 Logo 的图片水印,平铺覆盖全文。水印在页面上的固定位置不可编辑,接收方无法在不破坏文档的情况下删除或覆盖,有效降低合同被篡改的风险。

🎓

学生作业版权保护

高校学生或研究人员在提交论文、设计作品或作业时,担心被他人冒用或抄袭。将 PDF 文件添加包含学号、姓名或作品标题的文字水印,平铺于每一页。即使截图或复印,水印信息依然可见,能清晰追溯来源,保护原创成果。

🏢

内部资料分发溯源

企业 HR 或部门主管向员工分发员工手册、制度文件等内部 PDF 时,担心文件被外传。在文件上添加包含员工工号或部门名称的文字水印,平铺于页面。一旦文件泄露,可根据水印信息快速定位到具体责任人,实现分发可追溯。

🖼️

摄影作品样片展示

摄影师或设计师在向客户发送样片集 PDF 时,担心高清图片被直接保存商用。将包含个人 Logo 或网站域名的图片水印以低透明度平铺在图片上,既不影响客户预览效果,又使盗图者无法直接使用无水印原图,保护作品版权。

📊

财务报表保密分发

财务人员在向审计或股东发送季度财报 PDF 时,需要确保文件在传输过程中不被截取后冒用。在财报每一页添加包含“仅供内部审计”或“机密”字样的文字水印,平铺覆盖。即使文件被转发,水印也明确标识了文件的保密性质与用途。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具iLovePDFAdobe Acrobat Pro
数据隐私纯浏览器处理,文件不上传服务器文件上传至云服务器处理本地处理,但需安装桌面软件
处理速度1-3 秒(取决于文件大小)5-15 秒(含上传/下载时间)1-5 秒(本地处理)
离线可用支持(页面加载后完全离线)不支持(必须联网)支持(安装后离线使用)
收费模式完全免费,无水印基础免费,高级功能付费付费订阅(约 ¥150/月)
注册要求无需注册,打开即用免费用户有限制,需注册需注册 Adobe 账号
水印类型文字、图片、平铺文字、图片、平铺、PDF 覆盖文字、图片、动态字段、页码
文件大小限制无限制(浏览器内存决定)免费版 100MB,付费版 2GB无限制

使用指南

上手步骤 · 输入输出 · 避坑提示

使用步骤

  1. 上传 PDF 文件,单文件 ≤ 50MB,支持多文件批量上传
  2. 选择水印类型:文字(输入内容、字体、字号、颜色)或图片(上传 PNG,≤ 2MB)
  3. 调整水印位置(九宫格选择)与透明度(0-100 滑块)
  4. 选择平铺模式:单页重复或跨页连续平铺
  5. 点击「开始处理」,等待后端生成带水印的 PDF
  6. 预览结果后点击「下载」保存,或「批量下载」打包 ZIP

输入输出示例6 个典型场景,覆盖常规、边界与易错

输入输出说明
上传一个 3 页的合同 PDF,选择文字水印「机密」,透明度 50%,旋转 45 度,平铺生成一个 3 页的合同 PDF,每页背景平铺「机密」文字水印,倾斜 45 度,半透明可见典型场景:商业文件标注保密级别
上传一张 JPG 图片(公司 Logo),选择图片水印,不透明度 30%,平铺在 PDF 第一页PDF 第一页背景平铺 Logo 图片水印,其余页面无水印典型场景:仅对特定页面添加品牌标识
上传一个 200 页的 PDF,选择文字水印「草稿」,平铺,不透明度 100%生成 200 页 PDF,每页被「草稿」文字完全覆盖,背景不可见边界 case:大文件 + 完全不透明水印
上传一个 1 页的空白 PDF,选择文字水印「测试」,字号 1pt,不透明度 1%水印极小且几乎透明,肉眼难以辨认边界 case:极端小字号与低透明度组合
上传一个加密的 PDF(需密码打开),选择文字水印「样本」工具提示「文件已加密,请先解密后再添加水印」易错 case:加密文件无法直接处理
上传一个扫描件 PDF(图片形式,无文字层),选择文字水印「仅供预览」水印成功添加在扫描件图片上方,不影响原图内容易错 case:扫描件同样支持文字水印

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 水印文字包含特殊字符导致渲染异常

错误
水印文字:© 2024 公司™ 文件
修复
水印文字:2024 公司 文件

©/™/® 等符号在 PDF 字体子集中可能缺失,导致渲染为方块或乱码;后端 Go 默认字体不含这些符号的嵌入

2. 水印文字过长导致页面崩溃

错误
水印文字:这是一份非常非常非常非常非常非常非常非常非常非常非常长的水印文字(超过 200 字)
修复
水印文字:机密文件

后端处理时单行文字超过 200 字会导致 PDF 排版引擎内存溢出,服务端返回 502;建议控制在 50 字以内

3. 上传的 PDF 文件损坏或加密

错误
上传一个从微信下载的、提示“请输入密码”的 PDF
修复
先使用密码移除工具解密,再上传

后端 Go 无法处理加密 PDF(PDF 1.7 标准加密流),会直接返回“文件解析失败”;需先解密

4. 水印透明度设置过高导致文字不可见

错误
透明度:0.05
修复
透明度:0.3

透明度值范围 0-1,低于 0.1 时肉眼几乎不可见;后端渲染时 alpha 通道会截断到整数,0.05 实际等于 0

5. 水印旋转角度导致文字超出页面

错误
旋转角度:45 度,水印文字:机密文件机密文件机密文件
修复
旋转角度:0 度,水印文字:机密文件

45 度旋转后文字对角线长度增加约 1.4 倍,长文字会超出页面边界被裁切;建议 0 度或 90 度

6. 选择“平铺”模式时水印间距设置太小

错误
平铺间距:5px
修复
平铺间距:50px

间距小于 10px 时水印会重叠成一片,视觉上变成纯色块,失去水印作用;后端按像素计算间距,重叠后无法区分

7. 上传的 PDF 包含表单字段导致水印位置偏移

错误
上传一个包含可填写表单(AcroForm)的 PDF,直接加水印
修复
先使用“扁平化表单”工具处理,再加水印

表单字段的坐标系统与页面内容不同,水印会定位到表单字段的偏移位置;后端 Go 不处理 AcroForm 坐标变换

8. 水印颜色使用 RGB 值超出 0-255 范围

错误
颜色:#FF00FF00(四通道)或 RGB(300, 0, 0)
修复
颜色:#FF0000 或 RGB(255, 0, 0)

PDF 颜色空间仅支持 0-255 的 8 位 RGB;超范围值后端会截断,但用户可能误以为支持 RGBA 或 HSL

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

W(x, y) = α · T(x, y) + β · I(x, y)

变量说明

  • W(x, y) — 像素 (x, y) 处最终颜色值
  • T(x, y) — 水印图案在 (x, y) 处的颜色值
  • I(x, y) — 原始 PDF 页面在 (x, y) 处的颜色值
  • α — 水印透明度系数(0~1)
  • β — 原始内容保留系数(通常 β = 1 - α)

示例

将半透明红色水印(RGB=255,0,0)以 α=0.3 叠加到白色 PDF 页面(RGB=255,255,255)上。对于像素 (100,200):T=255,0,0;I=255,255,255;α=0.3,β=0.7。R 通道 = 0.3×255 + 0.7×255 = 255;G 通道 = 0.3×0 + 0.7×255 = 178.5 → 179;B 通道 = 0.3×0 + 0.7×255 = 179。最终像素颜色为 (255, 179, 179),即浅粉色。

适用范围

适用于所有基于像素混合的图片/文字水印叠加场景。不适用于矢量水印(如 PDF 原生注释)或加密水印(需频域变换)。公式为计算机图形学标准 Alpha 混合算法(Porter & Duff, 1984)。

原理图

上传 PDF 文件支持 .pdf 格式设置水印参数文字 / 图片 / 平铺服务端处理Go 后端渲染合成下载结果带水印的 PDF隐私说明• 文件上传后由服务端处理,处理完成后自动删除• 不存储任何用户文件或水印内容
用户输入 服务端处理 输出结果

开发者集成

3 种主流语言 · 复制即用

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
import io

# 生成一个示例 PDF 并添加文字水印
def add_text_watermark(input_pdf_path, output_pdf_path, watermark_text="CONFIDENTIAL"):
    # 创建水印层
    packet = io.BytesIO()
    c = canvas.Canvas(packet, pagesize=letter)
    c.setFont("Helvetica", 60)
    c.setFillAlpha(0.2)  # 透明度
    c.saveState()
    c.translate(letter[0]/2, letter[1]/2)
    c.rotate(45)
    c.drawCentredString(0, 0, watermark_text)
    c.restoreState()
    c.save()
    packet.seek(0)
    
    # 合并到原 PDF
    from PyPDF2 import PdfReader, PdfWriter
    reader = PdfReader(input_pdf_path)
    watermark = PdfReader(packet)
    writer = PdfWriter()
    
    for page in reader.pages:
        page.merge_page(watermark.pages[0])
        writer.add_page(page)
    
    with open(output_pdf_path, "wb") as f:
        writer.write(f)

# 使用示例(假设已有 input.pdf)
# add_text_watermark("input.pdf", "output.pdf", "SAMPLE")
package main

import (
	"github.com/unidoc/unipdf/v3/common/license"
	"github.com/unidoc/unipdf/v3/creator"
	"github.com/unidoc/unipdf/v3/model"
	"log"
)

func addWatermark(inputPath, outputPath, text string) {
	// 初始化许可证(生产环境需设置有效 key)
	license.SetMeteredKey("")

	// 读取源 PDF
	reader, err := model.NewPdfReaderFromFile(inputPath, nil)
	if err != nil {
		log.Fatal(err)
	}

	// 创建新 PDF
	c := creator.New()
	numPages, _ := reader.GetNumPages()

	for i := 1; i <= numPages; i++ {
		page, _ := reader.GetPage(i)
		c.AddPage(page)

		// 添加水印
		wm := c.NewText(text)
		wm.SetFontSize(48)
		wm.SetColor(creator.ColorRGBFromHex("#cccccc"))
		wm.SetOpacity(0.3)
		wm.SetAngle(45)
		wm.SetPos(200, 400)
		c.Draw(wm)
	}

	c.WriteToFile(outputPath)
}

func main() {
	addWatermark("input.pdf", "output.pdf", "DRAFT")
}
const { PDFDocument, rgb, degrees } = require('pdf-lib');
const fs = require('fs');

async function addWatermark(inputPath, outputPath, text = 'WATERMARK') {
  const pdfDoc = await PDFDocument.load(fs.readFileSync(inputPath));
  const pages = pdfDoc.getPages();
  
  pages.forEach((page) => {
    const { width, height } = page.getSize();
    page.drawText(text, {
      x: width / 2 - 100,
      y: height / 2,
      size: 50,
      opacity: 0.2,
      rotate: degrees(-45),
      color: rgb(0.8, 0.8, 0.8),
    });
  });

  const pdfBytes = await pdfDoc.save();
  fs.writeFileSync(outputPath, pdfBytes);
}

// 使用示例
// addWatermark('input.pdf', 'output.pdf', 'CONFIDENTIAL');

常见问题

7 个高频疑问

PDF 加水印,文字水印和图片水印哪个更清晰?
清晰度取决于水印本身的材质和 PDF 的渲染方式。文字水印(如“机密”“草稿”)由 PDF 阅读器直接渲染,字体清晰锐利,不会因缩放而模糊,适合纯文本场景。图片水印(如公司 Logo)效果取决于图片原始分辨率,建议使用 300 DPI 以上的 PNG 图片;如果图片分辨率低于 150 DPI,在 100% 缩放时会有明显锯齿。本工具对图片水印不做额外压缩,保持原图质量,但最终显示效果还受读者端 PDF 阅读器(如 Adobe Acrobat vs 浏览器内置)的影响。
为什么我加了水印后,PDF 文件变大了好几倍?
文件体积变化主要来自水印本身的嵌入方式。文字水印通常只增加几 KB 的字体描述信息,体积几乎不变。图片水印则不同:本工具将图片以无损方式嵌入 PDF,如果原图是 2MB 的高清 Logo,每页都嵌入一次,10 页 PDF 就会增加约 20MB。建议在上传前将图片压缩至合理尺寸(宽度 200-400 像素、JPEG 质量 80%),既能看清水印,又不会显著增加文件体积。如果 PDF 本身已经很大(超过 50MB),可以考虑先压缩 PDF 再加印。
水印加在 PDF 上之后,别人能直接删掉吗?
本工具生成的水印是直接合并到 PDF 页面内容中的(与文字/图片图层融合),不是独立的注释或印章图层。普通 PDF 阅读器(如 Chrome、Edge 内置)没有删除功能;Adobe Acrobat Pro 等专业编辑器可以通过“编辑 PDF”工具选中水印对象并删除——但前提是水印是独立对象。本工具的水印与页面内容融合后,删除会破坏原页面布局,很难无损恢复。如果需更高安全性(防复制、防截屏),建议结合 PDF 加密(设置打开密码)或使用专门的 DRM 工具。
水印可以只加在 PDF 的某几页上吗?比如只加封面和最后一页?
目前本工具支持两种范围设置:全部页面(默认)或指定页码范围。如果要只加封面和最后一页,可以在页码范围输入“1,5”(假设 PDF 共 5 页),或“1,last”(自动识别最后一页)。注意:页码范围用英文逗号分隔,页数从 1 开始计数。不支持“奇数页/偶数页”或“除第 3 页外所有页”这类复杂规则——如果需要,可以分两次操作:先加第 1 页,再加最后一页,然后合并。
加了水印之后,PDF 里的文字还能被复制出来吗?
可以。水印是附加在页面上的视觉元素,不会改变 PDF 底层文本层的内容。用户仍然可以选中 PDF 中的正文文字并复制到剪贴板。如果需要禁止文本复制,需要在生成 PDF 时设置权限(如禁止复制/打印),本工具目前不提供此功能。如果水印是半透明且覆盖在文字上,复制时不会带上水印文字。如需彻底阻止复制,建议在加水印前先用其他工具给 PDF 设置安全限制。
上传的 PDF 文件有大小限制吗?最多能处理多少页?
有。由于是通过后端服务器处理,上传文件大小限制为 200MB,超过会提示失败。页数方面没有硬性限制,但 500 页以上的大型 PDF 处理时间会显著增加(大约每 100 页耗时 3-5 秒)。如果文件超过 200MB,建议先用 PDF 压缩工具减小体积再上传。处理完成后,服务器不会保留原始文件和水印后的文件——下载链接有效期为 30 分钟,超时需重新上传。
手机浏览器上能用这个加水印工具吗?和电脑上操作一样吗?
可以用,但体验有差异。手机浏览器(Chrome/Safari)访问本工具,界面会自动适配屏幕宽度,上传和参数设置功能完整。主要区别:1)手机端选择图片水印时,只能从相册或文件管理器选取,不支持拖拽;2)水印位置预览在手机小屏上可能不精确,建议先在电脑上调整好参数再处理;3)手机浏览器下载文件时,部分机型会自动重命名(如加“-1”后缀),下载后建议手动重命名。核心处理能力(水印质量、速度)与电脑端一致。
选择 打开 +新窗口 esc关闭