Published on

[Python] EbookLib 사용법

Authors
  • avatar
    Name
    Almer Minified
    Twitter

EbookLib이란?

EbookLib은 을 사용하여 EPUB 형식의 전자책을 생성, 수정, 관리할 수 있는 라이브러리이다. 파이썬을 이용해서 전자책의 구조를 조작하고, 내용을 추가하거나 수정할 수 있다. 전자책 프로그램을 개발하려면 파이썬에선 거의 필수적인 라이브러리이다. EbookLib을 사용하면 EPUB 파일을 건드릴 수 있다. 물론 챕터, 이미지, 스타일, 표지, 메타데이터 등 전자책의 다양한 요소를 다룰 수 있게 된다. 게다가 다른 포맷들도 지원한다. 물론 EPUB 포맷에 초점을 맞추고 있지만 다른 전자책 형식도 일부 지원할 수 있다.

기본 사용법

  1. 설치: 환경에서 EbookLib를 설치하려면, 터미널이나 명령 프롬프트에서 pip를 쓰자.

    pip install EbookLib
    
  2. EPUB 생성

    from ebooklib import epub
    
    # 새 EPUB 책 객체 생성
    book = epub.EpubBook()
    
    # 메타데이터 설정
    book.set_identifier('identifier123123')
    book.set_title('샘플책제목')
    book.set_language('ko')
    
    # 책의 저자 추가
    book.add_author('이주인')
    
    # 챕터 생성
    c1 = epub.EpubHtml(title='서론', file_name='chap_01.xhtml', lang='ko')
    c1.content = '<h1>서론 헤딩</h1><p>안녕 이건 처음 쓰는 서문이야</p>'
    
    # 챕터를 책에 추가
    book.add_item(c1)
    
    # 목차와 책의 구조 정의
    book.toc = (c1,)
    book.add_item(epub.EpubNcx())
    book.add_item(epub.EpubNav())
    
    # 파일 저장
    epub.write_epub('test.epub', book, {})
    

    간단하다. 실제로 간단한 요소들도 구성되어 있으며 문서를 읽으면 금방 이해할수 있을 것이다.

    깃헙에서 살펴보기
  3. EPUB으로 기존 파일 읽고 바꾸기

    # 기존 EPUB 파일 읽기
    book = epub.read_epub('/Users/dev/epub/ebooksample1.epub')
    
    # 책의 내용을 수정하거나 추가 작업을 할 수 있음
    

    위에서 살펴본 것처럼 책의 내용을 또 다시 조작할 수 있다. 위에선 생성한 후 썼지만 여기선 객체에 그대로 작업할 수 있다.

그 외 사용방법 예시

EbookLib을 이용해서 커스터마이징을 좀 더해보고, 네스티드 목차 관리, 미디어 및 리소스 혼합을 해보자.

네스티드 목차 관리는 내가 그냥 붙인 말인데 목차 속 목차 같은 것을 의미한다.

1. 커스텀 스타일링

EbookLib을 사용하여 EPUB 파일에 CSS 스타일을 적용할 수도 있다. 이를 통해 전자책의 디자인을 바꾸고 가독성을 더 높여줄 수 있을 것이다.

from ebooklib import epub

# 새 EPUB 객체 만들기
book = epub.EpubBook()

# CSS 스타일 정의
style = '''
@namespace epub "http://www.idpf.org/2007/ops";
body {
    font-family: Georgia, serif;
    margin: 0;
}
h2 {
    text-align: left;
    text-transform: uppercase;
    font-weight: 200;
}
ol {
    list-style-type: none;
}
ol > li:first-child {
    margin-top: 0.3em;
}
'''

# CSS 파일 추가
nav_css = epub.EpubItem(uid="style_nav", file_name="style/nav.css", media_type="text/css", content=style)
book.add_item(nav_css)

기존 html 문서에서 css설정하는것과 방법이 비슷한다 근데 http://www.idpf.org/2007/ops 라는 주소를 설정해줄 수도 있는데 이건 필수는 아니지만 전에 RSS에서 언급했던 것처럼 그냥 표준의 일부라고 이해하면 된다. 표준을 제시해주는 것이라고 생각하자. 다시 말하자면 http://www.idpf.org/2007/ops는 EPUB 전자책 표준과 관련된 네임스페이스를 나타내는 주소다. 이 URL은 국제 디지털 출판 포럼(IDPF)에서 정의한 Open Publication Structure (OPS) 표준의 일부라고 한다.

2. 복잡한 목차 관리

EbookLib을 사용하면 복잡한 목차를 생성하고 관리할 수 있다. 하위 레벨의 목차들을 복잡하게 넣을 수도 있다.

# 챕터 생성
c1 = epub.EpubHtml(title='챕터1', file_name='chap_01.xhtml', lang='ko')
c2 = epub.EpubHtml(title='챕터2', file_name='chap_02.xhtml', lang='ko')
# 나머지 코드들 쓰던 대로 쓰면 된다.

# 목차 생성 (여러 레벨의 목차)
book.toc = (
    (epub.Section('Part 1'),
     (c1, c2)),
    (epub.Section('Part 2'),
     (c3, c4))
)

이렇게 하면 코드들에 따로따로 타이틀을 붙인 후에 그 챕터마다 섹션을 따로 부여할 수 있게 된다. 문제지에서 많이 보던 목차 속 목차를 구현하기 위해 사용된다.

3. 이미지 등 추가

이미지, 오디오, 비디오 등의 미디어 파일을 추가할 수도 있다. 이것이야말로 전자책의 큰 장점이 아닐까? 이 기능을 사용하여 텍스트 외에도 풍부한 미디어 콘텐츠를 포함시킬 수 있다.

# 이미지 추가
image = open('/Users/images/sample.jpg', 'rb').read()
epub_img = epub.EpubItem(file_name='images/converted_sample.jpg', media_type='image/jpeg', content=image)
book.add_item(epub_img)

# 이미지를 사용하는 챕터
c1 = epub.EpubHtml(title='이미지 추가챕터', file_name='chap_img.xhtml', lang='ko')
c1.content = '<h1>챕터에 이미지가 추가됐음</h1><p><img src="images/converted_sample.jpg" alt="추가된 이미지"></p>'

# 챕터 추가 및 책 저장
book.add_item(c1)

보면 알다시피 원래 파일 경로에서 실제로 ebook에 추가됐을때의 이미지 파일 경로가 다르다. 즉 epub에 맞게 원본 파일을 수정해서 저장하는 것이다.

4. 메타데이터

앞에서 설명했지만 좀 복잡해서 뒤에서 한번 더 설명한다. 메타데이터의 종류는 꽤 많다.

EbookLib을 사용하여 EPUB 전자책을 생성할 때, 메타데이터는 책에 대한 기본적인 정보를 제공하는 중요한 부분이다. 메타데이터는 책의 제목, 저자, 식별자, 언어, 출판사, 출판일 등 다양한 정보를 포함할 수 있으며, 이는 독자가 책을 검색하고, 분류하고, 이해하는 데 도움을 줍니다.

메타데이터 종류

  1. 식별자(Identifier)는 책에 대한 고유 식별자이다. 대부분의 경우 ISBN이나 URI 형태로 제공된다.

    book.set_identifier('aaa123')
    
  2. 제목 (Title)는 책의 제목을 설정한다.

    book.set_title('책제목')
    
  3. 언어 (Language)는 책이 작성된 언어의 코드를 설정한다. 일반적으로 ISO 639-1 언어 코드를 사용한다. 웹프로그래밍을 써봤다면 익숙할 것이다.

    book.set_language('ko')
    
  4. 저자 (Author)는 책의 저자나 기여자의 이름을 추가한다. 여러 저자를 추가할 수도 있다.

    book.add_author('책지은이이름')
    
  5. 출판사 (Publisher)는 책을 출판한 출판사의 이름을 추가할 수 있다.

    book.add_metadata('마블', 'publisher', 'Publisher Name')
    
  6. 출판일 (Publication Date)는 책이 출판된 날짜를 추가할 수 있다. 일반적으로 ISO 8601 날짜 형식을 사용한다.

    book.add_metadata('DC', 'date', '2023-12-01', {'event': 'publication'})
    
  7. 커버 이미지 (Cover Image)는 전자책의 표지 이미지를 추가할 수 있다. 이미지 파일은 별도로 준비해야 한다.

    book.set_cover("image.jpg", open('/Users/images/cover_image.jpg', 'rb').read())
    
  8. 그리고 그 외 키워드, 설명, 저작권 정보 등 기타 메타데이터를 추가할 수 있다.

    book.add_metadata('DC', 'description', '디스크립션, 설명입니다')