需求背景:
1.在网上下载的电子发票,需要打印,然后一张一张打开之后,打印比较费劲,如果能把所有的电子发票,合并成一个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两个库,才能使用。
将需要合并的发票,放在一个空的文件夹之后,修改代码中的路径就可以了。
后续加了一个界面,方便使用:
核心的代码还是上面那部分,就不上代码了。