| | |
| | | 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; |
| | |
| | | } |
| | | |
| | | /** |
| | | * 从资源文件加载字体 |
| | | */ |
| | | 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 { |
| | |
| | | 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); |
| | | // 使用可用的中文字体 |
| | | java.awt.Font awtFont = getChineseFont(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)); |
| | | } |
| | | |
| | | // 使用深黑色,RGB(0, 0, 0) 完全不透明 |
| | | g2d.setColor(new Color(0, 0, 0, 255)); |
| | | |
| | |
| | | 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)); |
| | | } |
| | | // 使用深黑色,RGB(0, 0, 0) 完全不透明 |
| | | g2dResized.setColor(new Color(0, 0, 0, 255)); |
| | | |