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

使用Open XML SDK为Word首页添加水印失败的问题求助

解决Word文档首页水印不显示问题(C# + Open XML SDK)

当文档开启“首页不同”页眉设置时,Word会为首页创建独立的FirstHeader,普通页面使用默认Header。你之前的问题大概率是只给默认页眉添加了水印,没处理首页的独立页眉;或者错误地重复给默认页眉添加,导致后续页面多水印。

以下是具体解决步骤和代码:

核心思路

  • 分别定位文档的首页页眉和普通页眉
  • 为两个页眉(如果存在)分别添加水印逻辑,避免重复添加

实现代码

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Vml;
using System.Linq;

public static void AddWatermarkToAllHeaders(string docPath, string watermarkText)
{
    using (var wordDoc = WordprocessingDocument.Open(docPath, true))
    {
        var mainPart = wordDoc.MainDocumentPart;
        
        // 获取所有页眉部分
        var headerParts = mainPart.HeaderParts.ToList();
        
        foreach (var headerPart in headerParts)
        {
            var header = headerPart.Header;
            // 判断页眉类型:首页页眉/普通页眉
            var headerType = header.Descendants<HeaderReference>().FirstOrDefault()?.Type?.Value;
            
            // 检查当前页眉是否已存在水印,避免重复添加
            if (header.Descendants<Shape>().Any(s => s.InnerText.Contains(watermarkText)))
                continue;
            
            // 添加水印到当前页眉
            AddWatermarkToHeader(headerPart, watermarkText);
        }
    }
}

private static void AddWatermarkToHeader(HeaderPart headerPart, string watermarkText)
{
    var header = headerPart.Header;
    
    // 创建VML水印元素(Word水印基于VML实现)
    var shape = new Shape
    {
        Id = "_x0000_s1025",
        Style = "position:absolute;margin-left:0;margin-top:0;width:527.85pt;height:134.95pt;z-index:-251654144;mso-wrap-style:none;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:center;mso-position-horizontal-relative:text;mso-position-vertical:center;mso-position-vertical-relative:text",
        WrapCoordinates = "-36 0 -36 21600 21600 21600 21600 0 -36 0",
        Type = "#_x0000_t136"
    };

    var textbox = new Textbox
    {
        Style = "mso-fit-shape-to-text:true",
        InssetMode = TextboxInsetValues.Auto
    };

    var textboxContent = new TextboxContent();
    var paragraph = new Paragraph(new ParagraphProperties(new Justification { Val = JustificationValues.Center }));
    var run = new Run();
    var runProperties = new RunProperties
    {
        FontSize = "24",
        Color = new Color { ThemeColor = ThemeColorValues.Text2, ThemeShade = "BF" },
        Bold = new Bold()
    };
    var text = new Text { Text = watermarkText };

    run.Append(runProperties, text);
    paragraph.Append(run);
    textboxContent.Append(paragraph);
    textbox.Append(textboxContent);

    var fill = new Fill { Color = "silver", Opacity = "50%" };
    var stroke = new Stroke { Visibility = VisibilityValues.Hidden };

    shape.Append(fill, stroke, textbox);

    // 将水印添加到页眉的末尾
    header.Append(shape);
    
    headerPart.Header.Save();
}

关键说明

  • 代码会自动识别文档中的所有页眉(包括首页专属的FirstHeader),避免遗漏首页
  • 添加前会检查页眉中是否已有相同文本的水印,防止重复添加导致多水印问题
  • 水印使用VML元素实现,这是Word原生水印的标准方式,兼容性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:55:22