1. ReportLab 기본 사용법
Canvas 사용
ReportLab에서 PDF 문서 생성을 위한 주요 도구는 canvas 클래스야. 이 클래스는 텍스트, 선, 사각형 그리고 기타 그래픽 요소를 추가하기 위한 메서드들을 제공해.
간단한 텍스트 PDF 파일 생성
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# 새로운 PDF 파일 생성
pdf_file = canvas.Canvas("basic_report.pdf", pagesize=A4)
width, height = A4
# 텍스트 추가
pdf_file.setFont("Helvetica", 12) # 폰트와 크기 설정
pdf_file.drawString(100, height - 100, "안녕! 이건 ReportLab으로 생성된 보고서야.")
# PDF 저장하고 닫기
pdf_file.save()
이 예제에서 생성된 PDF 파일은 첫 페이지에 "안녕! 이건 ReportLab으로 생성된 보고서야."라는 텍스트를 가지고 있어.
2. PDF에 텍스트 추가
ReportLab은 텍스트의 크기, 폰트 및 색상을 포함한 다양한 설정이 가능해. 보고서를 구조적으로 만들기 위해 제목, 부제목, 본문 텍스트를 다르게 보이게 할 수 있어.
텍스트 폰트와 크기 설정
setFont() 메서드를 사용하여 폰트와 텍스트 크기를 설정할 수 있어. ReportLab은 Helvetica, Times-Roman, Courier 같은 표준 폰트를 지원해.
pdf_file.setFont("Helvetica-Bold", 16) # 굵은 폰트
pdf_file.drawString(100, height - 50, "판매 보고서") # 제목
텍스트 색상 변경
ReportLab은 setFillColorRGB() 메서드를 사용하여 RGB 값(0에서 1 사이)을 받아 텍스트 색상을 설정할 수 있어.
pdf_file.setFillColorRGB(0, 0, 1) # 파란색
pdf_file.drawString(100, height - 150, "이 텍스트는 파란색이야.")
3. 텍스트 블록과 여러 줄 텍스트 작업
텍스트가 길다면, drawString()을 사용하여 줄별로 좌표를 설정할 수 있어. 하지만, 자동 줄바꿈이 필요하다면 drawText()와 TextObject를 사용하는 게 더 편리해.
TextObject를 사용한 여러 줄 텍스트 추가
text = """
2023년도 판매 보고서.
이 보고서는 판매 데이터, 데이터 분석 및 예측에 대한 세부 정보를 포함하고 있어.
"""
# 텍스트 객체 생성
text_object = pdf_file.beginText(100, height - 200)
text_object.setFont("Helvetica", 12)
text_object.setFillColorRGB(0, 0, 0)
# 텍스트 추가
for line in text.split("\n"):
text_object.textLine(line)
pdf_file.drawText(text_object)
이 예제에서는 텍스트 객체 TextObject를 생성하고 각 텍스트 줄을 자동으로 줄바꿈해.
4. 여러 페이지로 구성된 보고서 생성
여러 페이지로 구성된 보고서를 사용하면 더 많은 데이터를 포함할 수 있고 읽기 쉬운 문서 구조를 만들 수 있어. ReportLab에서는 showPage() 메서드를 사용하여 새 페이지로 이동해.
여러 페이지 PDF 파일 생성
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# PDF 생성
pdf_file = canvas.Canvas("multi_page_report.pdf", pagesize=A4)
width, height = A4
# 첫 번째 페이지
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "페이지 1: 소개")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "이것은 보고서의 첫 번째 페이지야.")
pdf_file.showPage() # 다음 페이지로 이동
# 두 번째 페이지
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "페이지 2: 데이터")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "이것은 보고서의 두 번째 페이지야.")
# PDF 저장 및 닫기
pdf_file.save()
이 예제에서는 두 개의 페이지를 가진 PDF가 생성되며, 각각 제목과 텍스트가 포함돼 있어. showPage() 메서드는 현재 페이지를 종료하고 다음 페이지를 시작해.
5. PDF에 동적 데이터 추가
ReportLab은 보고서 자동화를 위해 리스트나 dictionary에서 데이터를 동적으로 추가하는 기능을 제공해. 이 기능은 데이터 테이블이나 목록이 정기적으로 업데이트되는 보고서를 생성하는 데 유용해.
리스트에서 데이터 추가
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
data = [
{"월": "1월", "판매": 200},
{"월": "2월", "판매": 300},
{"월": "3월", "판매": 250},
]
pdf_file = canvas.Canvas("sales_report.pdf", pagesize=A4)
width, height = A4
# 제목
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "판매 보고서")
# 데이터 추가
pdf_file.setFont("Helvetica", 12)
y_position = height - 150
for item in data:
line = f"{item['월']}: 판매 = {item['판매']}"
pdf_file.drawString(100, y_position, line)
y_position -= 20
# PDF 저장
pdf_file.save()
이 코드는 매월 판매 데이터를 별도 줄에 추가하여 PDF 파일을 생성해.
6. 이미지 추가
텍스트 외에도 PDF 문서에 이미지와 그래프를 추가할 수 있어. 지금부터 이미지를 추가해 볼게!
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
def create_pdf_with_image(file_path):
c = canvas.Canvas(file_path, pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "여기에 이미지가 들어갈 거야:")
# 이미지 경로
image_path = "example_image.jpg"
c.drawImage(image_path, 100, height - 300, width=200, height=150)
c.showPage()
c.save()
file_path = "image_example.pdf"
create_pdf_with_image(file_path)
쉽지 않아? 이제 PDF에 이미지가 포함되었어!
텍스트와 이미지를 포함한 PDF를 생성하는 방법을 배웠으니, 실제로 어떻게 활용할 수 있을지 생각해보자. 예를 들어, 당신이 데이터 분석 회사에서 일하고 매달 판매 보고서를 작성해야 한다면, 매번 수작업으로 문서를 준비하는 대신, 데이터를 수집하고 PDF 보고서를 자동으로 생성하는 스크립트를 작성할 수 있어. 이렇게 하면 시간도 절약하고 보고서 데이터의 정확성과 일관성을 높일 수 있어.
7. PDF에 테이블 추가
이제 간단한 텍스트를 다루는 것을 잠깐 쉬어볼까? 만약 제품 목록과 가격 같은 데이터를 추가하고 싶다면 어떻게 해야할까? 간단한 예를 들어볼게:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
items = [("다리미", 42.99), ("주전자", 15.00), ("텔레비전", 250.00)]
def create_pdf_with_table(file_path):
c = canvas.Canvas(file_path, pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "제품 목록과 가격:")
y = height - 150
for item in items:
c.drawString(100, y, f"{item[0]} - {item[1]:.2f} $")
y -= 20
c.showPage()
c.save()
file_path = "table_example.pdf"
create_pdf_with_table(file_path)
이 코드에서는 제품 이름과 가격으로 구성된 간단한 리스트를 PDF로 추가해. 이제 pandas DataFrame같이 더 복잡한 데이터를 추가할 수도 있어!
8. 보고서 자동화를 위한 템플릿 사용
보고서 자동화를 위한 가장 강력한 접근 방법 중 하나는 템플릿을 사용하는 거야. 템플릿은 문서의 구조와 디자인을 미리 만들어두고, 데이터를 사용하여 채우는 방식이야.
템플릿 문서 만들기
고정된 요소(예: 로고, 고정된 제목)가 포함된 기본 템플릿을 만든 다음, 날짜, 그래프, 목록 같은 동적 데이터로 채울 수 있어. Jinja2 같은 템플릿 엔진을 사용하여 텍스트 템플릿을 작성하고, 최종 PDF를 생성할 수도 있어.
ReportLab을 사용하여 템플릿을 만들 때, 고정된 데이터를 포함한 보고서 템플릿을 미리 준비하고, 애플리케이션 데이터로 동적 컨텐츠를 생성하여 이를 추가하는 방식으로 활용할 수 있어.
GO TO FULL VERSION