文学起点网
当前位置: 首页 文学百科

可以做公司公章的软件(一个非常实用的加盖电子公章的工具)

时间:2023-06-20 作者: 小编 阅读量: 2 栏目名: 文学百科

据客户说,每年都为此消耗大量的A4纸,而且需要人工处理,长期积累下来也浪费了大量的人力成本。该客户想直接为它的客户发带公章的pdf文件,这样一年能节省不少的成本。网上大部分的案例都是单向通信,即子线程将处理的结果或其他信息传回主线程。本质上,在主线程中使用`emit`,那么就是主线程向子线程发送信号,在子线程中使用`emit`就是子线程向主线程发送信号。

大家好,我是野生程序员一灯。

今天分享一个python开发的小GUI项目:电子签章器。

客户的需求是这样的:

客户是一个不小的中药生产和批发企业,每天都需要为它的客户提供大量的药品质量检测纸质文件,并且需要在纸质上加盖公章。据客户说,每年都为此消耗大量的A4纸,而且需要人工处理,长期积累下来也浪费了大量的人力成本。该客户想直接为它的客户发带公章的pdf文件,这样一年能节省不少的成本。只需要一个员工,通过一个桌面软件,批量选择word文件,并且可随时选择电子公章文件(pdf格式),直接将word文件转成pdf并自动加盖公章。

这个需求有几个关键点:

1、考虑到word的格式有doc和docx,这里可以使用win32com,同时非常方便地将word转成pdf;

2、将word转成pdf后,为pdf加盖公章,本质上是加水印的行为,在代码中的逻辑是两页pdf叠加在一起;

3、使用pyqt6,为了提高使用体验,需要使用多线程,即UI线程和业务线程分开,避免在处理文件时UI界面僵死。

成品的样子

打包后的样子

word处理部分的核心代码

from win32com.client import Dispatchimport osclass WordHandler:def __init__(self, file, only_read=True):self.file = fileself.only_read = only_readself.word = Dispatch('kwps.Application')self.word.Visible = 0self.word.DisplayAlerts = 0self.doc = self.__open()def __open(self):doc = self.word.Documents.Open(self.file, ReadOnly=self.only_read)return docdef save_as_pdf(self):suffix = os.path.splitext(self.file)[-1]if suffix == '.doc':save_to = self.file.replace('.doc', '.pdf')elif suffix == '.docx':save_to = self.file.replace('.docx', '.pdf')self.doc.ExportAsFixedFormat(save_to, 17)return save_todef close(self):self.doc.Close()def quit(self):self.word.Quit()

啰嗦一句,在word转pdf这里,`ExportAsFixedFormat`是`Document`的方法(Open方法返回的是一个Document对象),除了这个方法,也有`SaveAs`和`SaveAs2`方法可以实现,它们是`Application`的方法,即它们是客户端提供的方法,对应着客户端 -> 文件 -> 另存为。

pdf加水印部分

这里使用`PyPDF2`,这是个声名在外的库了,无需多介绍,这里只分析加水印最基本的逻辑。

1、使用`PdfFileReader`分别打开水印pdf文件和要处理的pdf文件

2、水印文件只需要一页就ok,所以要使用PdfFileReader.getPage(0)来获取到第一页;

3、使用`PdfFileWriter`创建一个新的pdf对象,用来保存最后处理的结果

3、要处理的pdf文件在打开后,按照页数循环,逐个循环,将循环到的单页和水印单页合并,然后保存到`PdfFileWriter`所创建的对象中

至此,添加水印的工作便完成了。

pyqt的多线程部分

其实整个需求中,最耗费时间的应该是pyqt的多线程这部分了,使用多线程可以将UI线程和业务线程有效地分开,好处多多。先捋一捋最基本的流程。

1、点击签章后,手动开启一个子线程,UI主线程需要将1和2的数据传递到子线程

2、子线程拿到数据后,就开始工作,并且每完成一个文件,还需要将信号发回到主线程,主线程可以告知用户处理的进度

3、所有文件处理完毕时,手动关闭子线程

这是子线程的核心代码

class MyDocumentThread(QObject):# 发送信号signal_for_send = pyqtSignal(str)# 接收信号 接收一个文件列表signal_for_accept = pyqtSignal(list)def __init__(self, parent=None):super(MyDocumentThread, self).__init__()self.lock = QMutex()def work(self, file_list):"""文档处理逻辑"""print('子线程接受到的数据:', file_list)# 上锁self.lock.lock()temp_pdf_list = []for file in file_list[0]:pdf_file = word2pdf(file)temp_pdf_list.append(pdf_file)# 发送信号给UI主线程print('pdf处理后', temp_pdf_list)self.lock.unlock()# 将temp_pdf_list增加水印self.lock.lock()for index, pdf in enumerate(temp_pdf_list, 1):done = add_mark(pdf, file_list[-1])print(index, pdf)if done == 'success':self.signal_for_send.emit(f'{pdf}处理完成...')if index == len(temp_pdf_list):self.signal_for_send.emit('done')# 删除临时文件self.lock.unlock()

注:

官方强烈推荐使用QObject来自定义自己的线程,在该线程中实现自己的业务逻辑,而非在QThread中实现执行业务逻辑。所以以上逻辑在继承QObject来实现的,并且在实例化自定义自定义线程时,需要手动实例化一个QThread,使用moveToThread将自定义线程对象交给QThread对象来处理。

关于pyqt的多线程,既有官网文档,也有各界道友的各种实现,我这里也说说自己的心得。

1、根据以上的描述,主线程和子线程需要双向通信,我们都知道,使用`pyqtSignal`可以通信,这是一个发送信号的方法,但如何实现双向通信呢?网上大部分的案例都是单向通信,即子线程将处理的结果或其他信息传回主线程。这里我们需要注意到一个关键的动作,即:`pyqtSignal().emit()`,这是发送信号的工作,如何双向通信呢?本质上,在主线程中使用`emit`,那么就是主线程向子线程发送信号,在子线程中使用`emit`就是子线程向主线程发送信号。要注意的是,需要提前定义好这两种信号,发送时可以在需要的地方执行`emit`就可以了。

根据子线程传回的信号,向用户展示“全部处理完成”

2、如何在使用多线程

(1)以上的代码仅仅是核心代码,是实现多线程的方法,但是如何在pyqt整个流程中调用呢?这里谈谈关键点,首先要在初始化界面时,实例化咱们自定义好的线程对象。

(2)在点击签章时,才开启线程

有些道友在处理化界面时就启动了线程,其实要看具体需求哈,手工控制线程的启动和关闭,可以实现软件循环使用,比如处理完一批软件文档时,接着可以处理第二批,这就是手工控制的好处。如果在界面初始化自动开启线程,那么关闭后就无法再开线程了,得关闭软件才能再次开启。

好啦,今天的分享就到此为止。欢迎私信交流。

    推荐阅读
  • 荷塘月色简笔画彩图(荷塘的场景图简笔画)

    今日份简笔画荷塘月色.感恩日记1.,我来为整理几张简单漂亮的荷塘月色简笔画彩图?以下简笔画图片总有一款是你喜欢的,希望对你有帮助来看看吧!荷塘月色简笔画彩图今日份简笔画荷塘月色.感恩日记1.荷塘月色好看的儿童画图片儿童简笔画大全荷塘月色简笔画儿童画

  • 直硬头发软化前后效果图(头发软化前后效果图)

    可以使头发变软,变柔顺,变贴服,且价格也很便宜,普通的美发沙龙价格为50到80元左右,软化比较自然。头发软化后几天可以洗刚做完软化2至3天不要洗头,刚做完软化不要用力拉头发,会有损发质和效果。软化也是伤头发的,不过比不停地做一次性夹头发而言小很多,如果是短发做软化还是不错的。如果想让头发蓬蓬的,最好不要全头做软化,甚至不建议做软化。具体情况,建议咨询理发师。用药水要用好一点的,对头发伤害才不会很大。

  • 赞美运动员的话(赞美运动员的话有什么)

    年轻的我们自信飞扬,青春的气息如同出生的朝阳,蓬勃的力量如同阳光的挥洒此时此刻,跑道便是我们精彩的舞台,声声加油便是我们最高的奖项论何成功,谈何荣辱,心中的信念只有一个:拼搏,我来为大家科普一下关于赞美运动员的话?赞美运动员的话年轻的我们自信飞扬,青春的气息如同出生的朝阳,蓬勃的力量如同阳光的挥洒。所有的努力都是为了迎接这一刹那,所有的拼搏都是为了这一声令下。

  • 长安uni-k车主反映这款车怎么样(新车长安UNI-K登场)

    据长安汽车最新消息,中大型SUVUNI-K官图曝光,这是长安UNI系列的第二款车型。新车将搭载蓝鲸系列2.0T发动机并匹配8AT变速箱,将于广州车展首发亮相。新车亮点1.采用了全新的“V”型面设计和无边界格栅。新车概况新车前脸依然采用无边界设计并融入了V型面概念,不同于UNI-T,UNI-K的大灯位置设计在了最上方。车尾方面采用了时下流行的贯穿式尾灯设计,与UNI-T的V型后导流造型不同,UNI-K采用了新的航天器式造型,立式尾灯十分显眼。

  • 渡劫经典语录(关于渡劫的语录精选)

    情到深处人孤独,爱至穷时尽沧桑堕落的天使啊,你无知的游走着。我将于茫茫人海中访我唯一灵魂之伴侣;得之,我幸;不得,我命。玲珑骰子安红豆,入骨相思君知否。于千万人之中遇见你所遇见的人,于千万年时间无涯的荒野里,没有早一步,也没有晚一步,刚巧赶上了。生命是一朵千瓣莲花,我拒绝了绽放的同时,我也拒绝了枯萎和零落。就算哭泣也要皱眉优雅,就算失败也要转身潇洒。之后我也学会了阳奉阴违,发生了什么与我再无所谓。

  • 孤城闭什么时候上映(谁是主演)

    以下内容大家不妨参考一二希望能帮到您!孤城闭什么时候上映《孤城闭》将于2020年起在湖南卫视上映播出。该剧主要由王凯、江疏影、任敏、杨玏、边程、叶祖新、喻恩泰、王楚然、刘钧、孙坚等主演。《孤城闭》改编自米兰lady同名小说,以北宋为背景,在风起云涌的朝堂之事与剪不断理还乱的儿女情长之间,还原了一个复杂而真实的宋仁宗。

  • 大众朗逸所有灯图解(认识汽车灯图解)

    大众朗逸所有灯图解作为新手,汽车灯光就是一道难题,下面我们一起通过图解来认识一下汽车各种灯光吧。双闪灯的作用是当车辆发生意外情况后,引起其他车辆警惕,防止发生追尾事故。当踩下制动踏板后,制动灯立即亮起,并发出红色灯光,提醒后方车辆。倒车灯是白色,作用是为了照亮车尾的路面,减少倒车时盲区,另外也是对后方的提醒。

  • 雪里红的腌制方法(做雪里红腌菜的步骤)

    下面更多详细答案一起来看看吧!雪里红的腌制方法雪里红摘干净,根部用刀劈开,正一层反一层放入盆中,取盐均匀地洒在雪里红上,腌制1-2天。烧开水放凉,加盐,搅拌均匀,盐水倒入雪里红中泡制一天。泡好的雪里红捆成一小捆放入密封罐,倒入泡雪里红的盐水,盖好密封罐,即吃即取。

  • 郑州婚纱照推荐哪家好(郑州拍婚纱照团购)

    中国红喜嫁秀爆朋友圈的婚纱照中式婚纱照新中式婚纱照婚纱照风格高级感婚纱照婚纱照秀禾服的中式嫁衣,是完美诠释了东方女性温婉古典美。让人完全移不开目光~每一个女孩子都应该拥有这样华丽的喜嫁风太精致完全属于中式婚纱照的浪漫感~

  • 胎梦最准的位置(从胎梦看看你腹中的孩子给你暗示了吗)

    估计生完孩子和正在孕期的妈妈都会经历过这种事情,就是我们会经常做梦,而且会梦见一些动物植物什么的,这在老人眼里属于“胎梦”。你梦见的什么会预示着即将出生的宝宝是男孩还是女孩。你的胎梦准不准,来看看一下别人的胎梦。哈哈,看来有些胎梦还是挺准的,或许都是巧合吧,总之,宝宝来了就是我们的命中注定。