Back to productivity
productivity 2 min read 135 lines

pdf-report

한국어 PDF 보고서 생성 — fpdf2 + Apple SD Gothic Neo 폰트로 한글 지원 PDF 문서 생성

PDF Report Generator (한국어)

fpdf2를 사용하여 한국어 PDF 보고서를 생성합니다.

전제 조건

  • fpdf2 패키지 (시스템에 설치됨)
  • Apple SD Gothic Neo 폰트 (macOS 기본 탑재)

한글 폰트 준비

스크립트 실행 전 반드시 TTC에서 TTF를 추출해야 합니다:

from fontTools.ttLib import TTCollection

ttc = TTCollection('/System/Library/Fonts/AppleSDGothicNeo.ttc')
ttc[0].save('/tmp/AppleSDGothicNeoRegular.ttf') # Regular
ttc[6].save('/tmp/AppleSDGothicNeoBold.ttf') # Bold

기본 템플릿

from fpdf import FPDF

class KRReport(FPDF):
def __init__(self, args, *kwargs):
super().__init__(args, *kwargs)
self.add_font('SDGothic', '', '/tmp/AppleSDGothicNeoRegular.ttf')
self.add_font('SDGothic', 'B', '/tmp/AppleSDGothicNeoBold.ttf')

def header(self):
self.set_font('SDGothic', 'B', 10)
self.set_text_color(120, 120, 120)
self.cell(0, 8, 'ICBM2 Report', align='L')
self.cell(0, 8, 날짜, align='R', new_x="LMARGIN", new_y="NEXT")
self.set_draw_color(200, 200, 200)
self.line(10, self.get_y(), 200, self.get_y())
self.ln(5)

def footer(self):
self.set_y(-15)
self.set_font('SDGothic', '', 8)
self.set_text_color(150, 150, 150)
self.cell(0, 10, f'{self.page_no()}/{{nb}}', align='C')

def section_title(self, title):
self.set_font('SDGothic', 'B', 14)
self.set_text_color(30, 30, 80)
self.cell(0, 10, title, new_x="LMARGIN", new_y="NEXT")
self.set_draw_color(30, 30, 80)
self.line(10, self.get_y(), 200, self.get_y())
self.ln(3)

def sub_title(self, title):
self.set_font('SDGothic', 'B', 11)
self.set_text_color(60, 60, 60)
self.cell(0, 8, title, new_x="LMARGIN", new_y="NEXT")
self.ln(1)

def body_text(self, text):
self.set_font('SDGothic', '', 10)
self.set_text_color(40, 40, 40)
self.multi_cell(0, 5.5, text)
self.ln(2)

def add_table(self, headers, rows, col_widths=None):
if col_widths is None:
col_widths = [190 / len(headers)] * len(headers)

# 헤더
self.set_font('SDGothic', 'B', 9)
self.set_fill_color(30, 30, 80)
self.set_text_color(255, 255, 255)
for i, h in enumerate(headers):
self.cell(col_widths[i], 8, h, border=1, fill=True, align='C')
self.ln()

# 데이터 행
self.set_font('SDGothic', '', 8.5)
self.set_text_color(40, 40, 40)
for row_idx, row in enumerate(rows):
self.set_fill_color(245, 245, 250) if row_idx % 2 == 0 else self.set_fill_color(255, 255, 255)

max_lines = 1
for i, cell_text in enumerate(row):
lines = self.multi_cell(col_widths[i], 6, str(cell_text), dry_run=True, output="LINES")
max_lines = max(max_lines, len(lines))
row_height = 6 * max_lines

# 페이지 나눔 처리
if self.get_y() + row_height > 270:
self.add_page()
self.set_font('SDGothic', 'B', 9)
self.set_fill_color(30, 30, 80)
self.set_text_color(255, 255, 255)
for i, h in enumerate(headers):
self.cell(col_widths[i], 8, h, border=1, fill=True, align='C')
self.ln()
self.set_font('SDGothic', '', 8.5)
self.set_text_color(40, 40, 40)

y_start = self.get_y()
x_start = self.get_x()
for i, cell_text in enumerate(row):
x = x_start + sum(col_widths[:i])
self.set_xy(x, y_start)
self.multi_cell(col_widths[i], 6, str(cell_text), border=1, fill=True)
self.set_y(max(self.get_y(), y_start + row_height))

pdf = KRReport()
pdf.alias_nb_pages()
pdf.set_auto_page_break(auto=True, margin=20)

사용 방법

  • execute_code로 스크립트 작성 후 terminal로 실행 (샌드박스에 fpdf2 없음)
  • 폰트 추출 → 스크립트 작성 → python3 script.py로 실행
  • 출력 경로: ~/.hermes/data/ 권장

주의사항

  • 모든 PDF는 한국어로 작성 (주인님 기본 설정)
  • 샌드박스 Python에는 fpdf2가 없으므로 반드시 로컬 python3로 실행
  • dry_run=True, output="LINES" 사용 (split_only는 deprecated)
  • 테이블 col_widths 합이 190이 되도록 조정 (A4 기준, 좌우 여백 10mm)
  • /tmp/ 폰트 파일은 세션 재시작 시 사라짐 — 매번 추출 필요

Related Skills / 관련 스킬

google-workspace

Gmail, 캘린더, 드라이브, 연락처, 시트, 문서 통합 — gws CLI + OAuth2

linear

Linear 이슈/프로젝트/팀 관리 — GraphQL API, API 키 인증, curl만으로 동작

maps

>

nano-pdf

자연어 명령으로 PDF 편집 — 텍스트 수정, 오타 교정, 제목 업데이트