把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("
转换为图片",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尺寸页面以便打印

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

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

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容