Python实现多张多格式图片转PDF并打包成exe

发表于:2023-1-11 10:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:_心灵骇客_    来源:稀土掘金

  主要思路
  从文件夹中读取图片数据,然后将他们保存为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长这个样子:
  整个页面的代码是这样的:
      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()
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号