Skip to content

PDF转换工具

项目介绍

  • 在工作中,我们经常需要将文档或图片转换为PDF文件,而Windows并没有自带转换工具,而有些工具需要付费才能使用相应功能,那我们能不能自已写一个PDF转换工具呢?
  • 当然可以啦~,今天我们就尝试开发一个PDF转换工具,自已动手,丰衣足食嘛!

基本要求

  • 实现一个PDF转换工具,可以打开本地文档或图片,将其转换为PDF文件,并保存到指定位置。

开发过程

(1)基本框架

  • 创建工程“PDFTool”,然后在main.py中清空代码,按下CTRL+J,输入提示词:“使用tkinter开发一个小工具,要求界面上有两个按钮,点击“打开”按钮后能打开WORD、PPT、TXT、JPG、PNG文件,点击“转换”按钮,会启动线程对文件进行PDF转换并在下方进度条显示转换进度,转换完成会在文件目录下生成同名的PDF文件并弹出“转换完成”的提示。”,输入完成后,我们按下回车键,稍作等待后,InsCode AI IDE就会在代码编程区中生成出工具软件的代码了。 Alt text

  • 等生成过程结束后,最上部AI对话框的中的生成按钮会消失,变成“补充生成提示”、“取消”、“接受”三个按钮。分别用于对当前代码进行提示词完善后再次生成或者对当前生成的结果进行取消或接受。点击“接受”采纳生成的结果,然后在IDE右上角绿色三角按钮上点击,就会启动运行,这时可能会弹出错误提示:

Alt text

(2)模块安装

  • 遇到“ModuleNotFoundError”类的错误,一般都是因为当前使用的Python编译器环境没有安装对应的模块,这里提示的fpdf是一个轻量级的Python库,它可以帮助我们轻松地创建PDF文件,下面我们来安装一下。

  • 点击下面一排按钮中的“终端”,切换到命令行输入终端,输入“pip install fpdf”进行fpdf的手动安装,pip 是一个通用的 Python 包管理工具,可以帮助我们对 Python 包进行下载、安装、卸载。如果我们感觉下载比较慢,也可以使用清华大学提供的Python包镜像,命令如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple fpdf

Alt text

  • 安装完fpdf后,再次运行,又会提示“ModuleNotFoundError: No module named 'pythoncom'”,可以通过pip安装pywin32库,因为pythoncom是pywin32的一部分。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pywin32

  • 处理完缺失模块的安装后,我们再次运行,就可以使用转换工具对文档进行转换啦!

Alt text

(3)界面美化

  • 虽然小工具软件已经可以使用了,但是界面还是太简陋了,下面我们对界面进行美化,让它看起来更专业一些。

  • 首先我们准备一些小图片,这些图片包括了一个用于程序图标Logo.ico和涉及到的各种文件格式的图片,还有一个arrow.png表示转换箭头。 Alt text

  • 然后我们CTRL+J全选代码,对代码进行完善:“使用Logo.ico作为窗口的图标,美化界面,将界面分为上、中、下三行,上面行里放置一个输入框显示当前打开的文件名,设置“转换”按钮放置在“打开”按钮的右侧,在打开文件时,判断文件格式类型,在界面中间行显示左右两个图片,左边为选择的文件类型图片,从DOC.png,PPT.png,TXT.png,PNG.png,JPG.png中选择一个,右边为PDF.png,两个图片之间绘制一个向右右的箭头,表示文件正在转换成PDF,界面下方行放置进度条显示转换进度。”

  • 点击对话框右下角“生成”按钮后,很快就可以看到AI对代码进行了修改,并在有修改的行做了高亮对比提示。

Alt text

  • 等所有的修改都完成后,返回到最上面的对话框处,我们点击“接受”就可以对本次修改的所有改动之处进行采纳。再次运行后,可以看到界面变成了如下所示: Alt text

  • 我们打开一个JPG图片尝试转换一下,可以看到转换功能是没有问题的,但是文档图片没有显示出来,这是为什么呢? Alt text

  • 其实这是因为在python中加载图片所返回的图像对象只在函数的命名空间里存在,比如下面的函数通过ImageTk.PhotoImage 所生成的图像对象只是临时对象,退出函数后就会销毁,所以就不见了。

def update_file_image(self):
    file_extension = Path(self.file_path).suffix.lower()
    if file_extension in ['.doc', '.docx']:
        self.file_image.configure(image=ImageTk.PhotoImage(Image.open("DOC.png").resize((100, 100))))
    elif file_extension in ['.ppt', '.pptx']:
        self.file_image.configure(image=ImageTk.PhotoImage(Image.open("PPT.png").resize((100, 100))))
    elif file_extension in ['.txt']:
        self.file_image.configure(image=ImageTk.PhotoImage(Image.open("TXT.png").resize((100, 100))))
    elif file_extension in ['.jpg', '.jpeg']:
        self.file_image.configure(image=ImageTk.PhotoImage(Image.open("JPG.png").resize((100, 100))))
    elif file_extension in ['.png']:
        self.file_image.configure(image=ImageTk.PhotoImage(Image.open("PNG.png").resize((100, 100))))
    else:
        self.file_image.configure(image=’’)
  • 对于这种情况,我们也可以对代码进行修改,全选代码后,按下CTRL+J,在弹出的对话框里输入:“设置界面中左侧的图片使用一个类成员变量来保存加载图片的对象,默认加载DOC.png并显示,加载文件时根据文件类型加载对应的图片并显示。” 再次完成修改后,这部分代码已经更改为:
def update_file_image(self):
    file_extension = Path(self.file_path).suffix.lower()
    if file_extension in ['.doc', '.docx']:
        self.file_image_obj = ImageTk.PhotoImage(Image.open("DOC.png").resize((100, 100)))
    elif file_extension in ['.ppt', '.pptx']:
        self.file_image_obj = ImageTk.PhotoImage(Image.open("PPT.png").resize((100, 100)))
    elif file_extension in ['.txt']:
        self.file_image_obj = ImageTk.PhotoImage(Image.open("TXT.png").resize((100, 100)))
    elif file_extension in ['.jpg', '.jpeg']:
        self.file_image_obj = ImageTk.PhotoImage(Image.open("JPG.png").resize((100, 100)))
    elif file_extension in ['.png']:
        self.file_image_obj = ImageTk.PhotoImage(Image.open("PNG.png").resize((100, 100)))
    else:
        self.file_image_obj = self.default_image
    self.file_image.configure(image=self.file_image_obj)
  • 这样在每次加载文件时,就会将对应格式的图片先加载到当前类的file_image_obj对象了,再次运行,就可以看到正确的图标了。 Alt text

  • 最后我们再来尝试使用ttkbootstrap界面美化中的主题来对界面进行快速美化,ttkbootstrap 附带了许多风格精美的浅色和深色主题,我们可以只通过主题名称“‌Cosmo、‌Flatly、‌Litera、‌Lumen、‌Paper、‌Solar”等来对界面进行一键换肤。 Alt text

  • 按下CTRL+J,在弹出的对话框里输入:“使用ttkbootstrap中的深色主题进一步美化界面,调整界面控件的尺寸和字体,使界面更加美观。” Alt text -在完成代码修改后,我们还需要在终端输入相应的PIP安装指令:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ttkbootstrap

Alt text

  • 再次运行程序后,工具界面已经变成了暗色主题,按钮也变得炫酷无比了!这样我们的小工具就完成了。

(4)打包可执行程序

  • 这么炫酷的小工具软件,怎么能独自享用呢?但发给别人一个python文件,别人如果没有安装Python环境,就无法使用,那该怎么办呢?

  • 这时我们应该尝试将项目打包成EXE可执行程序,可以直接在右边侧栏点击“AI”,展开AI对话框,在下面的输入框里输入“如何将当前工程打包成为EXE”。 Alt text

  • 回车后,右边的InsCode AI就会系统的回答我们的问题,这里它提示我们安装pyinstaller,PyInstaller是一个在Windows、GNU/Linux、macOS等平台下将Python程序冻结(打包)为独立可执行文件的工具, 用于在未安装Python的平台上执行Python编写的应用程序。通过命令行:

pyinstaller --name=PDFConverter --onefile --icon=Logo.ico --noconsole main.py

就可以将main.py打包成对应的可执行文件了。

  • 我们在终端这里输入:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller

安装好打包工具后我们继续输入:

pyinstaller --name=PDFConverter --onefile --icon=Logo.ico --noconsole main.py

  • 命令行执行后可以在终端里显示出具体的打包日志,结束后可以在左边的资源管理器列表中看到build和dist目录,build目录是工程构建用的临时目录,dist是最终构建完成的输出目录,我们可以看到dist下有一个PDFConverter.exe。 Alt text
  • 打开dist文件夹,双击“PDFConverter.exe”,这时会提示错误说找不到图标,这是因为dist文件夹下没有图片资源的原因。 Alt text
  • 为了交付时的文件整洁,我们可以将用到的图片和图标都放到一个images文件夹,然后输入“修改代码,让图片和图标资源的加载更改为从images文件夹中的图应图片进行加载。”对代码进行修改。
  • 这样所有加载图片和图标的语句都改为了从images文件夹下加载对应文件,我们接受后重新通过pyinstaller进行打包。并将images文件夹拷贝到dist文件夹下,再次运行,就可以正常启动了。要记得发给小伙伴用的时候,要将EXE和images文件夹一并发过去哟! Alt text

(5)总结

  • 今天我们在AI的帮助下完成了一个实用的PDF小工具,并且学会了将工程打包为可执行程序,大家是不是觉得特别有成就感呀!。