精华内容
下载资源
问答
  • java使用poi给word添加多个水印

    千次阅读 热门讨论 2020-12-02 18:18:20
    一、解决poi给word添加水印遇到的问题: 1、遇到有页眉的word时水印添加失败 2、水印最底层被图片表格覆盖 二、解决思路: 1、把原来的页眉删除或者覆盖 2、水印只能在底层,那么我给它加多个水印 三、结果: ...

    限制高版本的docx

    一、解决poi给word添加水印遇到的问题:

    1、遇到有页眉的word时水印添加失败

    2、水印最底层被图片表格覆盖

    二、解决思路:

    1、把原来的页眉删除或者覆盖

    2、水印只能在底层,那么我给它加多个水印

    三、结果:

    四、代码

    maven配置

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.2</version>
            </dependency>
            <!--2007 docx文件读取,需要导入poi-ooxml-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.2</version>
            </dependency>

    代码工具类

    package com.feng.util;
    
    import com.feng.bean.ResultCode;
    import com.feng.error.MyException;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    
    import java.io.*;
    
    /**
     * @Author: feng
     * @Date: 2020/12/01 2:35 下午
     */
    @Slf4j
    public class WaterMarkUtils {
    
        /**
         * word文字水印
         *
         * @param inputPath
         * @param outPath
         * @param markStr
         */
        public static void setWordWaterMark(String inputPath, String outPath, String markStr) {
            File inputFile = new File(inputPath);
            //2003doc 用HWPFDocument  ; 2007doc 用 XWPFDocument
            XWPFDocument doc = null;
            try {
                // 延迟解析比率
                ZipSecureFile.setMinInflateRatio(-1.0d);
                doc = new XWPFDocument(new FileInputStream(inputFile));
            } catch (FileNotFoundException e) {
                throw new MyException(ResultCode.FAILURE, "源文件不存在");
            } catch (IOException e) {
                throw new MyException(ResultCode.FAILURE, "读取源文件IO异常");
            } catch (Exception e) {
                throw new MyException(ResultCode.FAILURE, "不支持的文档格式");
            }
            XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy();
            if (headerFooterPolicy == null) {
                headerFooterPolicy = doc.createHeaderFooterPolicy();
            }
            //添加水印
            headerFooterPolicy.createWatermark(markStr);
            File file = new File(outPath);
            if (!file.exists()) {
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    throw new MyException(ResultCode.FAILURE, "创建输出文件失败");
                }
            }
            OutputStream os = null;
            try {
                os = new FileOutputStream(outPath);
                doc.write(os);
            } catch (FileNotFoundException e) {
                throw new MyException(ResultCode.FAILURE, "创建输出文件失败");
            } catch (Exception e) {
                throw new MyException(ResultCode.FAILURE, "添加文档水印失败");
            } finally {
                   if (os != null) {
                        try {
                            os.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (doc != null) {
                        try {
                            doc.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
        }
    }
    
    创建 org.apache.poi.xwpf.model 包,重写 XWPFHeaderFooterPolicy 类
    
    如下:
    
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package org.apache.poi.xwpf.model;
    
    import com.microsoft.schemas.office.office.CTLock;
    import com.microsoft.schemas.office.office.STConnectType;
    import com.microsoft.schemas.vml.CTFormulas;
    import com.microsoft.schemas.vml.CTGroup;
    import com.microsoft.schemas.vml.CTH;
    import com.microsoft.schemas.vml.CTHandles;
    import com.microsoft.schemas.vml.CTPath;
    import com.microsoft.schemas.vml.CTShape;
    import com.microsoft.schemas.vml.CTShapetype;
    import com.microsoft.schemas.vml.CTTextPath;
    import com.microsoft.schemas.vml.STExt;
    import com.microsoft.schemas.vml.STTrueFalse;
    
    import java.util.Iterator;
    
    import org.apache.poi.ooxml.POIXMLDocumentPart;
    import org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFFactory;
    import org.apache.poi.xwpf.usermodel.XWPFFooter;
    import org.apache.poi.xwpf.usermodel.XWPFHeader;
    import org.apache.poi.xwpf.usermodel.XWPFHeaderFooter;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRelation;
    import org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHdrFtr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHdrFtrRef;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPicture;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.FtrDocument;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.HdrDocument;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.HdrDocument.Factory;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr.Enum;
    
    public class XWPFHeaderFooterPolicy {
        public static final Enum DEFAULT;
        public static final Enum EVEN;
        public static final Enum FIRST;
        private XWPFDocument doc;
        private XWPFHeader firstPageHeader;
        private XWPFFooter firstPageFooter;
        private XWPFHeader evenPageHeader;
        private XWPFFooter evenPageFooter;
        private XWPFHeader defaultHeader;
        private XWPFFooter defaultFooter;
    
        public XWPFHeaderFooterPolicy(XWPFDocument doc) {
            this(doc, (CTSectPr) null);
        }
    
        public XWPFHeaderFooterPolicy(XWPFDocument doc, CTSectPr sectPr) {
            if (sectPr == null) {
                CTBody i = doc.getDocument().getBody();
                sectPr = i.isSetSectPr() ? i.getSectPr() : i.addNewSectPr();
            }
    
            this.doc = doc;
    
            CTHdrFtrRef ref;
            POIXMLDocumentPart relatedPart;
            Enum type;
            int var11;
            for (var11 = 0; var11 < sectPr.sizeOfHeaderReferenceArray(); ++var11) {
                ref = sectPr.getHeaderReferenceArray(var11);
                relatedPart = doc.getRelationById(ref.getId());
                XWPFHeader ftr = null;
                if (relatedPart != null && relatedPart instanceof XWPFHeader) {
                    ftr = (XWPFHeader) relatedPart;
                }
    
                try {
                    type = ref.getType();
                } catch (XmlValueOutOfRangeException var10) {
                    type = STHdrFtr.DEFAULT;
                }
    
                this.assignHeader(ftr, type);
            }
    
            for (var11 = 0; var11 < sectPr.sizeOfFooterReferenceArray(); ++var11) {
                ref = sectPr.getFooterReferenceArray(var11);
                relatedPart = doc.getRelationById(ref.getId());
                XWPFFooter var12 = null;
                if (relatedPart != null && relatedPart instanceof XWPFFooter) {
                    var12 = (XWPFFooter) relatedPart;
                }
    
                try {
                    type = ref.getType();
                } catch (XmlValueOutOfRangeException var9) {
                    type = STHdrFtr.DEFAULT;
                }
    
                this.assignFooter(var12, type);
            }
    
        }
    
        private void assignFooter(XWPFFooter ftr, Enum type) {
            if (type == STHdrFtr.FIRST) {
                this.firstPageFooter = ftr;
            } else if (type == STHdrFtr.EVEN) {
                this.evenPageFooter = ftr;
            } else {
                this.defaultFooter = ftr;
            }
    
        }
    
        private void assignHeader(XWPFHeader hdr, Enum type) {
            if (type == STHdrFtr.FIRST) {
                this.firstPageHeader = hdr;
            } else if (type == STHdrFtr.EVEN) {
                this.evenPageHeader = hdr;
            } else {
                this.defaultHeader = hdr;
            }
    
        }
    
        public XWPFHeader createHeader(Enum type) {
            return this.createHeader(type, (XWPFParagraph[]) null);
        }
    
        public XWPFHeader createHeader(Enum type, XWPFParagraph[] pars) {
            XWPFHeader header = this.getHeader(type);
    //存在hdader则覆盖
    //        if(header == null) {
            HdrDocument hdrDoc = Factory.newInstance();
            XWPFRelation relation = XWPFRelation.HEADER;
            int i = this.getRelationIndex(relation);
            XWPFHeader wrapper = (XWPFHeader) this.doc.createRelationship(relation, XWPFFactory.getInstance(), i);
            wrapper.setXWPFDocument(this.doc);
            CTHdrFtr hdr = this.buildHdr(type, wrapper, pars);
            wrapper.setHeaderFooter(hdr);
            hdrDoc.setHdr(hdr);
            this.assignHeader(wrapper, type);
            header = wrapper;
    //        }
    
            return header;
        }
    
        public XWPFFooter createFooter(Enum type) {
            return this.createFooter(type, (XWPFParagraph[]) null);
        }
    
        public XWPFFooter createFooter(Enum type, XWPFParagraph[] pars) {
            XWPFFooter footer = this.getFooter(type);
    //        if (footer == null) {
            FtrDocument ftrDoc = org.openxmlformats.schemas.wordprocessingml.x2006.main.FtrDocument.Factory.newInstance();
            XWPFRelation relation = XWPFRelation.FOOTER;
            int i = this.getRelationIndex(relation);
            XWPFFooter wrapper = (XWPFFooter) this.doc.createRelationship(relation, XWPFFactory.getInstance(), i);
            wrapper.setXWPFDocument(this.doc);
            CTHdrFtr ftr = this.buildFtr(type, wrapper, pars);
            wrapper.setHeaderFooter(ftr);
            ftrDoc.setFtr(ftr);
            this.assignFooter(wrapper, type);
            footer = wrapper;
    //        }
    
            return footer;
        }
    
        private int getRelationIndex(XWPFRelation relation) {
            int i = 1;
            Iterator var3 = this.doc.getRelationParts().iterator();
    
            while (var3.hasNext()) {
                RelationPart rp = (RelationPart) var3.next();
                if (rp.getRelationship().getRelationshipType().equals(relation.getRelation())) {
                    ++i;
                }
            }
    
            return i;
        }
    
        private CTHdrFtr buildFtr(Enum type, XWPFHeaderFooter wrapper, XWPFParagraph[] pars) {
            CTHdrFtr ftr = this.buildHdrFtr(pars, wrapper);
            this.setFooterReference(type, wrapper);
            return ftr;
        }
    
        private CTHdrFtr buildHdr(Enum type, XWPFHeaderFooter wrapper, XWPFParagraph[] pars) {
            CTHdrFtr hdr = this.buildHdrFtr(pars, wrapper);
            this.setHeaderReference(type, wrapper);
            return hdr;
        }
    
        private CTHdrFtr buildHdrFtr(XWPFParagraph[] paragraphs, XWPFHeaderFooter wrapper) {
            CTHdrFtr ftr = wrapper._getHdrFtr();
            if (paragraphs != null) {
                for (int i = 0; i < paragraphs.length; ++i) {
                    ftr.addNewP();
                    ftr.setPArray(i, paragraphs[i].getCTP());
                }
            }
    
            return ftr;
        }
    
        private void setFooterReference(Enum type, XWPFHeaderFooter wrapper) {
            CTHdrFtrRef ref = this.doc.getDocument().getBody().getSectPr().addNewFooterReference();
            ref.setType(type);
            ref.setId(this.doc.getRelationId(wrapper));
        }
    
        private void setHeaderReference(Enum type, XWPFHeaderFooter wrapper) {
            CTHdrFtrRef ref = this.doc.getDocument().getBody().isSetSectPr() ? this.doc.getDocument().getBody().getSectPr().addNewHeaderReference() : this.doc.getDocument().getBody().addNewSectPr().addNewHeaderReference();
            ref.setType(type);
            ref.setId(this.doc.getRelationId(wrapper));
        }
    
        public XWPFHeader getFirstPageHeader() {
            return this.firstPageHeader;
        }
    
        public XWPFFooter getFirstPageFooter() {
            return this.firstPageFooter;
        }
    
        public XWPFHeader getOddPageHeader() {
            return this.defaultHeader;
        }
    
        public XWPFFooter getOddPageFooter() {
            return this.defaultFooter;
        }
    
        public XWPFHeader getEvenPageHeader() {
            return this.evenPageHeader;
        }
    
        public XWPFFooter getEvenPageFooter() {
            return this.evenPageFooter;
        }
    
        public XWPFHeader getDefaultHeader() {
            return this.defaultHeader;
        }
    
        public XWPFFooter getDefaultFooter() {
            return this.defaultFooter;
        }
    
        public XWPFHeader getHeader(int pageNumber) {
            return pageNumber == 1 && this.firstPageHeader != null ? this.firstPageHeader : (pageNumber % 2 == 0 && this.evenPageHeader != null ? this.evenPageHeader : this.defaultHeader);
        }
    
        public XWPFHeader getHeader(Enum type) {
            return type == STHdrFtr.EVEN ? this.evenPageHeader : (type == STHdrFtr.FIRST ? this.firstPageHeader : this.defaultHeader);
        }
    
        public XWPFFooter getFooter(int pageNumber) {
            return pageNumber == 1 && this.firstPageFooter != null ? this.firstPageFooter : (pageNumber % 2 == 0 && this.evenPageFooter != null ? this.evenPageFooter : this.defaultFooter);
        }
    
        public XWPFFooter getFooter(Enum type) {
            return type == STHdrFtr.EVEN ? this.evenPageFooter : (type == STHdrFtr.FIRST ? this.firstPageFooter : this.defaultFooter);
        }
    
        public void createWatermark(String text) {
            XWPFParagraph[] pars = new XWPFParagraph[]{this.getWatermarkParagraph(text, 1)};
            this.createHeader(DEFAULT, pars);
            pars[0] = this.getWatermarkParagraph(text, 2);
            this.createHeader(FIRST, pars);
            pars[0] = this.getWatermarkParagraph(text, 3);
            this.createHeader(EVEN, pars);
        }
    
        /**
         * 原方法备份
         * @param text
         * @param idx
         * @return
         */
        private XWPFParagraph getWatermarkParagraph123(String text, int idx) {
            CTP p = org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP.Factory.newInstance();
            byte[] rsidr = this.doc.getDocument().getBody().getPArray(0).getRsidR();
            byte[] rsidrdefault = this.doc.getDocument().getBody().getPArray(0).getRsidRDefault();
            p.setRsidP(rsidr);
            p.setRsidRDefault(rsidrdefault);
            CTPPr pPr = p.addNewPPr();
            pPr.addNewPStyle().setVal("Header");
            CTR r = p.addNewR();
            CTRPr rPr = r.addNewRPr();
            rPr.addNewNoProof();
            CTPicture pict = r.addNewPict();
            CTGroup group = com.microsoft.schemas.vml.CTGroup.Factory.newInstance();
            CTShapetype shapetype = group.addNewShapetype();
            shapetype.setId("_x0000_t136");
            shapetype.setCoordsize("1600,21600");
            shapetype.setSpt(136.0F);
            shapetype.setAdj("10800");
            shapetype.setPath2("m@7,0l@8,0m@5,21600l@6,21600e");
            CTFormulas formulas = shapetype.addNewFormulas();
            formulas.addNewF().setEqn("sum #0 0 10800");
            formulas.addNewF().setEqn("prod #0 2 1");
            formulas.addNewF().setEqn("sum 21600 0 @1");
            formulas.addNewF().setEqn("sum 0 0 @2");
            formulas.addNewF().setEqn("sum 21600 0 @3");
            formulas.addNewF().setEqn("if @0 @3 0");
            formulas.addNewF().setEqn("if @0 21600 @1");
            formulas.addNewF().setEqn("if @0 0 @2");
            formulas.addNewF().setEqn("if @0 @4 21600");
            formulas.addNewF().setEqn("mid @5 @6");
            formulas.addNewF().setEqn("mid @8 @5");
            formulas.addNewF().setEqn("mid @7 @8");
            formulas.addNewF().setEqn("mid @6 @7");
            formulas.addNewF().setEqn("sum @6 0 @5");
            CTPath path = shapetype.addNewPath();
            path.setTextpathok(STTrueFalse.T);
            path.setConnecttype(STConnectType.CUSTOM);
            path.setConnectlocs("@9,0;@10,10800;@11,21600;@12,10800");
            path.setConnectangles("270,180,90,0");
            CTTextPath shapeTypeTextPath = shapetype.addNewTextpath();
            shapeTypeTextPath.setOn(STTrueFalse.T);
            shapeTypeTextPath.setFitshape(STTrueFalse.T);
            CTHandles handles = shapetype.addNewHandles();
            CTH h = handles.addNewH();
            h.setPosition("#0,bottomRight");
            h.setXrange("6629,14971");
            CTLock lock = shapetype.addNewLock();
            lock.setExt(STExt.EDIT);
            CTShape shape = group.addNewShape();
            shape.setId("PowerPlusWaterMarkObject" + idx);
            shape.setSpid("_x0000_s102" + (4 + idx));
            shape.setType("#_x0000_t136");
            shape.setStyle("position:absolute;margin-left:0;margin-top:0;width:415pt;height:207.5pt;z-index:1;mso-wrap-edited:f;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin");
            shape.setWrapcoords("616 5068 390 16297 39 16921 -39 17155 7265 17545 7186 17467 -39 17467 18904 17467 10507 17467 8710 17545 18904 17077 18787 16843 18358 16297 18279 12554 19178 12476 20701 11774 20779 11228 21131 10059 21248 8811 21248 7563 20975 6316 20935 5380 19490 5146 14022 5068 2616 5068");
            shape.setFillcolor("black");
            shape.setStroked(STTrueFalse.FALSE);
            CTTextPath shapeTextPath = shape.addNewTextpath();
            shapeTextPath.setStyle("font-family:&quot;Cambria&quot;;font-size:1pt");
            shapeTextPath.setString(text);
            pict.set(group);
            return new XWPFParagraph(p, this.doc);
        }
    
        /**
         * 重写方法
         * @param text
         * @param idx
         * @return
         */
        private XWPFParagraph getWatermarkParagraph(String text, int idx) {
            CTP p = org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP.Factory.newInstance();
            byte[] rsidr = this.doc.getDocument().getBody().getPArray(0).getRsidR();
            byte[] rsidrdefault = this.doc.getDocument().getBody().getPArray(0).getRsidRDefault();
            p.setRsidP(rsidr);
            p.setRsidRDefault(rsidrdefault);
            CTPPr pPr = p.addNewPPr();
            pPr.addNewPStyle().setVal("Header");
            CTR r = p.addNewR();
            if (idx == 1) {
                //margin-left和margin-top调整位置,height和width调整大小
                //左上角
                setCTR(r, text, idx, "position:absolute;left:0pt;margin-left:-120pt;margin-top:108pt;mso-position-horizontal-relative:margin;mso-position-vertical-relative:margin;rotation:-2949120f;height:60pt;width:360pt;mso-width-relative:page;mso-height-relative:page");
                //右上角
                setCTR(r, text, idx, "position:absolute;left:0pt;margin-left:190pt;margin-top:108pt;mso-position-horizontal-relative:margin;mso-position-vertical-relative:margin;rotation:-2949120f;height:60pt;width:360pt;mso-width-relative:page;mso-height-relative:page");
                //左下角
                setCTR(r, text, idx, "position:absolute;left:0pt;margin-left:-120pt;margin-top:495pt;mso-position-horizontal-relative:margin;mso-position-vertical-relative:margin;rotation:-2949120f;height:60pt;width:360pt;mso-width-relative:page;mso-height-relative:page");
                //右下角
                setCTR(r, text, idx, "position:absolute;left:0pt;margin-left:190pt;margin-top:495pt;mso-position-horizontal-relative:margin;mso-position-vertical-relative:margin;rotation:-2949120f;height:60pt;width:360pt;mso-width-relative:page;mso-height-relative:page");
            } else {
                setCTR(r, text, idx, "position:absolute;left:0pt;mso-position-horizontal-relative:margin;mso-position-vertical-relative:margin;rotation:-2949120f;height:60pt;width:360pt;mso-width-relative:page;mso-height-relative:page");
            }
            return new XWPFParagraph(p, this.doc);
        }
    
        /**
         * 添加水印
         * @param r
         * @param text
         * @param idx
         * @param style
         */
        private void setCTR(CTR r, String text, int idx, String style) {
            CTRPr rPr = r.addNewRPr();
            rPr.addNewNoProof();
            CTPicture pict = r.addNewPict();
            CTGroup group = com.microsoft.schemas.vml.CTGroup.Factory.newInstance();
            CTShapetype shapetype = group.addNewShapetype();
            shapetype.setId("_x0000_t136");
            shapetype.setCoordsize("1600,21600");
            shapetype.setSpt(136.0F);
            shapetype.setAdj("10800");
            shapetype.setPath2("m@7,0l@8,0m@5,21600l@6,21600e");
            CTFormulas formulas = shapetype.addNewFormulas();
            formulas.addNewF().setEqn("sum #0 0 10800");
            formulas.addNewF().setEqn("prod #0 2 1");
            formulas.addNewF().setEqn("sum 21600 0 @1");
            formulas.addNewF().setEqn("sum 0 0 @2");
            formulas.addNewF().setEqn("sum 21600 0 @3");
            formulas.addNewF().setEqn("if @0 @3 0");
            formulas.addNewF().setEqn("if @0 21600 @1");
            formulas.addNewF().setEqn("if @0 0 @2");
            formulas.addNewF().setEqn("if @0 @4 21600");
            formulas.addNewF().setEqn("mid @5 @6");
            formulas.addNewF().setEqn("mid @8 @5");
            formulas.addNewF().setEqn("mid @7 @8");
            formulas.addNewF().setEqn("mid @6 @7");
            formulas.addNewF().setEqn("sum @6 0 @5");
            CTPath path = shapetype.addNewPath();
            path.setTextpathok(STTrueFalse.T);
            path.setConnecttype(STConnectType.CUSTOM);
            path.setConnectlocs("@9,0;@10,10800;@11,21600;@12,10800");
            path.setConnectangles("270,180,90,0");
            CTTextPath shapeTypeTextPath = shapetype.addNewTextpath();
            shapeTypeTextPath.setOn(STTrueFalse.T);
            shapeTypeTextPath.setFitshape(STTrueFalse.T);
            CTHandles handles = shapetype.addNewHandles();
            CTH h = handles.addNewH();
            h.setPosition("#0,bottomRight");
            h.setXrange("6629,14971");
            CTLock lock = shapetype.addNewLock();
            lock.setExt(STExt.EDIT);
            CTShape shape = group.addNewShape();
            shape.setId("PowerPlusWaterMarkObject" + idx);
            shape.setSpid("_x0000_s102" + (4 + idx));
            shape.setType("#_x0000_t136");
            shape.setStyle(style);
            shape.setWrapcoords("616 5068 390 16297 39 16921 -39 17155 7265 17545 7186 17467 -39 17467 18904 17467 10507 17467 8710 17545 18904 17077 18787 16843 18358 16297 18279 12554 19178 12476 20701 11774 20779 11228 21131 10059 21248 8811 21248 7563 20975 6316 20935 5380 19490 5146 14022 5068 2616 5068");
            //添加水印颜色
            shape.setFillcolor("#D3D3D3");
            shape.setStroked(STTrueFalse.FALSE);
            CTTextPath shapeTextPath = shape.addNewTextpath();
            shapeTextPath.setStyle("font-family:&quot;Cambria&quot;;font-size:1pt");
            shapeTextPath.setString(text);
            pict.set(group);
        }
    
        static {
            DEFAULT = STHdrFtr.DEFAULT;
            EVEN = STHdrFtr.EVEN;
            FIRST = STHdrFtr.FIRST;
        }
    }
    
    展开全文
  • Word添加多个文字水印的方法.docx
  • Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到Word页面,效果比较单一,本文通过Java代码示例介绍如何在页面中添加多行图片水印效果,即水印效果以多个图片平铺到页面。(添加...

    Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到Word页面,效果比较单一,本文通过Java代码示例介绍如何在页面中添加多行图片水印效果,即水印效果以多个图片平铺到页面。(添加多行文字水印效果,可以查看这篇文章中的方法)

    思路及方法:获取Word页眉,添加图片到页眉段落,并复制图片。

    程序环境:使用spire.doc.jar,版本:3.9.0

    Java代码:

    import com.spire.doc.*;
    import com.spire.doc.documents.Paragraph;
    import com.spire.doc.documents.TextWrappingStyle;
    import com.spire.doc.fields.DocPicture;
    
    public class ImageWatermark {
        public static void main(String[] args) {
            //加载Word文档
            Document doc=new Document();
            doc.loadFromFile("input.docx");
    
            //加载图片
            DocPicture picture = new DocPicture(doc);
            picture.loadImage("logo.png");
            picture.setTextWrappingStyle(TextWrappingStyle.Behind);//设置图片环绕方式
    
            //遍历所有section
            for (int n = 0; n < doc.getSections().getCount(); n++) {
                Section section = doc.getSections().get(n);
    
                //获取section的页眉
                HeaderFooter header = section.getHeadersFooters().getHeader();
    
                Paragraph paragrapg1;
                //获取或添加段落
                if(header.getParagraphs().getCount()>0)
                {
                    paragrapg1 = header.getParagraphs().get(0);
                }
                else
                    {
                        paragrapg1 = header.addParagraph();
                    }
    
                //复制图片,并添加图片到段落
                for (int p = 0; p < 4; p++) {
                    for (int q = 0; q < 3; q++) {
                        picture = (DocPicture)picture.deepClone();
                        picture.setVerticalPosition(50 + 150 * p);
                        picture.setHorizontalPosition(10 + 140 * q);
                        paragrapg1.getChildObjects().add(picture);
                    }
                }
            }
    
            //保存文档
            doc.saveToFile("output.docx", FileFormat.Docx_2013);
            doc.dispose();
        }
    }
    

     

     

    展开全文
  • 在办公中我们比较常用的就是对Word文档添加水印,在下面的文章中将介绍如何在C#中来实现Word水印添加(包括文本水印、图片水印)。工具使用:Free Spire.Doc for .NET(社区版)(安装后,在项目程序中引用Spire.Doc...

    水印作为一种数字信息保护手段,可以通过对多媒体,如图像、声音、视频信号等文件添加某些数字信息来达到防伪、版权声明的目的。在办公中我们比较常用的就是对Word文档添加水印,在下面的文章中将介绍如何在C#中来实现Word水印添加(包括文本水印、图片水印)。
    工具使用:Free Spire.Doc for .NET(社区版)
    安装后,在项目程序中引用Spire.Doc.dll即可,dll文件可在安装路径下的Bin文件夹中获取)
    下面是操作代码,供参考:

    1.添加Word文本水印

    using Spire.Doc;
    using Spire.Doc.Documents;
    using System.Drawing;
    
    namespace Text_Watermark
    {
        class Program
        {
            static void Main(string[] args)
            {
                //新建一个Document类对象,并加载需要添加水印的Word文档
                Document doc = new Document();
                doc.LoadFromFile("Test.docx");
    
                //新建一个TextWatermark对象,设置文本水印字样
                TextWatermark txtWatermark = new TextWatermark();
                txtWatermark.Text = "Internal Use Only";
                //设置文本水印字体大小、颜色和文本排列方式
                txtWatermark.FontSize = 45;
                txtWatermark.Color = Color.Green;
                txtWatermark.Layout = WatermarkLayout.Diagonal;
                //将文本应用到Word文档水印
                doc.Watermark = txtWatermark;
    
                //保存并打开文档
                doc.SaveToFile("Text_Watermark.docx",FileFormat.Docx2013);
                System.Diagnostics.Process.Start("Text_Watermark.docx");
            }
        }
    }
    

    调试运行程序后,生成文档,如下所示:
    C# 添加Word水印(文本水印、图片水印)

    2. 添加Word图片水印

    using Spire.Doc;
    using Spire.Doc.Documents;
    
    namespace Add_Watermark_To_Word
    {
        class Program
        {
            static void Main(string[] args)
            {
                //新建一个Document类对象,并加载需要添加水印的Word文档
                Document doc = new Document();
                doc.LoadFromFile("Test.docx");
    
                //初始化PictureWatermark类实例,加载作为水印的图片
                PictureWatermark picture = new PictureWatermark();
                picture.Picture = System.Drawing.Image.FromFile("wto.jpg");
                //设置图片大小,并将图片设置成水印
                picture.Scaling = 50;
                doc.Watermark = picture;
    
                //保存并打开文档
                doc.SaveToFile("Image_Watermark.docx",FileFormat.Docx2013);
                System.Diagnostics.Process.Start("Image_Watermark.docx");
            }
        }
    }
    

    测试效果:

    C# 添加Word水印(文本水印、图片水印)

    以上内容为本次关于Word文档水印添加的介绍,感谢阅读!

    转载于:https://blog.51cto.com/eiceblue/2089706

    展开全文
  • Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到Word页面,效果比较单一,本文通过Java代码示例介绍如何在页面中添加多行图片水印效果,即水印效果以多个图片平铺到页面。...

    Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到Word页面,效果比较单一,本文通过Java代码示例介绍如何在页面中添加多行图片水印效果,即水印效果以多个图片平铺到页面。

    思路及方法:获取Word页眉,添加图片到页眉段落,并复制图片。

    程序环境:使用spire.doc.jar,版本3.9.0

    import com.spire.doc.*;
    import com.spire.doc.documents.Paragraph;
    import com.spire.doc.documents.TextWrappingStyle;
    import com.spire.doc.fields.DocPicture;
    
    //java项目源码www.fhadmin.org
    public class ImageWatermark {
        public static void main(String[] args) {
            //加载Word文档
            Document doc=new Document();
            doc.loadFromFile("input.docx");
    
            //加载图片
            DocPicture picture = new DocPicture(doc);
            picture.loadImage("logo.png");
            picture.setTextWrappingStyle(TextWrappingStyle.Behind);//设置图片环绕方式
    
            //遍历所有section
            for (int n = 0; n < doc.getSections().getCount(); n++) {
                Section section = doc.getSections().get(n);
    
                //获取section的页眉
                HeaderFooter header = section.getHeadersFooters().getHeader();
    
                Paragraph paragrapg1;
                //获取或添加段落
                if(header.getParagraphs().getCount()>0)
                {
                    paragrapg1 = header.getParagraphs().get(0);
                }
                else
                    {
                        paragrapg1 = header.addParagraph();
                    }
    
                //复制图片,并添加图片到段落
                for (int p = 0; p < 4; p++) {
                    for (int q = 0; q < 3; q++) {
                        picture = (DocPicture)picture.deepClone();
                        picture.setVerticalPosition(50 + 150 * p);
                        picture.setHorizontalPosition(10 + 140 * q);
                        paragrapg1.getChildObjects().add(picture);
                    }
                }
            }
    
            //保存文档
            doc.saveToFile("output.docx", FileFormat.Docx_2013);
            doc.dispose();
        }
    }
    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    展开全文
  • 基于Aspose打印word模板插入水印的方法供参考,如有疑问请联系博主,谢谢!
  • 现在有越来越的人经营自媒体,因此自己发布的图片上往往要添加水印以防止别人盗用侵权,加水印的方法有很,PS加水印,在线网站加水印等。今天介绍一种方法,通过Word中图片排列的方式这种方式给图片加上水印,...
  • Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到Word页面,效果比较单一,本文通过Java代码示例介绍如何在页面中添加多行图片水印效果,即水印效果以多个图片平铺到页面。(添加...
  • 项目描述:最近有一需求是在文件上传的时候,需要添加水印来防伪,防止篡改。网上找了下,发现一aspose可以实现 aspose添加word水印 jar包在最下面!!! package com.wlkj.watermark.word; import ...
  • 我在以往的文章中曾介绍过如何给Word文档添加文本水印和图片水印,及怎样删除文档中的水印。关于文本水印,之前那篇教程里主要讲的是单行字体的水印,而在操作Excel文档时,有时也会碰到需要添加多行文字水印的情况...
  • java代码为word添加水印图片。

    千次阅读 2019-08-27 17:00:06
    方法不能说是真正意义上的添加水印,因为真正添加水印的方法很全面。他可以将字转为水印,或者将图片变成半透明,放入word中。 而我这方法只是在插入图片的基础上,做了一点点改进,可以设置图片的位置,而...
  • 本文将向您展示如何借助Spire.Doc for Java将多个图像水印添加Word文档中。可下载最新版测试。 示例代码如下: import com.spire.doc.Document; import com.spire.doc.FileFormat; import ...
  • Java 使用POI 给Word添加水印

    万次阅读 热门讨论 2019-10-16 23:21:15
    Maven 引入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> ...
  • 项目中基于Spire.Doc封装工具类实现Word文档添加图片水印? 一、Spire.Doc是什么? 1.Spire.Doc是成都冰蓝科技有限公司开发的一款简单易用、功能强大的Word文档编辑工具,有免费版本和收费版本,以下演示基于免费版本...
  • 给图片添加文字水印 设置文字的位置、大小、样式、类型、透明度、颜色等 给图片添单个文字水印 /* * 给图片添加单个文字水印类 * */ public class TextWatermarking { //定义图片水印字体类型 public static ...
  • POI给WORD添加水印(亲测可用) 最近要做电子合同,客户提出为了安全性要将合同中都添加水印,这之前在网上看到过,貌似使用POI很好加。去网上一搜发现,清一色的只有一篇文章,并且这段代码是用不了的;在文章...
  • 有时候,在制作文档的时候,我们需要给文档的背景添加个水印,那么下面就由学习啦小编给大家分享下word中加入水印的技巧,希望能帮助到您。word中加入水印方法一:步骤一:首先打开待添加水印的word文档步骤二:...
  • 导读:Flink 在开窗处理事件时间(Event Time) 数据时,可设置水印延迟以及设置窗口允许...水印延迟窗口允许延迟一Demo 两猜想总结水印延迟(WaterMark)水印由于采用了事件时间,脱离了物理挂钟。窗口不知道什么时...
  • java使用jacob给word添加水印

    千次阅读 2018-07-08 15:15:07
    1、操作word需要的jacobjar包和dll文件。2、jar包放到项目中WEB-INF\lib中,或者mvn install:install-file -Dfile=D:\Users\qiuzhb\Downloads\jacob-1.18-M2\jacob.jar -DgroupId=...
  • 这个在前面的文章已经有所介绍,具体请见:Word文档添加内置水印、个性化图片及文字水印的方法,但按照前面的方法即使多次执行添加水印的命令,也只能保留最后一次添加的水印,怎样才能在页面内添加多个水印呢?...
  • 从pdf中提取表格数据,并保存到本地的excel文件当中,并且还为大家加入了添加水印和去除水印的功能。虽然在去除水印的效果上可能不如付费的项目那么好,但是也足够大家在日常生活中进行使用,下面我们就一起来看...
  • 为了导出docx格式看了等文档,最后做总结依赖包用到dom4j和freemarker,最为方便。 <!-- https://mvnrepository.com/artifact/freemarker/freemarker --> <dependency> <groupId>...
  • 需求:为在线预览的word文档添加自定义水印,还要铺满效果,文字太还要能换行 使用插件Aspose.words for java 一jar包,官网下载或者复制相应的depedency语句即可,专门处理开发过程中的word文档的工具,功能挺...
  • php根据word模板生成pdf文件并添加水印背景说明工具介绍示例代码总结 背景说明 在一些项目中,经常会出现这样的需求 用户上传了word或者excel文件,需要审核或者查看这些文件内容的时候,总不能一下载吧,...
  • 这里的系统水印,是指通过Word软件中的水印功能添加水印效果。处理起来非常简单,分别有三种方法: 方法一:点击【设计】-【页面背景】-【水印】按钮,选择“删除水印”命令即可去除。 方法二:点击【..
  • Aspose.Java实现word转pdf,添加水印等操作一. word转pdf二. 文档插入水印 Aspose是一款商用版控件,支持各类文档操作,这里主要介绍如何在Springboot项目中使用破解版。 一. word转pdf 在项目中导入aspose.word包 ...
  • 使用jacob在Word添加水印

    千次阅读 2009-02-11 16:47:00
    最近由于工作的原因需要对Word进行操作,并且在文档上面加上水印,这问题我在网上搜索了很久都没有一完整的解决办法,没得办法之好自己研究了,半天的努力没有白费,终于解决了,有兴趣的朋友可以参考下:环境:...
  • word和excel水印其实不算真正的水印,毕竟word和excel可编辑的 只能算一背景图片,勉强算的上是一水印”了,不过打印出来就水印效果 word和excel需要用到jacob组件! jacob组件的使用方法 1.如果main方法...
  • PHP实现word(office文件)转PDF的功能并添加水印 可以将office的文件,包括图片都转为pdf文件,使用FPDI和FPDF给PDF加上水印

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,878
精华内容 1,151
关键字:

word添加多个水印