소스 검색

商品资料水印添加

Aslee 3 년 전
부모
커밋
e3fb8cf1ff

+ 18 - 0
src/main/java/com/caimei/modules/archive/entity/CmProductArchiveFile.java

@@ -17,7 +17,9 @@ public class CmProductArchiveFile extends DataEntity<CmProductArchiveFile> {
 	private Integer archiveContentId;		// 资料库内容id
 	private String fileName;		// 文件名称
 	private String ossName;		// oss名称
+	private String waterOssName;		//水印文俊oss名称
 	private String ossUrl;		// oss链接
+	private String waterOssUrl;		//水印文件oss链接
 	private Date uploadTime;		// 上传时间
 
 	public CmProductArchiveFile() {
@@ -67,4 +69,20 @@ public class CmProductArchiveFile extends DataEntity<CmProductArchiveFile> {
 	public void setUploadTime(Date uploadTime) {
 		this.uploadTime = uploadTime;
 	}
+
+	public String getWaterOssName() {
+		return waterOssName;
+	}
+
+	public void setWaterOssName(String waterOssName) {
+		this.waterOssName = waterOssName;
+	}
+
+	public String getWaterOssUrl() {
+		return waterOssUrl;
+	}
+
+	public void setWaterOssUrl(String waterOssUrl) {
+		this.waterOssUrl = waterOssUrl;
+	}
 }

+ 22 - 10
src/main/java/com/caimei/modules/archive/service/CmProductArchiveContentService.java

@@ -84,6 +84,13 @@ public class CmProductArchiveContentService extends CrudService<CmProductArchive
 							e.printStackTrace();
 						}
 						image.setOssUrl(imageUrl);
+						Map<String, Object> map = WaterMarkUtils.addWaterMark(null, null, imageUrl, "img");
+						if (null != map) {
+							String ossName = (String)map.get("ossName");
+							String waterUrl = (String) map.get("imagePath");
+							image.setWaterOssName(ossName);
+							image.setWaterOssUrl(waterUrl);
+						}
 					}
 					image.setArchiveContentId(Integer.parseInt(cmProductArchiveContent.getId()));
 					cmProductArchiveContentDao.insertFile(image);
@@ -176,32 +183,37 @@ public class CmProductArchiveContentService extends CrudService<CmProductArchive
 		Map<String, Object> map = new HashMap<>();
 		String fileAllName = multipartFile.getOriginalFilename();
 		String fileType = fileAllName.substring(fileAllName.lastIndexOf(".") + 1);
-		String uuid = UUID.randomUUID().toString().replaceAll("-", "");
-		String filePath = uuid + "." + fileType;
+		String uuid_1 = UUID.randomUUID().toString().replaceAll("-", "");
+		String filePath_1 = uuid_1 + "." + fileType;
+		String uuid_2 = UUID.randomUUID().toString().replaceAll("-", "");
+		String filePath_2 = uuid_2 + "." + fileType;
 		String contentType = OssArchiveUtil.getContentType(fileAllName);
 		try {
 			//保存本地
 			File file = OssArchiveUtil.ossUpload(multipartFile);
 			logger.info("默认路径>>>" + file.getAbsolutePath());
-			WaterMarkUtils.addWaterMark(file, "采美365网", filePath, fileType);
-			File waterMarkFile = new File(tempPath + filePath);
+			WaterMarkUtils.addWaterMark(file, "采美365网", filePath_2, fileType);
+			File waterMarkFile = new File(tempPath + filePath_2);
 			String contentDispositon = "pdf".equals(fileType) ? "inline" : "attachment";
 			//上传oss
-//			String url = OssArchiveUtil.ossUpload(filePath, "archiveFile/", file, contentType, contentDispositon);
-			String url = OssArchiveUtil.ossUpload(filePath, "archiveFile/", waterMarkFile, contentType, contentDispositon);
+//			String url = OssArchiveUtil.ossUpload(filePath_1, "archiveFile/", file, contentType, contentDispositon);
+			String waterMarkUrl = OssArchiveUtil.ossUpload(filePath_2, "archiveFile/", waterMarkFile, contentType, contentDispositon);
+            logger.info(">>>>>>>>>>>>>>>>>" + waterMarkUrl);
 			//删除本地文件
 			OssArchiveUtil.deleteFile(file);
 			OssArchiveUtil.deleteFile(waterMarkFile);
 			//保存关联关系
-			CmProductArchiveFile archiveFile = new CmProductArchiveFile();
+			/*CmProductArchiveFile archiveFile = new CmProductArchiveFile();
 			archiveFile.setFileName(fileName);
-			archiveFile.setOssName(filePath);
+			archiveFile.setOssName(filePath_1);
+            archiveFile.setWaterOssName(filePath_2);
 			archiveFile.setOssUrl(url);
+            archiveFile.setWaterOssUrl(waterMarkUrl);
 			archiveFile.setUploadTime(new Date());
-			cmProductArchiveContentDao.insertFile(archiveFile);
+			cmProductArchiveContentDao.insertFile(archiveFile);*/
 			map.put("success", true);
 			map.put("msg", "操作成功");
-			map.put("archiveFile", archiveFile);
+//			map.put("archiveFile", archiveFile);
 		} catch (Exception e) {
 			e.printStackTrace();
 			map.put("success", false);

+ 148 - 39
src/main/java/com/caimei/modules/archive/utils/WaterMarkUtils.java

@@ -1,10 +1,13 @@
 package com.caimei.modules.archive.utils;
 
+import com.caimei.modules.common.utils.Base64Util;
+import com.caimei.modules.sys.utils.UploadImageUtils;
 import com.itextpdf.text.*;
 import com.itextpdf.text.Rectangle;
 import com.itextpdf.text.pdf.*;
 import com.thinkgem.jeesite.common.config.Global;
 import groovy.util.logging.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.POIXMLDocument;
 import org.apache.poi.hwpf.HWPFDocument;
 import org.apache.poi.openxml4j.opc.OPCPackage;
@@ -21,7 +24,10 @@ import org.apache.poi.xwpf.usermodel.XWPFHeader;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.web.multipart.MultipartFile;
 import schemasMicrosoftComVml.CTShape;
+import sun.misc.BASE64Encoder;
 
 import javax.imageio.ImageIO;
 import javax.swing.*;
@@ -34,6 +40,9 @@ import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.lang.reflect.Field;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
 
 
 /**
@@ -224,24 +233,7 @@ public class WaterMarkUtils {
             if (headerFooterPolicy == null) {
                 headerFooterPolicy = doc.createHeaderFooterPolicy();
             }
-            // create default Watermark - fill color black and not rotated
             headerFooterPolicy.createWatermark(markStr);
-            // get the default header
-            // Note: createWatermark also sets FIRST and EVEN headers
-            // but this code does not updating those other headers
-            XWPFHeader header = headerFooterPolicy.getHeader(XWPFHeaderFooterPolicy.DEFAULT);
-            paragraph = header.getParagraphArray(0);
-//            // get com.microsoft.schemas.vml.CTShape where fill color and rotation is set
-//            paragraph.getCTP().newCursor();
-//            System.out.println(paragraph.getCTP().getRArray(0));
-//            System.out.println(paragraph.getCTP().getRArray(0).getPictArray(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("#D3D3D3");
-                ctshape.setStyle(ctshape.getStyle() + ";rotation:315" + ";height:60pt;width:360pt");
-            }
             File file = new File(outPath + filePath);
             if (!file.exists()) {
                 try {
@@ -274,15 +266,15 @@ public class WaterMarkUtils {
     /**
      * pdf设置文字水印
      *
-     * @param inputPath
-     * @param outPath
+     * @param inputFile
+     * @param filePath
      * @param markStr
      */
-    public static void setPdfWatermark(String inputPath, String outPath, String markStr) {
-        File file = new File(outPath);
-        if (!file.exists()) {
+    public static void setPdfWatermark(File inputFile, String filePath, String markStr) {
+        File outputFile = new File(outPath + filePath);
+        if (!outputFile.exists()) {
             try {
-                file.createNewFile();
+                outputFile.createNewFile();
             } catch (IOException e) {
                 log.error("setPdfWatermark fail: 创建输出文件IO异常", e);
                 // throw new MyException(ResultCode.FAILURE, "setPdfWatermark fail: 创建输出文件IO异常");
@@ -290,7 +282,7 @@ public class WaterMarkUtils {
         }
         BufferedOutputStream bufferOut = null;
         try {
-            bufferOut = new BufferedOutputStream(new FileOutputStream(file));
+            bufferOut = new BufferedOutputStream(new FileOutputStream(outputFile));
         } catch (FileNotFoundException e) {
             log.error("setPdfWatermark fail: 源文件不存在", e);
             // throw new MyException(ResultCode.FAILURE, "setPdfWatermark fail: 源文件不存在");
@@ -302,7 +294,7 @@ public class WaterMarkUtils {
         BaseFont base = null;
         PdfReader reader = null;
         try {
-            reader = new PdfReader(inputPath);
+            reader = new PdfReader(new FileInputStream(inputFile));
             //解决PdfReader not opened with owner password
             Field f = PdfReader.class.getDeclaredField("ownerPasswordUsed");
             f.setAccessible(true);
@@ -432,15 +424,15 @@ public class WaterMarkUtils {
     /**
      * PPT设置水印
      *
-     * @param path
+     * @param inputFile
      * @param targetpath
      * @param markStr
      * @throws IOException
      */
-    public static void setPPTWaterMark(String path, String targetpath, String markStr) {
+    public static void setPPTWaterMark(File inputFile, String filePath, String markStr) {
         XMLSlideShow slideShow = null;
         try {
-            slideShow = new XMLSlideShow(new FileInputStream(path));
+            slideShow = new XMLSlideShow(new FileInputStream(inputFile));
         } catch (IOException e) {
             log.error("setPPTWaterMark fail:", e);
             // throw new MyException(ResultCode.FAILURE, "setPPTWaterMark fail:获取PPT文件失败");
@@ -456,7 +448,7 @@ public class WaterMarkUtils {
 //                pictureShape.setAnchor(new java.awt.Rectangle(250, 0, 500, 500));
                 pictureShape.setAnchor(pictureShape.getAnchor());
             }
-            out = new FileOutputStream(targetpath);
+            out = new FileOutputStream(outPath + filePath);
             slideShow.write(out);
         } catch (IOException e) {
             log.error("setPPTWaterMark fail:" + e);
@@ -486,6 +478,40 @@ public class WaterMarkUtils {
         }
     }
 
+    private static Map<String,Object> setImageWaterMark(String image){
+        Map<String, Object> result = new HashMap<>(2);
+        String img = null;
+        try {
+            ClassPathResource classPathResource = new ClassPathResource("/templates/images/imgWaterMark.png");
+            InputStream inputStreamImg = classPathResource.getInputStream();
+            Image waterMarkImg = ImageIO.read(inputStreamImg);
+            img = markImageByIcon(waterMarkImg, image, null);
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+        String ossName = null;
+        String imagePath = null;
+        if (StringUtils.isNotEmpty(img)) {
+            MultipartFile imgFile = Base64Util.base64ToMultipart(img);
+            if (null != imgFile) {
+                Map<String, Object> map = UploadImageUtils.uploadOss(imgFile, "archiveFile/");
+                if ((boolean)map.get("success")) {
+                    ossName = (String) map.get("ossName");
+                    imagePath = (String) map.get("url");
+                    result.put("ossName", ossName);
+                    result.put("imagePath", imagePath);
+                    return result;
+                }
+            }
+        }
+        if (StringUtils.isNotEmpty(imagePath)) {
+            log.info(">>>>>>>>>>>>>>>>水印图片上传成功:" + imagePath);
+        } else {
+            log.info(">>>>>>>>>>>>>>>>水印图片上传失败");
+        }
+        return null;
+    }
+
     /**
      * 获取水印文字总长度
      *
@@ -531,6 +557,79 @@ public class WaterMarkUtils {
         return os;
     }
 
+    /**
+     * 添加水印图片
+     * @param waterMarkImg	水印图片
+     * @param srcImgURL		原图片路径
+     * @param degree		旋转角度
+     * @return
+     */
+    public static String markImageByIcon(Image waterMarkImg, String srcImgURL, Integer degree) {
+        //io流
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            //原图片
+            ImageIcon imageIcon = new ImageIcon(new URL(srcImgURL));
+            Image srcImg = imageIcon.getImage();
+            BufferedImage buffImg = ImageIO.read(new URL(srcImgURL));
+
+            // 1、得到画笔对象
+            Graphics2D g = buffImg.createGraphics();
+
+            // 2、设置对线段的锯齿状边缘处理
+            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+
+            g.drawImage(
+                    srcImg.getScaledInstance(srcImg.getWidth(null),
+                            srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
+                    null);
+            // 3、设置水印旋转
+            if (null != degree) {
+                g.rotate(Math.toRadians(degree),
+                        (double) buffImg.getWidth() / 2,
+                        (double) buffImg.getHeight() / 2);
+            }
+
+
+            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
+                    1f));
+
+            // 6、水印图片的位置
+            int srcWidth = srcImg.getWidth(null);
+            int srcHeight = srcImg.getHeight(null);
+            int waterMarkWidth = waterMarkImg.getWidth(null);
+            int waterMarkHeight = waterMarkImg.getHeight(null);
+            g.drawImage(waterMarkImg, (srcWidth - waterMarkWidth) / 2, srcHeight - waterMarkHeight, null);
+            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
+            // 7、释放资源
+            g.dispose();
+
+            //将图片写入流中
+            ImageIO.write(buffImg, "png", baos);
+            //转换成字节
+            byte[] bytes = baos.toByteArray();
+            BASE64Encoder encoder = new BASE64Encoder();
+            //转换成base64串
+            String addImage = encoder.encodeBuffer(bytes).trim();
+            //删除 \r\n
+            addImage = addImage.replaceAll("\n", "").replaceAll("\r", "");
+            return "data:image/jpg;base64," + addImage;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (null != baos) {
+                    baos.close();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
     /**
      * 根据文字生成水印图片(大号 平铺)
      *
@@ -538,16 +637,17 @@ public class WaterMarkUtils {
      * @return
      */
     public static BufferedImage createWaterMarkImageBig(String text) {
-        Integer width = 1000;
-        Integer height = 800;
+        Integer width = 1282;
+        Integer height = 723;
         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取bufferedImage对象
-        Font font = new Font("宋体", Font.PLAIN, 70);
+        Font font = new Font("宋体", Font.BOLD, 70);
         Graphics2D g2d = image.createGraphics();
         image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
         g2d.dispose();
         g2d = image.createGraphics();
         //设置字体颜色和透明度
-        g2d.setColor(new Color(0, 0, 0, 60));
+//        g2d.setColor(new Color(211,211,211,0));
+        g2d.setColor(new Color(0, 0, 0, 50));
         //设置字体
         g2d.setStroke(new BasicStroke(1));
         //设置字体类型  加粗 大小
@@ -556,12 +656,12 @@ public class WaterMarkUtils {
         g2d.rotate(Math.toRadians(-30), (double) image.getWidth() / 2, (double) image.getHeight() / 2);
         FontRenderContext context = g2d.getFontRenderContext();
         Rectangle2D bounds = font.getStringBounds(text, context);
-        double x = (width - bounds.getWidth()) / 2;
-        double y = (height - bounds.getHeight()) / 2;
-        double ascent = -bounds.getY();
-        double baseY = y + ascent;
         //写入水印文字原定高度过小,所以累计写水印,增加高度
-        g2d.drawString(text, (int) x, (int) baseY);
+//        g2d.drawString(text, (int) x, (int) baseY);
+        g2d.drawString(text, 200, 0);
+        g2d.drawString(text, 200, 500);
+        g2d.drawString(text, 700, 289);
+        g2d.drawString(text, 700, 780);
         //设置透明度
         g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
         //释放对象
@@ -569,9 +669,18 @@ public class WaterMarkUtils {
         return image;
     }
 
-    public static void addWaterMark(File inputFile, String markStr, String filePath, String fileType) {
+    public static Map<String,Object> addWaterMark(File inputFile, String markStr, String filePath, String fileType) {
         if (fileType.contains("doc")) {
             setWordWaterMark(inputFile, markStr, filePath, fileType);
+        } else if (fileType.contains("ppt")) {
+            setPPTWaterMark(inputFile, filePath, markStr);
+        } else if (fileType.contains("pdf")) {
+            setPdfWatermark(inputFile, filePath, markStr);
+        } else if (fileType.contains("img")) {
+            return setImageWaterMark(filePath);
         }
+        return null;
     }
+
+
 }

+ 80 - 0
src/main/java/com/caimei/modules/common/utils/Base64Util.java

@@ -0,0 +1,80 @@
+package com.caimei.modules.common.utils;
+
+import org.springframework.web.multipart.MultipartFile;
+import sun.misc.BASE64Decoder;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class Base64Util implements MultipartFile {
+    private final byte[] imgContent;
+    private final String header;
+
+    public Base64Util(byte[] imgContent, String header) {
+        this.imgContent = imgContent;
+        this.header = header.split(";")[0];
+    }
+
+    @Override
+    public String getName() {
+        return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];
+    }
+
+    @Override
+    public String getContentType() {
+        return header.split(":")[1];
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return imgContent == null || imgContent.length == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return imgContent.length;
+    }
+
+    @Override
+    public byte[] getBytes() throws IOException {
+        return imgContent;
+    }
+
+    @Override
+    public ByteArrayInputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(imgContent);
+    }
+
+    @Override
+    public void transferTo(File dest) throws IOException, IllegalStateException {
+        new FileOutputStream(dest).write(imgContent);
+    }
+
+    public static MultipartFile base64ToMultipart(String base64) {
+        try {
+            String[] baseStrs = base64.split(",");
+
+            BASE64Decoder decoder = new BASE64Decoder();
+            byte[] b = new byte[0];
+            b = decoder.decodeBuffer(baseStrs[1]);
+
+            for (int i = 0; i < b.length; ++i) {
+                if (b[i] < 0) {
+                    b[i] += 256;
+                }
+            }
+            return new Base64Util(b, baseStrs[0]);
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+}

+ 37 - 0
src/main/java/com/caimei/modules/sys/utils/UploadImageUtils.java

@@ -1,9 +1,17 @@
 package com.caimei.modules.sys.utils;
 
+import com.caimei.modules.archive.utils.OssArchiveUtil;
 import com.thinkgem.jeesite.common.config.Global;
 import com.thinkgem.jeesite.common.utils.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
 
 /**
  * 上传图片公用方法
@@ -32,4 +40,33 @@ public class UploadImageUtils {
         }
     }
 
+
+    public static Map<String, Object> uploadOss(MultipartFile multipartFile, String dirName) {
+        Map<String, Object> map = new HashMap<>();
+        String fileAllName = multipartFile.getOriginalFilename();
+        String fileType = fileAllName.substring(fileAllName.lastIndexOf(".") + 1);
+        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+        String filePath = uuid + "." + fileType;
+        String contentType = OssArchiveUtil.getContentType(fileAllName);
+        try {
+            //保存本地
+            File file = OssArchiveUtil.ossUpload(multipartFile);
+            logger.info("默认路径>>>" + file.getAbsolutePath());
+            //上传oss
+            String url = OssArchiveUtil.ossUpload(filePath, dirName, file, contentType, null);
+            //删除本地文件
+            OssArchiveUtil.deleteFile(file);
+            map.put("success", true);
+            map.put("msg", "操作成功");
+            map.put("ossName", filePath);
+            map.put("url", url);
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("success", false);
+            map.put("msg", "操作失败");
+            logger.info("上传异常!!!");
+        }
+        return map;
+    }
+
 }

+ 440 - 0
src/main/java/org/apache/poi/xwpf/model/XWPFHeaderFooterPolicy.java

@@ -0,0 +1,440 @@
+package org.apache.poi.xwpf.model;
+
+
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+
+import com.microsoft.schemas.office.office.CTLock;
+import com.microsoft.schemas.office.office.STConnectType;
+import com.microsoft.schemas.vml.*;
+import org.apache.poi.POIXMLDocumentPart;
+import org.apache.poi.POIXMLDocumentPart.RelationPart;
+import org.apache.poi.xwpf.usermodel.*;
+import org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.HdrDocument.Factory;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr.Enum;
+
+import java.util.Iterator;
+
+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 ctBody = doc.getDocument().getBody();
+            sectPr = ctBody.isSetSectPr() ? ctBody.getSectPr() : ctBody.addNewSectPr();
+        }
+
+        this.doc = doc;
+
+        CTHdrFtrRef ref;
+        POIXMLDocumentPart relatedPart;
+        Enum type;
+        int i;
+        for(i = 0; i < sectPr.sizeOfHeaderReferenceArray(); ++i) {
+            ref = sectPr.getHeaderReferenceArray(i);
+            relatedPart = doc.getRelationById(ref.getId());
+            XWPFHeader hdr = null;
+            if (relatedPart != null && relatedPart instanceof XWPFHeader) {
+                hdr = (XWPFHeader)relatedPart;
+            }
+
+            try {
+                type = ref.getType();
+            } catch (XmlValueOutOfRangeException var10) {
+                type = STHdrFtr.DEFAULT;
+            }
+
+            this.assignHeader(hdr, type);
+        }
+
+        for(i = 0; i < sectPr.sizeOfFooterReferenceArray(); ++i) {
+            ref = sectPr.getFooterReferenceArray(i);
+            relatedPart = doc.getRelationById(ref.getId());
+            XWPFFooter ftr = null;
+            if (relatedPart != null && relatedPart instanceof XWPFFooter) {
+                ftr = (XWPFFooter)relatedPart;
+            }
+
+            try {
+                type = ref.getType();
+            } catch (XmlValueOutOfRangeException var9) {
+                type = STHdrFtr.DEFAULT;
+            }
+
+            this.assignFooter(ftr, 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);
+        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);
+            String pStyle = "Header";
+            CTHdrFtr hdr = this.buildHdr(type, pStyle, 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 = 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);
+            String pStyle = "Footer";
+            CTHdrFtr ftr = this.buildFtr(type, pStyle, 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 i$ = this.doc.getRelationParts().iterator();
+
+        while(i$.hasNext()) {
+            RelationPart rp = (RelationPart)i$.next();
+            if (rp.getRelationship().getRelationshipType().equals(relation.getRelation())) {
+                ++i;
+            }
+        }
+
+        return i;
+    }
+
+    private CTHdrFtr buildFtr(Enum type, String pStyle, XWPFHeaderFooter wrapper, XWPFParagraph[] pars) {
+        CTHdrFtr ftr = this.buildHdrFtr(pStyle, pars, wrapper);
+        this.setFooterReference(type, wrapper);
+        return ftr;
+    }
+
+    private CTHdrFtr buildHdr(Enum type, String pStyle, XWPFHeaderFooter wrapper, XWPFParagraph[] pars) {
+        CTHdrFtr hdr = this.buildHdrFtr(pStyle, pars, wrapper);
+        this.setHeaderReference(type, wrapper);
+        return hdr;
+    }
+
+    private CTHdrFtr buildHdrFtr(String pStyle, XWPFParagraph[] paragraphs, XWPFHeaderFooter wrapper) {
+        CTHdrFtr ftr = wrapper._getHdrFtr();
+        if (paragraphs != null) {
+            for(int i = 0; i < paragraphs.length; ++i) {
+                CTP p = 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().getSectPr().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) {
+        if (pageNumber == 1 && this.firstPageHeader != null) {
+            return this.firstPageHeader;
+        } else {
+            return pageNumber % 2 == 0 && this.evenPageHeader != null ? this.evenPageHeader : this.defaultHeader;
+        }
+    }
+
+    public XWPFHeader getHeader(Enum type) {
+        if (type == STHdrFtr.EVEN) {
+            return this.evenPageHeader;
+        } else {
+            return type == STHdrFtr.FIRST ? this.firstPageHeader : this.defaultHeader;
+        }
+    }
+
+    public XWPFFooter getFooter(int pageNumber) {
+        if (pageNumber == 1 && this.firstPageFooter != null) {
+            return this.firstPageFooter;
+        } else {
+            return pageNumber % 2 == 0 && this.evenPageFooter != null ? this.evenPageFooter : this.defaultFooter;
+        }
+    }
+
+    public XWPFFooter getFooter(Enum type) {
+        if (type == STHdrFtr.EVEN) {
+            return this.evenPageFooter;
+        } else {
+            return 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);
+    }
+
+    private XWPFParagraph getWatermarkParagraph123(String text, int idx) {
+        CTP p = 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 = 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:-251654144;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
+     */
+    public XWPFParagraph getWatermarkParagraph(String text, int idx) {
+        CTP p = 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:70pt;width:310pt;mso-width-relative:page;mso-height-relative:page;");
+//            setCTR(r, text, idx, "position:absolute;left:0pt;margin-left:-120pt;margin-top:108pt;width:310pt;height:70pt;z-index:-251654144;mso-wrap-edited:f;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin;font-family:\"SimSun\"");
+            //右上角
+            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:70pt;width:310pt;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:70pt;width:310pt;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:70pt;width:310pt;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 = 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;
+    }
+}

+ 4 - 2
src/main/resources/mappings/modules/archive/CmOrderArchiveMapper.xml

@@ -32,10 +32,12 @@
 
     <select id="findList" resultType="CmOrderArchive">
         SELECT
-        <include refid="cmOrderArchiveColumns"/>,count(*) as fileNum
+        <include refid="cmOrderArchiveColumns"/>,ifnull(b.fileNum,0) as fileNum
         FROM cm_order_archive a
         <include refid="cmOrderArchiveJoins"/>
-        left join cm_order_archive_file coaf on a.id = coaf.orderArchiveId
+        left join (
+        select orderArchiveId, count(*) as fileNum from cm_order_archive_file
+        group by orderArchiveId) b on a.id = b.orderArchiveId
         <where>
             <if test="archiveNo != null and archiveNo != ''">
                 AND a.archiveNo LIKE

+ 3 - 2
src/main/resources/mappings/modules/archive/CmProductArchiveContentMapper.xml

@@ -86,8 +86,9 @@
 		)
 	</insert>
 	<insert id="insertFile" parameterType="CmProductArchiveFile" keyProperty="id" useGeneratedKeys="true">
-        insert into cm_product_archive_file(archiveContentId, fileName, ossName, ossUrl, uploadTime)
-        values (#{archiveContentId}, #{fileName}, #{ossName}, #{ossUrl}, now());
+		insert into cm_product_archive_file(archiveContentId, fileName, ossName, ossUrl, waterOssName, waterOssUrl,
+											uploadTime)
+		values (#{archiveContentId}, #{fileName}, #{ossName}, #{ossUrl}, #{waterOssName}, #{waterOssUrl}, now())
 	</insert>
 
 	<update id="update">

BIN
src/main/resources/templates/images/imgWaterMark.png