Hello Wold
개발

PDF 전자책을 EPUB으로 변환해 스마트폰에서 읽기 좋게 만들기

26년 05월 07일

RyuWoong

PDF 전자책을 EPUB으로 변환해 스마트폰에서 읽기 좋게 만들기

전자책으로 책을 읽다 보면 PDF 형태로 제공되는 책을 자주 접한다. 컴퓨터나 태블릿처럼 화면이 넓은 기기에서는 크게 문제가 없지만, 핸드폰 같은 작은 화면에서는 도저히 보기 어려웠다.

Ebook 리더기에서는 섹션을 정해 넘기듯 볼 수는 있었다. 그래도 페이지를 넘기는 흐름이 자연스럽지 않았고, 이동 중에 잠깐 읽기도 번거로워 손이 잘 가지 않았다.

그래서 PDF를 EPUB으로 다시 구성해보면 어떨까 생각했다. EPUB은 전자책 읽기에 더 적합한 형식이다. 화면 크기에 맞춰 글이 자연스럽게 재배치되고, 글자 크기나 줄 간격도 원하는 방식으로 조정할 수 있어 스마트폰처럼 작은 화면에서도 훨씬 편하게 읽을 수 있었다.

오늘은 PDF로 제공되는 책을 EPUB으로 변환했던 과정을 정리해보려고 한다.


해결하고 싶었던 문제

PDF 책을 스마트폰에서 읽을 때 가장 크게 느낀 불편함은 다음과 같았다.

  • 화면 크기에 맞게 글이 재배치되지 않는다.
  • 확대와 이동을 반복해야 해서 읽는 흐름이 끊긴다.
  • 코드 블록, 표, 이미지가 포함된 책은 더 읽기 어렵다.
  • 책을 잠깐씩 이어 읽기 어렵고 피로도가 높다.

특히 개발 서적처럼 코드와 이미지가 함께 등장하는 책은 단순히 텍스트만 추출해서는 부족했다. 코드 블록은 코드 블록답게 보여야 했고, 이미지를 봐야 이해되는 내용은 이미지까지 함께 포함되어야 했다.

전체적인 접근 방식

이번 작업의 전체 흐름은 다음과 같다.

PDF
→ OCR 또는 텍스트 추출
→ Markdown / JSON 정리
→ 오탈자 및 문맥 보정
→ 코드 블록 / 이미지 처리
→ EPUB 변환

전자책 리더 앱에서 자연스럽게 읽을 수 있는 EPUB을 만드는 것이 목표였다.

PDF를 텍스트로 바꾸기

가장 먼저 중요하게 생각한 부분은 OCR이었다.

처음에는 몇 가지 OCR 도구를 테스트해봤다. 단순히 글자를 인식하는 것만 보면 대부분 어느 정도 동작했다. 하지만 책 한 권을 EPUB으로 만들려면 단순한 인식률만으로는 부족했다.

특히 중요하게 느낀 부분은 다음과 같았다.

  • 글자 인식 정확도
  • 문단과 줄바꿈을 얼마나 자연스럽게 유지하는지
  • 코드 블록이나 표처럼 일반 문장과 다른 구조를 얼마나 잘 처리하는지
  • 한글과 영어가 섞인 문장을 얼마나 안정적으로 인식하는지
  • 이미지를 얼마나 잘 구분해 내는지

몇 번 테스트해보니 OCR 성능이 전체 결과물의 품질에 꽤 큰 영향을 줬다. OCR 결과가 좋지 않으면 이후 단계에서 아무리 Markdown으로 정리하고 EPUB으로 변환해도 읽기 좋은 책을 만들기 어려웠다.

잘못 인식된 글자가 많으면 문장을 계속 고쳐야 하고, 줄바꿈이 어색하면 문단을 다시 정리해야 했다.또 코드 블록이 깨지면 내용 자체가 달라질 수도 있다. OCR은 파이프라인의 가장 앞단에 있지만, 전체 품질을 좌우하는 중요한 단계였다.

PaddleOCR을 선택한 이유

여러 OCR 도구를 테스트한 뒤 최종적으로 선택한 것은 PaddleOCR이었다.

PaddleOCR을 선택한 이유는 비교적 인식 성능이 좋았기 때문이다. 이미지와 텍스트가 어떤 역할을 하는지도 대략적으로 구분했고, 웹페이지에서 쉽게 사용하고 테스트할 수 있었으며 JSON 데이터도 제공했다.

이미지 분리도 중요했지만, 첫 단계에서는 기준을 낮췄다

PaddleOCR의 이미지 분리 능력도 꽤 괜찮았다.

책 안에는 텍스트만 있는 것이 아니라 그림, 표, 다이어그램, 코드 실행 결과처럼 이미지로 이해해야 하는 내용이 포함될 수 있다. 특히 개발 서적에서는 본문 설명만으로는 부족하고, 이미지를 함께 봐야 문맥이 완성되는 경우가 많았다.

다만 이미지 분리 결과가 항상 완벽한 것은 아니었다.

어떤 이미지는 잘 분리되었지만, 어떤 경우에는 본문 일부가 이미지처럼 잡히거나, 반대로 필요한 그림이 제대로 분리되지 않는 경우도 있었다. 이 부분은 결국 커스텀이 필요해 보였다.

하지만 첫 단계부터 이미지 분리를 완벽하게 만들겠다고 잡으면 작업 범위가 너무 커질 수 있었다. 그래서 기준을 조금 낮췄다.

이미지는 내용을 이해하는 데 필요한 정도로만 분리되면 충분하다고 판단했다.

EPUB의 최종 품질을 높이려면 이미지 처리도 중요하다. 그래도 우선순위는 책의 본문을 읽을 수 있는 텍스트로 안정적으로 바꾸는 쪽에 있었다. 그래서 이미지 분리는 1단계에서는 어느 정도 감수하고 넘어가기로 했다.

OCR 결과를 그대로 믿을 수는 없었다

다음으로 확인해야 할 것은 OCR 특유의 문제였다.

OCR을 거친 텍스트는 겉보기에는 그럴듯해 보여도 자세히 읽어보면 문제가 꽤 많다. 글자가 비슷한 문자로 잘못 인식되거나, 문장이 이상한 곳에서 끊기고, 문단의 순서가 어색해지는 경우도 있었다.

특히 책처럼 긴 문서를 변환할 때는 이런 작은 오류들이 누적된다.

  • 비슷한 글자 오인식
  • 어색한 줄바꿈
  • 문단 분리 오류
  • 제목과 본문의 구분 실패
  • 코드 블록 구조 깨짐
  • 이미지 캡션과 본문이 섞이는 문제

그래서 OCR 결과를 그대로 EPUB으로 변환하지 않았다. 한 번 더 문법과 문맥을 검사하는 단계를 두었다.

이 단계에서는 AI를 활용했다. OCR 결과를 AI에게 전달하고, 문장이 자연스러운지, 문맥상 어색한 부분은 없는지, 명백한 오탈자는 없는지 확인하도록 했다.

한 번에 넣지 않고 장 단위로 나누기

처음에는 전체 결과를 한 번에 정리할 수도 있지 않을까 생각했다. 하지만 책 한 권 분량의 OCR 결과를 한꺼번에 AI에게 전달하면 문제가 생겼다.

문서가 너무 길면 일부 문맥을 놓칠 수 있고, 앞뒤 구조를 제대로 유지하지 못할 가능성도 있다. 또 수정 범위가 너무 커지면 어떤 부분이 어떻게 바뀌었는지 추적하기도 어려워진다.

그래서 OCR 결과를 장 단위로 쪼개서 제공하는 방식을 선택했다.

전체 PDF
→ OCR 결과 생성
→ 장 단위로 분리
→ AI에게 장별로 전달
→ 문법 / 문맥 / 오탈자 검수
→ 정리된 Markdown 생성

이렇게 나누면 각 장의 흐름을 유지하면서도 AI가 처리할 수 있는 범위를 적절히 제한할 수 있다. 문제가 생겼을 때 특정 장만 다시 처리하면 되기 때문에 반복 작업도 훨씬 쉬웠다.

이 단계의 목표는 OCR 결과를 완벽하게 자동 변환하는 것이 아니었다. AI가 안정적으로 읽고 보정할 수 있는 단위로 나누는 데 있었다.

장별 Markdown을 EPUB으로 합치기

OCR 결과를 장 단위로 나누고, AI를 통해 문법과 문맥을 어느 정도 정리했다면 다음 단계는 다시 하나의 책으로 합치는 것이다.

이 단계에서는 각 장을 개별 Markdown 파일로 관리했다.

chapter-01.md
chapter-02.md
chapter-03.md
...

장별로 파일을 나누어두면 작업 과정에서 관리하기가 훨씬 편하다. 특정 장에서 OCR 오류가 발견되면 해당 파일만 다시 수정하면 되고, 전체 책을 매번 다시 다룰 필요도 없다.

이제 해야 할 일은 이 장별 Markdown 파일들을 하나의 EPUB 파일로 묶는 것이다.

EPUB은 내부적으로 HTML, CSS, 메타데이터, 목차 파일 등을 포함하는 전자책 포맷이다. 그렇다고 EPUB 구조를 모두 손으로 작성할 필요는 없다. Markdown을 EPUB으로 변환해주는 도구를 사용하면 비교적 간단하게 만들 수 있다.

핵심은 다음과 같다.

장별 Markdown
→ 하나의 EPUB으로 변환
→ 제목 / 저자 / 표지 / 스타일 적용
→ 헤더 기준 목차 생성
→ 전자책 리더에서 확인

목차를 링크로 연결하기

EPUB에서 중요한 부분 중 하나는 목차다.

단순히 텍스트를 하나로 합치는 것만으로도 읽을 수는 있다. 하지만 책처럼 사용하려면 목차가 필요하다. 특히 개발 서적처럼 장과 절이 나뉘어 있는 책은 목차를 통해 원하는 위치로 바로 이동할 수 있어야 한다.

그래서 Markdown의 헤더 구조를 기준으로 목차를 만들었다.

# 1장. 시작하기

## 1.1 개발 환경 준비

## 1.2 첫 번째 예제

# 2장. 기본 개념

## 2.1 핵심 구조 이해하기

각 헤더는 EPUB 안에서 링크 가능한 위치가 되고, 목차에서는 해당 헤더로 바로 이동할 수 있게 연결된다.

이렇게 해두면 스마트폰의 전자책 리더 앱에서도 일반 EPUB 책처럼 장과 절을 오가며 읽을 수 있다.

목차 선택
→ 해당 헤더 위치로 이동
→ 작은 화면에서도 원하는 부분을 빠르게 찾기

최종 결과

여기까지 오면 처음 목표에 꽤 가까워진다.

처음에는 PDF 형태의 책이었다. 컴퓨터나 태블릿에서는 괜찮았지만, 핸드폰에서는 글자를 확대하고 화면을 좌우로 움직여야 해서 읽기 불편했다.

EPUB으로 변환한 뒤에는 화면 크기에 맞춰 문장이 자연스럽게 재배치된다. 글자 크기, 줄 간격, 여백도 전자책 리더 앱에서 조정할 수 있다. 이동 중이거나 잠깐 시간이 날 때도 훨씬 편하게 읽을 수 있었다.

결국 전체 흐름은 이렇게 정리할 수 있다.

PDF
→ PaddleOCR로 텍스트 / 구조 추출
→ JSON과 Markdown 결과 생성
→ 장 단위로 분리
→ AI로 문법 / 문맥 / OCR 오류 검수
→ 장별 Markdown 정리
→ EPUB으로 병합
→ 목차 링크 생성
→ 스마트폰에서 읽기

이 과정을 거치면 PDF 안에 고정되어 있던 책을 작은 화면에서도 자연스럽게 읽을 수 있는 EPUB으로 바꿀 수 있다.

마무리

이번 작업은 단순히 PDF를 EPUB으로 변환하는 일이 아니었다.

PDF에 고정되어 있던 내용을 다시 텍스트와 구조로 분리하고, OCR 과정에서 생기는 문제를 다듬고, 장별로 정리한 뒤, 다시 하나의 전자책으로 조립하는 과정에 가까웠다.

아직 이미지 분리나 코드 블록 처리처럼 더 개선할 부분은 남아 있다. 그래도 1차 목표였던 "핸드폰에서도 편하게 읽을 수 있는 책 만들기"는 충분히 달성할 수 있었다.

개발자로서 느낀 재미있는 지점은, 이 과정이 단순한 파일 변환이 아니라 작은 파이프라인을 설계하는 일에 가까웠다는 점이다. 입력은 PDF였지만, 중간에는 OCR, JSON, Markdown, AI 후처리, EPUB 생성이 이어졌고, 최종 결과물은 내가 실제로 읽을 수 있는 책이 되었다.