日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2024/1/11 windows 30 coder
生活随笔 收集整理的這篇文章主要介紹了 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生成企业公章图片源代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。