Python实现图片与PDF互相转换

目录

图片转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)

转换前

转换后

相关推荐
无心水27 分钟前
Java时间处理封神篇:java.time全解析
java·开发语言·python·架构·localdate·java.time·java时间处理
吴秋霖1 小时前
【某音电商】protobuf聊天协议逆向
python·算法·protobuf
深藏功yu名1 小时前
Day24:向量数据库 Chroma_FAISS 入门
数据库·人工智能·python·ai·agent·faiss·chroma
cm6543201 小时前
用Python破解简单的替换密码
jvm·数据库·python
wan9yu2 小时前
为什么你需要给 LLM 的数据"加密"而不是"脱敏"?我写了一个开源工具
python
摇滚侠2 小时前
你是一名 java 程序员,总结定义数组的方式
java·开发语言·python
这个名有人用不2 小时前
解决 uv 虚拟环境使用 pip 命令提示command not found的办法
python·pip·uv·claude code
Oueii2 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
2501_908329853 小时前
使用Python自动收发邮件
jvm·数据库·python