CodeGym /ํ–‰๋™ /Python SELF KO /ReportLab๋ฅผ ์‚ฌ์šฉํ•ด์„œ PDF ๋ฌธ์„œ์˜ ํ…์ŠคํŠธ์™€ ์ œ๋ชฉ ์Šคํƒ€์ผ๋งํ•˜๊ธฐ

ReportLab๋ฅผ ์‚ฌ์šฉํ•ด์„œ PDF ๋ฌธ์„œ์˜ ํ…์ŠคํŠธ์™€ ์ œ๋ชฉ ์Šคํƒ€์ผ๋งํ•˜๊ธฐ

Python SELF KO
๋ ˆ๋ฒจ 44 , ๋ ˆ์Šจ 3
์‚ฌ์šฉ ๊ฐ€๋Šฅ

1. PDF์— ํ…์ŠคํŠธ์™€ ์ œ๋ชฉ ์ถ”๊ฐ€ํ•˜๊ธฐ ๊ธฐ์ดˆ

ReportLab์—์„œ๋Š” canvas ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ธ€๊ผด, ์ƒ‰์ƒ, ํฌ๊ธฐ์™€ ํ…์ŠคํŠธ ์œ„์น˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด.

์ œ๋ชฉ๊ณผ ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ PDF ๋งŒ๋“ค๊ธฐ

Python

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4

# ์ƒˆ๋กœ์šด PDF ํŒŒ์ผ ์ƒ์„ฑ
pdf_file = canvas.Canvas("styled_text.pdf", pagesize=A4)
width, height = A4

# ์ œ๋ชฉ ์ถ”๊ฐ€
pdf_file.setFont("Helvetica-Bold", 20)
pdf_file.drawString(100, height - 100, "ํŒ๋งค ๋ณด๊ณ ์„œ")

# ๋ณธ๋ฌธ ํ…์ŠคํŠธ ์ถ”๊ฐ€
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "์ด ๋ฌธ์„œ๋Š” ์ง€๋‚œ ๋ถ„๊ธฐ์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.")

# PDF ์ €์žฅ
pdf_file.save()

์ด ์ฝ”๋“œ๋Š” ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ PDF ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด. ์šฐ๋ฆฌ๋Š” setFont() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…์ŠคํŠธ์˜ ๊ธ€๊ผด๊ณผ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•ด.

2. ํ…์ŠคํŠธ ์Šคํƒ€์ผ๋ง๊ณผ ํฌ๋งทํŒ…

ReportLab์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…์ŠคํŠธ์˜ ์ƒ‰์ƒ, ๊ธ€๊ผด, ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์Šคํƒ€์ผ ์žˆ๋Š” ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์„œ๊ฐ€ ๋” ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ ธ.

ํ…์ŠคํŠธ ๊ธ€๊ผด๊ณผ ํฌ๊ธฐ ๋ณ€๊ฒฝํ•˜๊ธฐ

ReportLab์€ Helvetica, Times-Roman, Courier ๊ฐ™์€ ๊ธฐ๋ณธ ๊ธ€๊ผด์„ ์ง€์›ํ•ด. setFont()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธ€๊ผด ์Šคํƒ€์ผ(์ผ๋ฐ˜, ๊ตต๊ฒŒ, ์ดํƒค๋ฆญ)๊ณผ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด.

Python

pdf_file.setFont("Helvetica-Bold", 18)  # ๊ตต์€ ๊ธ€๊ผด๋กœ ์ œ๋ชฉ
pdf_file.drawString(100, height - 50, "์ฃผ์š” ์ œ๋ชฉ")

pdf_file.setFont("Helvetica-Oblique", 14)  # ์ดํƒค๋ฆญ์œผ๋กœ ๋ถ€์ œ๋ชฉ
pdf_file.drawString(100, height - 80, "๋ถ€์ œ๋ชฉ: ๋ถ„๊ธฐ๋ณ„ ๊ฒฐ๊ณผ")

ํ…์ŠคํŠธ ์ƒ‰์ƒ ๋ณ€๊ฒฝํ•˜๊ธฐ

setFillColorRGB() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…์ŠคํŠธ์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด. ์ด ๋ฉ”์„œ๋“œ๋Š” 0๋ถ€ํ„ฐ 1๊นŒ์ง€์˜ RGB ๊ฐ’์„ ๋ฐ›์•„.

Python

pdf_file.setFillColorRGB(0.2, 0.4, 0.6)  # ํŒŒ๋ž€์ƒ‰
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 110, "์ด ํ…์ŠคํŠธ๋Š” ํŒŒ๋ž€์ƒ‰์ž…๋‹ˆ๋‹ค.")

reportlab.lib.colors์—์„œ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์–ด.

Python

from reportlab.lib import colors

pdf_file.setFillColor(colors.red)
pdf_file.drawString(100, height - 140, "๋นจ๊ฐ„์ƒ‰ ํ…์ŠคํŠธ")

3. ์ •๋ ฌ๊ณผ ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ

ํ…์ŠคํŠธ๊ฐ€ ๊ธธ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ ์ค„๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„. ReportLab์€ ์ž๋™ ์ค„๋ฐ”๊ฟˆ์„ ์ง€์›ํ•˜๋Š” TextObject ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ด.

TextObject๋ฅผ ์‚ฌ์šฉํ•œ ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ

Python

text = """
๋ณด๊ณ ์„œ๋Š” ์ง€๋‚œ ์„ธ ๋‹ฌ ๋™์•ˆ์˜ ํŒ๋งค ๋ถ„์„์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ๋ณ€ํ™”์™€ ๊ทธ๊ฒƒ์ด ํšŒ์‚ฌ์˜ ์ „์ฒด ์„ฑ์žฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.
"""

text_object = pdf_file.beginText(100, height - 180)
text_object.setFont("Helvetica", 12)
text_object.setFillColor(colors.darkblue)

for line in text.split("\n"):
    text_object.textLine(line)

pdf_file.drawText(text_object)

์ด ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ์ค„์˜ ํ…์ŠคํŠธ ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ๊ฐ ์ค„์„ PDF์— ์ถ”๊ฐ€ํ•ด. TextObject๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธด ํ…์ŠคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ํฌ๋งทํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•„.

4. ๋‹จ๋ฝ์„ ์‚ฌ์šฉํ•œ ํ…์ŠคํŠธ ์Šคํƒ€์ผ๋ง

reportlab.platypus ๋ชจ๋“ˆ์˜ Paragraph ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HTML ํƒœ๊ทธ(<b>, <i>, <u> ๋“ฑ)๋ฅผ ์ง€์›ํ•˜๋Š” ์Šคํƒ€์ผ๋ง๋œ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด. Paragraph๋Š” ์ •๋ ฌ๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐ๋„ ์ง€์›ํ•ด์„œ ํฌ๋งทํŒ…๋œ ํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•ด.

Paragraph๋ฅผ ์‚ฌ์šฉํ•œ ๋‹จ๋ฝ ์ƒ์„ฑ

Python

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph

# PDF ์„ค์ •
doc = SimpleDocTemplate("styled_paragraphs.pdf", pagesize=A4)
styles = getSampleStyleSheet()
elements = []

# ๊ตต์€ ๊ธ€๊ผด๊ณผ ์ดํƒค๋ฆญ ํ…์ŠคํŠธ๋กœ ๋‹จ๋ฝ ์ƒ์„ฑ
text = "ํŒ๋งค ๋ณด๊ณ ์„œ
2023๋…„ ๋ถ„๊ธฐ๋ณ„ ๋ณด๊ณ ์„œ" paragraph = Paragraph(text, styles["Title"]) elements.append(paragraph) # ๋ณธ๋ฌธ ํ…์ŠคํŠธ ์ถ”๊ฐ€ main_text = """ ์ด ๋ณด๊ณ ์„œ๋Š” ์ง€๋‚œ ๋ถ„๊ธฐ์˜ ์ฃผ์š” ํŒ๋งค ๋ฐ์ดํ„ฐ์™€ ํšŒ์‚ฌ์˜ ์ด ์ˆ˜์ต์— ๋Œ€ํ•œ ํŒ๋งค์˜ ์˜ํ–ฅ์„ ๋ถ„์„ํ•œ ๋‚ด์šฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. """ paragraph = Paragraph(main_text, styles["BodyText"]) elements.append(paragraph) # PDF ์ƒ์„ฑ doc.build(elements)

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” Paragraph๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์Šคํƒ€์ผ๋ง๋œ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์–ด. HTML ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•ด์„œ ๊ตต์€ ๊ธ€๊ผด๊ณผ ์ดํƒค๋ฆญ ํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , getSampleStyleSheet()๋Š” ๊ธฐ๋ณธ ์Šคํƒ€์ผ(์˜ˆ: Title, BodyText)์„ ์ œ๊ณตํ•ด.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION