dox_builder.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import os
  2. import re
  3. import uuid
  4. import pypandoc
  5. from docx import Document
  6. from docx.shared import Pt, Cm
  7. from docx.oxml.ns import qn
  8. from docx.enum.text import WD_ALIGN_PARAGRAPH
  9. from docx.enum.table import WD_TABLE_ALIGNMENT
  10. from config.settings import SERVER_HOST, REPORT_OUTPUT_DIR
  11. TEMPLATE_FILENAME = "template.docx"
  12. def convert_markdown_to_docx(md_content: str, save_path: str) -> None:
  13. # 自动检测并下载 pandoc
  14. try:
  15. pypandoc.get_pandoc_path()
  16. except OSError:
  17. print("未检测到 pandoc,正在自动下载...")
  18. pypandoc.download_pandoc()
  19. report_content = md_content.strip()
  20. template_file = os.path.join(os.path.dirname(__file__), TEMPLATE_FILENAME)
  21. if not os.path.exists(template_file):
  22. raise FileNotFoundError(
  23. f"样式模板不存在!路径:{template_file}"
  24. )
  25. extra_args = [
  26. "--standalone",
  27. f"--reference-doc={template_file}"
  28. ]
  29. pypandoc.convert_text(
  30. source=report_content,
  31. format="md",
  32. to="docx",
  33. outputfile=save_path,
  34. extra_args=extra_args,
  35. encoding="utf-8"
  36. )
  37. print(f"✅ 转换成功!文件输出路径:{save_path}")
  38. def get_docx_download_url(word_filename: str) -> str:
  39. return f"{SERVER_HOST}/static/report_pdf/{word_filename}"
  40. if __name__ == '__main__':
  41. # 读取本地 md 文本文件
  42. try:
  43. with open("../md.txt", "r", encoding="utf-8") as f:
  44. md_text = f.read()
  45. # 输出 word 路径,可自行修改
  46. word_output_path = "../审查报告.docx"
  47. convert_markdown_to_docx(md_text, word_output_path)
  48. except FileNotFoundError:
  49. print("错误:未找到 ../md.txt 文件,请检查文件路径!")
  50. except Exception as e:
  51. print(f"执行异常:{str(e)}")