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)

转换前

转换后

相关推荐
多米Domi01139 分钟前
0x3f 第49天 面向实习的八股背诵第六天 过了一遍JVM的知识点,看了相关视频讲解JVM内存,垃圾清理,买了plus,稍微看了点确定一下方向
jvm·数据结构·python·算法·leetcode
人工智能训练6 小时前
【极速部署】Ubuntu24.04+CUDA13.0 玩转 VLLM 0.15.0:预编译 Wheel 包 GPU 版安装全攻略
运维·前端·人工智能·python·ai编程·cuda·vllm
yaoming1686 小时前
python性能优化方案研究
python·性能优化
码云数智-大飞7 小时前
使用 Python 高效提取 PDF 中的表格数据并导出为 TXT 或 Excel
python
biuyyyxxx8 小时前
Python自动化办公学习笔记(一) 工具安装&教程
笔记·python·学习·自动化
极客数模9 小时前
【2026美赛赛题初步翻译F题】2026_ICM_Problem_F
大数据·c语言·python·数学建模·matlab
小鸡吃米…10 小时前
机器学习中的代价函数
人工智能·python·机器学习
Li emily11 小时前
如何通过外汇API平台快速实现实时数据接入?
开发语言·python·api·fastapi·美股
m0_5613596711 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
Ulyanov11 小时前
顶层设计——单脉冲雷达仿真器的灵魂蓝图
python·算法·pyside·仿真系统·单脉冲