使用python合并发票

需求背景:

1.在网上下载的电子发票,需要打印,然后一张一张打开之后,打印比较费劲,如果能把所有的电子发票,合并成一个pdf文件,那么一次打开并打印的操作就能完成所有的发票的打印了。
合并多个发票的pdf

2.打印出来的发票,通常是一张的A4大小,横着打印的话,发票就看起来很大。竖着打印的话,会浪费纸张,如果能把两张发票合并到一张纸上就好了。
两页合并为一夜
在看了PyMuPDF的示例代码之后,写了下面代码,完成了1和2的需求,其中在合并为一页的过程中,为例避免竖向的“发票商品明细”字太小,自动将其转变为横向的。
注释很烂……

from __future__ import print_function
import fitz, sys
import os

NewDir=r"E:\File\2022-11\temp"  #working director

fnames=[]  #to read files
for i in os.scandir(NewDir):
    if (i.is_file() and i.name.endswith(".pdf")):
        fnames.append(i.name)

src = fitz.open()
for name in fnames:
    read_pdf = fitz.open(NewDir+'\\'+name)
    src.insert_pdf(read_pdf)

doc = fitz.open()                      # empty output PDF

width, height = fitz.paper_size("a4")   # A4 portrait output page format
r = fitz.Rect(0, 0, width, height)

# 定义两个矩形
rx = r * 0.706651
r1 = fitz.Rect(0,0,r.width,rx.width)
r2 = fitz.Rect(0,rx.width,r.width,r.height)

# put them in a list
r_tab = [r1, r2]

# 现在将输入页面复制到输出
for spage in src:
    
    if spage.number % 2 == 0:           # create new output page
        page = doc.new_page(-1,
                      width = width,
                      height = height)
    if spage.rect.width > spage.rect.height:
        # 将输入页插入正确的矩形
        page.show_pdf_page(r_tab[spage.number % 2],    # select output rect
                         src,               # input document
                         spage.number,
                         rotate=0)      # input page number
    else:
        # 将输入页插入正确的矩形
        page.show_pdf_page(r_tab[spage.number % 2],    # select output rect
                         src,               # input document
                         spage.number,
                         rotate=90)      # input page number

# by all means, save new file using garbage collection and compression
doc.save(NewDir+'\\'+"output.pdf", garbage = 4, deflate = True)

需要安装 fitz,PyMuPDF两个库,才能使用。
将需要合并的发票,放在一个空的文件夹之后,修改代码中的路径就可以了。

后续加了一个界面,方便使用:
在这里插入图片描述

核心的代码还是上面那部分,就不上代码了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值