From ab4f5aafb0d7b6d77a3108a6fb7084219c56a1cf Mon Sep 17 00:00:00 2001
From: peter <14100000001@qq.com>
Date: Sun, 11 Jan 2026 04:14:56 +0800
Subject: [PATCH] 签章

---
 src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java |  219 +++++++++++++++---------------------------------------
 1 files changed, 60 insertions(+), 159 deletions(-)

diff --git a/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java b/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
index 88a9f23..648c15e 100644
--- a/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
@@ -70,11 +70,8 @@
                 dir.mkdirs();
             }
 
-            String pdfFileName = "agreement_" + user.getId() + ".pdf";
+            String pdfFileName = "contract_" + user.getId() + ".pdf";
             File pdfFile = new File(dir, pdfFileName);
-
-            // 构建完整的PDF访问URL
-//            String pdfUrl = PropertiesUtil.getProperty("pdf.server.http.prefix") + "/agreement_" + user.getId() + ".pdf";
 
             // 如果PDF已存在,删除后重新生成,确保数据是最新的
             if (pdfFile.exists()) {
@@ -109,7 +106,7 @@
      */
     private void generatePdfFromTemplate(File templatePdf, File outputPdf, User user) throws Exception {
         log.info("开始生成PDF,模板路径: {}, 输出路径: {}, 用户: {}",
-                templatePdf.getAbsolutePath(), outputPdf.getAbsolutePath(), user.getId());
+        templatePdf.getAbsolutePath(), outputPdf.getAbsolutePath(), user.getId());
 
         PdfReader reader = null;
         PdfStamper stamper = null;
@@ -354,37 +351,28 @@
     }
 
     @Override
-    public void viewAgreementPdf(HttpServletRequest request, HttpServletResponse response) {
+    public ServerResponse viewAgreementPdf(HttpServletRequest request) {
         try {
             User user = iUserService.getCurrentUser(request);
             if (user == null) {
-                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "用户未登录");
-                return;
+                return ServerResponse.createByErrorMsg("用户未登录");
             }
 
-            String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir");
-            String pdfFileName = "agreement_" + user.getId() + ".pdf";
-            File pdfFile = new File(pdfDir, pdfFileName);
-
-            if (!pdfFile.exists()) {
-                response.sendError(HttpServletResponse.SC_NOT_FOUND, "协议文件不存在,请先生成协议");
-                return;
+            // 从数据库查询已签名的图片
+            List<ContractImage> contractImages = contractImageMapper.selectByUserIdAndType(user.getId(), "contract");
+            List<String> imageUrls = new ArrayList<>();
+            
+            if (contractImages != null && !contractImages.isEmpty()) {
+                for (ContractImage image : contractImages) {
+                    imageUrls.add(image.getAddress());
+                }
+                log.info("从数据库查询到用户{}的{}张已签名合同图片", user.getId(), imageUrls.size());
             }
 
-            List<String> imageUrls = convertPdfToImages(pdfFile, "contract", user.getId());
-
-            response.setContentType("application/json;charset=UTF-8");
-            response.getWriter().write(JSON.toJSONString(ServerResponse.createBySuccess(imageUrls)));
-            response.getWriter().flush();
+            return ServerResponse.createBySuccess(imageUrls);
         } catch (Exception e) {
             log.error("查看用户协议PDF失败", e);
-            try {
-                if (!response.isCommitted()) {
-                    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "查看PDF失败: " + e.getMessage());
-                }
-            } catch (IOException ex) {
-                log.error("发送错误响应失败", ex);
-            }
+            return ServerResponse.createByErrorMsg("查看PDF失败: " + e.getMessage());
         }
     }
 
@@ -414,34 +402,21 @@
             log.info("用户{}的签名图片已保存: {}", user.getId(), signatureFileLocal.getAbsolutePath());
 
             String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir");
-            String pdfFileName = "agreement_" + user.getId() + ".pdf";
+            String pdfFileName = "contract_" + user.getId() + ".pdf";
             File pdfFile = new File(pdfDir, pdfFileName);
-
+            //删之前的图片
+            deleteFilesWithPattern(pdfDir,"contract_" + user.getId());
             if (pdfFile.exists()) {
                 addSignatureToPdf(pdfFile, signatureFileLocal, user);
-
                 List<String> imageUrls = convertPdfToImages(pdfFile, "contract", user.getId());
-
-                String imagePrefix = PropertiesUtil.getProperty("pdf.server.http.prefix");
-                long timestamp = System.currentTimeMillis();
-
-                for (int i = 0; i < imageUrls.size(); i++) {
-                    String imageName;
-                    if (i == 0) {
-                        imageName = "contract_" + timestamp + ".png";
-                    } else {
-                        imageName = "contract_" + timestamp + "_" + (i + 1) + ".png";
-                    }
-                    String imagePath = imagePrefix + "/" + imageName;
-
+                for(String imageUrl : imageUrls) {
                     ContractImage contractImage = new ContractImage();
                     contractImage.setUserId(user.getId());
                     contractImage.setContractType("contract");
-                    contractImage.setAddress(imagePath);
+                    contractImage.setAddress(imageUrl);
                     contractImage.setAddTime(new Date());
                     contractImageMapper.insert(contractImage);
                 }
-
                 iUserService.updateSignedContract(user.getId(), "Y");
             }
             return ServerResponse.createBySuccessMsg("签名保存成功");
@@ -498,7 +473,7 @@
                 return ServerResponse.createByErrorMsg("用户未登录");
             }
 
-            if (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()) || StringUtils.isBlank(user.getRegAddress())) {
+            if (user.getIsActive()!=2 || StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()) || StringUtils.isBlank(user.getRegAddress())) {
                 return ServerResponse.createByErrorMsg("用户信息不完整,请先完成实名认证");
             }
 
@@ -508,10 +483,8 @@
                 dir.mkdirs();
             }
 
-            String pdfFileName = "contract_" + user.getId() + ".pdf";
+            String pdfFileName = "agreement_" + user.getId() + ".pdf";
             File pdfFile = new File(dir, pdfFileName);
-
-            String pdfUrl = PropertiesUtil.getProperty("pdf.server.http.prefix") + "/contract_" + user.getId() + ".pdf";
 
             if (pdfFile.exists()) {
                 boolean deleted = pdfFile.delete();
@@ -547,16 +520,16 @@
                 return;
             }
 
-            String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir");
-            String pdfFileName = "contract_" + user.getId() + ".pdf";
-            File pdfFile = new File(pdfDir, pdfFileName);
-
-            if (!pdfFile.exists()) {
-                response.sendError(HttpServletResponse.SC_NOT_FOUND, "合同文件不存在,请先生成合同");
-                return;
+            // 从数据库查询已签名的图片
+            List<ContractImage> contractImages = contractImageMapper.selectByUserIdAndType(user.getId(), "agreement");
+            List<String> imageUrls = new ArrayList<>();
+            
+            if (contractImages != null && !contractImages.isEmpty()) {
+                for (ContractImage image : contractImages) {
+                    imageUrls.add(image.getAddress());
+                }
+                log.info("从数据库查询到用户{}的{}张已签名保密协议图片", user.getId(), imageUrls.size());
             }
-
-            List<String> imageUrls = convertPdfToImages(pdfFile, "agreement", user.getId());
 
             response.setContentType("application/json;charset=UTF-8");
             response.getWriter().write(JSON.toJSONString(ServerResponse.createBySuccess(imageUrls)));
@@ -591,7 +564,7 @@
                 dir.mkdirs();
             }
 
-            String signatureFileName = "contract_signature_" + user.getId() + ".png";
+            String signatureFileName = "agreement_signature_" + user.getId() + ".png";
             File signatureFileLocal = new File(dir, signatureFileName);
 
             signatureFile.transferTo(signatureFileLocal);
@@ -599,34 +572,22 @@
             log.info("用户{}的合同签名图片已保存: {}", user.getId(), signatureFileLocal.getAbsolutePath());
 
             String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir");
-            String pdfFileName = "contract_" + user.getId() + ".pdf";
+            String pdfFileName = "agreement_" + user.getId() + ".pdf";
             File pdfFile = new File(pdfDir, pdfFileName);
-
+            //删之前的图片
+            deleteFilesWithPattern(pdfDir,"agreement_" + user.getId());
             if (pdfFile.exists()) {
                 addSignatureToContractPdf(pdfFile, signatureFileLocal, user);
 
                 List<String> imageUrls = convertPdfToImages(pdfFile, "agreement", user.getId());
-
-                String imagePrefix = PropertiesUtil.getProperty("pdf.server.http.prefix");
-                long timestamp = System.currentTimeMillis();
-
-                for (int i = 0; i < imageUrls.size(); i++) {
-                    String imageName;
-                    if (i == 0) {
-                        imageName = "agreement_" + timestamp + ".png";
-                    } else {
-                        imageName = "agreement_" + timestamp + "_" + (i + 1) + ".png";
-                    }
-                    String imagePath = imagePrefix + "/" + imageName;
-
+                for (String imageUrl : imageUrls) {
                     ContractImage contractImage = new ContractImage();
                     contractImage.setUserId(user.getId());
                     contractImage.setContractType("agreement");
-                    contractImage.setAddress(imagePath);
+                    contractImage.setAddress(imageUrl);
                     contractImage.setAddTime(new Date());
                     contractImageMapper.insert(contractImage);
                 }
-
                 iUserService.updateSignedAgreement(user.getId(), "Y");
             }
 
@@ -662,7 +623,7 @@
 
     private void replacePlaceholdersInContractPdf(PdfContentByte canvas, Rectangle pageSize, String currentDate, Font font, int pageNum) throws Exception {
         float margin = 50;
-        float startY = pageSize.getHeight() - 364;
+        float startY = pageSize.getHeight() - 374;
         if(pageNum == 2){
             // 生成透明背景的日期图片并插入
             File dateImage = createTextImage(currentDate, font);
@@ -730,85 +691,6 @@
             return null;
         }
     }
-
-    public static void main(String[] args) {
-        try {
-            String pdfDir = "D:/work/A-stock/agreement_pdf";
-            String pdfFileName = "agreement_" + 19998 + ".pdf";
-            File pdfFile = new File(pdfDir, pdfFileName);
-            convertPdfToImages1(pdfFile,"agreement");
-        }catch (Exception e){
-            e.printStackTrace();
-        }
-    }
-    /**
-     * 将PDF转换为图片
-     */
-    public static void convertPdfToImages1(File pdfFile, String contractType) throws Exception {
-        List<String> imageUrls = new ArrayList<>();
-        String imagePrefix = "http://localhost:8099";
-        String pdfDir = "D:/work/A-stock/agreement_pdf";
-
-        long timestamp = System.currentTimeMillis();
-        PDDocument document = null;
-        try {
-            document = PDDocument.load(pdfFile);
-
-            // 创建PDFRenderer,使用高质量渲染
-            PDFRenderer pdfRenderer = new PDFRenderer(document);
-
-            int pageCount = document.getNumberOfPages();
-            log.info("PDF总页数: {}", pageCount);
-
-            for (int page = 0; page < pageCount; page++) {
-                // 使用RGB模式渲染,DPI设置为300确保文字清晰
-                // ImageType.RGB可以更好地处理中文字体
-                BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
-
-                // 对图片进行优化处理,确保文字清晰
-                BufferedImage optimizedImage = optimizeImage1(image);
-
-                String imageFileName = contractType + "_" + timestamp + ".png";
-                if (page > 0) {
-                    imageFileName = contractType + "_" + timestamp + "_" + (page + 1) + ".png";
-                }
-                File imageFile = new File(pdfDir, imageFileName);
-
-                ImageIO.write(optimizedImage, "png", imageFile);
-
-                String imageUrl = imagePrefix + "/imgs/" + imageFileName;
-                imageUrls.add(imageUrl);
-
-                log.info("PDF第{}页已转换为图片: {}", page + 1, imageUrl);
-            }
-        } finally {
-            if (document != null) {
-                document.close();
-            }
-        }
-
-//        return imageUrls;
-    }
-
-    public static BufferedImage optimizeImage1(BufferedImage originalImage) {
-        int width = originalImage.getWidth();
-        int height = originalImage.getHeight();
-
-        BufferedImage optimizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-        Graphics2D g2d = optimizedImage.createGraphics();
-
-        // 设置高质量渲染
-        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
-        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
-        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
-        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
-
-        g2d.drawImage(originalImage, 0, 0, null);
-        g2d.dispose();
-
-        return optimizedImage;
-    }
     /**
      * 将PDF转换为图片
      */
@@ -836,15 +718,15 @@
                 // 对图片进行优化处理,确保文字清晰
                 BufferedImage optimizedImage = optimizeImage(image);
 
-                String imageFileName = contractType + "_" + timestamp + ".png";
+                String imageFileName = contractType + "_" +userId +"_" + timestamp + ".png";
                 if (page > 0) {
-                    imageFileName = contractType + "_" + timestamp + "_" + (page + 1) + ".png";
+                    imageFileName = contractType+ "_" + userId + "_" + timestamp + "_" + (page + 1) + ".png";
                 }
                 File imageFile = new File(pdfDir, imageFileName);
 
                 ImageIO.write(optimizedImage, "png", imageFile);
 
-                String imageUrl = imagePrefix + "/imgs/" + imageFileName;
+                String imageUrl = imagePrefix + "/" + imageFileName;
                 imageUrls.add(imageUrl);
 
                 log.info("PDF第{}页已转换为图片: {}", page + 1, imageUrl);
@@ -922,4 +804,23 @@
             return ServerResponse.createByErrorMsg("查询失败:" + e.getMessage());
         }
     }
+
+    public void deleteFilesWithPattern(String dirPath, String userId) {
+        File directory = new File(dirPath);
+        if (!directory.exists() || !directory.isDirectory()) {
+            System.out.println("目录不存在或路径错误: " + dirPath);
+            return;
+        }
+
+        File[] files = directory.listFiles((dir, name) -> name.contains(userId + "_"));
+        if (files != null) {
+            for (File file : files) {
+                if (file.delete()) {
+                    System.out.println("已删除文件: " + file.getName());
+                } else {
+                    System.out.println("删除失败: " + file.getName());
+                }
+            }
+        }
+    }
 }

--
Gitblit v1.9.3