java生成企业公章图片源代码
企业公章图片在电子签章业务中应用广泛,在电子签章应用过程中首先需要生成公章图片,然后再使用公章图片结合数字签名技术完成电子签,这样就实现了从可视化到不可篡改的数字化电子签章功能,以下是企业公章图片生成源代码。
`
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生成企业公章图片源代码的更多相关文章
- Java生成动态GIF图片
写selenium自动化时,为了查看运行效果,后给浏览器截图,想到可以生成gif图片来快速预览.看到已经有人实现了,直接拿过来. 共涉及到三个java文件,分别是NeuQuant.java,LZWEn ...
- java生成竖排文字图片
package com.kadang.designer.web.action;import java.awt.Color;import java.awt.Font;import java.awt.Fo ...
- java生成简单验证码图片
概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...
- java生成随机验证码图片
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; i ...
- java 生成透明背景图片
//开始绘图 graphics2d.setBackground(Color.WHITE); graphics2d.clearRect(0, 0, width, height); graphics2d. ...
- java图片裁剪和java生成缩略图
一.缩略图 在浏览相冊的时候.可能须要生成相应的缩略图. 直接上代码: public class ImageUtil { private Logger log = LoggerFactory.getL ...
- springboot搭建项目,实现Java生成随机图片验证码。
这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...
- FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个方案只能在java中运行,无法在Android项目中运行.所以此方案是:APP将表单数据发送给后台,后台通过freemarker ...
- java 生成二维码后叠加LOGO并转换成base64
1.代码 见文末推荐 2.测试 测试1:生成base64码 public static void main(String[] args) throws Exception { String dat ...
- 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)
轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...
随机推荐
- ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析
GraphiteMergeTree该引擎用来对Graphite数据(图数据)进行瘦身及汇总.对于想使用ClickHouse来存储Graphite数据的开发者来说可能有用. 如果不需要对Graphite ...
- burpsuite验证码爆破后台夺权
目录 准备工作 爆破 同时爆破用户名密码和验证码 筛查爆破结果的成功输出 创建新用户远程桌面连接 准备工作 安装python 安装muggle_ocr库 运行xp_CAPTCHA服务端 burpsui ...
- 小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务
小米作为全球知名的科技巨头公司,已经在数百款产品中广泛应用了 AI 技术,这些产品包括手机.电视.智能音箱.儿童手表和翻译机等.这些 AI 应用主要都是通过小米的深度学习训练平台完成的. 在训练平台的 ...
- FreeRTOS 中的调度算法
FreeRTOS 中的调度算法 01 调度算法概述 调度算法的作用: 实时系统的调度需求 相应时间要求 任务优先级 资源利用率 FreeRTOS 调度算法的目标 提供可预测的任务调度 实现任务的优先级 ...
- .NET微服务系列之Saga分布式事务案例实践
自从Wing正式发布以后,很多童鞋反馈对Saga分布式事务比较感兴趣,今天就跟大家分享一下"跨行转账"的分布式事务实践案例,入门使用教程请自行前往Wing官方文档. 假设自己名下有 ...
- 【matplotlib 实战】--雷达图
雷达图(Radar Chart),也被称为蛛网图或星型图,是一种用于可视化多个变量之间关系的图表形式.雷达图是一种显示多变量数据的图形方法.通常从同一中心点开始等角度间隔地射出三个以上的轴,每个轴代表 ...
- js/javaScript实现金额千分位
作为前端开发,我们都知道,在实际的需求开发中,难免会遇到需要将接口返回的金额进行千分位格式化的场景.千分位后的金额便于阅读,提升用户体验.金额千分位可以由前端来处理,也可以后端处理后返回给前端展示. ...
- Java 7之基础 - 强引用、弱引用、软引用、虚引用(转)
载自:http://blog.csdn.net/mazhimazh/article/details/19752475 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对 ...
- Hundred Finance 攻击事件分析
Hundred Finance 背景知识 Hundred Finance 是 fork Compound 的一个借贷项目,在2023/04/15遭受了黑客攻击.攻击者在发起攻击交易之前执行了两笔准备交 ...
- 【Vue3响应式原理#02】Proxy and Reflect
专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核推荐 欢迎各位ITer关注点赞收藏 背景 以下是柏成根据Vue3官方课程整理的响应式书面文档 - 第二节, ...