把PDF文件A3页面批量分割为两张A4页面进而方便打印。

1,423 阅读2分钟

最近遇到一个问题:学校老师发来打印的学案是A3尺寸的PDF文件,可是家用打印机只能打印A4纸,如果缩印的话,学案文字太小,看不清楚。 到网上搜了一阵子,发现解决办法大概以下几种:

  • 将pdf逐页转换为图片,然后用PhotoShop等图片处理软件剪裁;
  • 使用专业软件“A-PDF Page Cut”可以方便的一分为二,但是需要花钱买注册码;
  • 使用急速pdf等软件对着软件自带的标尺逐页剪裁。 作为一个野生穷懒码农,以上方式都不能满足要求。写程序那点事不就是Ctrl-C、Ctrl-V嘛,网上找了几段代码,用Python加以实现。 思路是:先利用pymupdf包将PDF自动逐页转化为png图片,然后用Pillow包自动将图片一分为二。下面就简单了,既可以将分割好的图片合并为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)

原文件

切割后的样子 打完收工。