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生成企业公章图片源代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql性能优化这5点你知道吗?简单却
- 下一篇: 9 个让你的 Python 代码更快的小