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