图片加水印并推送邮箱

实际情况:

根据贺卡图片,依据工作时限是否满足周年纪念,填入对应员工姓名,将生成的图片以邮件形式推送该员工邮箱。

准备工作:

贺卡模型图片 model.jpg [本地测试 或 上传到 文件服务器 测试] 

直接代码:

//每日同步符合周年纪念的人员
public void dailyAnniversaryOfUser(){
    //查询所有在职人员
     List userList = userService.getAllUserCond();
    // 当日时间
     LocalDate now = LocalDate.now();

    //
     for (UserInfouser : list) {
            Timestamp joinStamp= user.getJoinDate();
            if (Objects.nonNull(entryDate)) {
                LocalDate joinDate = joinStamp.toLocalDateTime().toLocalDate();
                if (now.isEqual(joinDate.plusYears(1))) {
                    processMethord(1, user);
                } else if (now.isEqual(joinDate.plusYears(5))) {
                    processMethord(5, user);
                } else if (now.isEqual(joinDate.plusYears(10))) {
                    processMethord(10, user);
                } else if (now.isEqual(joinDate.plusYears(15))) {
                    processMethord(15, user);
                } else if (now.isEqual(joinDate.plusYears(20))) {
                    processMethord(20, user);
                }
            }
        }

}

//抽取的处理数据的方法
  private void processMethord(Integer num, UserInfo user) {
        log.info("进入处理部分===============人为{}", user.getUserName());
        AnniversaryEnum ae = AnniversaryEnum.getFromNum(num);
        ByteArrayOutputStream baos = null;
        try {
		//获取对应的图片地址
            BufferedImage image = ImageIO.read(new URL("http://162.217.3.16:9090/file/anniversary/" + ae.getName()));
            Graphics2D g2d = image.createGraphics();
            // 因为linux上且 docker打包无宋体,改为  Noto CJK 字体
            g2d.setFont(new Font("Noto Sans CJK SC", Font.BOLD, 42));
            g2d.setColor(Color.black);
            // 根据图片坐标添加文字
            g2d.drawString(user.getUserName(), ae.getX(), ae.getY());
            g2d.dispose();
            //转为byte[]
            baos = new ByteArrayOutputStream();
            // 使用ImageIO将BufferedImage写入ByteArrayOutputStream
            ImageIO.write(image, "jpg", baos);
            baos.flush();
            byte[] imageBytes = baos.toByteArray();// 返回字节数组
            DataSource dataSource = new ByteArrayDataSource(imageBytes, "image/jpeg");

			//注意:image1 图片定位的作用,邮件发送要找到位置填入图片
            String htmlTemplate = "
"; // 邮件标题 String subject = "祝您入职" + ae.getLetter() + "周年快乐~!"; if (isTestEnvir()) { subject = subject + "----测试环境"; } sendMailService.sendHtmlMailWithPic(subject, htmlTemplate, null, dataSource, Arrays.asList(user.getEmail()).toArray(new String[0])); } catch (Exception e) { log.info("贺卡错误信息为={}", e.getMessage()); throw new RuntimeException(e.getMessage()); } finally { try { if (baos != null) { baos.close(); // 关闭流 } } catch (IOException e) { log.error("关闭ByteArrayOutputStream时出错", e); } } }

涉及的枚举类

@Getter
public enum AnniversaryEnum {
    YEAR_ANNIVERSARY_1("1zn.jpg", 95, 440, 1,"一"),
    YEAR_ANNIVERSARY_5("5zn.jpg", 55, 433, 5,"五"),
    YEAR_ANNIVERSARY_10("10zn.jpg", 278, 240, 10,"十"),
    YEAR_ANNIVERSARY_15("15zn.jpg", 285, 240, 15,"十五"),
    YEAR_ANNIVERSARY_20("20zn.jpg", 280, 240, 20,"二十"),
    ;

    //名称
    private final String name;
    //x轴
    private final Integer x;
    //y轴
    private final Integer y;
    private final Integer num;
 // 数字对应的大写
    private final String letter;

    AnniversaryEnum(String name, Integer x, Integer y, Integer num,String letter) {
        this.name = name;
        this.x = x;
        this.y = y;
        this.num = num;
        this.letter = letter;
    }

    private static Map map = Arrays.stream(AnniversaryEnum.values()).collect(Collectors.toMap(AnniversaryEnum::getNum, Function.identity()));

    /**
     * 通过范围获取枚举
     *
     * @param num 号码
     */
    public static AnniversaryEnum getFromNum(Integer num) {
        return map.get(num);
    }

邮件代码

    public void sendHtmlMailWithPic(String subject, String text, String cc, DataSource dataSource, String... tos) {

        try {
            javaMailSender.setHost(host);
            javaMailSender.setPort(Integer.parseInt(port));
            javaMailSender.setUsername(username);
            javaMailSender.setPassword(password);
            javaMailSender.setDefaultEncoding("UTF-8");
            Properties p = new Properties();
            p.setProperty("mail.smtp.ssl.enable", "false");
            p.setProperty("mail.smtp.socketFactory.port", "25");
            p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            javaMailSender.setJavaMailProperties(p);
            MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMailMessage, true, "utf-8");
            messageHelper.setFrom(username);
            messageHelper.setTo(tos);
            if (cc != null) {
                messageHelper.setCc(cc);
            }
            messageHelper.setSubject(subject);
            messageHelper.setText(text, true);
            // "image1" 是你用来引用图片的 cid
            messageHelper.addInline("image1", dataSource);
            javaMailSender.send(mimeMailMessage);
        } catch (MessagingException e) {
            log.error("邮件发送失败: " + e.getMessage(), e);
            // 可以选择抛出一个自定义异常或进行其他处理
            throw new RuntimeException("邮件发送失败", e);
        }
    }

结果:

本地测试代码


    public static void main(String[] args) {

        try {
            BufferedImage image = ImageIO.read(new File("C:\\Users\\runing\\Desktop\\pic\\1zn.jpg"));
            Graphics2D g2d = image.createGraphics();
            g2d.setFont(new Font("Noto Sans CJK SC", Font.BOLD, 42));
            g2d.setColor(Color.black);
            // 设置文字额色1添加文字
            g2d.drawString("测试人名", 95, 440);

            ImageIO.write(image, "jpg", new File("C:\\Users\\runing\\Desktop\\pic\\test1.jpg"));
            g2d.dispose();
            System.out.println("图像处理完成,已保存为test1.jpg");
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }

    }

想要确认图片输入文字位置的坐标

最简单方法——图片,鼠标右键——打开方式——画图
打开图片如下图,假设 绿线上 红圈位置 为文字起始位置!,鼠标在那里看左下角有x,y轴的像素坐标!

图片加水印并推送邮箱_第1张图片

你可能感兴趣的:(windows)