目录
图片转PDF
之前的一篇博客《Python合并拼接图片》,可对图片进行合并拼接
使用前需要安装PyMuPDF库,以下代码使用的PyMuPDF(1.23.6)
,以及自然排序库natsort(8.4.0)
文件夹所有图片转为1个PDF
python
import fitz
from glob import glob
from natsort import natsorted
def img2pdf_1(img_path, pdf_path, pdf_name):
"""
将文件夹中所有格式图片全部转换为一个指定名称的pdf文件,并保存至指定文件夹
:param str img_path: 待转换图片所在文件夹
:param str pdf_path: 转换后PDF保存文件夹
:param str pdf_name: 转换后PDF文件名,不含扩展名
"""
doc = fitz.open()
filepath = []
for x in [r'\*.jpg', r'\*.png']: # 获取所有格式的图片
filepath.extend(glob(img_path + x)) # 将列表元素追加到列表中
for img in natsorted(filepath): # 读取图片,确保按文件名按自然排序
imgdoc = fitz.open(img) # 打开图片
pdfbytes = imgdoc.convert_to_pdf() # 使用图片创建单页的 PDF
imgpdf = fitz.open('pdf', pdfbytes)
doc.insert_pdf(imgpdf) # 将当前页插入文档
doc.save(pdf_path + '\\' + pdf_name + '.pdf') # 保存pdf文件
doc.close()
print('转换完成')
文件夹指定图片转为1个PDF
python
import fitz
from natsort import natsorted
def img2pdf_2(img_path, pdf_path, img_list, pdf_name):
"""
将文件夹中指定1个或多个图片转换为1个指定名称的pdf文件,并保存至指定文件夹
:param str img_path: 待转换图片所在文件夹
:param str pdf_path: 转换后PDF保存文件夹
:param str img_list: 指定的图片文件名,含扩展名
:param str pdf_name: 转换后PDF文件名,不含扩展名
"""
doc = fitz.open()
pic_list = [img_path + '\\' + i for i in img_list]
for img in natsorted(pic_list): # 读取图片列表,确保按文件名排序
imgdoc = fitz.open(img)
pdfbytes = imgdoc.convert_to_pdf()
imgpdf = fitz.open('pdf', pdfbytes)
doc.insert_pdf(imgpdf)
doc.save(pdf_path + '\\' + pdf_name + '.pdf')
doc.close()
print('转换完成')
文件夹所有图片分别转为PDF
python
import fitz
from glob import glob
from natsort import natsorted
import os.path
def img2pdf_3(img_path, pdf_path):
"""
将文件夹中所有jpg图片分别转换为同一名称的pdf文件,并保存至指定文件夹
:param str img_path: 待转换图片所在文件夹
:param str pdf_path: 转换后PDF保存文件夹
"""
filepath = []
for x in [r'\*.jpg', r'\*.png']: # 获取所有格式的图片
filepath.extend(glob(img_path + x)) # 将列表元素追加到列表中
for img in filepath: # 读取图片
img_type = os.path.splitext(img)[1] # 获取图片格式,splitext分割文件路径名和扩展名
file_name = os.path.basename(img).replace(img_type, '.pdf') # 获取不含路径文件名,替换为pdf后缀名
doc = fitz.open()
imgdoc = fitz.open(img)
pdfbytes = imgdoc.convert_to_pdf()
imgpdf = fitz.open('pdf', pdfbytes)
doc.insert_pdf(imgpdf)
doc.save(pdf_path + '\\' + file_name)
doc.close()
print('转换完成')
举例
python
if __name__ == '__main__':
img_path = r'E:\测试\jpg\一眼丁真'
pdf_path = r'E:\测试\jpg\一眼丁真'
img_list = ['绎演丁真.jpg', '缢艳丁真.jpg']
img2pdf_1(img_path, pdf_path, '全部图片')
img2pdf_2(img_path, pdf_path, img_list, '2张图片')
img2pdf_3(img_path, pdf_path)
对《Python合并拼接图片》中同样的18张图片进行转换,转换前
img2pdf_1
转换结果
img2pdf_2
转换结果
img2pdf_3
转换结果,以及前2个的转换结果(选中)
PDF转图片
使用前需要安装PyMuPDF库,以下代码使用的PyMuPDF(1.23.6)
指定PDF转为图片
python
import fitz
import os.path
def pdf2png1(filename, outpath, zoom_x=1.25, zoom_y=1.25):
"""
指定PDF文件转换为图片,并保存至指定文件夹
:param str filename: 待转换的PDF文件,文件名含路径
:param str outpath: 转换后图片保存文件夹
:param int zoom_x: 图片横向缩放比例
:param int zoom_y: 图片纵向缩放比例
"""
save_name = os.path.basename(filename).replace('.pdf', '') # 获取不含路径文件名
save_name = outpath + '\\' + save_name
doc = fitz.open(filename) # 打开PDF文件,生成一个对象
rotate = int(0) # 设置图片的旋转角度,顺时针度数
trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
for pg in range(doc.page_count):
page = doc[pg]
pm = page.get_pixmap(matrix=trans, alpha=False)
if doc.page_count == 1:
pm.save(f'{save_name}.png')
else:
pm.save('{}-{:04d}.png'.format(save_name, pg))
doc.close()
print('转换完成')
文件夹所有PDF转为图片
python
import fitz
from glob import glob
import os.path
def pdf2png2(filepath, outpath, zoom_x=1.25, zoom_y=1.25):
"""
指定文件夹中所有PDF文件转换为图片,并保存至指定文件夹
:param str filepath: 待转换的PDF所在文件夹
:param str outpath: 转换后图片保存文件夹
:param int zoom_x: 图片横向缩放比例
:param int zoom_y: 图片纵向缩放比例
"""
pdf_list = glob(filepath + r'\*.pdf')
for f in pdf_list:
save_name = os.path.basename(f).replace('.pdf', '') # 获取不含路径文件名
save_name = outpath + '\\' + save_name
doc = fitz.open(f)
rotate = int(0) # 设置图片的旋转角度
trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
for pg in range(doc.page_count):
page = doc[pg]
pm = page.get_pixmap(matrix=trans, alpha=False)
if doc.page_count == 1:
pm.save(f'{save_name}.png')
else:
pm.save('{}-{:04d}.png'.format(save_name, pg))
doc.close()
print('转换完成')
举例
对上面图片转PDF
举例中,图片转换为PDF文件,缩放系数zoom_x和zoom_y
设为1.25转换为图片后,分辨率与原始图片差不多
python
if __name__ == '__main__':
filename = r'E:\测试\jpg\一眼丁真\2张图片.pdf'
filepath = r'E:\测试\jpg\一眼丁真'
#pdf2png1(filename, filepath)
pdf2png2(filepath, filepath)
转换前
转换后