首页 > 编程语言 >java生成企业公章图片源代码

java生成企业公章图片源代码

时间:2024-01-09 16:32:53浏览次数:41  
标签:java 公章 int 印章 private Color g2d && 源代码

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

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) {
            }
        }
 
    }
}

更多电子签章使用帮助可关注开放签开源社区

https://gitee.com/kaifangqian

https://github.com/kaifangqian

标签:java,公章,int,印章,private,Color,g2d,&&,源代码
From: https://blog.51cto.com/u_16230987/9162969

相关文章

  • java的idea使用maven下载依赖速度过慢解决
    idea页面双击shift键,搜索settings.xml然后将以下代码复制到xml中间的settings中间切换为阿里源<mirrors><!--mirror|Specifiesarepositorymirrorsitetouseinsteadofagivenrepository.Therepositorythat|thismirrorserveshasanIDthatmatc......
  • java8日期时间格式化DateTimeFormatter多个格式
    原文地址:datetimeformatter.ofpatternmultipleformats-掘金DateTimeFormatter 是一个用于日期时间格式化和解析的类。使用 ofPattern 方法可以创建一个格式化器,该方法接受一个日期时间格式的字符串作为参数。如果您需要在同一个 DateTimeFormatter 对象中支持多种不同的......
  • Java多线程编程中的异常处理策略
    第1章:引言大家好,我是小黑,咱们今天聊聊异常处理。想必大家在写代码的时候都遇到过各种各样的异常吧?有时候,一个小小的异常如果处理不当,就可能导致整个程序崩溃。特别是在多线程环境下,异常处理就像是在拆雷,稍不留神,程序就可能“炸”了。为啥多线程编程中的异常处理这么重要呢?咱们......
  • JavaScript apply、call、bind 函数详解
    apply和callapply和call非常类似,都是用于改变函数中this的指向,只是传入的参数不同,等于间接调用一个函数,也等于将这个函数绑定到一个指定的对象上:letname='window'functiongetName(param1,param2){console.log(this.name)console.log(param1,param2)}letobj=......
  • Java学习建议
    很多大学生、在职员工、IT爱好者都会选择学习Java来提升自己的专业技能,那么在学习之前做好充分的准备也是必须的。建议大家不妨仔细研究下如何快速系统入门,这样才利于更好的掌握Java技术。以下是对于Java学习的一些建议,供参考。 1.了解Java,明确自己的学习目标 Java是一门面向对......
  • 基于Java的在线教育平台设计与实现
    一、 选题依据及意义随着电子技术和网络信息的迅速发展,互联网正在政治、经济、文化各个领域引发着一场影响广泛而深远的革命。利用互联网展开的网上教育,已经越来越成为衡量一个地方教育综合发展的重要指标之一。21世纪是一个网络平台的信息时代,随着网络应用的普及和深入,目前网络......
  • 新车怎么选?用Java采集汽车之家车辆配置参数信息
    年关将至,辛苦一年了,总得犒劳犒劳自己,有人喜欢出去大吃一顿,逛街买东西,也有人会选择买车给自己增添一个代步工具买一辆汽车,而且现在车辆活动力度很大,将会吸引更多人购买欲。那么,普通人怎么选择车辆呢?下面我将通过java爬虫写一个车辆配置参数信息抓取程序,并进行分析对比,让选择也能手......
  • Java 基础 - 注解机制详解
    注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它是框架学习和设计者必须掌握的基础。注解基础注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。......
  • Java+springboot开发医院智能导诊小程序源码
    智慧医院如何实现智能导诊服务?1、数据收集和整合:医院需要收集和整合患者的医疗数据,包括病历、化验结果、影像资料等。同时,还可以整合相关的医学数据库和知识库,以便为导诊提供支持。2、患者信息采集:在患者来院时,可以通过智能问诊系统收集患者的基本信息、症状描述、病史等。这可以......
  • 基于java的医院住院管理系统的设计与实现
    1.选题目的和意义:数字化医院是正在发展中的新生事物,概念一直没有明确的涵义。2001年,有关权威人士提出:数字化医院是以网络管理为基本模式,以信息为医院发展的基本功能,以信息技术为依托,增强医院的技术实力,以信息文化改变着人们教育、工作方式和思想观念的新兴群体形态,以信息化建设为......