当前位置: 首页 > news >正文

【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在被实例化后&#xff0c;可以执行指定的初始化方法完成一些初始化的操作&#xff0c;Bean在销毁之前也可以执行指定的销毁方法完成一些操作&#xff0c;初始化方法名称和销毁方法名称通过 <bean id"userService…...

实时更新进度条:JavaScript中的定时器和异步编程技巧

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

【简单图论】CF898 div4 H

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

【大虾送书第十一期】适合新手自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

目录 &#x1f96e;写在前面 &#x1f96e;内容简介 &#x1f96e;读者对象 &#x1f96e;专家推荐 &#x1f96e;目录 &#x1f96e;文末福利 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 CTF比赛是快…...

IDEA安装离线插件后重启无法打开

解决方法 1.找到插件安装目录删除插件 插件的位置一般在C:\Users\19058\AppData\Roaming\JetBrains\IntelliJIdea2021.1\plugins 高亮部分是自己电脑的用户位置&#xff0c;把报错前的刚才最新安装的插件删除&#xff0c;再尝试打开idea即可解决该问题 2.补充说明 AppData是个隐…...

论软件的可靠性设计

摘要 2021年6月&#xff0c;我所在的公司中标某集团保险大数据平台一体化研发项目&#xff0c;该项目总投资2000万人民币&#xff0c;项目周期为2年&#xff0c;通过该项目&#xff0c;搭建该集团保险大数据平台&#xff0c;一方面将全国所有保险业务全部入库并保存&#xff0…...

AG35学习笔记(一):debug串口抓取模组log、debug串口测试AT指令、echo命令通过串口发送16进制数据

目录 一、概述二、抓取模组log2.1 硬件接口2.2 用户登录2.3 相关指令 三、测试AT指令3.1 查看端口3.2 进入模式 四、串口发16进制echo使用 一、概述 二、抓取模组log 在之前记录了通过USB&#xff0c;使用移远工具Qwinlog来抓取log&#xff08;3.3 抓取模组log&#xff09;。…...

Python进阶学习----一闭三器

目录 ​编辑 前言 一.三器 1. 迭代器&#xff08;Iterator&#xff09; 1.1 什么是可迭代对象 1.2什么是迭代器 1.3案例演示&#xff1a; 以下是一个简单的迭代器示例&#xff0c;遍历一个列表并打印每个元素&#xff1a; 1.4迭代器总结 2. 生成器&#xff08;Generat…...

C/S架构学习之TCP客户端

TCP客户端的实现流程&#xff1a;一、创建套接字&#xff08;socket函数&#xff09;&#xff1a;通信域选择IPV4网络协议、流式套接字&#xff1b; int sockfd socket(AF_INET,SOCK_STREAM,0); 二、填充服务器的网络信息结构体&#xff08;struct sockaddr_in serveraddr&…...

系统集成|第十二章(笔记)

目录 第十二章 沟通管理12.1 沟通的基本概念12.2 主要过程12.2.1 规划沟通管理12.2.2 管理沟通12.2.3 控制沟通 12.3 常见问题 上篇&#xff1a;第十一章、项目人力资源管理 第十二章 沟通管理 沟通管理在项目计划、执行、监控过程中具有重要的作用&#xff0c;项目经理应该拿…...

图神经网络(GNN)最新顶会论文汇总【附源码】

得益于强大的建模和分析能力&#xff0c;图神经网络&#xff08;GNN&#xff09;在社交网络分析、推荐系统、知识图谱、文本分析、等诸多领域得到了广泛的应用&#xff0c;目前已成为了人工智能领域的热门研究方向。 在今年的各大顶会获奖论文中&#xff0c;图神经网络相关的论…...

【算法】算法设计与分析 课程笔记 第二章 递归与分治策略

2.1 递归 直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。 2.1.1 阶乘 首先得想到一个求阶乘的函数&#xff1a; 这个函数的下面那个式子就用到了调用自身&#xff0c;所以可以用递归来实现&#xff0c;将主问题拆分成若干层的子问题&am…...

Java客户端_Apache Curator操作Zookeeper

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

14:00面试,14:07就出来了,问的问题有点变态

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

《你好,C语言》:从另一个视角学习并重新审视C语言的意义

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

信创之国产浪潮电脑+统信UOS操作系统体验1:硬件及软件常规功能支持情况介绍

一、引言 由于公司要求支持国产信创&#xff0c;最近办公的笔记本电脑换成了软硬件全国产&#xff0c;由于国产操作系统是在开源linux基础上演进的&#xff0c;在换之前&#xff0c;非常担心操作不方便&#xff0c;周边应用软件少&#xff0c;功能差&#xff0c;内心是比较抗拒…...

JAVA学习-全网最详细

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

基于物联网的农村地区智能微电网系统(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

JavaScript系列从入门到精通系列第九篇:JavaScript中赋值运算符和关系运算符以及Unicode编码介绍

一&#xff1a;赋值运算符 1&#xff1a; 右侧的值可以赋值给左侧的变量。 var a 123; console.log(a);//123 2&#xff1a; var a 10; a a 5; a 5; 上边这两个写法是一样的。 3&#xff1a;- var a 10; a a-5; a - 5; 上边这两个写法是一样的。 4&#xff1a;* …...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...