반응형
✅ **선택한 시를 EPUB 파일로 변환하고 자동으로 출간(다운로드)**하는 과정을 구축해보겠습니다.
이 기능은 시니어 작가들의 시집을 쉽고 자동으로 전자책으로 만들어주는 핵심입니다.
📘 『시마당 프로젝트 따라하기』
10장. 선택한 시를 EPUB 파일로 자동 출간하기
작성자: easyfly
작성일: 2025년 7월 17일
🟦 1. EPUB 변환을 위한 패키지 설치
✅ 가상환경에서 아래 명령어 실행:
pip install ebooklib
🟧 2. 뷰 함수 만들기 – EPUB 생성
📁 poem/views.py
from django.http import HttpResponse
from ebooklib import epub
from .models import Poem
def generate_epub(request):
if request.method == 'POST':
ids = request.POST.getlist('selected_poems')
poems = Poem.objects.filter(id__in=ids)
book = epub.EpubBook()
book.set_title('시마당 전자시집')
book.set_language('ko')
chapters = []
for poem in poems:
content = f"<h2>{poem.title}</h2><h4>{poem.author.name}</h4><p>{poem.content.replace('\n', '<br/>')}</p>"
chapter = epub.EpubHtml(title=poem.title, file_name=f"{poem.id}.xhtml", lang='ko')
chapter.content = content
book.add_item(chapter)
chapters.append(chapter)
book.toc = chapters
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
style = 'BODY { font-family: NanumGothic, serif; }'
nav_css = epub.EpubItem(uid="style_nav", file_name="style/nav.css", media_type="text/css", content=style)
book.add_item(nav_css)
book.spine = ['nav'] + chapters
# 파일 출력
import io
buffer = io.BytesIO()
epub.write_epub(buffer, book)
buffer.seek(0)
response = HttpResponse(buffer.read(), content_type='application/epub+zip')
response['Content-Disposition'] = 'attachment; filename="simadang.epub"'
return response
🟦 3. URL 연결
📁 poem/urls.py
path('generate/', views.generate_epub, name='generate_epub'),
🟦 4. 목록 페이지 폼 수정 (epub 생성용 POST)
📁 poem/templates/poem/poem_list.html 내 <form> 태그 수정:
<form method="post" action="{% url 'generate_epub' %}">
이렇게 하면 선택한 시들이 POST 방식으로 generate_epub 뷰에 전송됩니다.
✅ 5. 결과 확인
접속 주소:
http://<EC2 IP>:8000/poem/list/
절차:
- 원하는 시의 체크박스를 선택
- “선택한 시로 EPUB 만들기” 버튼 클릭
- 자동으로 simadang.epub 파일이 다운로드됨
✅ EPUB 구성 예시
- 제목: 시 제목
- 저자: 작가 이름
- 본문: 시의 줄바꿈을 유지한 상태로 <br> 처리
- 각 시가 챕터처럼 구성되어 목차 탭에서 이동 가능
📌 보너스: 저장소에 기록하고 싶다면?
- 파일을 서버에 저장하려면 다음을 사용:
with open('/home/easyfly/madang/epub_output/simadang.epub', 'wb') as f:
epub.write_epub(f, book)
📝 정리
항목 | 구현 여부 |
시 목록 체크박스 선택 | ✅ 완료 |
EPUB 변환 로직 구현 | ✅ 완료 |
즉시 다운로드 응답 | ✅ 완료 |
외부 저장 및 전자책 관리 | ⏳ (선택적 기능) |
다음 예고 – 『11장. 작가별 시집 출간, 날짜별 묶음 출간 등 고급화』
- 작가별 필터링 기능 추가
- 특정 날짜 범위만 선택하여 전자책 출간
- 미리보기 화면 제공 등