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

目录
  • 转PDF初始代码
    • 转PDF最终代码
    • GUI界面设计代码
    • 打包成可执行文件
  • 完整代码
  • 附录

转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()用来读取一张照片。

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

(0)

相关推荐

  • 图片去摩尔纹简述实现python代码示例

    目录 1.前言 2.网络结构复现 3.数据预处理 4.模型训练 总结 1.前言 当感光元件像素的空间频率与影像中条纹的空间频率接近时,可能产生一种新的波浪形的干扰图案,即所谓的摩尔纹.传感器的网格状纹理构成了一个这样的图案.当图案中的细条状结构与传感器的结构以小角度交叉时,这种效应也会在图像中产生明显的干扰.这种现象在一些细密纹理情况下,比如时尚摄影中的布料上,非常普遍.这种摩尔纹可能通过亮度也可能通过颜色来展现.但是在这里,仅针对在翻拍过程中产生的图像摩尔纹进行处理. 翻拍即从计算机屏幕上捕获

  • Python实现普通图片转ico图标的方法详解

    目录 简介 历史攻略 下载安装包 下载地址 安装后缀pythonmagick - whl文件 案例源码 效果图 简介 ICO是一种图标文件格式,图标文件可以存储单个图案.多尺寸.多色板的图标文件.一个图标实际上是多张不同格式的图片的集合体,并且还包含了一定的透明区域.它是图标文件格式的一种,可以存储单个图案.多尺寸.多色板的图标文件.图标是具有明确指代含义的计算机图形.其中桌面图标是软件标识,界面中的图标是功能标识. 历史攻略 pip安装第三方库全攻略:普通安装.安装whl后缀文件.使用国内镜像

  • Python Matplotlib中使用plt.savefig存储图片的方法举例

    目录 前言 主要功能: 函数源码:(根据需要进行选择) 参数解释: 注意事项: 补充:解决plt.savefig() 保存多张图片有重叠的问题 总结 前言 plt.show()展示图片的时候,截图进行保存,图片不是多么清晰 如何保存高清图也是一知识点 函数包名:import matplotlib.pyplot as plt 主要功能: 保存绘制数据后创建的图形.使用此方法可以将创建的图形保存 函数源码:(根据需要进行选择) savefig(fname, dpi=None, facecolor='

  • Python使用PIL.image保存图片

    目录 1.原图 1.首先PIL保存图片的时候,图片类型一定要是ndarray类型,不能是tensor类型,否则报错 2.tensor转成ndarray类型保存 3.如果不进行归一化处理,也会报错 总结 1.原图 1.首先PIL保存图片的时候,图片类型一定要是ndarray类型,不能是tensor类型,否则报错 img=cv2.imread("./epoch034_iter100_target.png") img1=torch.tensor(img) image_pil=Image.fr

  • Python自制一个PDF转PNG图片小工具

    使用PyQt5应用程序制作PDF转换成图片的小工具,可以导入PDF文档后一键生成对应的PNG图片. PDF图片转换小工具使用的中间件: python版本:3.6.8 UI应用版本:PyQt5 PDF文件操作非标准库:PyPDF2 PNG图片生成库:PyMuPDF pip install PyQt5 pip install PyPDF2 pip install PyMuPDF==1.18.17 将需要使用到的python标准库或非标准库全部导入到我们的代码块中进入开发环节. # Importing

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

    目录 转PDF初始代码 转PDF最终代码 GUI界面设计代码 打包成可执行文件 完整代码 附录 转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:

  • 详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件

    一.安装Pyinstaller 环境:python3.6.window10 注意事项: python64位版本打包的exe,只能在64位操作系统使用 打包文件夹和文件的名称不能用中文 pygame打包是里面的字体要改成"arial"格式. pygame.font.SysFont("宋体", 32) 32)  换成 pygame.font.SysFont('arial',32) 1.直接安装 pip命令安装:pip install Pyinstaller 安装成功后会

  • 详解Python中如何将数据存储为json格式的文件

    一.基于json模块的存储.读取数据 names_writer.py import json names = ['joker','joe','nacy','timi'] filename='names.json' with open(filename,'w') as file_obj: json.dump(names,file_obj) 解释:我们先导入json模块,再创建一个名字列表,第5行我们指定了要将该列表存储到其中的文件的名称.通常使用扩展名.json来指出文件存储的数据为json格式.

  • 详解python中GPU版本的opencv常用方法介绍

    引言 本篇是以python的视角介绍相关的函数还有自我使用中的一些问题,本想在这篇之前总结一下opencv编译的全过程,但遇到了太多坑,暂时不太想回看做过的笔记,所以这里主要总结python下GPU版本的opencv. 主要函数说明 threshold():二值化,但要指定设定阈值 blendLinear():两幅图片的线形混合 calcHist() createBoxFilter ():创建一个规范化的2D框过滤器 canny边缘检测 createGaussianFilter():创建一个Ga

  • 详解python里使用正则表达式的分组命名方式

    详解python里使用正则表达式的分组命名方式 分组匹配的模式,可以通过groups()来全部访问匹配的元组,也可以通过group()函数来按分组方式来访问,但是这里只能通过数字索引来访问,如果某一天产品经理需要修改需求,让你在它们之中添加一个分组,这样一来,就会导致匹配的数组的索引的变化,作为开发人员的你,必须得一行一行代码地修改.因此聪明的开发人员又想到一个好方法,把这些分组进行命名,只需要对名称进行访问分组,不通过索引来访问了,就可以避免这个问题.那么怎么样来命名呢?可以采用(?P<nam

  • 详解Python 序列化Serialize 和 反序列化Deserialize

    详解Python 序列化Serialize 和 反序列化Deserialize 序列化 (serialization) 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化, 它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 序列化和反序列化的目的 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 3.使程序更具维护性 序列化   由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘

  • 详解python实现读取邮件数据并下载附件的实例

    详解python实现读取邮件数据并下载附件的实例 实现结果图: 实现代码: #!/usr/bin/python2.7 # _*_ coding: utf-8 _*_ """ @Author: MarkLiu """ import poplib import email from email.parser import Parser from email.header import decode_header from email.utils im

  • 详解Python在七牛云平台的应用(一)

    七牛云七牛云是国内领先的企业级云服务商.专注于以数据为核心的云计算业务,围绕富媒体场景推出了对象存储.融合CDN.容器云.大数据.深度学习平台等产品,并提供一站式视频云解决方案,同时打造简单,可信赖的解决方案平台,帮助企业快速上云,创造更大的商业价值. 以上是官网介绍. (一)在这里介绍一下Python怎么通过官方提供的库对自己空间进行操作 首先需要注册一个七牛的账号,并创建一个Bucket,另外还需要在个人面板中的密匙中得到AK和SK.之后就能通过七牛的SDK对自己的空间进行操作了. 本文对上

  • 详解Python map函数及Python map()函数的用法

    python map函数 map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方,就可以用map()函数: 因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算: def f(x): return x*x print map(f,

  • 详解Python自建logging模块

    简单使用 最开始,我们用最短的代码体验一下logging的基本功能. import logging logger = logging.getLogger() logging.basicConfig() logger.setLevel('DEBUG') logger.debug('logsomething') #输出 out>>DEBG:root:logsomething 第一步,通过logging.getLogger函数,获取一个loger对象,但这个对象暂时是无法使用的. 第二步,loggi

随机推荐