【Python】自动完成手写字体图片贴入以及盖章工具
简介
该工具完成了如下功能:
1.将文字转换为手写体填入到模板文件中
2.自动将文字转换为盖章格式填入到模板文件中
3.字体格式可以替换
4.有配置文件进行扩展功能
功能模块
1.界面模块
import sys
from PyQt5.QtWidgets import QApplication, QMessageBox, QWidget, QLabel, QComboBox, QLineEdit, QPushButton, QVBoxLayout
from source import get_stamp_png
from source import get_pic_by_font
from source import config_read
font_path = "./font/SIMYOU.TTF"
font_size = 25
save_path = "./output/"
save_stamp_path = "./output/stamp/"class TemplateGenerator(QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):self.setWindowTitle("模板盖章生成器V1.0")self.setGeometry(300, 300, 400, 200)layout = QVBoxLayout()# 选择框template_label = QLabel("选择模板:")self.template_combobox = QComboBox()self.template_combobox.addItem("口扫")self.template_combobox.addItem("转诊")layout.addWidget(template_label)layout.addWidget(self.template_combobox)#患者信息框patient_name_label = QLabel("患者姓名:")self.patient_name_edit = QLineEdit()patient_pid_label = QLabel("患者PID:")self.patient_pid_edit = QLineEdit()patient_scan_id_label = QLabel("患者口扫ID:")self.patient_scan_id_edit = QLineEdit()layout.addWidget(patient_name_label)layout.addWidget(self.patient_name_edit)layout.addWidget(patient_pid_label)layout.addWidget(self.patient_pid_edit)layout.addWidget(patient_scan_id_label)layout.addWidget(self.patient_scan_id_edit)# 转出输入框doctor_out_label = QLabel("转出医生姓名:")self.doctor_out_edit = QLineEdit()out_id_label = QLabel("转出医生DID:")self.out_id_edit = QLineEdit()clinic_out_label = QLabel("转出诊所名称:")self.clinic_out_id_edit = QLineEdit()layout.addWidget(doctor_out_label)layout.addWidget(self.doctor_out_edit)layout.addWidget(out_id_label)layout.addWidget(self.out_id_edit)layout.addWidget(clinic_out_label)layout.addWidget(self.clinic_out_id_edit)# 转入输入框doctor_in_label = QLabel("转入医生姓名:")self.doctor_in_edit = QLineEdit()in_id_label = QLabel("转入医生DID:")self.in_id_edit = QLineEdit()clinic_in_label = QLabel("转出诊所名称:")self.clinic_in_id_edit = QLineEdit()layout.addWidget(doctor_in_label)layout.addWidget(self.doctor_in_edit)layout.addWidget(in_id_label)layout.addWidget(self.in_id_edit)layout.addWidget(clinic_in_label)layout.addWidget(self.clinic_in_id_edit)# 生成按钮self.generate_button = QPushButton("生成")self.generate_button.clicked.connect(self.generate_button_clicked)layout.addWidget(self.generate_button)self.setLayout(layout)self.show()def generate_button_clicked(self):get_pic_by_font.delete_all_png()template = self.template_combobox.currentText()#模板patient_name = self.patient_name_edit.text()#患者姓名patient_pid = self.patient_pid_edit.text()#患者PIDpatient_scan_id = self.patient_scan_id_edit.text()#患者口扫IDout_doctor_name = self.doctor_out_edit.text()#转出医生姓名out_doctor_id = self.out_id_edit.text()#转出医生DIDout_clinic_name = self.clinic_out_id_edit.text()#转出诊所名称in_doctor_name = self.doctor_in_edit.text()#转入医生姓名in_doctor_id = self.in_id_edit.text()#转入医生DIDin_clinic_name = self.clinic_in_id_edit.text()#转入诊所名称# 进行模板生成的逻辑处理,这里只是简单的打印输出print("选择模板:", template)print("患者姓名:",patient_name)get_pic_by_font.generate_text_image(patient_name,font_path,font_size)print("患者PID:",patient_pid)get_pic_by_font.generate_text_image(patient_pid,font_path,font_size)print("患者口扫ID:",patient_scan_id)get_pic_by_font.generate_text_image(patient_scan_id,font_path,font_size)print("转出医生姓名:", out_doctor_name)print("转出医生DID:", out_doctor_id)print("转出诊所名称:", out_clinic_name)get_pic_by_font.generate_text_image(out_doctor_name,font_path,font_size)get_pic_by_font.generate_text_image(out_doctor_id,font_path,font_size)get_stamp_png.func_get_stamp_png(out_clinic_name)print("转入医生姓名:", in_doctor_name)print("转入医生DID:", in_doctor_id)print("转入诊所名称:", in_clinic_name)get_pic_by_font.generate_text_image(in_doctor_name,font_path,font_size)get_pic_by_font.generate_text_image(in_doctor_id,font_path,font_size)get_stamp_png.func_get_stamp_png(in_clinic_name)if template == "口扫":print("口扫盖章")template_path = "./template/口扫.png"output_ret_path = "./ret.png"get_pic_by_font.func_seal(template_path,save_path+patient_name+".png",output_ret_path,190,270)#患者名字盖章get_pic_by_font.func_seal(output_ret_path,save_path+patient_pid+".png",output_ret_path,760,270)#PID盖章get_pic_by_font.func_seal(output_ret_path,save_path+patient_scan_id+".png",output_ret_path,1350,270)#口扫ID盖章get_pic_by_font.func_seal(output_ret_path,save_path+out_doctor_name+".png",output_ret_path,190,710)#转出医生姓名盖章get_pic_by_font.func_seal(output_ret_path,save_path+out_doctor_id+".png",output_ret_path,640,710)#转出医生DID盖章get_pic_by_font.func_seal(output_ret_path,save_stamp_path+out_clinic_name+".png",output_ret_path,1190,770)#转出诊所名称盖章get_pic_by_font.func_seal(output_ret_path,save_path+in_doctor_name+".png",output_ret_path,190,1090)#转入医生姓名盖章get_pic_by_font.func_seal(output_ret_path,save_path+in_doctor_id+".png",output_ret_path,660,1090)#转入医生DID盖章get_pic_by_font.func_seal(output_ret_path,save_stamp_path+in_clinic_name+".png",output_ret_path,1250,1100)#转入诊所名称盖章get_pic_by_font.func_seal(output_ret_path,save_path+patient_name+".png",output_ret_path,170,1690)#患者名字盖章get_pic_by_font.func_seal(output_ret_path,save_path+patient_name+".png",output_ret_path,710,1690)#患者名字盖章QMessageBox.warning(None, "Warning", "盖章完毕,文件名为ret.png")elif template == "转诊":print("转诊盖章")template_path = "./template/转诊.png"if __name__ == "__main__":my_config = config_read.read_config()font_path = my_config.get('Font','style')font_size = int(my_config.get('Font','size'))print(font_path)print(font_size)app = QApplication(sys.argv)window = TemplateGenerator()sys.exit(app.exec_())
2.配置文件模块
import configparser
import os# 读取配置文件
def read_config():#root_dir = os.path.dirname(os.path.dirname(__file__)) # # 获取当前文件所在目录#config_dir = os.path.join(root_dir, './config', 'config.ini') # 组装config.ini路径,也可以直接写配置文件的具体路径,不用自动获取cf = configparser.ConfigParser()cf.read("./config/config.ini", encoding="utf-8") # 读取config.inireturn cf
3.文本转换手写字体图片模块
from PIL import Image, ImageDraw, ImageFont
import os
import globdef generate_text_image(text, font_path, font_size):# 创建一个空白的图片#print(text.length()*100)if len(text) == 0:returnimage = Image.new('RGB', (len(text)*25+20, 40), color='white')draw = ImageDraw.Draw(image)# 加载手写字体font = ImageFont.truetype(font_path, font_size)# 在图片上绘制文本draw.text((10, 10), text, font=font, fill='black')# 保存生成的图片image.save("./output/"+text+".png")# 指定目录
directory = "./output"def delete_all_png():# 获取指定目录中所有后缀名为".png"的文件列表png_files = glob.glob(os.path.join(directory, "*.png"))# 遍历文件列表,逐个删除文件for png_file in png_files:try:os.remove(png_file)print(f"已删除文件:{png_file}")except OSError as e:print(f"删除文件时出错:{e}")def func_seal(background,stamp,ret_name,x,y):'''print("seal satrt")print(background)print(stamp)print(ret_name)'''imageA = Image.open(stamp)#章imageB = Image.open(background)#表# 将图像A的背景色设置为透明imageA = imageA.convert("RGBA")datas = imageA.getdata()newData = []for item in datas:if item[0] == 255 and item[1] == 255 and item[2] == 255:newData.append((255, 255, 255, 0))else:newData.append(item)imageA.putdata(newData)# 在图像B上粘贴图像A,并将B的背景色设置为A的透明区域的背景色imageB.paste(imageA, (x, y), imageA)newImage = Image.new("RGBA", imageB.size, (255, 255, 255, 255))newImage.paste(imageB, (0, 0), imageB)# 保存新图像newImage.save(ret_name, "PNG")return ret_name
4.文本生成盖章内容模块
import requests
import urllib.parse
from PIL import Imagedef func_get_stamp_png(name):# 定义API的地址if len(name) == 0:returnout_put_name = "./output/stamp/"+name+".png"url = "http://www.yinzhang8.com.cn/seal/index.php?name="url += urllib.parse.quote(name)url += "&type=1"# 发送HTTP请求response = requests.get(url)print(response.status_code)#print(response.text)print(type(response))# 将返回的二进制数据保存为本地文件with open(out_put_name, "wb") as f:f.write(response.content)# 打开图片文件img = Image.open(out_put_name)# 获取图片的宽度和高度width, height = img.size# 计算需要裁剪的高度crop_height = int(height * 0.1)# 裁剪图片cropped_img = img.crop((0, 0, width, height - crop_height))# 覆盖保存原始文件cropped_img.save(out_put_name)
相关文章:
【Python】自动完成手写字体图片贴入以及盖章工具
简介 该工具完成了如下功能: 1.将文字转换为手写体填入到模板文件中 2.自动将文字转换为盖章格式填入到模板文件中 3.字体格式可以替换 4.有配置文件进行扩展功能 功能模块 1.界面模块 import sys from PyQt5.QtWidgets import QApplication, QMessageBox, QWid…...

基于Xml方式Bean的配置-初始化方法和销毁方法
SpringBean的配置详解 Bean的初始化和销毁方法配置 Bean在被实例化后,可以执行指定的初始化方法完成一些初始化的操作,Bean在销毁之前也可以执行指定的销毁方法完成一些操作,初始化方法名称和销毁方法名称通过 <bean id"userService…...

实时更新进度条:JavaScript中的定时器和异步编程技巧
前言 在Web开发中,有许多场景需要实时地更新页面上的进度,例如上传文件、数据处理等。本文将介绍如何利用JavaScript中的定时器和异步编程技巧来实现实时更新进度,并探讨一些其他解决方案。 处理进度实时更新: 利用异步编程实现实…...

【简单图论】CF898 div4 H
Problem - H - Codeforces 题意: 思路: 手玩一下样例就能发现简单结论: v 离它所在的树枝的根的距离 < m 离这个根的距离时是 YES 否则就是NO 实现就很简单,先去树上找环,然后找出这个根,分别给a 和…...

【大虾送书第十一期】适合新手自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》
目录 🥮写在前面 🥮内容简介 🥮读者对象 🥮专家推荐 🥮目录 🥮文末福利 🦐博客主页:大虾好吃吗的博客 🦐专栏地址:免费送书活动专栏地址 写在前面 CTF比赛是快…...

IDEA安装离线插件后重启无法打开
解决方法 1.找到插件安装目录删除插件 插件的位置一般在C:\Users\19058\AppData\Roaming\JetBrains\IntelliJIdea2021.1\plugins 高亮部分是自己电脑的用户位置,把报错前的刚才最新安装的插件删除,再尝试打开idea即可解决该问题 2.补充说明 AppData是个隐…...
论软件的可靠性设计
摘要 2021年6月,我所在的公司中标某集团保险大数据平台一体化研发项目,该项目总投资2000万人民币,项目周期为2年,通过该项目,搭建该集团保险大数据平台,一方面将全国所有保险业务全部入库并保存࿰…...

AG35学习笔记(一):debug串口抓取模组log、debug串口测试AT指令、echo命令通过串口发送16进制数据
目录 一、概述二、抓取模组log2.1 硬件接口2.2 用户登录2.3 相关指令 三、测试AT指令3.1 查看端口3.2 进入模式 四、串口发16进制echo使用 一、概述 二、抓取模组log 在之前记录了通过USB,使用移远工具Qwinlog来抓取log(3.3 抓取模组log)。…...

Python进阶学习----一闭三器
目录 编辑 前言 一.三器 1. 迭代器(Iterator) 1.1 什么是可迭代对象 1.2什么是迭代器 1.3案例演示: 以下是一个简单的迭代器示例,遍历一个列表并打印每个元素: 1.4迭代器总结 2. 生成器(Generat…...
C/S架构学习之TCP客户端
TCP客户端的实现流程:一、创建套接字(socket函数):通信域选择IPV4网络协议、流式套接字; int sockfd socket(AF_INET,SOCK_STREAM,0); 二、填充服务器的网络信息结构体(struct sockaddr_in serveraddr&…...

系统集成|第十二章(笔记)
目录 第十二章 沟通管理12.1 沟通的基本概念12.2 主要过程12.2.1 规划沟通管理12.2.2 管理沟通12.2.3 控制沟通 12.3 常见问题 上篇:第十一章、项目人力资源管理 第十二章 沟通管理 沟通管理在项目计划、执行、监控过程中具有重要的作用,项目经理应该拿…...

图神经网络(GNN)最新顶会论文汇总【附源码】
得益于强大的建模和分析能力,图神经网络(GNN)在社交网络分析、推荐系统、知识图谱、文本分析、等诸多领域得到了广泛的应用,目前已成为了人工智能领域的热门研究方向。 在今年的各大顶会获奖论文中,图神经网络相关的论…...

【算法】算法设计与分析 课程笔记 第二章 递归与分治策略
2.1 递归 直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。 2.1.1 阶乘 首先得想到一个求阶乘的函数: 这个函数的下面那个式子就用到了调用自身,所以可以用递归来实现,将主问题拆分成若干层的子问题&am…...

Java客户端_Apache Curator操作Zookeeper
Curator是 Netflix公司开源的一套ZooKeeper客户端框架。和ZkClient一样,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和 NodeExistsException异常等,目前已经成为了Apache的顶级项目,是全世界范围…...

14:00面试,14:07就出来了,问的问题有点变态
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,…...

《你好,C语言》:从另一个视角学习并重新审视C语言的意义
《你好,C语言》:从另一个视角学习并重新审视C语言的意义 尽管C语言诞生了这么多年,但是它依然活跃在开发者一线,不可否认的是C语言的确有它独特的魅力。本文将从一个全新的视角,重新带领大家学习领悟C语言的奥秘&#…...

信创之国产浪潮电脑+统信UOS操作系统体验1:硬件及软件常规功能支持情况介绍
一、引言 由于公司要求支持国产信创,最近办公的笔记本电脑换成了软硬件全国产,由于国产操作系统是在开源linux基础上演进的,在换之前,非常担心操作不方便,周边应用软件少,功能差,内心是比较抗拒…...

JAVA学习-全网最详细
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...

基于物联网的农村地区智能微电网系统(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

JavaScript系列从入门到精通系列第九篇:JavaScript中赋值运算符和关系运算符以及Unicode编码介绍
一:赋值运算符 1: 右侧的值可以赋值给左侧的变量。 var a 123; console.log(a);//123 2: var a 10; a a 5; a 5; 上边这两个写法是一样的。 3:- var a 10; a a-5; a - 5; 上边这两个写法是一样的。 4:* …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...