EPUB 변환기: 알파벳순으로 정리된 챕터는 책의 순서가 아닌, 스파인(spine)이 읽기 순서를 정의한다
요약
EPUB 파일의 챕터 순서를 결정하는 것은 단순히 파일명이나 알파벳순 정렬이 아닙니다. EPUB은 ZIP 압축 파일이며, 실제 읽기 순서는 `content.opf` 내 `<spine>` 요소에 명시된 매니페스트 ID 목록을 따라야 합니다. 이 글은 올바른 파싱 방법과 수정된 워크플로우를 제시합니다.
핵심 포인트
- EPUB의 읽기 순서는 파일명(알파벳순)이 아닌, `content.opf`의 `<spine>` 요소가 정의한다.
- `<spine>`은 책을 읽어야 하는 순서대로 매니페스트 ID를 나열하는 권위적인 메커니즘이다.
- 최신 파이프라인은 OPF 분석 -> 스파인 탐색 -> NCX 폴백 -> 파일명 정렬 순으로 작동한다.
- 컨테이너의 파일 목록(저장 순서)을 의미적 순서로 오해해서는 안 된다.
한 사용자가 40개 챕터로 구성된 기술 매뉴얼을 저에게 보내주었고, 저는 이 파일을 EPUB 변환기를 거쳤습니다. 모든 내용은 있었지만, 서문은 14번째 위치에 놓였고, 챕터 3은 챕터 12 다음에 나왔으며, 부록은 책 중간쯤에 자리 잡았습니다. 깨끗한 텍스트는 그대로인데 순서가 완전히 엉망이었습니다.
버그의 원인은 창피할 정도로 저에게 있었습니다. EPUB은 개별 XHTML 파일들의 ZIP 압축 파일입니다. 보통 챕터당 하나씩, chapter1.xhtml, chapter2.xhtml와 같은 이름으로 되어 있죠. 저는 결정론적이라고 느꼈기 때문에 이 항목들을 알파벳 순서로 처리했습니다. 사전식 정렬(Lexicographic sort)에 따르면 chapter10.xhtml이 chapter2.xhtml보다 먼저 옵니다. 그리고 서문은 출판사가 fm1.xhtml라는 이름으로 지정한 일회성 파일이었는데, 이것이 가장 마지막 순서로 정렬되었습니다. 제가 출력했던 읽기 순서는 책의 내용에 의한 것이 아니라, 파일 정렬 과정에서 발생한 사고였습니다.
수정된 방법: EPUB에서 읽기 순서는 파일명 규칙이 아닙니다. 그것은 content.opf에 선언되어 있습니다. <spine> 요소는 책을 읽어야 하는 순서대로 매니페스트 ID를 나열하며, 매니페스트(manifest)는 각 ID를 해당 href와 연결합니다. EPUB2 책에는 또한 중첩된 navMap이 포함된 toc.ncx가 존재하고, EPUB3에서는 이를 nav.xhtml로 대체했습니다. 스파인(spine)은 선형적인 읽기에 있어 권위적이며, 목차(TOC)는 계층 구조(챕터를 포함하는 파트 등)를 추가합니다. 저는 이제 이 TOC를 사용하여 최상위 제목의 깊이를 설정합니다.
현재 파이프라인: OPF를 구문 분석하고, 스파인 내의 idrefs를 순서대로 탐색하며, 스파인이 누락한 부분에 대해서는 NCX navMap으로 폴백(fallback)하고, 마지막으로 심하게 훼손된 파일들에 한해서만 정렬된 파일명을 사용합니다. 그 이후로는 테스트했던 모든 책들이 올바른 순서로 나왔으며, 챕터 10은 마침내 챕터 2 다음에 오게 되었습니다.
교훈: 컨테이너의 파일 목록은 저장 순서일 뿐, 의미적(semantic) 순서는 아닙니다. 이는 PDF 내부 트리에서 객체 순서를 신뢰하는 것과 같은 함정입니다. 어떤 포맷이 매니페스트를 제공한다면, 그 매니페스트를 믿어야 합니다.
해당 변환기는 https://x402.freeq.one/tools/epub_to_markdown.html에서 이용 가능하며, 스파인 순서 수정 기능이 포함되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기