把A3尺寸的PDF文件批量切割为两张A4尺寸页面以便打印

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

  • 将pdf逐页转换为图片,然后用PhotoShop等图片处理软件剪裁;
  • 使用专业软件“A-PDF Page Cut”可以方便的一分为二,但是需要花钱买注册码;
  • 使用急速pdf等软件对着软件自带的标尺逐页手动剪裁。
    作为一个又懒又抠的野生码农,一直秉持的原则是:
  1. 能用免费开源的绝不用收费的;
  2. 能自己实现的就自己实现;
  3. 能自动的绝不手动。
    所以,以上几个方式都不能满足要求。写程序那点事不就是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)
原来的样子

现在的样子
打完收工

你可能感兴趣的:(把A3尺寸的PDF文件批量切割为两张A4尺寸页面以便打印)