企业公章图片在电子签章业务中应用广泛,在电子签章应用过程中首先需要生成公章图片,然后再使用公章图片结合数字签名技术完成电子签,这样就实现了从可视化到不可篡改的数字化电子签章功能,以下是企业公章图片生成源代码。

`​

import com.resrun.utils.Base64;

import org.apache.pdfbox.io.IOUtils;

import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;

import java.awt.;

import java.awt.image.BufferedImage;

import java.io.
;

/**

  • @Description: 企业签章业务

  • @Package: com.resrun.service.image

  • @ClassName: EntSealGenerateService

  • @copyright 北京资源律动科技有限公司

    */

    @Service

    public class EntSealGenerateService {

    /**

    • @Description #生成企业签章

    • @Param [topText, middleText]

    • @return byte[]

      **/

      public byte[] generateEntSeal(String topText,String middleText){

      byte[] bytes = export2pic("png", middleText,topText);

      return bytes;

      }

    /**

    • 印章名称距中心点偏移量,按照y轴方向

      /

      private int nameOffset = 50;

      /
      *
    • 印章宽度

      /

      private int width = 200;

      /
      *
    • 印章高度

      /

      private int height = 200;

      /
      *
    • 印章中心标志(默认为五角星)外接圆半径

      /

      private float radius = 30;

      /
      *
    • 印章名称颜色

      /

      private Color nameColor = Color.RED;

      /
      *
    • 印章所属单位

      /

      // private String firm;

      /
      *
    • 印章所属单位颜色

      /

      private Color firmColor = Color.RED;

      private float firmScale = 0.7F;

      /
      *
    • 边框线宽

      /

      private float borderWidth = 5F;

      /
      *
    • 边框颜色

      /

      private Color borderColor = Color.RED;

      /
      *
    • 印章标记(默认为五角星)线宽

      /

      private float signBorderWidth = 3F;

      /
      *
    • 印章标记颜色

      /

      private Color signBorderColor = Color.RED;

      /
      *
    • 印章标记填充颜色

      */

      private Color signFillColor = Color.RED;

    public void draw(Graphics2D g2d,String middleText,String topText) {

    // 把绘制起点挪到圆中心点

    g2d.translate(width / 2, height / 2);

     Stroke stroke = g2d.getStroke();// 旧的线性
    // 填充五角星
    Polygon polygon = getPentaclePoints(radius);
    if (signFillColor != null) {
    g2d.setColor(signFillColor);
    g2d.fill(polygon);
    }
    // 绘制五角星边框
    g2d.setStroke(new BasicStroke(signBorderWidth));
    g2d.setColor(signBorderColor);
    g2d.draw(polygon); // 绘制印章边框
    g2d.setFont(nameFont);
    g2d.setColor(borderColor);
    g2d.setStroke(new BasicStroke(borderWidth));
    g2d.drawOval(-width / 2, -height / 2, width, height);
    g2d.setStroke(stroke); // 绘制印章名称
    g2d.setFont(nameFont);
    g2d.setColor(nameColor); //g2d.setStroke(new BasicStroke(10F));
    FontMetrics fm = g2d.getFontMetrics();
    int w = fm.stringWidth(middleText);// 名称宽度
    int h = fm.getHeight();// 名称高度
    int y = fm.getAscent() - h / 2;// 求得中心线经过字体的高度的一半时的字体的起绘点
    g2d.drawString(middleText, -w / 2, y + nameOffset); // 绘制印章单位
    g2d.setFont(getFirmFont(topText));
    g2d.setColor(firmColor);
    fm = g2d.getFontMetrics();
    h = fm.getHeight();// 字高度 int count = topText.length();// 字数
    int r = width / 2;// 半径,就假设此印章是个矩形,方便计算
    float angle;
    float start; if(count>1 && count <=10){
    angle = 20f;// 字间角度
    start = 90+(360 - angle*(count-1))/2;// 以x轴正向为0,顺时针旋转
    }else if(count > 10){
    angle = (360 - firmAngle) / (count-1);// 字间角度
    start = 90+(360 - angle*(count-1))/2;// 以x轴正向为0,顺时针旋转
    }else{
    angle = 0f;// 字间角度
    start = 90+(360 - angle*(2-1))/2;// 以x轴正向为0,顺时针旋转
    }
    double vr = Math.toRadians(90);// 垂直旋转弧度
    char[] chars = topText.toCharArray();
    for (int i = 0; i < count; i++) {
    char c = chars[i];// 需要绘制的字符
    int cw = fm.charWidth(c);// 此字符宽度
    float a = start + angle * i;// 现在角度
    double radians = Math.toRadians(a);
    g2d.rotate(radians);// 旋转坐标系,让要绘制的字符处于x正轴
    float x = r - h;// 绘制字符的x坐标为半径减去字高度
    g2d.translate(x, 0);// 移动到此位置,此时字和x轴垂直
    g2d.rotate(vr);// 旋转90度,让字平行于x轴
    g2d.scale(firmScale, 1);// 缩放字体宽度
    g2d.drawString(String.valueOf(c), -cw / 2, 0);// 此点为字的中心点
    // 将所有设置还原,等待绘制下一个
    g2d.scale(1 / firmScale, 1);
    g2d.rotate(-vr);
    g2d.translate(-x, 0);
    g2d.rotate(-radians);
    }
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    }

    /**

    • 获取具有指定半径外接圆的五角星顶点
    • @param radius
    •        圆半径

    */

    private Polygon getPentaclePoints(float radius) {

    if (radius <= 0)

    return null;

    float lradius = radius * 0.381966f;// 根据radius求内圆半径

    double halfpi = Math.PI / 180f;

    Point[] points = new Point[10];

    for (int i = 0; i < points.length; i++) {

    if (i % 2 == 1)

    points[i] = new Point(

    (int) (Math.sin(halfpi * 36 * i) * radius),

    (int) (Math.cos(halfpi * 36 * i) * radius));

    else

    points[i] = new Point(

    (int) (Math.sin(halfpi * 36 * i) * lradius),

    (int) (Math.cos(halfpi * 36 * i) * lradius));

    }

    Polygon polygon = new Polygon();

    for (Point p : points) {

    polygon.addPoint(p.x, p.y);

    }

    return polygon;

    }

    public int getWidth() {

    return width;

    }

    public int getHeight() {

    return height;

    }

    private Font nameFont = new Font("宋体", Font.PLAIN, 19);

    private Font getFirmFont(String topText){

    Font font = null;

    int len = topText.length();

    System.out.println(len);

    if(len==1){

    setFirmAngle(355);

    font = new Font("宋体", Font.PLAIN, 25);

    }else if(len>1 && len<=3){

    setFirmAngle(310);

    font = new Font("宋体", Font.PLAIN, 25);

    }else if(len>3 && len<=6){

    setFirmAngle(250);

    font = new Font("宋体", Font.PLAIN, 25);

    }else if(len>6 && len <=10){

    setFirmAngle(200);

    font = new Font("宋体", Font.PLAIN, 25);

    }else if(len>10 && len<=13){

    setFirmAngle(180);

    font = new Font("宋体", Font.PLAIN, 25);

    }

    else if(len>13 && len<=20){

    font = new Font("宋体", Font.PLAIN, 25);

    setFirmAngle(120);

    }else if(len>20 && len <= 25){

    font = new Font("宋体", Font.PLAIN, 23);

         setFirmAngle(80);
    }else if(len>25 && len < 30){
    setFirmAngle(80);
    font = new Font("宋体", Font.PLAIN, 19);
    }else if(len>=30 && len <= 40){
    setFirmAngle(80);
    font = new Font("宋体", Font.PLAIN, 19);
    }else{
    setFirmAngle(10);
    font = new Font("宋体", Font.PLAIN, 17);
    }
    return font;

    }

    private int firmAngle;

    public void setFirmAngle(int firmAngle){

    this.firmAngle = firmAngle;

    }

    /**

    • 导出此印章为透明背景的图片字节数组.
    • @param format
    •        图片类型,如果为null,则默认为png
    • @return 数组
    • @throws FileNotFoundException
    • @throws IOException
    •         写出图像数据出现问题

    */

    public byte[] export2pic(String format,String middleText,String topText) {

    int fix = 5;// 宽高修正,如果宽高就为图片宽高,可能边框线被切割

    BufferedImage bi = new BufferedImage(getWidth() + fix * 2, getHeight()

    + fix * 2, 3);

     Graphics2D g2d = bi.createGraphics();
    //防锯齿状毛刺算法
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.translate(fix, fix);
    draw(g2d,middleText,topText); ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
    ImageIO.write(bi, format == null ? "png" : format, baos);
    return baos.toByteArray();
    } catch (IOException e) {
    throw new RuntimeException(topText+":生成企业签章失败",e);
    }finally {
    try {
    if(baos!=null)
    baos.close();
    } catch (IOException e) {
    }
    }

    }

    }

​`

java生成企业公章图片源代码的更多相关文章

  1. Java生成动态GIF图片

    写selenium自动化时,为了查看运行效果,后给浏览器截图,想到可以生成gif图片来快速预览.看到已经有人实现了,直接拿过来. 共涉及到三个java文件,分别是NeuQuant.java,LZWEn ...

  2. java生成竖排文字图片

    package com.kadang.designer.web.action;import java.awt.Color;import java.awt.Font;import java.awt.Fo ...

  3. java生成简单验证码图片

    概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...

  4. java生成随机验证码图片

    import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; i ...

  5. java 生成透明背景图片

    //开始绘图 graphics2d.setBackground(Color.WHITE); graphics2d.clearRect(0, 0, width, height); graphics2d. ...

  6. java图片裁剪和java生成缩略图

    一.缩略图 在浏览相冊的时候.可能须要生成相应的缩略图. 直接上代码: public class ImageUtil { private Logger log = LoggerFactory.getL ...

  7. springboot搭建项目,实现Java生成随机图片验证码。

    这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...

  8. FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个方案只能在java中运行,无法在Android项目中运行.所以此方案是:APP将表单数据发送给后台,后台通过freemarker ...

  9. java 生成二维码后叠加LOGO并转换成base64

      1.代码 见文末推荐 2.测试 测试1:生成base64码 public static void main(String[] args) throws Exception { String dat ...

  10. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

随机推荐

  1. Modbus动态链接库供多语言使用 | Go

    Modbus协议控制动态链接库 应用场景 基于各门语言都有各自的modbus协议库,且良莠不齐,而且在具体的框架下可能存在版本依赖问题, 而且对modbus协议存在比较多的细节处理,可以查看modbu ...

  2. .NET周刊【10月第1期 2023-10-01】

    国内文章 .NET应用如何防止被反编译 https://www.cnblogs.com/Can-daydayup/p/17736700.html 本文主要讲述了如何防止.NET应用被反编译.虽然无法完 ...

  3. linux 批量替换文件内容

    1.批量查找某个目下文件的包含的内容,例如: #   grep -rn "要找查找的文本" ./ 2.批量查找并替换文件内容. #   sed -i "s/要找查找的文本 ...

  4. 设置使用mac 自带终端记住密码

    厌倦了 mac上每次登录linux服务器或树莓派时总是需要输入用户名和密码. 使用下列方法, 可以减少上述操作. 新建一个 .ssh 文件 vim pi4.ssh 添加如下内容 #!/usr/bin/ ...

  5. command_execution

    前置知识 可以通过ping的TTL来判断系统的版本 判断了是Linux之后就使用Linux的连接命令来进行操作 这里直接全局搜索flag相关的文件 linux全局查询文件_linux全局查找某个文件- ...

  6. .NET 8.0 中有哪些新的变化?

    1性能提升 .NET 8在整个堆栈中带来了数千项性能改进 .默认情况下会启用一种名为动态配置文件引导优化 (PGO) 的新代码生成器,它可以根据实际使用情况优化代码,并且可以将应用程序的性能提高高达 ...

  7. Dart 初探 (一)

    前言 Dart 是 Google 为 Flutter 开发的一款用于网页编程的语言,其类似于Javascript,也是一种面向对象的语言,但其采用基于类的编程,语法风格接近C语言. 虽说它是开发用于网 ...

  8. 增长实验室-ab分流的流量保护功能介绍

    介绍ab分流的流量保护功能之前,先普及一下ab分流的一些概念和术语 名词解释: 实验:用来验证某个决定请求处理方式的功能或策略的一部分流量,通常用来验证某个功能或策略对系统指标(如PV/UV,CRT, ...

  9. RK3588-MPP解码详解

    一. 简介 [RK3588从入门到精通] 专栏总目录 本篇文章进行RK3588-MPP解码的详细解析 二. 环境介绍 硬件环境: ArmSoM-W3 RK3588开发板 软件版本: OS:ArmSoM ...

  10. Grok AI 是什么?

    原文链接:https://openaigptguide.com/grok-ai/ Grok AI是由马斯克推出的一款高级别的人工智能大语言模型,旨在帮助软件开发者以不同的口头语言交流和表达.它是基于多 ...