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

使用C#结合PDFsharp生成PDF文件时无法添加水印问题求助

PDFsharp水印不显示问题排查与解决

问题根因

  • 所用API不兼容.NET Core版本:代码中采用XGraphicsPath.AddString绘制文本路径的方式实现水印,该方法在PDFsharp Core版本中未实现,无报错但无实际输出,代码自带注释也明确标注了该限制。
  • 绘制层级参数使用不当:创建水印绘制对象时使用XGraphicsPdfPageOptions.Append,后续绘制的业务内容容易覆盖水印。

解决方法

直接替换水印绘制逻辑,使用兼容Core版本的DrawString+半透明画刷实现水印,修改后代码如下:

void DrawWatermark(PdfPage page)
{
    string watermark = "CartMart";
    // Prepend表示将水印绘制在页面最底层,作为背景不遮挡上层业务数据
    using var gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Prepend);
    
    // 计算水印倾斜角度
    double angle = -Math.Atan(page.Height.Point / page.Width.Point) * 180 / Math.PI;
    
    // 半透明红色画刷,第一个参数77对应30%不透明度,可自行调整
    var watermarkBrush = new XSolidBrush(XColor.FromArgb(77, 255, 0, 0));
    // 自定义水印字体、字号、样式
    var watermarkFont = new XFont("Verdana", 150, XFontStyle.BoldItalic);
    
    // 应用居中旋转变换
    gfx.TranslateTransform(page.Width.Point / 2, page.Height.Point / 2);
    gfx.RotateTransform(angle);
    gfx.TranslateTransform(-page.Width.Point / 2, -page.Height.Point / 2);
    
    // 计算水印尺寸,居中绘制
    var watermarkSize = gfx.MeasureString(watermark, watermarkFont);
    gfx.DrawString(watermark, watermarkFont, watermarkBrush, 
        new XPoint((page.Width.Point - watermarkSize.Width) / 2, (page.Height.Point - watermarkSize.Height) / 2),
        XStringFormats.Center);
}

调用调整说明

  1. 原主逻辑中DrawWatermark的调用顺序可以保持不变,不需要修改现有业务数据绘制逻辑。
  2. 如果需要水印浮在业务内容上层作为前景,可将XGraphicsPdfPageOptions.Prepend改为Append,同时把DrawWatermark的调用移到所有业务内容绘制完成之后即可。

内容的提问来源于stack exchange,提问作者mordor619

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:15:02