136 lines
3.9 KiB
Python
136 lines
3.9 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
将实习报告Markdown转换为Word文档
|
||
"""
|
||
|
||
from docx import Document
|
||
from docx.shared import Pt, RGBColor, Inches
|
||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||
from docx.oxml.ns import qn
|
||
import re
|
||
|
||
def set_cell_border(cell):
|
||
"""设置表格边框"""
|
||
from docx.oxml import OxmlElement
|
||
from docx.oxml.ns import qn
|
||
|
||
tcPr = cell._element.get_or_add_tcPr()
|
||
tcBorders = OxmlElement('w:tcBorders')
|
||
|
||
for border_name in ['top', 'left', 'bottom', 'right']:
|
||
border = OxmlElement(f'w:{border_name}')
|
||
border.set(qn('w:val'), 'single')
|
||
border.set(qn('w:sz'), '4')
|
||
border.set(qn('w:space'), '0')
|
||
border.set(qn('w:color'), '000000')
|
||
tcBorders.append(border)
|
||
|
||
tcPr.append(tcBorders)
|
||
|
||
def add_paragraph_with_format(doc, text, bold=False, font_size=12, alignment=WD_ALIGN_PARAGRAPH.LEFT):
|
||
"""添加带格式的段落"""
|
||
para = doc.add_paragraph()
|
||
para.alignment = alignment
|
||
run = para.add_run(text)
|
||
run.font.size = Pt(font_size)
|
||
run.font.name = '宋体'
|
||
run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
|
||
if bold:
|
||
run.bold = True
|
||
return para
|
||
|
||
def add_heading(doc, text, level=1):
|
||
"""添加标题"""
|
||
heading = doc.add_heading(text, level=level)
|
||
for run in heading.runs:
|
||
run.font.size = Pt(16 - level * 2)
|
||
run.font.name = '黑体'
|
||
run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
|
||
return heading
|
||
|
||
def parse_markdown_to_docx(md_file, docx_file):
|
||
"""解析Markdown文件并转换为Word文档"""
|
||
|
||
# 创建Word文档
|
||
doc = Document()
|
||
|
||
# 设置页面边距
|
||
sections = doc.sections
|
||
for section in sections:
|
||
section.top_margin = Inches(1)
|
||
section.bottom_margin = Inches(1)
|
||
section.left_margin = Inches(1.25)
|
||
section.right_margin = Inches(1.25)
|
||
|
||
# 读取Markdown文件
|
||
with open(md_file, 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
|
||
# 分割成行
|
||
lines = content.split('\n')
|
||
|
||
i = 0
|
||
while i < len(lines):
|
||
line = lines[i].strip()
|
||
|
||
# 跳过空行
|
||
if not line:
|
||
i += 1
|
||
continue
|
||
|
||
# 处理标题
|
||
if line.startswith('#'):
|
||
level = line.count('#')
|
||
title_text = line.lstrip('#').strip()
|
||
if level <= 6:
|
||
add_heading(doc, title_text, min(level, 3))
|
||
else:
|
||
add_paragraph_with_format(doc, title_text, font_size=14, bold=True)
|
||
i += 1
|
||
continue
|
||
|
||
# 处理水平线
|
||
if line.startswith('---'):
|
||
doc.add_paragraph('_' * 50)
|
||
i += 1
|
||
continue
|
||
|
||
# 处理粗体文本
|
||
if line.startswith('**') and line.endswith('**'):
|
||
text = line.replace('**', '').strip()
|
||
add_paragraph_with_format(doc, text, bold=True)
|
||
i += 1
|
||
continue
|
||
|
||
# 处理列表
|
||
if line.startswith('- ') or line.startswith('• '):
|
||
text = line.lstrip('-·').strip()
|
||
add_paragraph_with_format(doc, ' ' + text)
|
||
i += 1
|
||
continue
|
||
|
||
# 处理编号列表
|
||
if re.match(r'^\d+[、..]', line):
|
||
add_paragraph_with_format(doc, line)
|
||
i += 1
|
||
continue
|
||
|
||
# 处理普通段落(可能是多行)
|
||
para_text = line
|
||
i += 1
|
||
while i < len(lines) and lines[i].strip() and not lines[i].startswith('#') and not lines[i].startswith('-') and not lines[i].startswith('**'):
|
||
para_text += ' ' + lines[i].strip()
|
||
i += 1
|
||
|
||
add_paragraph_with_format(doc, para_text)
|
||
|
||
# 保存文档
|
||
doc.save(docx_file)
|
||
print(f"Word文档已生成: {docx_file}")
|
||
|
||
if __name__ == '__main__':
|
||
md_file = '杨璐-实习报告.md'
|
||
docx_file = '杨璐-实习报告.docx'
|
||
parse_markdown_to_docx(md_file, docx_file)
|