Python实现图片与PDF互相转换

目录

    • 图片转PDF
      • 文件夹所有图片转为1个PDF
      • 文件夹指定图片转为1个PDF
      • 文件夹所有图片分别转为PDF
      • 举例
    • PDF转图片
      • 指定PDF转为图片
      • 文件夹所有PDF转为图片
      • 举例

图片转PDF

之前的一篇博客《Python合并拼接图片》,可对图片进行合并拼接
使用前需要安装PyMuPDF库,以下代码使用的PyMuPDF(1.23.6),以及自然排序库natsort(8.4.0)

文件夹所有图片转为1个PDF

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

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

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('转换完成')

举例

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

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

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转换为图片后,分辨率与原始图片差不多

if __name__ == '__main__':
    filename = r'E:\测试\jpg\五共1\2张图片.pdf'
    filepath = r'E:\测试\jpg\五共1'
    #pdf2png1(filename, filepath)
    pdf2png2(filepath, filepath)

转换前
在这里插入图片描述
转换后
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124688.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设置区块链节点输出等级为警告级,并把日志存储阈值位100MB并验证;

题目 获取指定区块链节点输出等级为警告级,并设置日志存储阈值位100MB并验证; 操作步骤 1.切换目录 cd nodes/127.0.0.1/node0 2.打开配置文件并修改 vim config.ini warn:警告

力扣最热一百题——每日温度

Python后面的文章,内容都比较多,但是同时我又想保持每天更新的速度,所以Python的文章我继续打磨打磨,先更新一篇算法的文章。 一身正气报国家,旁无乱境不恋她 ヾ(◍∇◍)ノ゙ 力扣题号&#xff1a…

大语言模型比武

今年随着 ChatGPT 的流行,并在各个领域有一定程度生产级别的应用。国内外也掀起了一股大语言模型浪潮,各大厂商都推出了自己的大语言模型,阿里推出了 通义千问,腾讯推出了 Hunyuan,亚马逊云推出了 Titan,大…

微服务-grpc-consul-protoBuf-micro

微服务 一、微服务(microservices) 近几年,微服这个词闯入了我们的视线范围。在百度与谷歌中随便搜一搜也有几千万条的结果。那么,什么是微服务 呢?微服务的概念是怎么产生的呢? 我们就来了解一下Go语言与微服务的千丝…

C++ 断言

1.断言的概念 断言(assertion)是一种编程中常用的手段。在通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中,用于排除在设计的逻辑上不应该产生的情况。比如一个函数总需要输人在一定的范围内的参数,那么程序员就可以对该参数…

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

1 数据对象的创建 CtrlH打开Model Explorer,在Base workspace中点击工具栏add,出现如下界面, 可以看到Simulink提供了多种数据类型 Matlab Variable:Simulink.Parameter:使用该数据对象表示工程应用中的标定量Simuli…

CSS 渐变、文本效果、字体

一、CSS3渐变: CSS3渐变(gradient)可以在两个或多个指定的颜色之间显示平稳的过渡。CSS3定义了两种类型的渐变(gradient):线性渐变(linear gradient)-向下/向上/向左/向右/对角方向…

MySQL–第4关:查询用户日活数及支付金额

MySQL–第4关:查询用户日活数及支付金额 – WhiteNights Site 标签:MySQL 非常好的题,爱来自中国。 题目 没啥用 任务描述 现有3张业务表,详见如下: 需要输出结果如下,没有支付的日期不需要显示,请写出对…

设计模式——建造者模式

目录 建造者模式盖房项目需求基本介绍四个角色实例代码注意事项和细节抽象工厂模式 VS 建造者模式 建造者模式 盖房项目需求 传统方式:打地基,砌墙,封顶 盖房子步骤 public abstract class AbstractHouse {// 地基public abstract void b…

【小白专用】PHP中的JSON转换操作指南 23.11.06

一、JSON的基础知识 1.1JSON数据格式 JSON数据格式是一组键值对的集合,通过逗号分隔。键值对由“键”和“值”组成,中间使用冒号分隔。JSON数据格式可以嵌套,而且可以使用数组 二、PHP中的JSON函数 JSON的操作需要使用编程语言进行处理&am…

软考软件设计师刷题笔记整理

软件设计师 HTML代码中,创建指向邮箱地址的链接正确的是ARP攻击造成网络无法跨网段通信的原因是在软件开发过程中进行风险分析关于哈夫曼树的叙述关于风险管理的叙述ISO/IEC9126软件质量模型关于结构化开发方法的叙述分布式数据库中的分片透明、复制透明、位置透明和…

day61--单调栈2

503.下一个更大元素II 42. 接雨水 第一题:下一个更大元素2 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之…

前端工程化(vue2)

一、环境准备 1.依赖环境:NodeJS 官网:Node.js 2.脚手架:Vue-cli 参考网址:安装 | Vue CLI 介绍:Vue-cli用于快速的生成一个Vue的项目模板。主要功能有:统一的目录结构,本地调试&#xff0…

小程序day04

目标 自定义组件 创建组件 引用组件 局部引用 全局引用 组件的函数定义到metods节点中,梦回vue2. 样式 数据,方法,属性 下划线开头的称为自定义方法,非下划线开头的都是事件处理函数。 神特么,this.datathis.pro…

一种ESDF地图实现方法:FIESTA

背景: 在机器人定位、行动规划中建图是一个很重要的工作,只有通过感知器感知到自己在哪、周围有什么;才能为下一步行动作出决策的依据。然而要知道自己在哪,就必须要有一个整体规划和参照也就是所谓的地图。地图相当于是一次规划…

c语言 结构体 简单实例

结构体 简单例子 要求&#xff1a; 结构体保存学生信息操作 代码 #include <stdio.h>//定义结构体 struct student{int ID;char name[20];char sex;char birthday[8];int grade; };int main(){int number;printf("请输入学生个数&#xff1a;");scanf(&quo…

java入门,记一次mysql函数使用

一、前言 记一次mysql函数使用&#xff0c;要求给一个字段进行拼接&#xff0c;然后MD5加密&#xff0c;再转换成大写。这里都是有现成的函数&#xff0c;所以记录下来 二、函数使用 1、拼接函数&#xff1a; concat(字符串1,字符串2) select concat(字符串1,字符串2); 2、…

【Linux】:git基本操作_添加文件_两种场景_查看.git文件 || git修改文件 || 版本回退

&#x1f3af;添加⽂件–场景⼀ &#x1f3af;在包含.git的⽬录下新建⼀个ReadMe⽂件&#xff0c;我们可以使⽤ git add 命令可以将⽂件添加到暂存区&#xff1a; • 添加⼀个或多个⽂件到暂存区&#xff1a; git add [file1] [file2] … • 添加指定⽬录到暂存区&#xff0c;…

Tomcat,jdk下载配置(发布项目)

Tomcat&#xff0c;jdk下载&#xff0c; 远程连接 启动以下服务 高级设置 允许别人连接进来 网上搜索jdk下载即可 双击下一步即可 下一步 输入java&#xff0c;看有没有安装成功 这是安装成功的 Tomcat就可以安装了 和以上操作一样&#xff0c;在网上下载安装包&#xff0c;…

11月9日星期四今日早报简报微语报早读

11月9日星期四&#xff0c;农历九月廿六&#xff0c;早报微语早读。 1、中国数字经济规模十年增至50.2万亿元&#xff0c;网民规模增至10.79亿&#xff1b; 2、世界互联网发展指数排名发布&#xff1a;中国位居第二&#xff1b; 3、中国—拉美开发性金融合作机制扩容&#x…