# PRD: PDFtoMD ## 목표 PDFtoMD는 수학, 공학, 역학 중심의 PDF 문서를 AI Agent가 쉽게 접근하고 읽을 수 있는 Markdown 문서 묶음으로 변환하는 프로그램입니다. 이 프로젝트의 목표는 PDF의 텍스트를 단순 추출하는 것이 아니라, 원문 문서의 논리 구조를 보존하면서 AI가 읽기 쉬운 지식 자료로 재구성하는 것입니다. ## 문제 정의 - PDF는 텍스트, 이미지, 수식, 표, 캡션을 좌표 기반으로 저장하므로 원문 읽기 순서가 쉽게 깨집니다. - 논문과 공학 문서에는 다단 레이아웃, 수식 번호, 그림/표 참조, 복잡한 표가 자주 등장합니다. - 스캔 PDF와 텍스트 레이어 PDF가 섞인 문서는 OCR 여부를 문서 전체 단위가 아니라 페이지 단위로 판단해야 합니다. - AI Agent와 RAG 도구는 긴 PDF 하나보다 논리적으로 나뉜 Markdown chunk와 연결된 asset을 더 안정적으로 탐색합니다. ## 사용자 - PDF 문서를 Markdown으로 변환해 AI Agent, RAG, 개인 지식 관리 도구에 활용하고 싶은 사용자 - 수식, 표, 이미지가 많은 논문/공학 문서를 Markdown으로 읽고 관리하고 싶은 사용자 - 긴 PDF를 여러 Markdown 파일로 나누어 부분 탐색하고 싶은 사용자 - Windows native 환경에서 외부 서비스 없이 로컬로 변환하고 싶은 사용자 ## 1차 MVP 범위 - Windows native 환경에서 완전 로컬 실행 - GPU 기본 사용, VRAM 8GB 환경을 기준으로 안정적인 chunk 처리 - repo-local Python 3.11 단일 `venv` 환경 사용 - PDF parser는 `Marker`를 기본 엔진으로 사용 - 본문 구조, OCR/layout, reading order, 표, 그림, heading, caption은 Marker 경로를 유지 - 수학적 표현이나 수식은 `Nougat` parser를 사용 - PyMuPDF로 페이지 수, 텍스트 레이어 품질, OCR 필요 여부, chunk 계획을 사전 분석 - PDF 텍스트를 Markdown 문단과 heading 구조로 변환 - PDF 내 수식을 Markdown math delimiter를 사용하는 LaTeX로 변환 - Nougat 실패 시 Marker 원문 수식 문자열을 fallback으로 보존 - PDF 내 이미지를 추출하고 Markdown에서 연결 - 이미지의 figure 번호와 캡션을 가능한 한 보존 - PDF 내 표를 구조화하고 Markdown table로 출력 - Markdown table 손실이 큰 표는 제한적 HTML table 또는 표 영역 이미지 fallback으로 보존 - 페이지 수가 많은 문서를 20페이지 목표 chunk로 분할하되 논리 block 경계 보존 - CLI 진행률, chunk 단위 성공/실패 요약, stderr/local log 기록 - 실패 chunk 재개를 위한 runtime cache/state 기반 resume 옵션 - `samples/` PDF 기반 품질 검증과 회귀 테스트 지원 ## 2차 범위 - PyQt 기반 Windows UI - UI는 CLI/라이브러리 계층을 호출하는 thin client로 구현 - 선택적 외부 API 연동은 변환 엔진 안정화 이후 검토 ## 제외 범위 - hosted conversion API 기본 경로화 - LLM 보정 모드 기본 경로화 - 생성 문서와 함께 배포되는 별도 sidecar metadata/log 산출물 - 변환 엔진 로직을 PyQt UI 안에 중복 구현하는 방식 ## 핵심 기능 1. PDF 문서를 Markdown 문서 묶음으로 변환 2. 텍스트 PDF, 스캔 PDF, 혼합 PDF를 페이지별 OCR 판단으로 처리 3. 수식을 `$ ... $` 또는 `$$ ... $$` 형식의 LaTeX로 보존 4. 수식 번호와 본문 내 수식 참조를 가능한 한 내부 링크로 연결 5. 논문에서 자주 쓰이는 다중 컬럼 문서를 Markdown의 선형 구조로 재배치 6. 이미지 추출 및 Markdown 연결 7. figure 번호, caption, 본문 내 figure 참조 연결 8. 표 구조화 및 표 유형별 Markdown/HTML/fallback 이미지 출력 9. 긴 PDF를 여러 chunk Markdown 파일로 분할 변환 10. 한글 파일명, 긴 Windows 경로, 공백 포함 경로 지원 11. GTX 1070 Ti 8GB VRAM 기준 batch 크기 제어와 OOM 재시도 12. offline 실행을 위한 명시적 model cache 정책 ## 품질 기준 - 원문 읽기 순서가 Markdown에서 자연스럽게 유지되어야 합니다. - heading, 본문, 리스트, 인용, 표, 그림, 캡션, 수식의 의미 역할이 구분되어야 합니다. - 수식 delimiter와 기본 LaTeX 구조가 깨지지 않아야 합니다. - 수식 번호와 본문 참조가 가능한 한 연결되어야 합니다. - 이미지와 캡션, figure 번호, 본문 참조가 가능한 한 연결되어야 합니다. - 표는 구조 손실을 최소화하는 형식으로 저장되어야 합니다. - chunk 경계가 문단, 표, 그림, 수식을 중간에서 깨뜨리지 않아야 합니다. - 같은 입력 PDF와 같은 옵션은 같은 파일명, anchor, asset 구조를 생성해야 합니다. - Windows 경로, 한글 파일명, 긴 문서, GPU 메모리 부족 상황을 고려해야 합니다. - 오류와 경고는 Markdown 본문을 오염시키지 않고 stderr/local log에 남겨야 합니다. ## Acceptance Criteria - `python scripts/validate_workspace.py`가 성공해야 합니다. - `.\venv\python.exe -m pip check`가 성공해야 합니다. - CUDA smoke test가 GTX 1070 Ti에서 성공해야 합니다. - `.\venv\Scripts\nougat.exe --help`가 성공해야 합니다. - sample metadata mapping 파일이 각 sample PDF의 특성을 설명해야 합니다. - focused pytest가 heading, 수식 delimiter, LaTeX environment pair, image link, caption matching, table parseability, chunk boundary, no-exception conversion을 검증해야 합니다. ## UI - UI는 2차 목표로 PyQt를 사용합니다. - UI는 변환 엔진을 직접 구현하지 않고 CLI/라이브러리 계층을 호출하는 thin client로 둡니다. - 미니멀하고 깔끔한 Windows 표준 디자인을 따릅니다.