详解python实现多张多格式图片转PDF并打包成exe
作者:_心灵骇客_ 发布时间:2022-06-16 15:43:38
转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
我查询了许多资料并测试了很久,发现是图片格式色彩空间问题。
平常图片的颜色是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长这个样子:
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打开命令提示行。
pip安装这个包。
pip install Pyinstaller
准备好图标和代码文件。
进入相应文件夹。
用这个命令(后面的图标名和文件名需要进行相应的修改哦)。
pyinstaller -F -i ./alpaca.ico PictureToPDF.py
然后等待……
完成之后到dist文件夹中找到这个程序,即可。
完整代码
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()用来读取一张照片。
来源:https://juejin.cn/post/7184686242645311547
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 文件操作此为本人学习python过程中的笔记,将持续更新,欢迎提问指正。1.txt文件1.文本文件 txt2.二进制文件 图片视频操作流程打
- 经常写一些联合查询,联合一多了,代码就成倍的增加,时间一长,连我自己也看不懂到底是什么意思了。做Oracle 的时候,就看到有个 WITH,
- 前言:本文为 HITwh 网络空间安全专业网络空间安全设计与实践 I 的选题之一,主要实现了远程监控局域网内的主机桌面与网络情况、简单键鼠控
- 以前看到 andy的关于“Quiet Structure”觉的很不错,于是今天到她的个人站点上逛逛,发现不少好的文章,今天介绍的是
- ORM 查询管理器对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,
- 一. 打印图片属性、设置图片存储路径代码如下:#打印图片的属性、保存图片位置import cv2 as cvimport nump
- 鼠标回调函数:def setMouseCallback(windowName, #窗口名称onMouse, &n
- MaxDB是MySQL AB公司通过SAP认证的数据库。MaxDB数据库服务器补充了MySQL AB产品系列。某些MaxDB特性在MySQL
- 实际上在python中用列表就可以实现动态变量名的管理,python中的列表中可以存储任何类型的元素:listA = [0,"st
- 数组/对象数组删除其中某一项由于日常工作中经常需要对数组进行操作,最经常使用到的就是对数组进行的删除操作对于我们前端来说,数组有两种区别1、
- pytho的使用和分发完全是免费的,它是一种面向对象的语言,它的。它的类模块支持多态,操作符重载和多重继承等高级概念,并且以python特有
- AdobeAdobe公司的标识1982年,40多岁的程序员约翰·沃诺克(John Warnock)和查尔斯·杰斯克(Charles Gesc
- 校验是否全由数字组成function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.
- 本文介绍了几乎所有关于对象的基本概念,什么是对象,如何创建对象,对象的属性的设置和读取,删除属性的方法,构造函数,对象原型,父类,子类,继承
- 如下所示:file->settings->Editor->General->Console里面的console co
- 通过无能的baidu逛了一圈,发现有两三段能用的代码,不过参考之下,发现还有不足的:不能拷贝有合并格式的sheet、没有拷贝cell的相关格
- 前言NSQ是Go语言编写的,开源的分布式消息队列中间件,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。NSQ 具有分布式和去中心化
- 目录一、socketserver实现并发二、验证客户端合法性一、socketserver实现并发tcp协议的socket是只能和一个客户端通
- 阅读上一章:chapter 5 表单Chapter 6 <strong>,<em>与其他短语元素在引言和前面的章节中
- 本文实例讲述了python实现自动登录人人网并采集信息的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/python#