python: Electronic Seal

📅 2026/8/2 16:26:41
python: Electronic Seal
# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Electronic Seal # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/2 8:39 # User : geovindu # Product : PyCharm # Project : PyElectronicSeal # File : global_const.py # -*- coding: utf-8 -*- 全局常量定义模块 统一管理字体路径、印章默认参数、滤镜常量、颜色常量 职责集中配置后期修改无需到处改代码 # Windows系统字体路径 FONT_SIMSUN rC:/Windows/Fonts/simsun.ttc # 宋体-中文 FONT_ARIAL rC:/Windows/Fonts/arial.ttf # Arial-英文数字 # 印章默认RGBA红色(透明度120) SEAL_RED_COLOR (255, 0, 0, 120) # 高斯模糊默认参数 BLUR_NORMAL 0.6 BLUR_TEXTURE 1 # 随机纹理画布基础尺寸 TEXTURE_BASE_SIZE 300 # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Electronic Seal # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/2 8:40 # User : geovindu # Product : PyCharm # Project : PyElectronicSeal # File : char_utils.py 字符工具类 职责仅负责字符类型判断后续可扩展全角半角、标点过滤 def is_chinese_char(ch: str) - bool: 判断单个字符是否为中文字符 :param ch: 待检测单个字符 :return: 中文返回True非中文返回False if \u4e00 ch \u9fff: return True return False # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Electronic Seal # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/2 8:40 # User : geovindu # Product : PyCharm # Project : PyElectronicSeal # File : geometry_utils.py 几何计算工具类 职责仅提供数学坐标计算不做图像绘制 提供五角星顶点计算、圆形边框范围计算 from math import pi, cos, sin def calc_pentagram_vertex(center_x: int, center_y: int, outer_r: int, y_degree: float 0): 计算五角星所有顶点坐标 :param center_x: 五角星中心点X坐标 :param center_y: 五角星中心点Y坐标 :param outer_r: 五角星外接大圆半径 :param y_degree: 五角星整体旋转偏移角度 :return: list[tuple] 五角星闭合顶点坐标数组 rad_per_degree pi / 180 # 五角星几何公式计算内圈半径 inner_r outer_r * sin(18 * rad_per_degree) / cos(36 * rad_per_degree) # 外圈5个顶点坐标 outer_points [] for k in range(5): angle (90 k * 72 y_degree) * rad_per_degree px center_x - outer_r * cos(angle) py center_y - outer_r * sin(angle) outer_points.append((px, py)) # 内圈5个顶点坐标 inner_points [] for k in range(5): angle (90 36 k * 72 y_degree) * rad_per_degree px center_x - inner_r * cos(angle) py center_y - inner_r * sin(angle) inner_points.append((px, py)) # 内外顶点交叉合并构成五角星轮廓 vertex_list [] for o_point, i_point in zip(outer_points, inner_points): vertex_list.append(o_point) vertex_list.append(i_point) return vertex_list def calc_circle_box(center_x: int, center_y: int, radius: int): 计算圆形外接矩形边框用于PIL绘制圆环 :param center_x: 圆心X :param center_y: 圆心Y :param radius: 圆半径 :return: tuple(left, top, right, bottom) 矩形范围 left center_x - radius top center_y - radius right center_x radius bottom center_y radius return left, top, right, bottom # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Electronic Seal # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/2 8:40 # User : geovindu # Product : PyCharm # Project : PyElectronicSeal # File : texture_generator.py 随机纹理生成器 职责生成每次唯一、不可重复的印章做旧纹理不依赖外部图片 特性使用随机噪声随机旋转随机灰度渐变每次调用纹理完全不一样 import random from PIL import Image, ImageFilter from common.global_const import TEXTURE_BASE_SIZE, BLUR_TEXTURE class UniqueTextureGenerator: 全局唯一纹理生成器 单例设计每次generate()生成全新不重复纹理 _instance None def __new__(cls): if cls._instance is None: cls._instance super().__new__(cls) return cls._instance def generate_random_texture(self, target_size: tuple) - Image.Image: 生成一张全新随机纹理图每次调用结果唯一 :param target_size: 最终纹理尺寸 (width, height) :return: 灰度纹理Image对象 # 1. 生成基础随机噪声画布 base_img Image.new(L, (TEXTURE_BASE_SIZE, TEXTURE_BASE_SIZE)) pixel_data [] # 随机灰度填充噪声随机 for _ in range(TEXTURE_BASE_SIZE * TEXTURE_BASE_SIZE): gray_val random.randint(180, 245) pixel_data.append(gray_val) base_img.putdata(pixel_data) # 2. 随机旋转 0~360度 random_rotate random.randint(0, 360) base_img base_img.rotate(random_rotate, expandTrue) # 3. 随机裁剪区域 crop_x1 random.randint(0, 120) crop_y1 random.randint(0, 80) crop_x2 crop_x1 TEXTURE_BASE_SIZE crop_y2 crop_y1 TEXTURE_BASE_SIZE base_img base_img.crop((crop_x1, crop_y1, crop_x2, crop_y2)) # 4. 缩放至目标尺寸高斯模糊柔化 texture_img base_img.resize(target_size).filter(ImageFilter.GaussianBlur(BLUR_TEXTURE)) return texture_img # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Electronic Seal # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/2 8:48 # User : geovindu # Product : PyCharm # Project : PyElectronicSeal # File : shape_drawer.py 基础图形绘制类 职责仅负责圆环、五角星绘制只依赖PIL Draw和几何工具 from PIL import ImageDraw from common.geometry_utils import calc_pentagram_vertex, calc_circle_box class ShapeDrawer: def __init__(self, draw_obj: ImageDraw.ImageDraw): 图形绘制器初始化 :param draw_obj: 画布Draw对象 self.draw draw_obj def draw_outer_circle(self, center_x: int, center_y: int, radius: int, line_width: int, color: tuple): 绘制印章外圈圆环 :param center_x: 圆心X :param center_y: 圆心Y :param radius: 圆环外圈半径 :param line_width: 圆环线条宽度 :param color: RGBA颜色 box calc_circle_box(center_x, center_y, radius) self.draw.arc(box, start0, end360, fillcolor, widthline_width) def draw_pentagram(self, center_x: int, center_y: int, radius: int, fill_color: tuple): 绘制实心五角星 :param center_x: 五角星中心 :param center_y: 五角星中心 :param radius: 五角星外接圆半径 :param fill_color: 填充RGBA颜色 vertex_list calc_pentagram_vertex(center_x, center_y, radius) self.draw.polygon(vertex_list, fillfill_color, outlinefill_color) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Electronic Seal # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/2 8:49 # User : geovindu # Product : PyCharm # Project : PyElectronicSeal # File : text_drawer.py 弧形旋转文字绘制类 职责单一职责弧形环绕文字绘制、文字旋转抗锯齿处理 from PIL import Image, ImageDraw, ImageFont from common.char_utils import is_chinese_char from common.global_const import FONT_SIMSUN, FONT_ARIAL class ArcTextDrawer: def draw_rotated_arc_text( self, canvas_img: Image.Image, rotate_angle: float, center_point: tuple, arc_radius: int, char: str, fill_color: tuple, font_size: int, x_scale_ratio: float, stroke_width: int, flip_vertical: bool False ): 在画布上绘制环绕圆弧的单个旋转文字 :param canvas_img: 目标画布 :param rotate_angle: 文字旋转角度 :param center_point: 圆弧中心点(x,y) :param arc_radius: 文字所在圆弧半径 :param char: 单个绘制字符 :param fill_color: RGBA文字颜色 :param font_size: 字体字号 :param x_scale_ratio: 横向缩放比例印章窄字体 :param stroke_width: 文字描边粗细 :param flip_vertical: 是否垂直翻转下方文字倒置 # 加载字体容错兜底 try: if is_chinese_char(char): font ImageFont.truetype(FONT_SIMSUN, font_size, encodingutf-8) else: font ImageFont.truetype(FONT_ARIAL, font_size, encodingutf-8) except Exception: font ImageFont.load_default(sizefont_size) img_w, img_h canvas_img.size max_dim max(img_w, img_h) # 创建超大透明文字蒙版抗锯齿 mask_size (max_dim * 2, max_dim * 2) resize_mask_size (int(max_dim * 2 * x_scale_ratio), max_dim * 2) mask_layer Image.new(L, mask_size, 0) mask_draw ImageDraw.Draw(mask_layer) # 计算文字边界、绘制坐标 text_box mask_draw.textbbox((max_dim, max_dim), char, fontfont, aligncenter) char_w text_box[2] - text_box[0] char_h text_box[3] - text_box[1] if flip_vertical: text_pos (int(max_dim - char_w / 2), max_dim arc_radius - char_h) else: text_pos (int(max_dim - char_w / 2), max_dim - arc_radius) mask_draw.text(text_pos, char, fill255, fontfont, aligncenter, stroke_widthstroke_width) # 高精度旋转处理 if rotate_angle % 90 0: rotated_mask mask_layer.resize(resize_mask_size).rotate(rotate_angle) else: big_mask mask_layer.resize((int(max_dim * 8 * x_scale_ratio), max_dim * 8), Image.BICUBIC) rotated_mask big_mask.rotate(rotate_angle).resize(resize_mask_size, Image.LANCZOS) # 裁剪蒙版对齐画布 mask_offset_x max_dim * x_scale_ratio - center_point[0] mask_offset_y max_dim - center_point[1] crop_box (mask_offset_x, mask_offset_y, mask_offset_x img_w, mask_offset_y img_h) final_mask rotated_mask.crop(crop_box) # 粘贴到原图 color_layer Image.new(RGBA, canvas_img.size, fill_color) canvas_img.paste(color_layer, maskfinal_mask) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Electronic Seal # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/2 8:49 # User : geovindu # Product : PyCharm # Project : PyElectronicSeal # File : seal_generator.py 印章生成业务主类 职责整合所有底层模块统一入参、编排绘制流程、对外提供生成/保存/查看接口 高扩展新增样式只需新增绘制方法不改动主流程 # 修复补齐缺失PIL导入 from PIL import Image, ImageDraw, ImageFilter from math import tan, pi from core.shape_drawer import ShapeDrawer from core.text_drawer import ArcTextDrawer from common.texture_generator import UniqueTextureGenerator from common.global_const import SEAL_RED_COLOR, BLUR_NORMAL class SealGenerator: def __init__( self, edge_padding: int 5, center_mid_distance: int 160, circle_radius: int 250, ring_width: int 13, pentagram_radius: int 90, seal_color: tuple SEAL_RED_COLOR, top_text: str , top_angle_range: int 270, top_font_size: int 80, top_x_scale: float 0.66, top_stroke: int 2, mid_text: str , mid_angle_range: int 72, mid_font_size: int 60, mid_x_scale: float 0.7, mid_stroke: int 1, bottom_text: str , bottom_angle_range: int 60, bottom_font_size: int 20, bottom_x_scale: float 1.0, bottom_stroke: int 1 ): 印章生成配置初始化 :param edge_padding: 画布边缘留白 :param center_mid_distance: 圆心到中部文字垂直距离 :param circle_radius: 外圆半径 :param ring_width: 外圈圆环线条宽度 :param pentagram_radius: 五角星外接圆半径 :param seal_color: 印章RGBA颜色 :param top_text: 顶部环绕文字 :param top_angle_range: 顶部文字总弧度范围 :param top_font_size: 顶部字号 :param top_x_scale: 顶部字体横向缩放 :param top_stroke: 顶部文字粗细 :param mid_text: 中间竖排文字 :param mid_angle_range: 中部文字展开角度 :param mid_font_size: 中部字号 :param mid_x_scale: 中部字体横向缩放 :param mid_stroke: 中部文字粗细 :param bottom_text: 底部环绕文字 :param bottom_angle_range: 底部文字总弧度范围 :param bottom_font_size: 底部字号 :param bottom_x_scale: 底部字体横向缩放 :param bottom_stroke: 底部文字粗细 # 画布基础配置 self.edge_padding edge_padding self.center_mid_distance center_mid_distance self.circle_radius circle_radius self.ring_width ring_width self.pentagram_radius pentagram_radius self.seal_color seal_color # 顶部文字配置 self.top_text top_text self.top_angle_range top_angle_range self.top_font_size top_font_size self.top_x_scale top_x_scale self.top_stroke top_stroke # 中部文字配置 self.mid_text mid_text self.mid_angle_range mid_angle_range self.mid_font_size mid_font_size self.mid_x_scale mid_x_scale self.mid_stroke mid_stroke # 底部文字配置 self.bottom_text bottom_text self.bottom_angle_range bottom_angle_range self.bottom_font_size bottom_font_size self.bottom_x_scale bottom_x_scale self.bottom_stroke bottom_stroke # 实例化底层工具 self.text_drawer ArcTextDrawer() self.texture_gen UniqueTextureGenerator() self.result_img: Image.Image | None None def build_seal_canvas(self): 绘制完整印章主流程 canvas_size 2 * (self.circle_radius self.edge_padding) canvas Image.new(RGBA, (canvas_size, canvas_size), (255, 255, 255, 0)) draw ImageDraw.Draw(canvas) shape_drawer ShapeDrawer(draw) center_xy self.circle_radius self.edge_padding # 外圈圆环 shape_drawer.draw_outer_circle(center_xy, center_xy, self.circle_radius, self.ring_width, self.seal_color) # 五角星 shape_drawer.draw_pentagram(center_xy, center_xy, self.pentagram_radius, self.seal_color) # 顶部文字 if len(self.top_text) 0: single_angle self.top_angle_range / len(self.top_text) current_angle ((len(self.top_text) - 1) / 2) * single_angle text_radius self.circle_radius - self.ring_width * 2 for char in self.top_text: self.text_drawer.draw_rotated_arc_text( canvas, current_angle, (center_xy, center_xy), text_radius, char, self.seal_color, self.top_font_size, self.top_x_scale, self.top_stroke ) current_angle - single_angle # 中部文字 if len(self.mid_text) 0: single_angle self.mid_angle_range / len(self.mid_text) current_angle -((len(self.mid_text) - 1) / 2) * single_angle for char in self.mid_text: offset_x self.center_mid_distance * tan(current_angle * pi / 180) point (center_xy offset_x, center_xy) self.text_drawer.draw_rotated_arc_text( canvas, 0, point, self.center_mid_distance, char, self.seal_color, self.mid_font_size, self.mid_x_scale, self.mid_stroke, flip_verticalTrue ) current_angle single_angle # 底部文字 if len(self.bottom_text) 0: single_angle self.bottom_angle_range / len(self.bottom_text) current_angle -((len(self.bottom_text) - 1) / 2) * single_angle text_radius self.circle_radius - self.ring_width * 2 for char in self.bottom_text: self.text_drawer.draw_rotated_arc_text( canvas, current_angle, (center_xy, center_xy), text_radius, char, self.seal_color, self.bottom_font_size, self.bottom_x_scale, self.bottom_stroke, flip_verticalTrue ) current_angle single_angle # 叠加唯一随机纹理 random_texture self.texture_gen.generate_random_texture(canvas.size) w, h canvas.size for y in range(h): for x in range(w): rgba canvas.getpixel((x, y)) gray random_texture.getpixel((x, y)) new_alpha int(gray / 255 * rgba[3]) canvas.putpixel((x, y), (rgba[0], rgba[1], rgba[2], new_alpha)) self.result_img canvas.filter(ImageFilter.GaussianBlur(BLUR_NORMAL)) def show(self): 展示图片 if self.result_img is not None: self.result_img.show() def save(self, save_path: str): 保存图片 if self.result_img is not None: self.result_img.save(save_path)调用# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述pip install pillow Electronic Seal # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/2 8:39 # User : geovindu # Product : PyCharm # Project : PyElectronicSeal # File : main.py 程序运行入口 快速配置参数一键生成印章每次运行纹理随机不重复 from business.seal_generator import SealGenerator if __name__ __main__: # 印章自定义配置区 top_words 深圳涂聚文有限公司 mid_words 财务专用章 bottom_words 3624250888 output_path 企业电子印章_随机纹理.png # # 实例化印章生成器 seal SealGenerator( top_texttop_words, mid_textmid_words, bottom_textbottom_words ) # 生成印章画布 seal.build_seal_canvas() # 预览图片 seal.show() # 保存文件 seal.save(output_path) print(f印章生成完成保存路径{output_path}本次纹理为独立随机唯一纹理)代码实现了一个高度模块化的电子印章生成系统采用Python 3.11开发主要功能特性包括采用分层架构设计包含全局常量、字符处理、几何计算、纹理生成、图形绘制、文字绘制和主生成器等7个模块实现印章核心元素外圈圆环、五角星、顶部弧形文字、中部竖排文字和底部弧形文字独特纹理生成算法每次生成具有唯一随机噪声的做旧效果支持中文/英文自动识别和字体切换采用抗锯齿技术处理旋转文字提供完整的参数配置接口可自定义印章大小、颜色、文字内容和样式输出为透明背景的PNG图像适用于电子文档直接叠加使用系统严格遵循单一职责原则各模块解耦度高便于维护和扩展新样式。生成的印章具有专业的外观和防伪特性适用于企业电子文档场景。可以考虑扩展三种印章都可自定义公司名称、用章名称、组织机构代码的字体大小有默认值颜色字体和形状默认红色可自定义其他颜色防伪纹理每次生成都是随机唯一的输出印章是实体名称不存在实体无法律效用不可借用他用途。是测试而已。代码不可用于违法违规违纪用途。