마크다운, 이제 '정식 식구'로 인정 — PyMuPDF 1.28 업데이트 소식

마크다운, 이제 '정식 식구'로 인정합니다 — PyMuPDF 1.28 업데이트

태그: pymupdf, markdown, pdf, opensource, ai, llm
카테고리: 읽을거리&정보공유


안녕하세요, 여러분!

최근 나온 PyMuPDF 1.28 업데이트가 RAG/LLM 파이프라인 다루시는 분들께 꽤 쓸모 있을 것 같아 짧게 공유드립니다.

마크다운은 이미 LLM과 RAG 파이프라인의 기본 언어죠. 이번 릴리즈에서 PyMuPDF가 이 마크다운을 PDF와 동급의 정식 문서 포맷으로 받아들이기 시작했고, 반대로 Office 문서를 마크다운으로 바로 뽑아내는 기능도 추가됐습니다. 핵심은 딱 두 가지입니다.

1. 마크다운, PDF급 정식 문서 포맷이 되다

기존에는 마크다운을 PDF로 만들려면 외부 변환기를 거치거나 HTML을 중간에 끼워 넣어야 하는 경우가 많았습니다. 이제는 .md 파일을 PDF나 전자책처럼 그냥 열고, 렌더링하고, 변환할 수 있습니다.

  • .md 파일 직접 열기
  • 레이아웃·폰트·이미지·스타일까지 포함한 전체 렌더링 파이프라인 지원
  • 검색·선택 가능한 텍스트로 렌더링 (이미지로 뭉개지지 않음)
  • 하이퍼링크, 이미지, 리스트, 표 처리
  • 일관되고 품질 높은 레이아웃으로 PDF 변환

외부 변환기도, HTML 중간 단계도 필요 없고 구조 손실도 없습니다. PyMuPDF가 전통적 문서 포맷과 텍스트 기반 포맷을 모두 다루는 범용 엔진이 된 셈이죠.

2. CSS로 제어하는 마크다운 → PDF 변환

기존 Document.save() 메서드가 이 마크다운 엔진을 그대로 품게 되면서, CSS로 PDF 디자인을 세밀하게 제어하며 마크다운으로 PDF를 뽑아낼 수 있습니다. 폰트(커스텀 폰트 포함), 크기·자간·여백, 색상, 표 스타일, 코드 블록 스타일, 이미지 임베딩, 페이지 레이아웃까지 전부 손댈 수 있습니다.

제일 기본적인 예시

import pymupdf
md_doc = pymupdf.open("example.md") # MD 텍스트 파일 열기
md_doc.save("example.pdf")

코드 두 줄이면 끝입니다. 여기서 example.md는 이렇게 생겼습니다.

# Title

## A Table

|**Boiling Points °C**|**min**|**max**|**avg**|
|---|---|---|---|
|**Noble gases**|-269|-62|-170.5|
|**Nonmetals**|-253|4827|414.1|
|**Metalloids**|335|3900|741.5|
|**Metals**|357|>5000|2755.9|

## A List

* Comment 1
* Comment 2
* Comment 3 with a link to [Find out more](https://pymupdf.readthedocs.io)

## My TO-DOs

* [x] Done!
* [x] Also done!
* [ ] Still open

CSS로 디자인 커스터마이징

입력 마크다운은 그대로 두고 CSS만 얹으면 폰트·색상 등을 자유롭게 꾸밀 수 있습니다.

import pymupdf

css = """
@font-face {
    font-family: 'FreightSans Bold';
    src: url(FreigSanProBol.ttf);
}

h1 {
    font-size:50px;
    font-family: 'FreightSans Bold';
    border:2px solid #ff00ff;
    background: yellow;
    text-align:center;
}

table {
    width: 100%;
}

ul li {
    color: green;
}
"""

# 폰트가 들어있는 폴더를 가리키는 Archive 생성
archive = pymupdf.Archive("fonts")  # 폰트가 여기 있음
archive.add(".")  # 이미지는 이 스크립트와 같은 폴더에 저장해둠

md_file = "test.md"
md_doc = pymupdf.open(  # 마크다운 문서 열기
    md_file,
    archive=archive,  # 리소스(폰트, 이미지)를 찾을 위치
    rect=pymupdf.paper_rect("A4"),  # 페이지 크기: ISO A4
)

md_doc.apply_css(css)  # CSS 적용

md_doc.save("example.pdf") # PDF로 저장

H1 제목에 테두리·배경색을 넣고, 표는 페이지 폭에 맞게 늘리고, 리스트 항목은 초록색으로 꾸미는 CSS입니다.

커스텀 태그로 이미지 위치·크기까지 제어

마크다운 본문에 커스텀 엘리먼트 태그를 넣고 CSS로 직접 타깃팅할 수도 있습니다.

<mytag>Hello World</mytag>
mytag { ... }

같은 방식으로 이미지 배치·크기도 조정 가능합니다.

<mytag><img src="pie-chart.png" /></mytag>
mytag img {
    width:100px;
    height:100px;
}

이렇게 지정하지 않으면 이미지는 원본 크기 그대로 들어갑니다.

3. Office 문서 → 마크다운 (유료 버전 기능)

참고로 Office 문서를 마크다운으로 변환하는 기능은 유료 버전(PyMuPDF Pro)에서 지원합니다. office_to_markdown() 메서드 하나면 끝입니다.

md = pymupdf.pro.office_to_markdown("my-office-doc.xls")

바이너리 포맷인 Office 문서를 마크다운으로 바꾸면 콘텐츠 알맹이만 그대로 손에 넣을 수 있습니다. 텍스트 에디터든 터미널이든 LLM이든 별도 앱 없이 바로 읽히고, 용량이 확 줄어서 저장·검색이 쉬워지고, Git으로 버전 비교(diff)도 가능해지고, 무엇보다 LLM이 가장 잘 읽고 쓰는 포맷이라는 게 장점입니다.

:bulb: 정리

여러분이 다루시는 RAG/LLM 파이프라인 관점에서 보면 이번 업데이트는 양방향으로 쓸모가 있습니다. Office 문서(워드, 엑셀, 파워포인트)를 깔끔한 마크다운으로 뽑아내서 인덱싱·청킹 전 단계에 바로 태울 수 있고, 반대로 파이프라인 산출물이나 리포트를 CSS로 스타일링한 PDF로 자동 발행하는 것도 몇 줄이면 가능해졌습니다. AI 시대에 맞춰 마크다운을 양방향으로 다루게 된 업데이트라, 알아두시면 도움이 될 것 같아 공유드립니다.

PyMuPDF GitHub 바로가기

PyMuPDF PyPI 바로가기

:link: 원문 참고: Markdown in PyMuPDF 1.28 (Artifex Blog)

1개의 좋아요