律师平日来往律所、公检法、客服处,总免不了发生一点交通费。
虽然各类APP都可以开具电子发票,但实际报销时一般仍需要打印成纸质文件。如果拖到月底一次性报销,也要花费不少工作量。作为一名“爱偷懒”的律师,上次和大家分享了利用编程实现网上调档时“一键打包下载”,具体可参见《律师如何利用简易编程避免重复劳作》一文,这次我们来说说怎么用Python实现批量自动化打印,以滴滴打车为例。一、登录邮箱,下载邮件附件
在滴滴出行APP中,可以对已完成的订单申请开票,并将电子发票发送至邮箱,发件人为“<didifapiao@mailga;”,附件为“滴滴电子发票.pdf”。对于每一张单独开具的发票,都会收到一封邮件。
网上关于读取、下载邮件的轮子有很多,就不再重复造了,直接照抄一个也能用,主要涉及到python自带的email和poplib库。
此处有两点需要注意:
1.由于是通过POP3协议获取邮箱内容的,所以自己的邮箱需要先开通POP3服务,以及使用授权码作为登录密码。
2.POP3协议收取服务器中的邮件时,会在服务器端删除所收取的信件。所以还要视情况对个人邮箱设置“禁止收件软件删信”、“保留备份”等,以免误删信件。
二、下载PDF文件后进行打印
所有附件的名称都叫“滴滴电子发票.pdf”,为了避免文件名重复、文件覆盖等问题,我们选择“下载发票-打印发票-删除文件”这样循环操作的方式。
Win32api库提供了使用python语句调用Windows API的功能,其中ShellExecute语句可以用来执行windows程序,比如打开文件-open,打印文件-print等。所以这里的ShellExecute语句就相当于“在指定路径(桌面)对文件(滴滴电子发票.pdf)执行打印”操作,在执行语句的过程中就不用鼠标键盘了,方便自动化。
需要注意的是,语句执行时会跳出Acrobat窗口(这台电脑上安装了Adobe Acrobat Pro来阅读PDF文件),但不会自动关闭,所以还需要通过os.system-taskkill关闭Acrobat进程。
三、满足纸质大小、送纸纸盒等特殊要求
一开始,我们用A4纸把电子发票打印出来即可,法务秘书会统一裁剪并粘贴在报销申请表上。后来,财务人员购买了专用的发票纸张(120mm*210mm),固定放在“手送纸盘”内。因此打印时还需要满足纸质大小、送纸纸盒等特殊需求,遇到了许多实际问题。
1.自定义纸张大小和送纸纸盒
第一种办法是直接更改打印机的首选项,把尺寸、纸盘调整为需要的选项。
不过这样一来,打印其他材料时还需要把打印设置更改回A4纸、自动选择纸盘等。考虑到打印发票的需求不是那么频繁,所以还是不动首选项了。可以通过python在需要打印发票时,才去自定义打印设置。打印完毕后,再将首选项调整回初始状态。
Win32api其中的win32print模块可以获取并修改打印机的属性。首先获取打印机的默认属性:
得到PaperSize=9,DefaultSource=15,也就是说A4纸大小对应的编号是9,自动选择纸盘的编号是15。接下来手动把打印机首选项修改为120mm*210mm纸张大小、手送纸盘。重新获取打印机属性后,PaperSize=200,DefaultSource=4。
这样一来,用win32方法,就可以在打印之前设置好特定的属性,而在打印完毕后恢复默认设置了。
2.打印时的缩放问题
本来以为调好纸张大小和纸盘便大功告成,但是按照上述程序打印出来的发票却是下面这种“缺胳膊少腿”的样子:
研究了一番,发现是“页面缩放方式”的问题。PDF文件打印时默认的缩放方式是“无”,而非“适合可打印的区域”,无法进行自动缩放。当PDF页面大于打印纸时,就会被截掉一部分内容。
由于我们打印文件时使用win32a语句,在打印时除了事先设定好的属性以外,是没有办法做其他调整的(win32print调整打印机的Scale参数不知为何没有实际作用),所以要想想有没有别的方法。
(1)首先想到的是把PDF文件转换为图片格式,如.png/.jpg等,看看图片打印时的默认缩放方式是怎么样的。安装pdf2image库,把PDF转换为png格式,打印试试。
显然,默认的“适应边框打印”又不是我们想要的,看来默认缩放方式老是跟我们过不去。关于这个问题还有网友向微软反映,问怎么取消默认勾选,得到的回复是“很抱歉”。
(2)格式转换不行,那只有从PDF本身入手了,直接调整“滴滴电子发票.pdf”的页面大小。安装PyPDF2库,对于PageObject对象有个scale方法,长宽均缩放到80%,再生成新的PDF文件。
哈哈,这次终于成功了!
2020年,笔者共报销滴滴出行发票141张。虽然用程序打印也没节省太多时间,不过对于设置打印机属性、调整文件大小的研究颇有乐趣,掌握了原理后就能应付各种特殊要求,把批量打印推广到很多其他的办公场景,比如二维码、宣传册、标书等等。当然,笔者对于python提升办公效率的理解和运用还是很初级的,欢迎各位读者交流指正。
文:邵洋
本文为星瀚原创,如需转载请先联系。
1.《怎么打印滴滴发票?我来告诉你答案Python X律师工作效率②:文件打印不用愁》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《怎么打印滴滴发票?我来告诉你答案Python X律师工作效率②:文件打印不用愁》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/3164067.html