웹 페이지의 내용을 보존하거나, 보고서 형태로 공유하거나, 온라인 문서를 오프라인에서 보기 좋게 저장해야 할 때가 많습니다. 이때 가장 유용한 방법 중 하나가 바로 HTML 콘텐츠를 PDF 파일로 변환하는 것입니다. 다행히 파이썬(Python) 생태계에는 이러한 작업을 도와주는 강력하고 무료인 라이브러리들이 존재합니다.
이 글에서는 가장 널리 사용되는 세 가지 방법(pdfkit, Playwright, WeasyPrint)을 소개하고, 실제 코드 예제와 함께 Colab 또는 로컬 환경에서 실행하는 방법을 상세히 안내합니다.
안내 없이 바로 실행하는 코드 보러가기 –>
1. pdfkit: 간단하고 빠른 변환 (wkhtmltopdf 기반)
pdfkit은 wkhtmltopdf라는 유명한 오픈소스 커맨드라인 도구를 파이썬에서 쉽게 사용할 수 있도록 감싼 라이브러리입니다. 웹킷(WebKit) 렌더링 엔진을 사용하여 HTML을 PDF로 변환하며, 사용법이 매우 간단하다는 장점이 있습니다.
실행 환경 준비 (Colab/Linux 기준):
# 시스템 패키지 업데이트 및 wkhtmltopdf 설치
!apt-get update
!apt-get install -y wkhtmltopdf
# pdfkit 파이썬 라이브러리 설치
!pip install pdfkit
content_copydownloadUse code with caution.Bash
파이썬 코드 예제:
import pdfkit
import os # 예제 HTML 파일 생성을 위해 추가
# --- 예제용 HTML 파일 생성 ---
html_content = """
<!DOCTYPE html>
<html>
<head>
<title>PDF 테스트</title>
<meta charset="UTF-8">
<style> body { font-family: sans-serif; } </style> # 간단한 스타일 추가
</head>
<body>
<h1>안녕하세요! (pdfkit)</h1>
<p>HTML에서 PDF로 변환하는 예제입니다.</p>
<p>이 방법은 wkhtmltopdf를 사용합니다.</p>
</body>
</html>
"""
with open('test_pdfkit.html', 'w', encoding='utf-8') as f:
f.write(html_content)
# --- 예제용 HTML 파일 생성 끝 ---
# 1. HTML 파일로부터 PDF 생성
def html_file_to_pdf(html_file_path, output_pdf_path):
try:
pdfkit.from_file(html_file_path, output_pdf_path)
print(f"PDF 생성 성공 (파일): {output_pdf_path}")
except Exception as e:
print(f"PDF 생성 실패 (파일): {e}")
# 2. HTML 문자열로부터 PDF 생성
def html_string_to_pdf(html_string, output_pdf_path):
try:
pdfkit.from_string(html_string, output_pdf_path)
print(f"PDF 생성 성공 (문자열): {output_pdf_path}")
except Exception as e:
print(f"PDF 생성 실패 (문자열): {e}")
# 3. URL로부터 PDF 생성
def url_to_pdf(url, output_pdf_path):
try:
pdfkit.from_url(url, output_pdf_path)
print(f"PDF 생성 성공 (URL): {output_pdf_path}")
except Exception as e:
print(f"PDF 생성 실패 (URL): {e}")
# 사용 예시
html_file_to_pdf('test_pdfkit.html', 'output_pdfkit_from_file.pdf')
html_string_to_pdf(html_content, 'output_pdfkit_from_string.pdf')
# url_to_pdf('https://www.google.com', 'output_pdfkit_from_url.pdf') # 예시 URL
content_copydownloadUse code with caution.Python
실행 방법: 위 코드를 .py 파일로 저장하거나 Colab 셀에 붙여넣고 실행합니다. test_pdfkit.html 파일이 생성되고, 이를 기반으로 output_pdfkit_*.pdf 파일들이 생성됩니다.
장점: 사용법이 간단하고 빠르며, URL 변환 기능도 기본 제공합니다.
단점: wkhtmltopdf 설치가 필요하며, 최신 CSS나 복잡한 자바스크립트 렌더링에는 한계가 있을 수 있습니다.
2. Playwright: 정확한 렌더링 (최신 브라우저 기반)
Playwright는 Microsoft에서 개발한 최신 브라우저 자동화 라이브러리입니다. 실제 브라우저(Chromium, Firefox, WebKit)를 백그라운드에서 실행하여 HTML을 렌더링하므로, 자바스크립트로 동적으로 생성된 콘텐츠나 최신 CSS가 적용된 페이지도 매우 정확하게 PDF로 변환할 수 있습니다.
실행 환경 준비 (Colab/Linux 기준):
# Playwright 라이브러리 설치
!pip install playwright
# 필요한 브라우저 엔진 설치 (여기서는 Chromium)
!playwright install chromium
content_copydownloadUse code with caution.Bash
파이썬 코드 예제:
from playwright.sync_api import sync_playwright
import os
# --- 예제용 HTML 파일/문자열 준비 ---
html_content_playwright = """
<!DOCTYPE html>
<html>
<head>
<title>PDF 테스트 (Playwright)</title>
<meta charset="UTF-8">
<style> h1 { color: blue; } p { font-size: 1.1em; } </style>
</head>
<body>
<h1>안녕하세요! (Playwright)</h1>
<p>Playwright를 사용하여 HTML을 PDF로 변환합니다.</p>
<p>이 방법은 실제 브라우저 렌더링을 사용해 정확도가 높습니다.</p>
<script> document.body.innerHTML += '<p>자바스크립트도 실행됩니다!</p>'; </script>
</body>
</html>
"""
with open('test_playwright.html', 'w', encoding='utf-8') as f:
f.write(html_content_playwright)
# --- 예제용 HTML 준비 끝 ---
def html_to_pdf_with_playwright(html_source, output_pdf_path, is_string=False):
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
try:
if is_string:
# HTML 문자열에서 변환
page.set_content(html_source)
else:
# HTML 파일에서 변환 (절대 경로 사용 권장)
page.goto(f'file://{os.path.abspath(html_source)}')
# 페이지 로딩 대기 (필요에 따라 추가)
page.wait_for_load_state('networkidle')
# PDF로 저장 (옵션 추가 가능: format, margin 등)
page.pdf(path=output_pdf_path, format='A4', print_background=True) # 배경 그래픽 인쇄 포함
print(f"PDF 생성 성공 (Playwright): {output_pdf_path}")
except Exception as e:
print(f"PDF 생성 실패 (Playwright): {e}")
finally:
browser.close()
# 사용 예시
html_to_pdf_with_playwright('test_playwright.html', 'output_playwright_file.pdf', is_string=False)
html_to_pdf_with_playwright(html_content_playwright, 'output_playwright_string.pdf', is_string=True)
content_copydownloadUse code with caution.Python
실행 방법: 위 코드를 실행하면 test_playwright.html 파일이 생성되고, 이를 기반으로 output_playwright_*.pdf 파일들이 생성됩니다. 자바스크립트가 실행된 결과까지 PDF에 포함되는 것을 확인할 수 있습니다.
장점: 실제 브라우저 렌더링으로 웹 페이지 모습 그대로 매우 정확한 PDF 생성이 가능합니다. 자바스크립트 실행 결과 포함.
단점: 초기 설정(브라우저 엔진 설치)이 필요하고, pdfkit보다 약간 더 느릴 수 있습니다.
3. WeasyPrint: CSS 표준 지원 강화
WeasyPrint는 HTML과 CSS 표준, 특히 인쇄를 위한 CSS Paged Media Module 지원에 중점을 둔 순수 파이썬 라이브러리입니다. 별도의 브라우저 엔진이나 wkhtmltopdf 없이 자체 렌더링 엔진을 사용하며, CSS를 통한 정교한 페이지 레이아웃 제어가 가능합니다.
실행 환경 준비 (Colab/Linux 기준):
# WeasyPrint가 의존하는 시스템 라이브러리 설치
!apt-get install -y python3-dev build-essential libcairo2-dev libpango1.0-dev libgdk-pixbuf2.0-dev libffi-dev shared-mime-info
# WeasyPrint 파이썬 라이브러리 설치
!pip install weasyprint
content_copydownloadUse code with caution.Bash
파이썬 코드 예제:
from weasyprint import HTML, CSS
import os
# --- 예제용 HTML 파일/문자열 준비 ---
html_content_weasyprint = """
<!DOCTYPE html>
<html>
<head>
<title>PDF 테스트 (WeasyPrint)</title>
<meta charset="UTF-8">
<style>
@page { margin: 1cm; } /* 페이지 여백 설정 */
h1 { color: green; }
p { text-align: justify; }
</style>
</head>
<body>
<h1>안녕하세요! (WeasyPrint)</h1>
<p>WeasyPrint는 CSS 표준 지원이 뛰어난 라이브러리입니다.
특히 인쇄용 스타일시트(Paged Media)를 잘 처리합니다.</p>
</body>
</html>
"""
with open('test_weasyprint.html', 'w', encoding='utf-8') as f:
f.write(html_content_weasyprint)
# --- 예제용 HTML 준비 끝 ---
def html_to_pdf_with_weasyprint(html_source, output_pdf_path, is_string=False):
try:
if is_string:
# HTML 문자열에서 변환
HTML(string=html_source).write_pdf(output_pdf_path)
else:
# HTML 파일에서 변환
HTML(filename=html_source).write_pdf(output_pdf_path)
print(f"PDF 생성 성공 (WeasyPrint): {output_pdf_path}")
except Exception as e:
print(f"PDF 생성 실패 (WeasyPrint): {e}")
# 사용 예시
html_to_pdf_with_weasyprint('test_weasyprint.html', 'output_weasyprint_file.pdf', is_string=False)
html_to_pdf_with_weasyprint(html_content_weasyprint, 'output_weasyprint_string.pdf', is_string=True)
content_copydownloadUse code with caution.Python
실행 방법: 위 코드를 실행하면 test_weasyprint.html 파일이 생성되고, 이를 기반으로 output_weasyprint_*.pdf 파일들이 생성됩니다. CSS @page 규칙 등이 적용된 것을 확인할 수 있습니다.
장점: CSS 표준, 특히 인쇄 관련 CSS 지원이 매우 우수합니다. 외부 프로그램 의존성이 낮습니다(시스템 라이브러리 제외).
단점: 복잡한 자바스크립트 렌더링은 지원하지 않습니다. 시스템 라이브러리 설치가 필요합니다.
어떤 방법을 선택해야 할까?
- 간단하고 빠른 변환, URL 변환: pdfkit
- 웹 페이지 모습 그대로 정확한 렌더링 (JS 포함): Playwright
- CSS 기반의 정교한 레이아웃, 인쇄용 PDF: WeasyPrint
결론
파이썬을 이용하면 pdfkit, Playwright, WeasyPrint와 같은 훌륭한 무료 라이브러리들을 활용하여 HTML 콘텐츠를 PDF로 손쉽게 변환할 수 있습니다. 각 라이브러리는 고유한 장단점을 가지고 있으므로, 프로젝트의 요구 사항(정확성, 속도, CSS 지원 수준 등)에 가장 적합한 도구를 선택하여 문서 자동화, 웹 콘텐츠 아카이빙 등 다양한 작업에 활용해 보시기 바랍니다.