1、pom引入
注:该方法必须使用4:.X以上版本的poi,4.X以下版本将报告异常。
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.1.2</version> </dependency>
package org.publiccms.common.watermark; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFHeader; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import java.io.*; import java.util.regex.Pattern; public class DocxWaterMark { public static void addWaterMark (String filePath,String outPath,String waterMarkValue) throws IOException, FileNotFoundException { //输入的docx文档 InputStream in = new FileInputStream(new File(filePath)); XWPFDocument doc = new XWPFDocument(in); XWPFParagraph paragraph = doc.createParagraph()///创建文本段落 XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy() if (headerFooterPolicy == null) headerFooterPolicy = doc.createHeaderFooterPolicy()///如果没有页眉页脚,则创建 headerFooterPolicy.createWatermark(waterMarkValue);///设置水印显示的内容 XWPFHeader header = headerFooterPolicy.getHeader(XWPFHeaderFooterPolicy.DEFAULT); paragraph = header.getParagraphArray(0); org.apache.xmlbeans.XmlObject[] xmlobjects = paragraph.getCTP().getRArray(0).getPictArray(0).selectChildren( new javax.xml.namespace.QName("urn:schemas-microsoft-com:vml", "shape")); if (xmlobjects.length > 0) { com.microsoft.schemas.vml.CTShape ctshape = (com.microsoft.schemas.vml.CTShape) xmlobjects[0]; ctshape.setFillcolor("#f6f6f6");//设置水印颜色 // ctshape.setStyle(ctshape.getStyle() ";rotation:315");//设置水印样式 获得默认样式和旋315度 ctshape.setStyle(getShapeStyle());//设置水印样式 获得默认样式和旋315度 } OutputStream out = new FileOutputStream(outPath); doc.write(out); // doc.write(out); out.flush(); out.close(); } private static String getShapeStyle() { StringBuilder sb = new StringBuilder(); sb.append("position: ").append("absolute"); // 文本path绘制定位方法 sb.append(";left: ").append("opt"); sb.append(";width: ").append("500pt"); // 计算文本占用的长度(文本总数*单字长度) sb.append(";height: ").append("150pt"); // 字体高度 sb.append(";z-index: ").append("-251654144"); sb.append(";mso-wrap-edited: ").append("f"); sb.append(";margin-left: ").append("-50pt"); sb.append(";margin-top: ").append("270pt"); sb.append(";mso-position-horizontal-relative: ").append("margin"); sb.append(";mso-position-vertical-relative: ").append("margin"); sb.append(";mso-width-relative: ").append("page"); sb.append(";mso-height-relative: ").append("page"); sb.append(";rotation: ").append("335"); return sb.toString(); } /** * 修改水印风格高度的方法,如果你不想改变高度,你可以不使用第二种方法 * @param styleStr 以前的水印风格 * @param height 需要改成的高度 * @return 返回新修改的水印样式 */ public static String getWaterMarkStyle(String styleStr,double height){ //使用获得的样式";"切割后保存在数组中 Pattern p=Pattern.compile(";"); String[] strs = p.split(styleStr); ///遍历保存的数据,找高度风格,将高度改为参数传入高度 for(String str : strs){ if(str.startsWith("height:")){ String heightStr = "height:" height "pt"; styleStr = styleStr.replace(str,heightStr); break; } } return styleStr;//返回改进的样式 } }
测试水印功能代码如下:
DocxWaterMark dwm = new DocxWaterMark(); String FileName=urlOfd.substring(urlOfd.lastIndexOf("/") 1); String baseSrcUrl=this.preAbsoluteUrl urlOfd.substring(urlOfd.lastIndexOf("upload")-1,urlOfd.lastIndexOf("/")) "/" FileName; String baseOutUrl = this.preAbsoluteUrl "\\waterMark" urlOfd.substring(urlOfd.lastIndexOf("/")); try { dwm.addWaterMark(baseSrcUrl,baseOutUrl, username); msg = "success"; }catch (Exception ex){ ex.printStackTrace(); }
/div>