开发者

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

开发者 https://www.devze.com 2023-01-06 09:16 出处:网络 作者: _心灵骇客_
目录转PDF初始代码转PDF最终代码GUI界面设计代码打包成可执行文件完整代码附录转PDF初始代码
目录
  • 转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: canno编程客栈t 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='P编程DF名字:').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).grphpid(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(itjs, '\\')
      

      打包成可执行文件

      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, column开发者_自学开发span=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并打包http://www.devze.com成exe的详细内容,更多关于python图片格式转PDF打包exe的资料请关注我们其它相关文章!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号