使用PDF4NET实现PDF页面全页平铺重复水印的方法咨询
实现方案
你当前硬拼接长字符串填充文本框的实现,天然受文本长度、字体大小、换行规则约束,无法实现稳定的平铺效果。正确的实现逻辑是先测量单个水印单元的尺寸,再逐行逐列循环绘制,完全不受水印内容、字体参数影响。
完整实现代码
// 1. 配置水印基础参数,可按需调整 string watermarkText = "Sample"; PDFFont fontText = new PDFFont(PDFFontStandard.Helvetica, 12); // 替换为你实际使用的字体配置 PDFBrush watermarkBrush = new PDFBrush(new PDFColor(255, 0, 0, 50)); // 最后一位是透明度,可调 int horizontalGap = 20; // 水印横向间距 int verticalGap = 40; // 水印纵向间距 float rotateAngle = 30; // 水印旋转角度,不需要倾斜效果设为0即可 // 2. 测量单个水印的实际尺寸,计算平铺单元参数 PDFSize singleTextSize = page.Canvas.MeasureString(watermarkText, fontText); float singleUnitWidth = singleTextSize.Width + horizontalGap; float singleUnitHeight = singleTextSize.Height + verticalGap; // 3. 计算需要绘制的水印行列数,多补1个避免页面边缘留空 int columnCount = (int)Math.Ceiling(page.Width / singleUnitWidth) + 1; int rowCount = (int)Math.Ceiling(page.Height / singleUnitHeight) + 1; // 4. 循环绘制所有水印 for (int row = 0; row < rowCount; row++) { for (int col = 0; col < columnCount; col++) { float posX = col * singleUnitWidth; float posY = row * singleUnitHeight; page.Canvas.SaveState(); if (rotateAngle != 0) { // 旋转场景:先平移坐标系到当前水印位置再旋转 page.Canvas.TranslateTransform(posX, posY); page.Canvas.RotateTransform(rotateAngle); page.Canvas.DrawString(watermarkText, fontText, watermarkBrush, 0, 0); } else { // 不旋转场景直接按坐标绘制 page.Canvas.DrawString(watermarkText, fontText, watermarkBrush, posX, posY); } page.Canvas.RestoreState(); } }
方案特性
- 完全和水印文本长度、字体大小解耦,修改水印内容、字体参数后自动适配铺满页面
- 可通过调整
horizontalGap、verticalGap参数自由控制水印密度 - 支持任意角度旋转的平铺水印效果,符合常用的水印使用场景
内容的提问来源于stack exchange,提问作者Xion
相关产品推荐
相关产品推荐

