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

---
 src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java |  126 +++++++++++++++++++++++++++++++++++++-----
 1 files changed, 111 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java b/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
index 648c15e..3dbd397 100644
--- a/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserAgreementServiceImpl.java
@@ -33,6 +33,7 @@
 import java.awt.RenderingHints;
 import java.awt.Color;
 import java.awt.FontMetrics;
+import java.awt.GraphicsEnvironment;
 import com.nq.pojo.ContractImage;
 import com.nq.dao.ContractImageMapper;
 import com.alibaba.fastjson.JSON;
@@ -232,6 +233,110 @@
     }
 
     /**
+     * 从资源文件加载字体
+     */
+    private java.awt.Font loadFontFromResource(String fontPath, int size) {
+        try {
+            InputStream fontStream = this.getClass().getClassLoader().getResourceAsStream(fontPath);
+            if (fontStream != null) {
+                java.awt.Font font = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, fontStream);
+                font = font.deriveFont(java.awt.Font.PLAIN, size);
+                fontStream.close();
+                log.info("成功从资源文件加载字体: {}", fontPath);
+                return font;
+            }
+        } catch (Exception e) {
+            log.warn("从资源文件加载字体失败: {}, 错误: {}", fontPath, e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * 从系统字体目录加载字体文件
+     */
+    private java.awt.Font loadFontFromFile(String fontPath, int size) {
+        try {
+            File fontFile = new File(fontPath);
+            if (fontFile.exists()) {
+                java.awt.Font font = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, fontFile);
+                font = font.deriveFont(java.awt.Font.PLAIN, size);
+                log.info("成功从文件加载字体: {}", fontPath);
+                return font;
+            }
+        } catch (Exception e) {
+            log.warn("从文件加载字体失败: {}, 错误: {}", fontPath, e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * 获取可用的中文字体
+     */
+    private java.awt.Font getChineseFont(int size) {
+        // 1. 优先从资源文件加载字体(如果项目中有字体文件)
+        java.awt.Font font = loadFontFromResource("fonts/simsun.ttf", size);
+        if (font != null) return font;
+        
+        font = loadFontFromResource("fonts/simhei.ttf", size);
+        if (font != null) return font;
+        
+        // 2. 从系统字体目录加载(Linux常见字体路径)
+        String[] systemFontPaths = {
+            "/usr/share/fonts/chinese/simsun.ttf",           // CentOS/RHEL
+            "/usr/share/fonts/truetype/wqy/wqy-microhei.ttf", // 文泉驿
+            "/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc", // Noto字体
+            "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", // DejaVu
+            "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf", // Liberation
+            "/usr/share/fonts/chinese/SimSun.ttf",
+            "/usr/share/fonts/chinese/SimHei.ttf",
+            "/usr/share/fonts/truetype/arphic/uming.ttc",    // 文鼎字体
+            "/usr/share/fonts/truetype/arphic/ukai.ttc"
+        };
+        
+        for (String fontPath : systemFontPaths) {
+            font = loadFontFromFile(fontPath, size);
+            if (font != null) return font;
+        }
+        
+        // 3. 按优先级尝试加载系统已安装的字体
+        String[] fontNames = {
+            "SimSun",           // 宋体 (Windows)
+            "SimHei",           // 黑体 (Windows)
+            "Microsoft YaHei",  // 微软雅黑 (Windows)
+            "STSong",           // 华文宋体
+            "STHeiti",          // 华文黑体
+            "WenQuanYi Micro Hei", // 文泉驿微米黑 (Linux)
+            "WenQuanYi Zen Hei",   // 文泉驿正黑 (Linux)
+            "Noto Sans CJK SC",    // Noto字体 (Linux)
+            "Droid Sans Fallback", // Android字体 (Linux)
+            "AR PL UMing CN",       // 文鼎字体 (Linux)
+            "AR PL UKai CN"         // 文鼎字体 (Linux)
+        };
+        
+        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        String[] availableFonts = ge.getAvailableFontFamilyNames();
+        
+        // 查找可用的中文字体
+        for (String fontName : fontNames) {
+            for (String availableFont : availableFonts) {
+                if (availableFont.equals(fontName)) {
+                    try {
+                        font = new java.awt.Font(fontName, java.awt.Font.PLAIN, size);
+                        log.info("成功加载系统字体: {}", fontName);
+                        return font;
+                    } catch (Exception e) {
+                        log.warn("加载字体{}失败: {}", fontName, e.getMessage());
+                    }
+                }
+            }
+        }
+        
+        // 如果找不到中文字体,尝试使用逻辑字体
+        log.warn("未找到可用的中文字体,使用SERIF逻辑字体,可能出现乱码");
+        return new java.awt.Font(java.awt.Font.SERIF, java.awt.Font.PLAIN, size);
+    }
+
+    /**
      * 创建透明背景的文本图片
      */
     private File createTextImage(String text, Font font) throws Exception {
@@ -262,14 +367,10 @@
         g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
         g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
 
-        // 设置字体和颜色
-        try {
-            java.awt.Font awtFont = new java.awt.Font("SimSun", java.awt.Font.PLAIN, 12);
-            g2d.setFont(awtFont);
-        } catch (Exception e) {
-            log.warn("无法加载SimSun字体,使用默认字体", e);
-            g2d.setFont(new java.awt.Font(java.awt.Font.SANS_SERIF, java.awt.Font.PLAIN, 12));
-        }
+        // 使用可用的中文字体
+        java.awt.Font awtFont = getChineseFont(12);
+        g2d.setFont(awtFont);
+        
         // 使用深黑色,RGB(0, 0, 0) 完全不透明
         g2d.setColor(new Color(0, 0, 0, 255));
 
@@ -293,13 +394,8 @@
             g2dResized.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
             g2dResized.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
             
-            // 设置字体
-            try {
-                java.awt.Font awtFont = new java.awt.Font("SimSun", java.awt.Font.PLAIN, 12);
-                g2dResized.setFont(awtFont);
-            } catch (Exception e) {
-                g2dResized.setFont(new java.awt.Font(java.awt.Font.SANS_SERIF, java.awt.Font.PLAIN, 12));
-            }
+            // 使用相同的中文字体
+            g2dResized.setFont(awtFont);
             // 使用深黑色,RGB(0, 0, 0) 完全不透明
             g2dResized.setColor(new Color(0, 0, 0, 255));
             

--
Gitblit v1.9.3