最近遇到一个问题:学校老师发来打印的学案是A3尺寸的PDF文件,可是家用打印机只能打印A4纸,如果缩印的话,学案文字太小,看不清楚。
到网上搜了一阵子,发现解决办法大概以下几种:
- 将pdf逐页转换为图片,然后用PhotoShop等图片处理软件剪裁;
- 使用专业软件“A-PDF Page Cut”可以方便的一分为二,但是需要花钱买注册码;
- 使用急速pdf等软件对着软件自带的标尺逐页手动剪裁。
作为一个又懒又抠的野生码农,一直秉持的原则是:
- 能用免费开源的绝不用收费的;
- 能自己实现的就自己实现;
- 能自动的绝不手动。
所以,以上几个方式都不能满足要求。写程序那点事不就是Ctrl-C、Ctrl-V嘛,网上找了几段代码,用Python加以实现。
思路是:先利用pymupdf包将PDF页面按照1:1的比例自动转化为png图片,然后用Pillow包自动将图片从中间一分为二,那么理论上我们就应该能得到两张A4大小的图片了,然后按照文件名逐个保存。剩下的工作就简单了,既可以将分割好的图片合并为pdf文件,也可以直接批量打印图片。
具体代码如下:
import os
import fitz
from PIL import Image
import shutil
pdf_dir=[]
os.mkdir('1')
os.mkdir('2')
path = r'./1' #临时文件目录
path2 =r'./2' #结果文件目录
docunames = os.listdir()
for docuname in docunames:
if os.path.splitext(docuname)[1]=='.pdf':
pdf_dir.append(docuname)
for pdf in pdf_dir:
print(pdf)
doc = fitz.open(pdf)
pdf_name = os.path.splitext(pdf)[0]
print("====================================")
print("开始转换%s.PDF文档"%pdf_name)
print("====================================")
print("共",doc.pageCount,"页")
for pg in range(0,doc.pageCount):
print("\r转换为图片",pg+1,"/",doc.pageCount,end=";")
page=doc[pg]
rotate = int(0) #旋转角度
zoom_x=1.3
zoom_y=1.36
# zoom_x=2
# zoom_y=2
print("")
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pm= page.getPixmap(matrix=trans, alpha=False)
pm.writePNG(r'./1/'+str(pdf_name)+'-'+'{:02}.png'.format(pg))
print(path)
path_list = os.listdir(path)
for i in path_list: #截左半张图片
a = open(os.path.join(path,i),'rb')
img = Image.open(a)
w = img.width
h = img.height
print('正在处理图片',i,'宽',w,'长',h)
box = (0,0,w*0.5,h)
img = img.crop(box)
print('正在截取左半张图...')
img.save(os.path.join(path2,i+'a'+i))
for i in path_list: #截取右半张图片
a = open(os.path.join(path,i),'rb')
img = Image.open(a)
w = img.width
h = img.height
print('正在处理图片',i,'宽',w,'长',h)
box = (w*0.5,0,w,h)
img = img.crop(box)
print('正在截取右半张图...')
img.save(os.path.join(path2,i+'b'+i))
a.close()
shutil.rmtree(path)