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

如何使用RMarkdown生成带文字水印标识的Word文档?

生成带文字水印的Word文档方案

方案一:用Python的python-docx库实现

python-docx本身没有原生水印接口,但可以通过插入VML(矢量标记语言)代码实现文字水印,步骤如下:

  1. 安装依赖
pip install python-docx
  1. 示例代码
from docx import Document
from docx.oxml import parse_xml
from docx.oxml.ns import qn

def add_text_watermark(doc, text="CONFIDENTIAL", font_size=48, color="d0d0d0"):
    section = doc.sections[0]
    header = section.header
    # 构建VML水印XML代码
    vml_xml = f"""<w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
        <w:r>
            <w:pict xmlns:v="urn:schemas-microsoft-com:vml">
                <v:shape id="Watermark" o:spid="_x0000_s1025" type="#_x0000_t136" style="position:absolute;left:0;text-align:center;margin-left:0;margin-top:0;width:495pt;height:100pt;z-index:-251654144;mso-wrap-style:none;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin">
                    <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="none"/>
                    <v:textbox style="mso-fit-shape-to-text:true">
                        <div style="text-align:center;font-family:Calibri;font-size:{font_size}pt;color:{color};mso-text-scale:100;rotation:315">
                            {text}
                        </div>
                    </v:textbox>
                </v:shape>
            </w:pict>
        </w:r>
    </w:p>"""
    header._p.append(parse_xml(vml_xml))

# 生成带水印的文档
doc = Document()
doc.add_paragraph("测试文档正文内容")
add_text_watermark(doc, text="内部文档", font_size=50, color="a0a0a0")
doc.save("带水印的文档.docx")

这段代码会在文档页眉插入倾斜的文字水印,层级设为底层,不会遮挡正文。

方案二:结合YAML配置与Pandoc生成

如果是通过Pandoc将Markdown转Word并尝试用YAML配置水印,YAML本身无法直接定义水印,但可以结合以下两种方式实现:

方式1:使用预加水印的Word模板

  1. 手动创建一个带文字水印的Word文档(通过Word「设计」→「水印」功能添加),保存为template.docx
  2. 在Markdown的YAML头部指定模板:
---
title: "带水印的文档"
output:
  word_document:
    reference_docx: template.docx
---

# 文档正文
这是测试内容。
  1. 执行Pandoc转换命令:
pandoc input.md -o output.docx

方式2:用Lua过滤器动态添加水印

如果需要动态修改水印文字,可使用Pandoc的Lua过滤器:

  1. 创建watermark.lua文件:
function DocxWriter.open_document(doc)
    local watermark_vml = [[<w:hdr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:v="urn:schemas-microsoft-com:vml">
        <w:p>
            <w:r>
                <w:pict>
                    <v:shape id="Watermark" type="#_x0000_t136" style="position:absolute;z-index:-251654144;rotation:315;width:495pt;height:100pt">
                        <v:textbox style="mso-fit-shape-to-text:true">
                            <div style="text-align:center;font-size:48pt;color:#d0d0d0">内部文档</div>
                        </v:textbox>
                    </v:shape>
                </w:pict>
            </w:r>
        </w:p>
    </w:hdr>]]
    -- 将水印插入文档结构
    local content = doc:gsub("<w:hdr[^>]*></w:hdr>", watermark_vml)
    return content
end
  1. 在Markdown的YAML头部指定过滤器:
---
title: "动态水印文档"
output:
  word_document:
    lua_filters: [watermark.lua]
---
  1. 执行转换命令即可生成带动态水印的Word文档。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:42:26