Skip to content

Commit 30ed92b

Browse files
committed
update codes
1 parent f0ba2eb commit 30ed92b

File tree

8 files changed

+2042
-1061
lines changed

8 files changed

+2042
-1061
lines changed

pdf_tools/build_exe.py

Lines changed: 103 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -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

185235
if __name__ == "__main__":
186236
build_exe()

pdf_tools/modules/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# 空的__init__.py文件,使Python将此目录视为包

0 commit comments

Comments
 (0)