Files
AX-Copilot/dist/AxCopilot/skills/markdown-to-doc.skill.md

5.2 KiB

name, label, description, icon, tabs, requires
name label description icon tabs requires
markdown-to-doc Markdown → 문서 변환 Markdown 파일을 서식이 적용된 Word(.docx) 또는 PDF 문서로 변환합니다. \uE8A5 cowork python

Markdown 파일을 전문적인 Word 또는 PDF 문서로 변환하세요.

사전 준비

먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요:

process_run: pip install python-docx markdown

작업 절차

  1. Markdown 파일 확인: file_read로 변환할 Markdown 파일의 내용과 구조를 파악
  2. 변환 옵션 확인: 사용자에게 다음 옵션을 확인
    • 출력 형식: Word(.docx) 또는 PDF
    • 폰트: 맑은 고딕 (기본) / 사용자 지정
    • 여백, 페이지 크기 설정
    • 머리글/바닥글 포함 여부
  3. Python 스크립트 작성: file_write로 변환 스크립트 생성
  4. 스크립트 실행: process_run으로 Python 스크립트 실행
  5. 결과 확인: 생성된 문서 파일 경로와 페이지 수를 안내

스타일 매핑

Markdown Word 스타일 설명
# 제목 Heading 1 16pt, 굵게
## 소제목 Heading 2 14pt, 굵게
### 항목 Heading 3 12pt, 굵게
본문 텍스트 Normal 11pt
**굵게** Bold run 굵게
*기울임* Italic run 기울임
`코드` 코드 스타일 Consolas, 배경색
> 인용 Quote 들여쓰기 + 왼쪽 테두리
- 목록 List Bullet 글머리 기호
1. 번호 List Number 번호 목록
Table Grid 테두리 표
--- 페이지 구분 가로선 → 페이지 나누기
코드 블록 코드 단락 Consolas, 회색 배경

Python 스크립트 템플릿

import re
from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
import markdown

# Markdown 파일 읽기
with open('input.md', 'r', encoding='utf-8') as f:
    md_content = f.read()

doc = Document()

# 기본 스타일 설정
style = doc.styles['Normal']
font = style.font
font.name = '맑은 고딕'
font.size = Pt(11)
style.element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕')

# 여백 설정
for section in doc.sections:
    section.top_margin = Cm(2.54)
    section.bottom_margin = Cm(2.54)
    section.left_margin = Cm(3.17)
    section.right_margin = Cm(3.17)

# Markdown 파싱 및 변환
lines = md_content.split('\n')
i = 0
while i < len(lines):
    line = lines[i]

    # 제목 (Heading)
    if line.startswith('#'):
        level = len(line) - len(line.lstrip('#'))
        text = line.lstrip('#').strip()
        doc.add_heading(text, level=min(level, 4))

    # 코드 블록
    elif line.startswith('```'):
        code_lines = []
        i += 1
        while i < len(lines) and not lines[i].startswith('```'):
            code_lines.append(lines[i])
            i += 1
        p = doc.add_paragraph()
        run = p.add_run('\n'.join(code_lines))
        run.font.name = 'Consolas'
        run.font.size = Pt(9)

    # 인용
    elif line.startswith('>'):
        text = line.lstrip('>').strip()
        p = doc.add_paragraph(text)
        p.paragraph_format.left_indent = Cm(1.27)

    # 글머리 기호
    elif line.startswith('- ') or line.startswith('* '):
        text = line[2:].strip()
        doc.add_paragraph(text, style='List Bullet')

    # 번호 목록
    elif re.match(r'^\d+\.\s', line):
        text = re.sub(r'^\d+\.\s', '', line).strip()
        doc.add_paragraph(text, style='List Number')

    # 가로선 → 페이지 나누기
    elif line.strip() in ('---', '***', '___'):
        doc.add_page_break()

    # 빈 줄
    elif line.strip() == '':
        pass

    # 일반 텍스트
    else:
        p = doc.add_paragraph()
        # 굵게, 기울임 처리
        parts = re.split(r'(\*\*.*?\*\*|\*.*?\*|`.*?`)', line)
        for part in parts:
            if part.startswith('**') and part.endswith('**'):
                run = p.add_run(part[2:-2])
                run.bold = True
            elif part.startswith('*') and part.endswith('*'):
                run = p.add_run(part[1:-1])
                run.italic = True
            elif part.startswith('`') and part.endswith('`'):
                run = p.add_run(part[1:-1])
                run.font.name = 'Consolas'
                run.font.size = Pt(10)
            else:
                p.add_run(part)

    i += 1

# 저장
doc.save('output.docx')
print(f'변환 완료: output.docx ({len(doc.paragraphs)}개 단락)')

표 변환

Markdown 표가 있으면 Word 표로 변환합니다:

  • 헤더 행: 굵게, 배경색 적용
  • 셀 정렬: Markdown의 :---, :---:, ---: 구문 반영
  • 테두리: 전체 셀에 얇은 테두리

규칙

  • 원본 Markdown 파일은 수정하지 않음
  • 인코딩: UTF-8 기본
  • 이미지 링크(![](path))는 로컬 파일이면 삽입, URL이면 경로만 표시
  • 복잡한 Markdown(수식, 다이어그램)은 지원 범위와 한계를 안내
  • 출력 파일명: 원본 파일명 기준 (.md → .docx)

한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요.