【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:* …...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
