import docx from docx import Document from docx.shared import Pt from pypinyin import pinyin, Style, lazy_pinyin import re def get_first_char_pinyin(text): """获取中文段落开头汉字的拼音(首字母大写)""" if re.match(r'[\u4e00-\u9fff]', text): return lazy_pinyin(text[0], style=Style.FIRST_LETTER)[0].upper() return '' def is_chinese_paragraph(paragraph): """判断段落是否为中文段落""" return bool(re.match(r'[\u4e00-\u9fff]', paragraph.text.strip())) def apply_font_to_paragraph(paragraph, font_name='宋体'): """为段落应用指定的字体""" for run in paragraph.runs: try: run.font.name = font_name except ValueError: # 如果字体名称无效或不受支持,可能会引发ValueError # 这里可以捕获异常并做适当处理,比如记录日志或回退到默认字体 pass def sort_paragraphs(paragraphs): """根据要求排序段落,处理空文本段落""" chinese_paragraphs = [] english_paragraphs = [] for p in paragraphs: stripped_text = p.text.strip() if stripped_text: # 只处理非空文本段落 if is_chinese_paragraph(p): # 对中文段落,使用拼音首字母作为排序键(如果文本非空) # 注意:这里假设 get_first_char_pinyin 能处理单字符输入 chinese_paragraphs.append( (p, get_first_char_pinyin(stripped_text[0]) if len(stripped_text) > 0 else '')) else: # 对英文段落,使用文本首字母小写作为排序键(如果文本非空) english_paragraphs.append((p, stripped_text[0].lower() if len(stripped_text) > 0 else '')) # 对中英文段落分别按排序键排序(注意这里我们存储了段落和排序键的元组) chinese_paragraphs.sort(key=lambda x: x[1]) english_paragraphs.sort(key=lambda x: x[1]) # 提取排序后的段落对象列表 sorted_chinese = [p for p, _ in chinese_paragraphs] sorted_english = [p for p, _ in english_paragraphs] # 合并排序后的中英文段落列表 return sorted_chinese + sorted_english def main(input_path, output_path): # 读取Word文档 doc = Document(input_path) paragraphs = doc.paragraphs # 排序段落 sorted_paragraphs = sort_paragraphs(paragraphs) # 创建新的Word文档并添加排序后的段落 new_doc = Document() for para in sorted_paragraphs: new_para = new_doc.add_paragraph() # 复制段落内容 new_para.add_run(para.text) # 为中文段落应用宋体字体(如果可用) if is_chinese_paragraph(para): apply_font_to_paragraph(new_para, '宋体') # 保存新的Word文档 new_doc.save(output_path) if __name__ == "__main__": input_path = 'input.docx' # 输入的Word文件路径 output_path = 'sorted_output.docx' # 输出的Word文件路径 main(input_path, output_path)