피드로 돌아가기
How to Generate PDF Reports from HTML Templates in Python
Dev.toDev.to
Backend

How to Generate PDF Reports from HTML Templates in Python

Python 개발팀이 자체 호스팅 PDF 생성 대신 API 기반 방식으로 전환해 메모리 사용량 50~150MB 감소 및 생성 시간 2~4초에서 1회 HTTP 요청으로 단축

Custodia-Admin2026년 3월 24일10intermediate

Context

자체 호스팅 PDF 라이브러리(wkhtmltopdf, weasyprint)는 프로세스 관리 오버헤드, 메모리 소비(50~150MB), 2~4초 렌더링 시간, 그리고 대량 생성 시 병렬 처리 불가능이라는 한계가 있다. 월 1,000건 이상의 PDF 생성(청구서, 영수증, 명세서)이 필요한 경우 CPU 비용이 급증한다.

Technical Solution

  • HTML 템플릿을 Jinja2 또는 Django 템플릿 엔진으로 렌더링해 HTML 문자열로 변환
  • 렌더링된 HTML을 PageBolt API의 /v1/pdf 엔드포인트로 POST 요청해 PDF 바이너리 응답 수신
  • Django 뷰에서 FileResponse를 통해 다운로드 가능한 파일로 즉시 반환
  • ThreadPoolExecutor를 사용해 5~10개 워커로 병렬 PDF 생성(100개 파일 ~10초)
  • 429(레이트 제한), Timeout, RequestException에 대한 재시도 로직 구현(최대 3회, exponential backoff)

Impact

  • 월 50건 이상 생성 환경에서 API 사용이 자체 호스팅보다 비용 효율적
  • 월 100건: API 비용 $3~5 vs 자체 호스팅 인프라 비용
  • 월 1,000건: API 비용 $15~25 vs 자체 호스팅 CPU 스파이크
  • 100개 PDF 병렬 생성 시 약 10초 완료(자체 호스팅 대비 대폭 단축)

Key Takeaway

HTML 템플릿 렌더링과 PDF 변환을 분리해 HTTP API 기반으로 처리하면, 프로세스 관리 복잡도를 제거하면서도 비용과 성능 모두에서 이득을 얻을 수 있다. 특히 월 50~1,000건 규모의 대량 보고서 생성 환경에서 API 기반 접근이 실질적으로 저렴하고 안정적이다.


Django/Flask로 청구서, 영수츠, 보고서를 생성하는 웹 애플리케이션에서 HTML 문자열을 PageBolt 같은 PDF API로 송신하는 방식을 도입하면, 프로세스 크래시 위험을 제거하고 100개 파일 생성을 병렬로 10초 내에 완료할 수 있으며, 월 50건 이상 생성 시 자체 호스팅보다 운영 비용이 낮아진다.

원문 읽기