python PDF中每页都调整成页面大小一致
将PDF中每页都调整成页面大小一致,方便打印。
·
需要安装的库:
pip install fitz -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install PyMuPDF==1.18.14 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install img2pdf -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
程序:(运行一次生成一个pdf)
import fitz,os,img2pdf
file_path = r'C:\xx.pdf' # PDF 文件路径
dir_path = 'C:/Users/Desktop/output/output/' # 存放图片的文件夹
def pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle): # zoom_x, zoom_y可以用来调整生成的图片的大小
# 打开PDF文件
pdf = fitz.open(pdfPath)
# 逐页读取PDF
for pg in range(0, pdf.pageCount):
page = pdf[pg]
# 设置缩放和旋转系数
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
pm.writePNG(imgPath + str(pg).zfill(3) + ".png")
print(imgPath + str(pg).zfill(3) + ".png")
pdf.close()
# def pic2pdf(img_dir):
# doc = fitz.open()
# for img in sorted(glob.glob("{}/*".format(img_dir))): # 读取图片,确保按文件名排序
# print(img)
# imgdoc = fitz.open(img) # 打开图片
# pdfbytes = imgdoc.convertToPDF() # 使用图片创建单页的 PDF
# imgpdf = fitz.open("pdf", pdfbytes)
# doc.insertPDF(imgpdf) # 将当前页插入文档
# if os.path.exists("allimages.pdf"):
# os.remove("allimages.pdf")
# doc.save("allimages.pdf") # 保存pdf文件
# doc.close()
def from_photo_to_pdf(photo_path):
# 1、生成地址列表
photo_list = os.listdir(photo_path)
photo_list = [os.path.join(photo_path, i) for i in photo_list][0:-1]
print(photo_list)
# 1、指定pdf的单页的宽和高
# A4纸张
a4inpt = (img2pdf.mm_to_pt(210), img2pdf.mm_to_pt(297))
# 我的自定义:
# a4inpt = (img2pdf.mm_to_pt(720), img2pdf.mm_to_pt(1080))
layout_fun = img2pdf.get_layout_fun(a4inpt)
with open(photo_path+'/1result.pdf', 'wb') as f:
f.write(img2pdf.convert(photo_list, layout_fun=layout_fun))
if __name__ == '__main__':
# 将pdf转图片
pdf_image(file_path, dir_path, 10, 10, 0)
# 将图片合成pdf
# pic2pdf(dir_path)
from_photo_to_pdf(dir_path)
批量生成pdf:
import fitz,os,img2pdf
dir_path = 'C:/Users/DOUH/Desktop/pdf批量改页面大小/output/output/' # 存放图片的文件夹
PDFDIR_intput = "C:/Users/DOUH/Desktop/pdf批量改页面大小/output/AI-Lab 课件资料打印装订版_20230111/Training materials/" # 原始PDF存放的路径
PDFDIR_output = "C:/Users/DOUH/Desktop/pdf批量改页面大小/outputPDF/" # pdf导出后存放的路径
def pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle):
# 打开PDF文件
pdf = fitz.open(pdfPath)
# 逐页读取PDF
for pg in range(0, pdf.pageCount):
page = pdf[pg]
# 设置缩放和旋转系数
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
pm.writePNG(imgPath + str(pg).zfill(3) + ".png")
print(imgPath + str(pg).zfill(3) + ".png")
pdf.close()
def from_photo_to_pdf(photo_path,pdfName):
# 1、生成地址列表
photo_list = os.listdir(photo_path)
photo_list = [os.path.join(photo_path, i) for i in photo_list][0:-1]
print(photo_list)
# 1、指定pdf的单页的宽和高
# A4纸张
a4inpt = (img2pdf.mm_to_pt(210), img2pdf.mm_to_pt(297))
# 我的自定义:
# a4inpt = (img2pdf.mm_to_pt(720), img2pdf.mm_to_pt(1080))
layout_fun = img2pdf.get_layout_fun(a4inpt)
with open(PDFDIR_output+pdfName, 'wb') as f:
f.write(img2pdf.convert(photo_list, layout_fun=layout_fun))
if __name__ == '__main__':
# # 将pdf转图片
# pdf_image(file_path, dir_path, 10, 10, 0)
#
# # 将图片合成pdf
# from_photo_to_pdf(dir_path)
for filename in os.listdir(PDFDIR_intput):
if filename[-3:] == "pdf":
pdf_image(PDFDIR+filename, dir_path, 10, 10, 0)
from_photo_to_pdf(dir_path,filename)
# 清空所有图片(每生成一次pdf,就将转出的所有图片清空)
for pngname in os.listdir(dir_path):
os.remove(dir_path+pngname)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献15条内容
所有评论(0)