最近遇到一个问题:学校老师发来打印的学案是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("
转换为图片",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)



© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END
















暂无评论内容