ColdFusion输出Word文档:添加水印与页码的实现难题
问题:ColdFusion生成Word文档时添加水印和页码失效
我通过ColdFusion的<cfcontent>将查询结果输出为application/msword类型的Word文档,想给生成的文档每页添加“Confidential”水印和页码,但试了多种CSS和Bootstrap脚本后样式都不生效,页码也不知道怎么实现,不确定这个需求能不能做到。相关代码如下:
调用对象的页面代码
<cfprocessingdirective pageencoding="utf-8"> <cfheader name="Content-Disposition" value='inline; filename="#prc.filename#"' charset="utf-8"> <cfcontent type="application/msword; charset=utf-8" reset="yes"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <cfoutput>#prc.objAgenda.getAgendaText()#</cfoutput> <script type="text/javascript"> $(document).ready(function() { $("html").attr("xmlns:o", "urn:schemas-microsoft-com:office:office"); $("html").attr("xmlns:w", "urn:schemas-microsoft-com:office:word"); // $("html").attr("xmlns", "http://www.w3.org/TR/REC-html40"); }); </script>
函数调用的页面主体代码(需应用水印和页码的agendaBody区域)
<div class="agendaBody"> <div class="border border-dark text-center bg-light"> AGENDA<br> <cfoutput>#prc.SchoolName#</cfoutput> Conflict of Interest Committee<br> </div> <br><br> <ol style="font-weight:bold;padding-left:15px;"> <li>Review and Approval of Interim COI Actions</li> <li>COI Case Reviews</li> <li>Updates</li> <li>Next Meeting:</li> </ol> <hr style="color:black;"></hr> <p style="text-decoration:underline;"><strong>Actions since last meeting:</strong><br><br></p> <p style="text-decoration:underline;"><strong>EXPEDITED REVIEWS</strong></p> <p style="text-decoration:underline;"><strong>New Relationships</strong></p> <cfoutput>#listDisclosures(prc.new_fcoi,'FCOI Management')#</cfoutput> </div>
尝试过的水印代码
.watermark { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); }
<div class="watermark"> CONFIDENTIAL </div>
解决方案
直接通过HTML/CSS生成Word文档时,很多现代CSS属性和JS脚本不会被Word解析,要实现水印和页码,必须使用Word支持的Office XML标记和特定样式:
1. 添加页码
利用Word支持的CSS分页规则,结合Office命名空间,在<head>中添加以下样式:
<style> @page { margin: 1in; @bottom-right { content: "Page " counter(page) " of " counter(pages); font-family: Arial; font-size: 10pt; } } </style>
同时要确保HTML根元素直接包含正确的命名空间,不要用JS动态设置:
<html xmlns="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word">
2. 添加每页水印
使用Word兼容的VML标记实现水印,在<body>开头插入以下代码:
<div style="mso-element:header" id="watermarkHeader"> <p class="MsoHeader"> <v:shape id="Watermark" o:spid="_x0000_s1025" type="#_x0000_t136" style="position:absolute;left:0;top:0;width:527.85pt;height:131.95pt;z-index:-1;visibility:visible;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"> <v:path textpathok="true" /> <v:textpath style="font-family:'Arial';font-size:48pt;font-weight:bold;color:#cccccc;" string="CONFIDENTIAL" /> <v:fill color="#cccccc" o:opacity="30%" /> <v:shadow on="false" /> </v:shape> </p> </div>
需要在<html>标签中添加VML命名空间:
xmlns:v="urn:schemas-microsoft-com:vml"
3. 完整修改后的调用页面代码
<cfprocessingdirective pageencoding="utf-8"> <cfheader name="Content-Disposition" value='inline; filename="#prc.filename#"' charset="utf-8"> <cfcontent type="application/msword; charset=utf-8" reset="yes"> <html xmlns="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:v="urn:schemas-microsoft-com:vml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style> @page { margin: 1in; @bottom-right { content: "Page " counter(page) " of " counter(pages); font-family: Arial; font-size: 10pt; } } </style> <!-- Word特定配置 --> <xml> <w:WordDocument> <w:View>Print</w:View> <w:Zoom>100</w:Zoom> <w:DoNotOptimizeForBrowser/> </w:WordDocument> </xml> </head> <body> <!-- 每页水印 --> <div style="mso-element:header" id="watermarkHeader"> <p class="MsoHeader"> <v:shape id="Watermark" o:spid="_x0000_s1025" type="#_x0000_t136" style="position:absolute;left:0;top:0;width:527.85pt;height:131.95pt;z-index:-1;visibility:visible;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"> <v:path textpathok="true" /> <v:textpath style="font-family:'Arial';font-size:48pt;font-weight:bold;color:#cccccc;" string="CONFIDENTIAL" /> <v:fill color="#cccccc" o:opacity="30%" /> <v:shadow on="false" /> </v:shape> </p> </div> <cfoutput>#prc.objAgenda.getAgendaText()#</cfoutput> </body> </html>
注意事项
- Word仅兼容HTML4和特定Office扩展标记,现代CSS特性(如
transform)无法被解析 - 不要用JS动态设置命名空间,必须直接写在
<html>标签中 - 测试时用本地Word客户端打开,避免浏览器预览的兼容性问题
内容的提问来源于stack exchange,提问作者Traci Porter
相关产品推荐
相关产品推荐

