代码角度为Word添加封面、封底和页面背景
工作中有个需求,需要批量为Word文档添加封面、封底和页面背景图(此处的封面、封底皆为预制好的图片文件)。
其中,添加封底和页面背景图时遇到些许阻碍,在此略作分享。
一、添加封面
1.1实现思路
在文档开头添加“一个衬于文字上方的大小占满整个页面的图片”和“一个分页符”。
1.2涉及文件
1)word/media/ 目录,需要将封面图片拷贝到多媒体资源目录下
2)[Content_Types].xml 文件,需要添加相应的图片类型声明(若已存在则无需添加)
3)word/_rels/document.xml.rels 文件,需要添加声明资源的rId索引
4)word/document.xml 文件,需要添加封面图和分页符段落
1.3代码示例
1)[Content_Types].xml
<Default Extension="png" ContentType="image/png"/>
2)word/_rels/document.xml.rels
/*
*说明
* @param {number} rId Relationship的Id是“rId”加“数字序号(从1开始计数)”,添加封面图索引时,需要首先读取到文件中已有的rId数量,然后加1
* @param {string}图片名称 对应的是拷贝到 word/media 目录下的图片文件
*/
<Relationship
Id="rId${封面图的rId}"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
Target="media/${图片名称}"/>
3)word/document.xml
在标签的一开始添加代码
//封面图片
<w:p w14:paraId="316BC6CE" w14:textId="6EE78F19" w:rsidR="009D10E0" w:rsidRDefault="009D10E0">
<w:r>
<w:drawing>
<wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251658240"
behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="4469974F"
wp14:editId="24386E33">
<wp:simplePos x="0" y="0" />
<wp:positionH relativeFrom="column">
<wp:posOffset>-1151890</wp:posOffset>
</wp:positionH>
<wp:positionV relativeFrom="paragraph">
<wp:posOffset>-903605</wp:posOffset>
</wp:positionV>
<wp:extent cx="7570800" cy="10692000" />
<wp:effectExtent l="0" t="0" r="0" b="1905" />
<wp:wrapNone />
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
noChangeAspect="1" />
</wp:cNvGraphicFramePr>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPicPr />
</pic:nvPicPr>
<pic:blipFill>
<a:extLst>
<a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
<a14:useLocalDpi
xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main"
val="0" />
</a:ext>
</a:extLst>
</a:blip>
<a:stretch>
<a:fillRect />
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x="0" y="0" />
<a:ext cx="7570800" cy="10692000" />
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst />
</a:prstGeom>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
<wp14:sizeRelH relativeFrom="margin">
<wp14:pctWidth>0</wp14:pctWidth>
</wp14:sizeRelH>
<wp14:sizeRelV relativeFrom="margin">
<wp14:pctHeight>0</wp14:pctHeight>
</wp14:sizeRelV>
</wp:anchor>
</w:drawing>
</w:r>
</w:p>
//分页符段落
<w:p w14:paraId="0FD1B046" w14:textId="77777777" w:rsidR="009D10E0" w:rsidRDefault="009D10E0">
<w:r>
<w:br w:type="page" />
</w:r>
</w:p>
二、添加封底
2.1问题出现
添加封底的基本思路和操作与添加封面相同,最初打算在文档末尾添加“一个分页符”和“一个衬于文字上方的大小占满整个页面的图片”。但实际应用中发现,如果原始文档最后一页刚好被填满了,那么处理后的文件会在封底之前多出一个空白页面。
2.2分析解决
首先,因为文档的分页是在渲染阶段产生的,从代码角度无法判定末页是否还有多余空间放分页符。
于是,我考虑是否可以调整分页符的文字大小和段落高度为0,但是失败了,原因主要是:分页符会在当前页面中先回车添加一个新行,然后再在产生的新页面添加一个新行。占用空间较大。
之后,我用分节符替换分页符,发现分节符默认会尽量向已有的段落上靠拢,尽量不开启新行。但是,如果末尾页面特别满,分节符还是有几率被挤下去,导致依旧产生空白页。于是,我又考虑将分节符的字号调整为0.7磅(文字大小最小为0.7磅,再小会失效),这样分节符会小成一条线,不再会被挤下去。
2.3代码示例
在word/document.xml文件末尾的<w:sectPr>标签之前添加代码
//分节符
<w:p w:rsidR="00871CCD" w:rsidRPr="00424CF9" w:rsidRDefault="000545AA" w:rsidP="00424CF9">
<w:pPr>
<w:spacing w:line="14" w:lineRule="exact" />
<w:sectPr w:rsidR="00871CCD" w:rsidRPr="00424CF9">
<w:pgSz w:w="11906" w:h="16838" />
<w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992"
w:gutter="0" />
<w:cols w:space="425" />
<w:docGrid w:type="lines" w:linePitch="312" />
</w:sectPr>
</w:pPr>
</w:p>
//封底图片(略)
三、页面背景
1.1实现思路
添加页面背景的方式有多种,此处采取的方式是添加页眉,也是最合适的方案。
1.2涉及文件
1)word/media/ 目录,需要将背景图片拷贝到多媒体资源目录下
2)[Content_Types].xml 文件,需要添加相应的图片类型声明(若已存在则无需添加)
3)word/ 目录,需要将页眉相关的xml文件拷贝到此处(例:header.xml)
4)word/_rels/ 目录,需要将页眉相关的rels文件拷贝到此处(例:header.xml.rels)
5)word/_rels/document.xml.rels 文件,需要添加声明资源(例:header.xml)的rId索引
6)word/document.xml 文件,需要通过rId索引关联页眉文件
1.3代码示例
1)word/header.xml
略,该文件为页眉文件,代码内容比较固定,可以在一个Word文档中添加页眉(内容为一张衬于文字下方并铺满整个页面的图片),然后解压文档后获取。
2)word/_rels/header.xml.rels
略,该文件是页眉的索引文件,它会索引页眉xml文件对应的图片文件,获取方法同上。
3)word/_rels/document.xml.rels
该文件是文档的索引文件,它会索引页眉xml文件。
<Relationship Id="rId63" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header.xml"/></Relationships>
4)word/document.xml
文档文件,通过rId索引关联页眉文件。代码添加到<w:sectPr>标签中。
1.4横竖页面共存
1)当文档中存在横屏页面时,背景图需要与竖屏页面区分(图片大小样式不匹配),便需要单独为横屏页设置单独的图片、页眉文件、页眉索引文件等。
2)Word文档中的横竖屏是通过分节符来划分区域的,判断横竖屏可以通过分节符中<w:pgSz/>标签的w:orient属性,landscape代表横屏(例:<w:pgSz w:w="16838" w:h="11906" w:orient="landscape"/>);当横屏时,关联横屏页眉文件,竖屏时关联竖屏页眉文件。