fix:修复模板问题,修复系统操作逻辑,修复系统的一些BUG

This commit is contained in:
2025-12-31 08:28:45 +08:00
parent d3c0121632
commit 54398e2cbe
12 changed files with 342 additions and 172 deletions

View File

@@ -8,8 +8,9 @@ import traceback
from config.config import load_config
class_type_config =[
"本期开展了小袋鼠整合主题课程:(语言、社会、科学、健康、艺术)、生活数学;特色课程(英语、体能、美工、篮球)",
"本学期开展了柏克莱主题课程(语言、社会、科学、艺术、健康);英语及特色课程(体能、舞蹈、美工、魔力猴、足球、国学)"
"本期开展了小袋鼠整合主题课程:(语言、社会、科学、健康、艺术)、生活数学;特色课程(英语、体能、美工、篮球)",
"本学期开展了柏克莱主题课程(语言、社会、科学、艺术、健康);英语及特色课程(体能、舞蹈、美工、魔力猴、足球、国学)",
"本学期开展了双木桥主题课程(图说汉字、妙趣汉音、情智阅读、麦斯思维、专注力训练);英语及特色课程(体能、舞蹈、美工、魔力猴、足球、国学)。"
]
def generate_comment(name, age_group, traits,sex):

View File

@@ -5,6 +5,7 @@ from loguru import logger
import zipfile
import traceback
def export_templates_folder(output_folder, stop_event, progress_callback=None):
"""
将指定文件夹压缩为 zip 包
@@ -121,7 +122,9 @@ def export_data(save_dir, root_dir=".", progress_callback=None):
has_files = True
# 更新进度条
if progress_callback:
progress_callback(processed_count + 1, total_files, "导出数据中...")
progress_callback(
processed_count + 1, total_files, "导出数据中..."
)
if has_files:
# 确保进度条最后能走到 100%
@@ -139,6 +142,7 @@ def export_data(save_dir, root_dir=".", progress_callback=None):
except Exception as e:
logger.error(f"导出过程出错: {str(e)}")
import traceback
logger.error(traceback.format_exc())
return None
@@ -218,6 +222,7 @@ def check_file_exists(file_path):
"""
return file_path and isinstance(file_path, str) and os.path.exists(file_path)
def get_output_pptx_files(output_dir="output"):
"""
获取 output 文件夹下所有的 pptx 文件
@@ -241,3 +246,17 @@ def get_output_pptx_files(output_dir="output"):
except Exception as e:
logger.error(f"发生未知错误: {e}")
logger.error(traceback.format_exc())
def open_folder(folder_path):
"""
打开指定文件夹
:param folder_path: 文件夹路径
"""
try:
if os.path.exists(folder_path):
os.startfile(folder_path)
else:
logger.error(f"文件夹不存在: {folder_path}")
except Exception as e:
logger.error(f"打开文件夹失败: {e}")

View File

@@ -21,28 +21,28 @@ def replace_text_in_slide(prs, slide_index, placeholder, text):
original_paragraph_formats = []
for paragraph in shape.text_frame.paragraphs:
paragraph_format = {
'alignment': paragraph.alignment,
'space_before': getattr(paragraph, 'space_before', None),
'space_after': getattr(paragraph, 'space_after', None),
'line_spacing': getattr(paragraph, 'line_spacing', None),
'left_indent': getattr(paragraph, 'left_indent', None),
'right_indent': getattr(paragraph, 'right_indent', None),
'first_line_indent': getattr(paragraph, 'first_line_indent', None),
'font_info': []
"alignment": paragraph.alignment,
"space_before": getattr(paragraph, "space_before", None),
"space_after": getattr(paragraph, "space_after", None),
"line_spacing": getattr(paragraph, "line_spacing", None),
"left_indent": getattr(paragraph, "left_indent", None),
"right_indent": getattr(paragraph, "right_indent", None),
"first_line_indent": getattr(paragraph, "first_line_indent", None),
"font_info": [],
}
for run in paragraph.runs:
run_format = {
'font_name': run.font.name,
'font_size': run.font.size,
'bold': run.font.bold,
'italic': run.font.italic,
'underline': run.font.underline,
'color': run.font.color,
'character_space': getattr(run.font, 'space', None),
'all_caps': getattr(run.font, 'all_caps', None),
'small_caps': getattr(run.font, 'small_caps', None)
"font_name": run.font.name,
"font_size": run.font.size,
"bold": run.font.bold,
"italic": run.font.italic,
"underline": run.font.underline,
"color": run.font.color,
"character_space": getattr(run.font, "space", None),
"all_caps": getattr(run.font, "all_caps", None),
"small_caps": getattr(run.font, "small_caps", None),
}
paragraph_format['font_info'].append(run_format)
paragraph_format["font_info"].append(run_format)
original_paragraph_formats.append(paragraph_format)
# 2. 设置新文本
@@ -51,55 +51,69 @@ def replace_text_in_slide(prs, slide_index, placeholder, text):
# 3. 恢复格式
for i, paragraph in enumerate(shape.text_frame.paragraphs):
orig_idx = i if i < len(original_paragraph_formats) else -1
if not original_paragraph_formats: break
if not original_paragraph_formats:
break
original_para = original_paragraph_formats[orig_idx]
# 恢复段落属性
for attr in ['alignment', 'space_before', 'space_after', 'line_spacing',
'left_indent', 'right_indent', 'first_line_indent']:
for attr in [
"alignment",
"space_before",
"space_after",
"line_spacing",
"left_indent",
"right_indent",
"first_line_indent",
]:
if original_para[attr] is not None:
setattr(paragraph, attr, original_para[attr])
# 恢复字体属性
for j, run in enumerate(paragraph.runs):
font_idx = j if j < len(original_para['font_info']) else 0
if not original_para['font_info']: break
font_idx = j if j < len(original_para["font_info"]) else 0
if not original_para["font_info"]:
break
original_font = original_para['font_info'][font_idx]
original_font = original_para["font_info"][font_idx]
# 字体名称检查与回退
if original_font['font_name']:
if is_font_available(original_font['font_name']):
run.font.name = original_font['font_name']
if original_font["font_name"]:
if is_font_available(original_font["font_name"]):
run.font.name = original_font["font_name"]
else:
run.font.name = "微软雅黑"
# 恢复其他字体属性
if original_font['font_size']: run.font.size = original_font['font_size']
if original_font['bold']: run.font.bold = original_font['bold']
if original_font['italic']: run.font.italic = original_font['italic']
if original_font['underline']: run.font.underline = original_font['underline']
if original_font['all_caps']: run.font.all_caps = original_font['all_caps']
if original_font["font_size"]:
run.font.size = original_font["font_size"]
if original_font["bold"]:
run.font.bold = original_font["bold"]
if original_font["italic"]:
run.font.italic = original_font["italic"]
if original_font["underline"]:
run.font.underline = original_font["underline"]
if original_font["all_caps"]:
run.font.all_caps = original_font["all_caps"]
if original_font['character_space']:
if original_font["character_space"]:
try:
run.font.space = original_font['character_space']
run.font.space = original_font["character_space"]
except:
pass
logger.error(f"错误: 无法设置字体间距 {original_font['character_space']}")
if original_font['color']:
if original_font["color"]:
try:
if hasattr(original_font['color'], 'rgb'):
run.font.color.rgb = original_font['color'].rgb
if hasattr(original_font["color"], "rgb"):
run.font.color.rgb = original_font["color"].rgb
except:
pass
logger.error(f"错误: 无法设置字体颜色 {original_font['color']}")
def replace_picture(prs, slide_index, placeholder, img_path):
"""
在指定幻灯片中替换指定占位符的图片(包含自动旋转修复)
参数:
prs: Presentation 对象
slide_index: 幻灯片索引 (从0开始)
@@ -122,19 +136,26 @@ def replace_picture(prs, slide_index, placeholder, img_path):
target_shape = shape
target_index = i
break
if target_shape:
# 获取原位置信息
left, top, width, height = target_shape.left, target_shape.top, target_shape.width, target_shape.height
left, top, width, height = (
target_shape.left,
target_shape.top,
target_shape.width,
target_shape.height,
)
# 2. 获取修正后的图片流
img_stream = get_corrected_image_stream(img_path)
# 3. 移除旧形状
sp_tree.remove(target_shape._element)
# 4. 插入新图片 (使用流而不是路径)
new_shape = slide.shapes.add_picture(img_stream, left, top, width, height)
# 5. 恢复层级位置 (z-order)
sp_tree.insert(target_index, new_shape._element)
sp_tree.insert(target_index, new_shape._element)
else:
logger.warning(f"警告: 幻灯片 {slide_index} 中未找到占位符 {placeholder}")