详解python实现多张多格式图片转PDF并打包成exe

   2023-02-09 学习力0
核心提示:目录转PDF初始代码转PDF最终代码GUI界面设计代码打包成可执行文件完整代码附录转PDF初始代码从文件夹中读取图片数据,然后将他们保存为PDF格式。不长,大概10行代码。from PIL import Imagefrom os import *def PictureToPDF(picture_path, name):pictures =

转PDF初始代码

从文件夹中读取图片数据,然后将他们保存为PDF格式。

不长,大概10行代码。

from PIL import Image
from os import *
def PictureToPDF(picture_path, name):
    pictures = []
    picture_file = listdir(picture_path)
    for file in picture_file:
        picture = Image.open(picture_path + '\\' + file)
        pictures.append(picture)
    pictures[0].save(picture_path + '\\' + name + '.pdf', "PDF", save_all=True, append_images=pictures)
PictureToPDF(r'C:\Users\Yezi\Desktop\Temp', 'test')

但这个有缺陷,部分图片转换过程有漏洞,经过多次实验,发现部分图片会出现这种错误:

ValueError: cannot save mode RGBA

详解python实现多张多格式图片转PDF并打包成exe

我查询了许多资料并测试了很久,发现是图片格式色彩空间问题。

平常图片的颜色是RGB三种颜色,red红,green绿,blue蓝,但是png图片使用的是RGBA色彩空间,除了平常的RGB,多出来的A是alpha,是不透明度参数,有利于合成和融合图片。

但是在转PDF的过程,就不知道A怎么办,所以会出问题。

因此有下面的修改版,去掉A。

转PDF最终代码

与原来的相比,增加了一个判断语句,如果图片格式是png类型,那么就去掉里面的A。

from PIL import Image
from os import *
def PictureToPDF(picture_path, name):
    pictures = []
    picture_file = listdir(picture_path)
    for file in picture_file:
        picture = Image.open(picture_path + '\\' + file)
        if 'png' in file:
            r, g, b, a = picture.split()
            picture = Image.merge("RGB", (r, g, b))
        pictures.append(picture)
    pictures[0].save(picture_path + '\\' + name + '.pdf', "PDF", save_all=True, append_images=pictures)
PictureToPDF(r'C:\Users\Yezi\Desktop\Temp', 'test')

GUI界面设计代码

然后是加上GUI界面设计,这个问题就比较多,首先UI长这个样子:

详解python实现多张多格式图片转PDF并打包成exe

p>整个页面的代码是这样的:

    window = tkinter.Tk()
    main = tkinter.Frame(window)
    main.grid(row=0, column=0)
    tkinter.Label(window, text='图片路径:').grid(row=0, column=0)
    pathEntry = tkinter.Entry(window, width=32)
    pathEntry.grid(row=0, column=1, columnspan=10)
    tkinter.Label(window, text='PDF名字:').grid(row=1, column=0)
    nameEntry = tkinter.Entry(window, width=32)
    nameEntry.grid(row=1, column=1, columnspan=10)
    tkinter.Button(window, text='开始转换', command=convert).grid(row=2, column=4)
    window.mainloop()

代码不长,我懒得解释了问题在于捕获路径的时候有一个问题,正常windows文件路径是这样的:

C:\Users\Yezi\Desktop\Python\PictureToPDF

但是这样是不能识别的,,因为 \ 会形成转义字符,所以我们在前面加了个r ,表示不用转义字符,但是在弄成可执行文件的时候,路径是个参数,不能加r了,因此,我写了个函数把路径这个字符串变成可以识别的路径,这样的路径可以识别:

C:/Users/Yezi/Desktop/Python/PictureToPDF

或者是这样的:

C:\\Users\\Yezi\\Desktop\\Python\\PictureToPDF

但是前面的比较好转,所以我就让它变成 / 这个:

    def convert():
        char = "\\"
        path = pathEntry.get()
        for it in path:
            if it in char:
                path = path.replace(it, '\\')

打包成可执行文件

win+R输入cmd打开命令提示行。

详解python实现多张多格式图片转PDF并打包成exe

pip安装这个包。

pip install Pyinstaller

准备好图标和代码文件。

详解python实现多张多格式图片转PDF并打包成exe

进入相应文件夹。

详解python实现多张多格式图片转PDF并打包成exe

用这个命令(后面的图标名和文件名需要进行相应的修改哦)。

pyinstaller -F -i ./alpaca.ico PictureToPDF.py

然后等待……

完成之后到dist文件夹中找到这个程序,即可。

详解python实现多张多格式图片转PDF并打包成exe

完整代码

import os
import PIL
import tkinter
def PictureToPDF(picture_path, name):
    pictures = []
    picture_file = os.listdir(picture_path)
    for file in picture_file:
        picture = PIL.Image.open(picture_path + '\\' + file)
        if 'png' in file:
            r, g, b, a = picture.split()
            picture = PIL.Image.merge("RGB", (r, g, b))
        pictures.append(picture)
    pictures[0].save(picture_path + '\\' + name + '.pdf', "PDF", save_all=True, append_images=pictures)
def GUI():
    def convert():
        char = "\\"
        path = pathEntry.get()
        for it in path:
            if it in char:
                path = path.replace(it, '\\')
        PictureToPDF(path, nameEntry.get())
    window = tkinter.Tk()
    main = tkinter.Frame(window)
    main.grid(row=0, column=0)
    tkinter.Label(window, text='图片路径:').grid(row=0, column=0)
    pathEntry = tkinter.Entry(window, width=32)
    pathEntry.grid(row=0, column=1, columnspan=10)
    tkinter.Label(window, text='PDF名字:').grid(row=1, column=0)
    nameEntry = tkinter.Entry(window, width=32)
    nameEntry.grid(row=1, column=1, columnspan=10)
    tkinter.Button(window, text='开始转换', command=convert).grid(row=2, column=4)
    window.mainloop()
GUI()

附录

os模块

os是用来处理文件和目录的。

os.listdir(path)

os.listdir(path)是用来返回path指定的文件夹包含的文件或文件夹的名字的列表。

str.lower()

str.lower()会返回将字符串中所有大写字符转换为小写后生成的字符串。

PIL模块

好像就是pillow。

Image.open(path+picture's full name)

Image.open()用来读取一张照片。

以上就是详解python实现多张多格式图片转PDF并打包成exe的详细内容,更多关于python图片格式转PDF打包exe的资料请关注其它相关文章!

原文地址:https://juejin.cn/post/7184686242645311547
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • SICP:复数的直角和极坐标的表示(Python实现)
    SICP:复数的直角和极坐标的表示(Python实现)
    数据抽象屏障是控制复杂性的强有力工具,然而这种类型的数据抽象还不够强大有力。从一个另一个角度看,对于一个数据对象可能存在多种有用的表示方式,且我们希望所设计的系统能够处理多种表示形式。比如,复数就可以表示为两种几乎等价的形式:直角坐标形式(
    03-16
  • [个人发展] 我做了一个可以永远谈论任何事情的女士对话AI(TypeScript,Python)
    [个人发展] 我做了一个可以永远谈论任何事情的
    在个人发展中对话式人工智能服务 Eveki我做了虚构角色1这是一项以人工智能为特色的服务,可以再现并享受自然对话。这一次,作为第一个艾小姐发表了。请先尝试实物。服务概览与人工智能对话基本上只需输入您的信息是。对话是用女士的语言进行的,就像人类一样
    03-08
  • ruby写爬虫 ruby python
    ruby写爬虫 ruby python
    http://www.javaeye.com/topic/545160爬虫性能比较http://www.rubyrailways.com/data-extraction-for-web-20-screen-scraping-in-rubyrails/srcapihttp://huacnlee.com/blog/ruby-scrapi-collect-koubei  2009年4月22日 星期三用ruby写的一个网络爬虫程序前
    03-08
  • sf02_选择排序算法Java Python rust 实现
    Java 实现package common;public class SimpleArithmetic {/** * 选择排序 * 输入整形数组:a[n] 【4、5、3、7】 * 1. 取数组编号为i(i属于[0 , n-2])的数组值 a[i],即第一重循环 * 2. 假定a[i]为数组a[k](k属于[i,n-1])中的最小值a[min],即执行初始化 min =i
    02-09
  • Python vs Ruby: 谁是最好的 web 开发语言?
    Python 和 Ruby 都是目前用来开发 websites、web-based apps 和 web services 的流行编程语言之一。 这两种语言在许多方面有相似之处。它们都是高级的面向对象的编程语言,都是交互式脚本语言、都提供标准库且支持持久化。但是,Python 和 Ruby 的解决方法却
    02-09
  • 详解Python手写数字识别模型的构建与使用
    详解Python手写数字识别模型的构建与使用
    目录一:手写数字模型构建与保存1 加载数据集2 特征数据 标签数据3 训练集 测试集4 数据流图 输入层5 隐藏层6 损失函数7 梯度下降算法8 输出损失值 9 模型 保存与使用10 完整源码分享二:手写数字模型使用与测试一:手写数字模型构建与保存1 加载数据集# 1加
  • Python asyncore socket客户端实现方法详解
    Python asyncore socket客户端实现方法详解
    目录介绍1.定义类并且继承 asyncore.dispatcher2.实现类中的回调代码调用父类方法创建socket对象连接服务器3.创建对象并且执行asyncore.loop进入运行循环服务端示例代码运行结果注意介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的
  • Python+Sklearn实现异常检测
    目录离群检测 与 新奇检测Sklearn 中支持的方法孤立森林 IsolationForestLocal Outlier FactorOneClassSVMElliptic Envelope离群检测 与 新奇检测很多应用场景都需要能够确定样本是否属于与现有的分布,或者应该被视为不同的分布。离群检测(Outlier detectio
  • Python基础教程之while循环用法讲解 Python中的while循环
    Python基础教程之while循环用法讲解 Python中的
    目录1.while 循环2.无限循环3、while 循环使用 else 语句4、简单语句组附小练习:总结1.while 循环Python 中 while 语句的一般形式:while 判断条件(condition):    执行语句(statements)……执行流程图如下:同样需要注意冒号和缩进。另外,在 Python 中
点击排行