itextsharp 5.5.13.2 是 c# 中可靠添加中文透明斜体水印的最优方案,需用 onendpage、显式注册中文字体、坐标平移+旋转+恢复状态,并注意流释放与字体路径。

用 iTextSharp 给 PDF 加水印最稳
直接说结论:别碰 PDFsharp 做文字水印,它对中文支持差、旋转后偏移难控;iTextSharp(5.x 版本)是 C# 里真正能可靠加透明斜体水印的方案,尤其适合批量处理带中文字体的 PDF。
实操要点:
-
iTextSharp必须用 5.5.13.2 或更早的 .NET Framework 兼容版,新版 iText7 是商业授权,免费版不支持中文嵌入 - 水印必须写在
OnEndPage里,不能只写一次——否则只有第一页有 - 中文字体得显式注册:
BaseFont.CreateFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED),路径要对,且文件得随程序发布 - 透明度靠
canvas.SetGState(new PdfGState { FillOpacity = 0.1f })控制,设太低看不见,设太高遮正文
水印文字歪了、位置飘忽怎么办
这不是代码写错了,是坐标系和旋转逻辑没理清。iText 的 canvas.SaveState() + canvas.RotateAbsolute() 默认以左下角为原点旋转,文字一转就飞出可视区。
正确做法:
- 先用
canvas.TranslateAbsolute(x, y)把原点移到你想要的中心位置(比如页面中间) - 再
canvas.RotateAbsolute(-30)(负角度顺时针斜) - 最后用
ColumnText.ShowTextAligned()以 (0, 0) 为基准画字——此时文字就在你“挪过去”的那个点上斜着显示 - 别忘了
canvas.RestoreState(),不然后续内容也跟着歪
生成的 PDF 打开报错或字体变方块
错误现象通常是 Adobe Reader 提示 “字体损坏” 或文字全成 □□□,根本原因是字体未嵌入或编码不匹配。
关键检查项:
- 确认 TTF 文件本身支持 GBK/UTF-16(比如
simhei.ttf可以,但某些精简版“黑体”可能缺中文字符) -
BaseFont.CreateFont()第三个参数必须是BaseFont.NOT_EMBEDDED—— 看似反直觉,但嵌入(EMBEDDED)在 iTextSharp 5.x 里反而常触发字体解析失败 - 如果用的是 Windows Server,确保系统有该字体,或把 .ttf 文件放在项目输出目录,用相对路径加载
- 避免用
FontFactory.GetFont(),它走默认字体缓存,对自定义中文字体不可靠
批量加水印时 CPU 占满、内存暴涨
这不是 PDF 太大,而是没关流、没复用对象。iTextSharp 对每个文档都新建 PdfReader 和 PdfStamper,若不手动释放,byte[] 缓存会堆满。
必须做的几件事:
- 用
using (var reader = new PdfReader(inputPath))包裹读取,强制释放底层资源 -
PdfStamper构造时传new FileStream(... FileMode.Create),别用MemoryStream处理大文件 - 关闭
stamper.Close()后,reader.Close()再调一次(有些版本不自动关) - 加水印逻辑别塞在循环里反复 new Font/Phrase——提出来复用
复杂点在于:水印位置要适配每页尺寸(reader.GetPageSize(i)),而页数多时,PdfReader 初始化本身就有开销。真要跑几百个文件,得加个简单进度回调,不然卡住还以为崩了。










