首页 > 编程语言 >Java自定义生成证书图片

Java自定义生成证书图片

时间:2023-04-27 09:56:36浏览次数:42  
标签:srcImgWidth Java String 自定义 证书 certificateParam private param new

1、引入依赖

 <!-- cmyk格式图片转换 -->
        <dependency>
            <groupId>org.sejda.imageio</groupId>
            <artifactId>webp-imageio</artifactId>
            <version>0.1.6</version>
        </dependency>

2、请求参数

@Data
public class CertificateParam {

    private Long id;

    /**
     * 证书图片
     */
    private String certificateImg;

    /**
     * 证书导入参数
     */
    private List<CertificateConfigParam> certificateConfigParams;
}
@Data
public class CertificateConfigParam {

    /**
     * 要绘制的内容
     **/
    private String context;
    /**
     * 位置:横坐标
     **/
    private Integer x;
    /**
     * 位置:纵坐标
     **/
    private Integer y;
    /**
     * 字体大小
     **/
    private Integer fontSize;
    /**
     * 字体
     **/
    private String font;
    /**
     * 字体颜色(RGB Color对象)
     **/
    private String color;
}

3、Controller

  @PostMapping("/getCertificatePreviewPicture")
    public String getCertificatePreviewPicture(@RequestBody CertificateParam certificateParam,HttpServletResponse response) {
        response.addHeader("request-type", "download");
        response.addHeader("Access-Control-Expose-Headers", "request-type");
        return bizCertificateService.getCertificatePreviewPicture(certificateParam);
    }

4、Service

String getCertificatePreviewPicture(CertificateParam certificateParam);

5、ServiceImpl

 @Override
    public String getCertificatePreviewPicture(CertificateParam certificateParam) {
        return Base64.getEncoder().encodeToString(CertificatePictureUtil.getCertificatePictureByte(certificateParam));
    }

6、Utils

public class CertificatePictureUtil {

    /**
     * @Description 根据传入的证书参数和证书模板参数去生成证书字节数据
     * @Date 15:52 2023/4/25
     * @Param [certificateParam, response]
     * @Return byte[]
     **/
    public static byte[] getCertificatePictureByte(CertificateParam certificateParam){
        try {

            //获取底图
            URL url = new URL(certificateParam.getCertificateImg());
            URLConnection resource = url.openConnection();

            InputStream inputStream = resource.getInputStream();
            //文件转化为图片
            Image srcImg = ImageIO.read(inputStream);
            //获取图片的宽、高
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);
            // 设置画布大小
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            // 证书中写字
            List<CertificateConfigParam> certificateConfigParams = certificateParam.getCertificateConfigParams();
            if(ObjectUtil.isNotEmpty(certificateConfigParams)){
                for (CertificateConfigParam certificateConfigParam : certificateConfigParams) {
                    setMark(g, certificateConfigParam.getContext(), srcImgWidth, srcImgHeight, certificateConfigParam.getX(), certificateConfigParam.getY(),certificateConfigParam.getFontSize(), certificateConfigParam.getFont(), certificateConfigParam.getColor());
                }
            } else {
                throw new RuntimeException("证书参数错误");
            }
            //画出内容
            g.dispose();

            // 下载证书
            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
            ImageIO.write(bufImg, "png", imOut);

            //关闭流
            bs.close();
            inputStream.close();
            imOut.close();

            return bs.toByteArray();
        } catch (IOException e) {
            throw new RuntimeException("证书生成失败");
        }
    }


    /**
     * 设置水印
     *
     * @param graphics2D   绘图对象
     * @param context      要绘制的内容
     * @param srcImgWidth  原图的宽度
     * @param srcImgHeight 原图的高度
     * @param x            位置:横坐标
     * @param y            位置:纵坐标
     * @param font         字体
     * @param fontSize     字体大小
     * @param color        字体颜色(RGB Color对象)
     */
    private static void setMark(Graphics2D graphics2D, String context, Integer srcImgWidth, Integer srcImgHeight, Integer x, Integer y,Integer fontSize, String font, String color) {
        // 获取图片相对500 * 708 的相对坐标,以及字体大小
        fontSize=(int) ((srcImgWidth / 500.00) * fontSize);
        x = (int) ((srcImgWidth / 500.00) * x);
        y = (int) ((srcImgHeight / 708.00) * y)+fontSize;

        // 设置字体
        graphics2D.setFont(new Font(font, Font.PLAIN, fontSize));
        // 设置颜色
        try {
            graphics2D.setColor(Color.decode(color));
        } catch (Exception e) {
            throw new RuntimeException("不存在该种颜色,请重新设置");
        }

        // 获取文本宽度
        int textWidth = graphics2D.getFontMetrics().stringWidth(context);

        // 写字
        graphics2D.drawString(new String(context.getBytes(StandardCharsets.UTF_8)), x - textWidth, y);

    }
}

注意事项:

代码在本地跑时,写入中文内容正常,但是部署到Linux环境出现乱码,解决办法:需要在Linux安装字体库(具体教程网上很多),安装好字体库后一定记得记得重启项目。

 

标签:srcImgWidth,Java,String,自定义,证书,certificateParam,private,param,new
From: https://www.cnblogs.com/liaozk/p/17358072.html

相关文章

  • https生成证书
    进入jdk安装目录,运行cmd命令行窗口,使用keytool命令生成证书为服务端生成证书keytool-genkey-v-aliastomcat-keyalgRSA-keystoretomcat.keystore-validity36500命令参数介绍:keytool-genkey-aliastomcat(别名)-keypass123456(别名密码)-keyalgRSA(算法)-......
  • 基于Java开发支持全文检索、工作流审批、知识图谱的应用系统
    一、项目介绍一款全源码,可二开,可基于云部署、私有部署的企业级知识库云平台,应用在需要进行常用文档整理、分类、归集、检索的地方,适合知识密集型单位/历史文档丰富的单位,或者大型企业、集团。为什么建立知识库平台?二、项目所用技术springboot+vue+tinyMce+activiti+elastics......
  • 【单例设计模式原理详解】Java/JS/Go/Python/TS不同语言实现
    简介单例模式(SingletonPattern)属于创建型设计模式,这种模式只创建一个单一的类,保证一个类只有一个实例,并提供一个访问该实例的全局节点。当您想控制实例数目,节省系统资源,并不想混用的时候,可以使用单例模式。单例有很多种实现方式,主要分为懒汉和饿汉模式,同时要通过加锁来避免线程......
  • java解决表达式计算问题(转)
    这是LeetCode上的一道题,因为特别具有代表性,所有记录在这里。题目227.给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如eval()。......
  • Java8使用Stream API转换Map遇到的2种异常报错和解决思路
    问题java8提供了StreamAPI,配合Lambda表达式,让开发者能对集合对象进行便利、高效的操作。在日常业务开发中,有个经常用到的场景是将List类型对象转换为Map类型对象,方便后续操作。在java8之前,这种转换需要先new一个Map对象,遍历list然后通过Map#put来初始化。使用java8后,可方便的......
  • CefSharp自定义缓存实现
    大家好,我是沙漠尽头的狼。上文介绍了《C#使用CefSharp内嵌网页-并给出C#与JS的交互示例》,本文介绍CefSharp的缓存实现,先来说说添加缓存的好处:提高页面加载加速:CefSharp缓存可以缓存已经加载过的页面和资源,当用户再次访问相同的页面时,可以直接从缓存中加载,而不需要重新下载和解......
  • 阿里oss自定义域名从默认的预览改成下载
    阿里oss自定义域名从默认的预览改成下载今天测试人员反馈,说oss绑定的自定义域名,在电脑端的QQ浏览器打开的excel文件,打开显示黑屏,而不是下载。微软的Edge浏览器还算正常点,QQ浏览器直接黑屏。如下图:(1)Edge浏览器: (2)QQ浏览器: 以前我试过把已经上传到oss的图片,批量地从......
  • java出现class lombok.javac.apt.LombokProcessor错误
    出现:java:java.lang.IllegalAccessError:classlombok.javac.apt.LombokProcessor(inunnamedmodule@0x3278991b)cannotaccessclasscom.sun.tools.javac.processing.JavacProcessingEnvironment(inmodulejdk.compiler)becausemodulejdk.compilerdoesnotexpor......
  • Java对象内存布局
    一、对象在堆内存中布局Objectobject=newObject()一般而言JDK8按照默认情况下,new一个对象占多少内存空间在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(InstanceData)和对齐填充(Padding)。二、对象在堆内存中的存储布局下面......
  • springboot自定义拦截器
    springboot自定义拦截器操作说明1、编写一个拦截器实现HandlerInterceptor接口2、拦截器注册到容器中(实现WebMvcConfigures的addInterceptors)3、指定拦截规则(如果是拦截所有,静态资源也会被拦截)LoginInterceptor.javapackagecom.example.springtxiangmu.interceptor;im......