使用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); }
调用调整说明
- 原主逻辑中
DrawWatermark的调用顺序可以保持不变,不需要修改现有业务数据绘制逻辑。 - 如果需要水印浮在业务内容上层作为前景,可将
XGraphicsPdfPageOptions.Prepend改为Append,同时把DrawWatermark的调用移到所有业务内容绘制完成之后即可。
内容的提问来源于stack exchange,提问作者mordor619
相关产品推荐
相关产品推荐

