-
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:"Cambria";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:"Cambria";font-size:1pt"); shapeTextPath.setString(text); pict.set(group); } static { DEFAULT = STHdrFtr.DEFAULT; EVEN = STHdrFtr.EVEN; FIRST = STHdrFtr.FIRST; } }
-
java添加word水印_word文档添加水印背景
2020-12-10 23:48:561、点【设计】下的【水印】,2016版本的word在右侧,各位,向右看齐2、点水印下的倒三角按钮后,可以看到有“机密”、"紧急"等预设好的水印文字,我们不要这个,点下看,点下面的【自定义水印】...加水印不止是为了好看,更重要的有防伪或者声明的作用,比如在合同或公司文件上加上公司标志水印等,也有很多不愿意去这么做,我们公司的产品型式检验报告的材料上,都有相关的水印,这也是为了防止做假的材料而设置的吧。
1、点【设计】下的【水印】,2016版本的word在右侧,各位,向右看齐
2、点水印下的倒三角按钮后,可以看到有“机密”、"紧急"等预设好的水印文字,我们不要这个,点下看,点下面的【自定义水印】
3、在弹出的【自定义水印】窗口中,有图片水印和文字水印,根据需要选择使用水印即可,我们以文字水印来设置一下。
4、我简单的设置了几个水印文字“李兆香爱你们”,字体改为习字体,颜色改成黄色并设置成了透明,版式一般情况下选择“斜式”的较多,因为水印用斜着的方式显示好看,另外水印的面积会比水平方式的大些。
5、最后还是放上一张我设置完毕的效果图吧
-
Java 在 Word 里面添加多行水印图片
2021-02-19 13:22:18Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到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(); } }
-
Java 在Word中添加多行图片水印
2021-02-09 13:58:48Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到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(); } }
-
Java在Word中添加多行图片水印
2021-02-10 10:20:21Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到Word页面,效果比较单一,本文通过Java代码示例介绍如何在页面中添加多行图片水印效果,即水印效果以多个图片平铺到页面。(添加... -
如何使用Java将多个图像水印添加到Word文档?试试这款小众工具
2021-02-04 11:04:28本文将向您展示如何借助Spire.Doc for Java将多个图像水印添加到Word文档中。可下载最新版测试。 示例代码如下: import com.spire.doc.Document; import com.spire.doc.FileFormat; import ... -
.net 添加word水印_PDF的图章和水印有什么区别?分别如何添加呢?
2020-11-16 16:46:35水印和图章都是在PDF文档页面中添加特殊标记,而水印是以整一个页面为基础添加,但图章却可以在页面任意地方多次添加多个。下面一起来看看如何添加吧。一、水印1、首先用极速PDF编辑器打开需要添加水印的文档后,... -
mupdf添加图片水印_原来Word文档的水印要这样设置,怪不得别人的水印又好看又有创意...
2020-12-31 21:26:46很多时候,我们都需要给一些重要的文件加上水印,在Word中就有很好用的加水印功能,不过很多小伙伴却不知道怎么利用这个功能做出好看又具有创意的水印,今天小编就来跟大家分享一些水印设置的技巧,帮助大家设计出... -
使用jacob在Word中添加水印
2009-02-11 16:47:00最近由于工作的原因需要对Word进行操作,并且在文档上面加上水印,这个问题我在网上搜索了很久都没有一个完整的解决办法,没得办法之好自己研究了,半天的努力没有白费,终于解决了,有兴趣的朋友可以参考下:环境:... -
.net 添加word水印_PDF文件如何加水印去水印?用Word就能做到,你不会才知道吧?...
2020-11-03 07:38:18PDF文件是我们在工作、学习中经常接触的文件,PDF文件具有较好的稳定性,在传输的时候不会出现格式错乱的现象,但是PDF文件的编辑却是一大难题,例如加水印去水印,很多小伙伴都不知道怎么做,没关系!小编今天就来... -
Java实现在线word文档添加铺满效果文字水印,文字可换行
2020-08-19 12:49:41需求:为在线预览的word文档添加自定义水印,还要铺满效果,文字太多还要能换行 使用插件Aspose.words for java 一个jar包,官网下载或者复制相应的depedency语句即可,专门处理开发过程中的word文档的工具,功能挺... -
导出word文档生成docx格式 添加水印
2019-12-23 17:56:02为了导出docx格式看了等多文档,最后做个总结依赖包用到dom4j和freemarker,最为方便。 <!-- https://mvnrepository.com/artifact/freemarker/freemarker --> <dependency> <groupId>... -
如何word转换成pdf文件,怎样添加水印?
2016-10-25 13:49:16word文档在传输给其他人查看时往往需要转成pdf文件,这样可以使得文件在任何系统下都可以打开查看,还能使文档内容不会被随意改动,有时还需要为转换的pdf文件...添加文件一次可以添加多个文档来一起转换。 添加的 -
vba 添加水印问题
2018-12-21 15:26:35最近qt操作word添加水印时,出现一个问题,当word文档有多页时,添加的水印只有第一页有水印或者只有第一页没有水印(安装的Word版本不同) 添加方式: 打开word文档,录制宏,开始录制后添加水印,添加成功后停止... -
C# Microsoft.Office.Interop.Word 将多个word合成一个并插入图片 转换成pdf
2020-05-07 15:18:16最近领导提了个需求 需要把多个word和多个图片 放在一起并且转换成pdf格式 我这里的思路是先把多个word放在一个新的word里 再把图片循环添加到这个新的word文档里 保存之后转换成PDF格式 之前用的spire Doc的这个... -
java使用jacob操作word添加图片
2018-07-08 15:30:44这是给word添加水印,当业务需求在多页word文档中,某一页添加水印一样的盖章,这个链接就没有办法了。 2、在word中需要盖章的位置添加个书签。 3、用jacob给书签替换成图片 /** * Created by qiuzhb on 2018... -
mac pdf去水印_工作5年才发现,Word、PDF文档还能这样去水印!网友:厉害了
2020-12-27 04:21:08工作5年才发现,Word、PDF文档还能这样去水印!网友:厉害了在工作中对于一些重要的文件我们会...Word直接去水印方法一:Word文档中添加水印的话,我们是可以直接利用Word自带的去水印功能进行删除。操作方法:打... -
word加多行水印_给视频加字幕?分享8个工具助力你的微信视频号创作!
2020-11-13 21:05:38@珞珈从发第一条视频号开始距今已经快有小半个月了,这半个月我们投入了蛮多的时间和精力在制作视频上面。(还没看过视频的同学赶紧在视频号搜索:珞珈老师)细心的小伙伴们就会发现,每一个视频我们都为大家贴心地配... -
easyui一行显示多行_Office中添加多行水印的方法,你也可以一学就会
2020-12-26 22:09:26今天有小伙伴发过来一个多页的Word文档,要求给每一页上添加上水印效果,并且要求了水印的颜色,要布满全页面,字体不能太大,水印的内容要分好几行才能重复等等,你是准备花几个小时设计个图片作水印呀还是花三分钟... -
java编辑word文档,向word文档尾部添加图片
2020-06-03 08:52:44工作中遇到一个需求,app端手写签名要插入到后台上传的附件中,多人签名时在word底部竖向往下排列。在此记录一下。 第一步 首先导入jar包:SpireDoc.jar(使用SprieDocforJava),有免费版(有水印)和付费版,各位... -
PDF转换Word、Excel、PPT、图片,PDF去水印,PDF拆分该怎么做到这些
2020-09-28 09:23:54其实下载一个PDF转换工具就可以了,现在很多PDF转换工具都具备这些功能。 PDF转换工具:okfone PDF转换大师(地址链接,点击进入) 操作步骤如下: 解决PDF转换Word、Excel、PPT、图片问题 点击【PDF转文件】,... -
Aspose.Words for C++功能示例演示:如何比较两个Word文档
2019-07-04 15:20:26API直接在您自己的C ++应用程序中提供文档格式化,操作,邮件合并,水印和更多功能,而无需Microsoft Word。API支持大多数Microsoft Word格式进行处理。 近期更新了Aspose.Words for C ++ v19.6,添加了对Document.... -
word使用技巧大全
2011-03-18 20:37:53★在Word2002中选择多个文档区域 15 ★禁用智能标记 15 ★WORD字体随身携带 15 ★为WORD文本加注解 16 ★快速输入特定的短语 16 ★特殊符号的输入 17 ★使用通配符进行模糊替换 17 ★Word文档与RTF文档的互换问题 17... -
jacob操作office word简单教程
2017-03-10 14:37:17现在的项目中操作word文件比较多,word文件的加密解密,转换为各种格式,插入图片,添加水印、html转word等等各种东西,大家也都知道,java语言是不能直接操作word或者excel的,不像C#,可以调用VBA的类来直接操作... -
提取富文本里得图片_快速提取Word文档里的所有图片
2021-01-11 20:25:09先来说说我为什么会有这个需求吧蓝同学给大家分享了很多软件安装教程,不知道你是否注意到上面的水印了没,这些水印的添加可不是一个很容易的事情,特别是批量添加比如下面这个PS安装教程,有7张图片,如果一张张地... -
word转PDF,PDF转图片
2018-09-25 11:35:50最终根据自己的需求做成了下面两个工具类,来完成需求.pdf转图片用的是icepdf,可以自己根据需求添加水印文字,设置图片分辨率. import org.apache.commons.lang3.StringUtils; import org.icepdf.core.pobjects.... -
添加本地打印机
2010-08-06 10:45:41【实验名称】添加本地打印机--实现模拟打印和...n 共享本地打印机---实现网络中的多个用户共享打印 n 将整个过程整理成Word文档 n 给Word文档加水印 n 将Word文档转换为.pdf文档 【实验环境及拓扑结构】 ... -
PDF转换成Word怎样转换?分享一种PDF转换方法
2020-03-04 17:16:36很多的小伙伴还不知道怎样将PDF文件转换为Word文档,今天小编就来教给大家一个简单的方法,还可以实现批量转换哦。 今日转换:PDF转Word 软件可完成功能: 1.PDF转换功能:可以完成PDF到Word、Excel、PPT、图片... -
transPDF.exe
2021-01-18 13:48:38例如你想要把一个word文件加水印并转换为加密的pdf文件发送给多个同事,且每个pdf都有特定的水印和特定的密码。 a同事收到的文件:水印为:a同事专属,密码为:xxxxxx b同事收到的文件:水印为:b同事专属。密码为:... -
PDFdo PDF Converter(pdf转换器) v1.4.zip
2019-07-14 00:24:08支持PDF添加水印,可添加页眉、页脚、图片水印、重复文字水印等,可设置水印字体。 支持PDF删除文字,只能删除文字型的PDF 支持PDF替换文字,只能替换文字型的PDF 支持PDF删除页面,可一次删除一个文档的一页或多...