代码角度为Word添加封面、封底和页面背景

2024-11-27  本文已影响0人  半吊子伯爵

工作中有个需求,需要批量为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"/>);当横屏时,关联横屏页眉文件,竖屏时关联竖屏页眉文件。

上一篇 下一篇

猜你喜欢

热点阅读