LAPTOP-FO2T5SIU\35838 месяцев назад: 7
Родитель
Сommit
e193b30554

+ 6 - 0
pro-base/src/main/java/com/idea/customerManagement/controller/RoomSelectionInfoController.java

@@ -97,6 +97,12 @@ public class RoomSelectionInfoController extends BaseController {
         return modelService.getById(id);
     }
 
+    /**
+     * 房源确认单 下载
+     * @param model
+     * @param request
+     * @param response
+     */
     @GetMapping(value = "download",produces = {"application/json;charset=UTF-8"})
     public void download(RoomSelectionInfoDto model, HttpServletRequest request, HttpServletResponse response) {
         modelService.downLoad(model,request,response);

+ 13 - 2
pro-base/src/main/java/com/idea/customerManagement/service/RoomSelectionInfoService.java

@@ -277,9 +277,17 @@ public class RoomSelectionInfoService implements BaseService<RoomSelectionInfo,
         return selectByPrimaryKey(id);
     }
 
+    /**
+     * 房源确认单 下载
+     * @param model
+     * @param request
+     * @param response
+     */
     public void downLoad(RoomSelectionInfoDto model,HttpServletRequest request, HttpServletResponse response) {
 
         String filePath = "/home/project/settleDown/tem/roomConfirmationSheet.docx";
+        String picturePath = "C:\\Users\\35838\\Pictures\\liuhaizhu.jpg";
+        String sealPath = "C:\\Users\\35838\\Pictures\\seal.png";
         String fileName = "房源确认单.docx";
         String customerManagementId = model.getCustomerManagementId();
         BuyerExample buyerExample = new BuyerExample();
@@ -295,7 +303,8 @@ public class RoomSelectionInfoService implements BaseService<RoomSelectionInfo,
             String roomChooseDate = DateUtils.parseDateToStr(DateUtils.DATE_CH, new Date());
 
             Map<String, Object> data = new HashMap<>();
-            HashMap<String, Object> picData = new HashMap<>();
+            Map<String, Object> picData = new HashMap<>();
+            Map<String, Object> sealData = new HashMap<>();
             data.put("${name}", buyer.getName());
             data.put("${identityCard}", buyer.getIdentityCard());
             data.put("${address}", fullName);
@@ -303,7 +312,9 @@ public class RoomSelectionInfoService implements BaseService<RoomSelectionInfo,
             data.put("${roomNumber}", roomResponse.getRoomNumber());
             data.put("${roomChooseDate}", roomChooseDate);
             data.put("${username}", loginName);
-            ReplaceWord.operateWord(response,filePath,fileName,data, picData);
+            picData.put("${picture}", picturePath);
+            sealData.put("${seal}", sealPath);
+            ReplaceWord.operateWord(response,filePath,fileName,data, picData,sealData);
         }
 
 

+ 62 - 1
pro-base/src/main/java/com/idea/util/ReplaceWord.java

@@ -2,6 +2,9 @@ package com.idea.util;
 
 import org.apache.poi.util.Units;
 import org.apache.poi.xwpf.usermodel.*;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;
+import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
@@ -74,6 +77,28 @@ public class ReplaceWord {
         }
     }
 
+    /**
+     * 替换印章图片
+     * @param document
+     * @param sealData
+     * @throws Exception
+     */
+    public static void changeSeal(XWPFDocument document, Map<String, Object> sealData,
+                                  int leftOffset, int topOffset, boolean behind) throws Exception {
+        // 获取段落集合
+        Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();
+        XWPFParagraph paragraph;
+        while (iterator.hasNext()) {
+            paragraph = iterator.next();
+            // 判断此段落是否需要替换
+            String text = paragraph.getText();
+            if (checkText(text)) {
+                replaceSealValue(paragraph, sealData,leftOffset,topOffset,behind);
+            }
+        }
+    }
+
+
     /***
      * @Description :替换表格内的文字
      * @param document
@@ -200,6 +225,37 @@ public class ReplaceWord {
         }
     }
 
+    public static void replaceSealValue(XWPFParagraph paragraph, Map<String, Object> sealData,
+                                        int leftOffset, int topOffset, boolean behind) throws Exception {
+        List<XWPFRun> runs = paragraph.getRuns();
+        for (XWPFRun run : runs) {
+            Object value = changeValue(run.toString(), sealData);
+            if (sealData.containsKey(run.toString())) {
+                //清空内容
+                run.setText("", 0);
+                FileInputStream is = new FileInputStream((String) value);
+                //图片宽度、高度
+                int width = Units.toEMU(100), height = Units.toEMU(100);
+                //添加图片信息,段落高度需要在模板中自行调整
+                run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, (String) value, width, height);
+                // TODO: 2024/10/22 测试水印
+                // 2. 获取到图片数据
+                CTDrawing drawing = run.getCTR().getDrawingArray(0);
+                CTGraphicalObject graphicalobject = drawing.getInlineArray(0).getGraphic();
+
+                //拿到新插入的图片替换添加CTAnchor 设置浮动属性 删除inline属性
+                CTAnchor anchor = WordSealUtil.getAnchorWithGraphic(graphicalobject, "Seal",
+                        width, height,//图片大小
+                        Units.toEMU(leftOffset), Units.toEMU(topOffset), behind);//相对当前段落位置 需要计算段落已有内容的左偏移
+                drawing.setAnchorArray(new CTAnchor[]{anchor});//添加浮动属性
+                drawing.removeInline(0);//删除行内属性
+
+
+            }
+        }
+    }
+
+
     /***
      * @Description :匹配参数
      * @param value
@@ -264,7 +320,8 @@ public class ReplaceWord {
         }
     }
 
-    public static void operateWord(HttpServletResponse response,String filePath,String fileName, Map<String, Object> data, Map<String, Object> picData){
+    public static void operateWord(HttpServletResponse response,String filePath,String fileName, Map<String, Object> data,
+                                   Map<String, Object> picData,Map<String, Object> sealData){
         try {
             FileInputStream is = new FileInputStream(filePath);
             XWPFDocument document = new XWPFDocument(is);
@@ -280,6 +337,10 @@ public class ReplaceWord {
                 // 替换表格内的图片对象
                 ReplaceWord.changeTablePic(document, picData);
             }
+            if (sealData.size() > 0) {
+                // 替换内容图片
+                ReplaceWord.changeSeal(document, sealData,0,0,false);
+            }
             response.setContentType("text/html;charset=UTF-8");
             response.setContentType("application/msword");
             response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "utf-8"));

+ 123 - 0
pro-base/src/main/java/com/idea/util/WordSealUtil.java

@@ -0,0 +1,123 @@
+package com.idea.util;
+
+import org.apache.poi.util.Units;
+import org.apache.poi.xwpf.usermodel.Document;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
+import org.apache.xmlbeans.XmlException;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;
+import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Random;
+
+public class WordSealUtil {
+    public static void main(String[] args) throws Exception {
+        sealInWord("D:\\test\\test.docx","D:\\test\\SealInWord.docx","D:\\test\\hh01.png","(签字/盖章)",0,0,300,-30,false);
+    }
+    /**
+     * <b> Word中添加图章
+     * </b><br><br><i>Description</i> :
+     * String srcPath, 源Word路径
+     * String storePath, 添加图章后的路径
+     * String sealPath, 图章路径(即图片)
+     * tString abText, 在Word中盖图章的标识字符串,如:(签字/盖章)
+     * int width, 图章宽度
+     * int height, 图章高度
+     * int leftOffset, 图章在编辑段落向左偏移量
+     * int topOffset, 图章在编辑段落向上偏移量
+     * boolean behind,图章是否在文字下面
+     * @return void
+     * <br><br>Date: 2019/12/26 15:12     <br>Author : dxl
+     */
+    public static void sealInWord(String srcPath, String storePath,String sealPath,String tabText,
+                                  int width, int height, int leftOffset, int topOffset, boolean behind) throws Exception {
+        File fileTem = new File(srcPath);
+        InputStream is = new FileInputStream(fileTem);
+        XWPFDocument document = new XWPFDocument(is);
+        List<XWPFParagraph> paragraphs = document.getParagraphs();
+        XWPFRun targetRun = null;
+        for(XWPFParagraph  paragraph : paragraphs){
+            if(!"".equals(paragraph.getText()) && paragraph.getText().contains(tabText)){
+                List<XWPFRun> runs = paragraph.getRuns();
+                targetRun = runs.get(runs.size()-1);
+            }
+        }
+        if(targetRun != null){
+            InputStream in = new FileInputStream(sealPath);//设置图片路径
+            if(width <= 0){
+                width = 100;
+            }
+            if(height <= 0){
+                height = 100;
+            }
+            //创建Random类对象
+            Random random = new Random();
+            //产生随机数
+            int number = random.nextInt(999) + 1;
+            targetRun.addPicture(in, Document.PICTURE_TYPE_PNG, "Seal"+number, Units.toEMU(width), Units.toEMU(height));
+            in.close();
+            // 2. 获取到图片数据
+            CTDrawing drawing = targetRun.getCTR().getDrawingArray(0);
+            CTGraphicalObject graphicalobject = drawing.getInlineArray(0).getGraphic();
+
+            //拿到新插入的图片替换添加CTAnchor 设置浮动属性 删除inline属性
+            CTAnchor anchor = getAnchorWithGraphic(graphicalobject, "Seal"+number,
+                    Units.toEMU(width), Units.toEMU(height),//图片大小
+                    Units.toEMU(leftOffset), Units.toEMU(topOffset), behind);//相对当前段落位置 需要计算段落已有内容的左偏移
+            drawing.setAnchorArray(new CTAnchor[]{anchor});//添加浮动属性
+            drawing.removeInline(0);//删除行内属性
+        }
+        document.write(new FileOutputStream(storePath));
+        document.close();
+    }
+    /**
+     * @param ctGraphicalObject 图片数据
+     * @param deskFileName      图片描述
+     * @param width             宽
+     * @param height            高
+     * @param leftOffset        水平偏移 left
+     * @param topOffset         垂直偏移 top
+     * @param behind            文字上方,文字下方
+     * @return
+     * @throws Exception
+     */
+    public static CTAnchor getAnchorWithGraphic(CTGraphicalObject ctGraphicalObject,
+                                                String deskFileName, int width, int height,
+                                                int leftOffset, int topOffset, boolean behind) {
+        System.out.println(">>width>>"+width+"; >>height>>>>"+height);
+        String anchorXML =
+                "<wp:anchor xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" "
+                        + "simplePos=\"0\" relativeHeight=\"0\" behindDoc=\"" + ((behind) ? 1 : 0) + "\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">"
+                        + "<wp:simplePos x=\"0\" y=\"0\"/>"
+                        + "<wp:positionH relativeFrom=\"column\">"
+                        + "<wp:posOffset>" + leftOffset + "</wp:posOffset>"
+                        + "</wp:positionH>"
+                        + "<wp:positionV relativeFrom=\"paragraph\">"
+                        + "<wp:posOffset>" + topOffset + "</wp:posOffset>" +
+                        "</wp:positionV>"
+                        + "<wp:extent cx=\"" + width + "\" cy=\"" + height + "\"/>"
+                        + "<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>"
+                        + "<wp:wrapNone/>"
+                        + "<wp:docPr id=\"1\" name=\"Drawing 0\" descr=\"" + deskFileName + "\"/><wp:cNvGraphicFramePr/>"
+                        + "</wp:anchor>";
+
+        CTDrawing drawing = null;
+        try {
+            drawing = CTDrawing.Factory.parse(anchorXML);
+        } catch (XmlException e) {
+            e.printStackTrace();
+        }
+        CTAnchor anchor = drawing.getAnchorArray(0);
+        anchor.setGraphic(ctGraphicalObject);
+        return anchor;
+    }
+
+}
+