Java根据模板图片自定义生成获奖证书图片

需求

在一些教学系统中,经常会用到一些证书自定义生成,提供一个模板,写入不同姓名、获得的奖项、描述等,本篇文章就是处理这类需求的。
在这里插入图片描述

代码

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安装字体库(具体教程网上很多),安装好字体库后一定记得记得重启项目。

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据word模板生成包含图片的word文档可以通过Java的Apache POI库来实现。首先,需要添加POI库的依赖。 在Java中,可以使用HWPF(HSSFWorkbook)和XWPF(XSSFWorkbook)两个类来处理.doc和.docx文件。下面以.docx文件为例进行说明。 首先,需要准备一个word模板文件,其中包含需要替换的占位符和插入图片的位置。 然后,通过POI库加载模板文件: ``` XWPFDocument document = new XWPFDocument(new FileInputStream("模板文件.docx")); ``` 接下来,可以通过`document`对象获取所有的段落(Paragraph)和表格(Table)等元素,然后根据需求对其进行修改。 假设有一个占位符是`${name}`,可以使用`XWPFParagraph`对象替换它: ``` List<XWPFParagraph> paragraphs = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { String text = paragraph.getText(); if (text.contains("${name}")) { text = text.replace("${name}", "张三"); paragraph.setText(text); } } ``` 如果需要在指定位置插入图片,可以使用`XWPFParagraph`对象中的`createRun()`方法和`addPicture()`方法: ``` String filePath = "图片路径"; int width = 200; int height = 200; XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.addPicture(new FileInputStream(filePath), XWPFDocument.PICTURE_TYPE_JPEG, "图片名称", width, height); ``` 最后,将修改后的文档保存为新文件: ``` document.write(new FileOutputStream("生成的文档.docx")); document.close(); ``` 通过以上的步骤,就可以根据word模板生成包含图片的word文档了。当然,还可以根据具体需求进行更多的操作,如修改字体样式、插入表格等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值