@@ -11,57 +11,90 @@ def build_exe():
1111 """使用PyInstaller打包应用程序为EXE文件"""
1212 print ("开始打包PDF工具为可执行文件..." )
1313
14- # 确保PyInstaller已安装
15- try :
16- import PyInstaller
17- print (f"检测到PyInstaller版本: { PyInstaller .__version__ } " )
18- except ImportError :
19- print ("未检测到PyInstaller,正在安装..." )
20- subprocess .check_call ([sys .executable , "-m" , "pip" , "install" , "pyinstaller" ])
21- print ("PyInstaller安装完成" )
14+ # 确保必要的依赖已安装
15+ required_packages = [
16+ "PyInstaller" ,
17+ "PyPDF2" ,
18+ "Pillow" ,
19+ "PyMuPDF" ,
20+ "ttkthemes"
21+ ]
22+
23+ for package in required_packages :
24+ try :
25+ __import__ (package .lower ())
26+ print (f"检测到 { package } 已安装" )
27+ except ImportError :
28+ print (f"未检测到 { package } ,尝试安装..." )
29+ try :
30+ subprocess .check_call ([sys .executable , "-m" , "pip" , "install" , package ])
31+ print (f"{ package } 安装完成" )
32+ except Exception as e :
33+ print (f"安装 { package } 失败: { str (e )} " )
34+ print ("尝试从 requirements_for_build.txt 安装所有依赖..." )
35+ if os .path .exists ("requirements_for_build.txt" ):
36+ try :
37+ subprocess .check_call ([sys .executable , "-m" , "pip" , "install" , "-r" , "requirements_for_build.txt" ])
38+ print ("依赖安装完成" )
39+ break
40+ except Exception as e :
41+ print (f"安装依赖失败: { str (e )} " )
42+ sys .exit (1 )
43+ else :
44+ print ("未找到 requirements_for_build.txt 文件" )
45+ sys .exit (1 )
2246
2347 # 清理之前的构建文件
2448 if os .path .exists ("build" ):
2549 shutil .rmtree ("build" )
2650 if os .path .exists ("dist" ):
2751 shutil .rmtree ("dist" )
2852
29- # 检查是否有图标文件,如果没有尝试创建一个
53+ # 检查是否有图标文件,如果没有尝试使用 create_icon.py 创建
3054 if not os .path .exists ("icon.ico" ):
3155 print ("未找到icon.ico文件,尝试创建默认图标..." )
3256 try :
33- # 如果有PIL库,尝试创建一个图标
34- from PIL import Image , ImageDraw , ImageFont
35-
36- # 创建一个512x512的图标
37- icon_size = 512
38- icon = Image .new ('RGBA' , (icon_size , icon_size ), (255 , 255 , 255 , 0 ))
39- draw = ImageDraw .Draw (icon )
40-
41- # 绘制背景
42- draw .rectangle ([(0 , 0 ), (icon_size , icon_size )], fill = (52 , 152 , 219 , 255 ))
43-
44- # 绘制PDF字样
45- try :
46- # 尝试使用一个常见字体
47- font = ImageFont .truetype ("arial.ttf" , int (icon_size / 2 ))
48- except IOError :
49- # 如果找不到字体,使用默认字体
50- font = ImageFont .load_default ()
51-
52- # 在图标中央绘制文字
53- draw .text ((icon_size / 2 , icon_size / 2 ), "PDF" , fill = (255 , 255 , 255 , 255 ),
54- font = font , anchor = "mm" )
55-
56- # 保存为ICO文件
57- icon .save ("icon.ico" )
58- print ("成功创建默认图标" )
57+ # 优先使用专用的图标创建模块
58+ if os .path .exists ("create_icon.py" ):
59+ print ("使用 create_icon.py 创建图标..." )
60+ subprocess .check_call ([sys .executable , "create_icon.py" ])
61+ if os .path .exists ("icon.ico" ):
62+ print ("成功创建默认图标" )
63+ use_icon = True
64+ else :
65+ raise Exception ("图标创建失败" )
66+ else :
67+ # 如果没有专用模块,使用内置方法创建
68+ from PIL import Image , ImageDraw , ImageFont
69+
70+ # 创建一个512x512的图标
71+ icon_size = 512
72+ icon = Image .new ('RGBA' , (icon_size , icon_size ), (255 , 255 , 255 , 0 ))
73+ draw = ImageDraw .Draw (icon )
74+
75+ # 绘制背景
76+ draw .rectangle ([(0 , 0 ), (icon_size , icon_size )], fill = (52 , 152 , 219 , 255 ))
77+
78+ # 绘制PDF字样
79+ try :
80+ # 尝试使用一个常见字体
81+ font = ImageFont .truetype ("arial.ttf" , int (icon_size / 2 ))
82+ except IOError :
83+ # 如果找不到字体,使用默认字体
84+ font = ImageFont .load_default ()
85+
86+ # 在图标中央绘制文字
87+ draw .text ((icon_size / 2 , icon_size / 2 ), "PDF" , fill = (255 , 255 , 255 , 255 ),
88+ font = font , anchor = "mm" )
89+
90+ # 保存为ICO文件
91+ icon .save ("icon.ico" )
92+ print ("成功创建默认图标" )
93+ use_icon = True
5994 except Exception as e :
6095 print (f"创建图标失败: { str (e )} " )
6196 print ("将使用无图标方式打包" )
6297 use_icon = False
63- else :
64- use_icon = True
6598 else :
6699 use_icon = True
67100
@@ -78,7 +111,7 @@ def build_exe():
78111 pathex=[],
79112 binaries=[],
80113 datas=[],
81- hiddenimports=[],
114+ hiddenimports=['ttkthemes' ],
82115 hookspath=[],
83116 hooksconfig={},
84117 runtime_hooks=[],
@@ -125,7 +158,7 @@ def build_exe():
125158 pathex=[],
126159 binaries=[],
127160 datas=[],
128- hiddenimports=[],
161+ hiddenimports=['ttkthemes' ],
129162 hookspath=[],
130163 hooksconfig={},
131164 runtime_hooks=[],
@@ -167,20 +200,37 @@ def build_exe():
167200 print ("生成配置文件完成,开始打包..." )
168201
169202 # 执行PyInstaller命令
170- subprocess .check_call ([
171- sys .executable ,
172- "-m" ,
173- "PyInstaller" ,
174- "--clean" ,
175- "pdf_tool.spec"
176- ])
177-
178- print ("\n 打包完成! 可执行文件已生成在dist目录中。" )
179- print ("您可以在dist文件夹中找到 'PDF工具.exe' 文件" )
180- print ("\n 注意事项:" )
181- print ("1. 首次启动可能较慢,这是正常现象" )
182- print ("2. 杀毒软件可能会对生成的EXE进行检查,这是因为打包工具的特性" )
183- print ("3. 确保最终用户电脑上安装了适当的字体,否则可能会影响界面显示" )
203+ try :
204+ subprocess .check_call ([
205+ sys .executable ,
206+ "-m" ,
207+ "PyInstaller" ,
208+ "--clean" ,
209+ "pdf_tool.spec"
210+ ])
211+
212+ print ("\n 打包完成! 可执行文件已生成在dist目录中。" )
213+ print ("您可以在dist文件夹中找到 'PDF工具.exe' 文件" )
214+
215+ # 检查是否成功创建了EXE文件
216+ exe_path = os .path .join ("dist" , "PDF工具.exe" )
217+ if os .path .exists (exe_path ):
218+ print (f"\n 成功创建可执行文件: { os .path .abspath (exe_path )} " )
219+ print (f"文件大小: { os .path .getsize (exe_path ) / (1024 * 1024 ):.2f} MB" )
220+ else :
221+ print ("\n 警告: 未找到生成的可执行文件,请检查打包过程是否有错误" )
222+
223+ print ("\n 注意事项:" )
224+ print ("1. 首次启动可能较慢,这是正常现象" )
225+ print ("2. 杀毒软件可能会对生成的EXE进行检查,这是因为打包工具的特性" )
226+ print ("3. 确保最终用户电脑上安装了适当的字体,否则可能会影响界面显示" )
227+ print ("4. 如果程序无法启动,请尝试安装 Microsoft Visual C++ Redistributable" )
228+
229+ return True
230+ except subprocess .CalledProcessError as e :
231+ print (f"\n 打包失败: { str (e )} " )
232+ print ("请检查上述错误信息,解决问题后重试" )
233+ return False
184234
185235if __name__ == "__main__" :
186236 build_exe ()
0 commit comments