You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:18:03