Positive-Influence-Data

[Report Lab] Python PDF 생성 본문

Library

[Report Lab] Python PDF 생성

DS쟁이 2025. 2. 20. 16:34

 

회사에서 일을 하다보면 PDF를 생성하거나 조작해야하는 일이 있다.

필자는 데이터 분석과 머신러닝을 바탕으로 주기적인 리포팅을 해야하는 문제에 직면했다.

데이터 분석 및 ML/DL 결과 리포팅을 해야할 때 어떻게 해야할까?

 

 

주로 이런경우 시스템에 올리지 않는다면

대부분 문서작업을 하게 되는데 한글, MS WORD 등을 활용해서 단기성 리포팅을 하게 된다.

하지만 주기적으로 해야한다면 상당히 불편하기도 하다. 꼼꼼하지 못한 성격이라면 이전 내용을 그대로 쓰는 문제가 있어

실수가 나올 수 밖에 없다.(필자가 그랬다..)

이를 해결하기 위해 PDF로 작업하여 자동화 하는 방법을 생각했다.

 

여러 라이브러리를 알아보던중

"Report Lab"이라는 파이썬 라이브러리로 자동화를 시도했다.

 

이제부터 이것을 간단하게 알아보도록 하자.

 

■ Report Lab 설치

파이썬에서 PDF를 만들 수 있는 라이브러리다. 자유도가 높고 약간의 코드로 PDF를 제어 할 수 있다.

사용 했을때 동적으로 PDF를 제어 할 수 있다는 장점과 내장 되어있는 Canvas를 통해 조금 더 세밀한 작업이 가능하다.

 

Report Lab설치는 아래의 명령어로 설치 할 수 있다.

pip install reportlab

 

■ Report Lab 간단한 사용법

  •  템플릿
    먼저,  PDF를 만드려면 템플릿이 필요하다.
    SimpleDocTemplate, PageTemplate 등이 존재하는데 필자는 SimpleDocTemplate을 기반으로 PDF를 생성해보겠다.
from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import letter

filename = "C:/Users/USER/Desktop/data/prac.pdf"

doc = SimpleDocTemplate(
    filename,
    pagesize=letter,
    topMargin=30,
    bottomMargin=30,
)
# pagesize는 letter도 있고 A4도 있고 다양하다 원하는 사이즈에 맞게 사용하면 된다.

 

필자는 파일이름을 prac.pdf로 했고 SimpleDocTemplate를 생성했다.

 

  • 타이틀
    필자는 가장 앞면의 타이틀을 달아줄 예정이다.
from reportlab.platypus import Paragraph
from reportlab.pdfbase import pdfmetrics

title_style = ParagraphStyle(
    name='HeaderStyle',
    fontName='Malgun Gothic',
    fontSize=23,
    alignment=2,
    spaceAfter=10,
)
pdfmetrics.registerFont(TTFont('Malgun Gothic', 'C:/Windows/Fonts/malgun.ttf'))
# 한글 폰트 적용을 위해 맑음고딕 사용

title = Paragraph("연습이야", title_style)

 


  • 간단하게 표도 넣어줄거다.
import pandas as pd
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, PageBreak

data = pd.DataFrame({
    '하나':[1,2,3,4,5],
    '둘' : [6,7,8,9,10]
})
# 가상의 데이터를 만들어주자.

style = ParagraphStyle(
    name='KoreanStyle',
    fontName='Malgun Gothic',
    fontSize=8,
    leading=10,
    alignment=1,
    spaceAfter=4,
)


style_table = TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.grey),
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
    ('FONTNAME', (0, 0), (-1, -1), 'Malgun Gothic'),
    ('GRID', (0, 0), (-1, -1), 0.5, colors.black),
    ('FONTSIZE', (0, 0), (-1, -1), 10),
    ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
])
# 표의 스타일을 잡아주면 되겠다.

table_data = [[Paragraph(str(col), style) for col in data.columns]]
for row in data.values:
    table_data.append([Paragraph(str(cell), style) for cell in row])
table = Table(table_data, colWidths=[50,50], repeatRows=1) 
# repeatRows=1 은 표가 길어져서 페이지를 넘길때 첫 헤더는 무조건 똑같이 다음 페이지에서도 가져간다

table.setStyle(style_table)

# Pandas로 데이터프레임을 만든다음 이것을 for문으로 돌려가면서 각 style을 적용한다.
# table을 찍게 되면 데이터프레임의 값들이 Table의 형태대로 정의되어 나온다.
  • 그래프 & 그림
    위의 데이터 만든걸 가지고 그래프도 넣어보겠다.
import matplotlib.pyplot as plt
from io import BytesIO
from reportlab.platypus import Image

plt.rcParams['font.family'] = 'Malgun Gothic'
# 한글이 깨지지 않게 하기위해 맑음고딕으로 plt의 폰트를 바꿔준다.


## BytesIO를 통해 plt에서 시각화한 것을 버퍼에 저장하고 이것을 report lab의 image형식으로 바꿔야한다.

f, ax = plt.subplots(figsize=(5,5))
ax = data['하나'].plot(kind='bar')
ax.set_title('연습이야')
buffer = BytesIO()
plt.savefig(buffer, format='png',bbox_inches='tight')
buffer.seek(0)
plt.close()

chart_image = Image(buffer, width=400, height=200) # report lab의 이미지 형식으로 변경

 

  • 페이지 넘김 및 저장
    위에서 표도 만들고 그래프도 만들었다. 표하고 그래프를 따로 페이지를 분리하여 표현하고 PDF파일을 저장해보겠다.
# 위의 코드에 이어서 작성

elements = [title,PageBreak(),
            table, PageBreak(), 
            chart_image]
            
# elements안에 넣고싶은거 넣고 PageBreak()를 하게 되면 페이지가 넘어간다.

doc.build(elements)
# 빌드하여 저장하면 맨처음 우리가 정의했던 filename위치에 저장이 된다.

 

 

이렇게 해서 간단하게 표를 만들고 그래프도 만들어서 PDF로 뽑아봤다.
이제 Repor tLab을 활용하면 반복적인 리포팅 업무를 자동화할 수 있다.

추가적으로 스타일을 커스터마이징하거나, 다른 요소(차트, 이미지 등)를 더 넣어볼 수도 있다. 

 

Report Lab Docs
홈페이지에 들어면 상세한 내용들을 확인 할 수 있다.

 

ReportLab Docs

Preppy The fast, light templating system we bundle with ReportLab PLUS (BSD Licence) Docs

docs.reportlab.com

'Library' 카테고리의 다른 글

[Psycopg2] Postgresql 파이썬으로 접근  (0) 2025.03.26
Comments