bond_daily_report PDF 한글 폰트 활성화
결론
bond_daily_report.py의 PDF 폰트 경로를 NanumGothic 의존에서 macOS 기본 AppleGothic으로 전환했다.- AppleGothic은
/System/Library/Fonts/Supplemental/AppleGothic.ttf에 존재했다. - 기존 PDF 라이브러리는
fpdf2였고, AppleGothic을 그대로 등록하면KeyError: 'OS/2'로 실패했다. AppleGothic TTF가 fpdf2가 요구하는OS/2테이블을 제공하지 않는 것이 원인이었다. - 텍스트 폴백은 유지한 채, PDF 생성 단계에만 ReportLab AppleGothic 렌더러를 안전 fallback으로 추가했다.
- 실제 실행 결과 PDF 생성 및 Telegram 그룹 전송 성공:
message_id=51832.
수정 파일
/Users/ron/.hermes/workspace/scripts/pipeline/bond_daily_report.py
수정 위치
475-476: PDF 폰트 상수 교체505-737: 기존_generate_pdf()fpdf2 렌더러의 폰트명을AppleGothic으로 교체하고 fpdf2 실패 시 ReportLab fallback으로 넘기도록 수정740-914:_generate_pdf_reportlab()추가 — AppleGothic을reportlab.pdfbase.ttfonts.TTFont로 등록해 PDF 생성
수정 diff 요약
- FONT_DIR = Path.home() / ".hermes" / "fonts"
- NANUM_REGULAR = FONT_DIR / "NanumGothic-Regular.ttf"
- NANUM_BOLD = FONT_DIR / "NanumGothic-Bold.ttf"
+ APPLEGOTHIC_REGULAR = Path("/System/Library/Fonts/Supplemental/AppleGothic.ttf")
+ APPLEGOTHIC_BOLD = APPLEGOTHIC_REGULAR
- log(f"NanumGothic 폰트 없음 — PDF 생성 스킵", "WARN")
+ log(f"AppleGothic 폰트 없음 — PDF 생성 스킵: {APPLEGOTHIC_REGULAR}", "WARN")
- pdf.add_font("Nanum", "", str(NANUM_REGULAR))
- pdf.add_font("Nanum", "B", str(NANUM_BOLD))
+ pdf.add_font("AppleGothic", "", str(APPLEGOTHIC_REGULAR))
+ pdf.add_font("AppleGothic", "B", str(APPLEGOTHIC_BOLD))
- pdf.set_font("Nanum", ...)
+ pdf.set_font("AppleGothic", ...)
- log(f"PDF 생성 실패: {e}", "ERROR")
- return None
+ log(f"FPDF PDF 생성 실패: {e} — ReportLab AppleGothic 렌더러로 재시도", "WARN")
+ return _generate_pdf_reportlab(report_text, date_str)
추가된 ReportLab fallback 핵심:
pdfmetrics.registerFont(TTFont("AppleGothic", str(APPLEGOTHIC_REGULAR)))
...
doc.build(story, onFirstPage=add_footer, onLaterPages=add_footer)
log(f"PDF 생성: {out_path} ({out_path.stat().st_size // 1024}KB) [ReportLab AppleGothic]")
검증
1) 구문 검사
/usr/bin/python3 -m py_compile /Users/ron/.hermes/workspace/scripts/pipeline/bond_daily_report.py
py_compile ok
2) 실제 실행
실행 명령:
cd /Users/ron/.hermes/workspace
PYTHONPATH=/Users/ron/.hermes/workspace/scripts/shared:/Users/ron/.hermes/workspace/scripts/pipeline \
/usr/bin/python3 /Users/ron/.hermes/workspace/scripts/pipeline/bond_daily_report.py --notify
실행 결과:
START_TS=2026-04-15 20:47:26
[2026-04-15 20:47:27] bond_daily_report 시작
[2026-04-15 20:47:27] 노트: 260415_황대진_전달-일일-415-수-채권시장-마감정리-DS증권-황대진.md
[2026-04-15 20:47:27] 파싱 완료 — 타입: 입찰안내, 날짜: 2026-04-15, 낙찰: 1건
[2026-04-15 20:51:00] LLM 완료 (모델: ollama/qwen3.5:4b, 6541자)
[2026-04-15 20:51:16] [WARN] FPDF PDF 생성 실패: 'OS/2' — ReportLab AppleGothic 렌더러로 재시도
[2026-04-15 20:51:16] PDF 생성: /Users/ron/.hermes/workspace/memory/bond-briefing/briefing_2026-04-15.pdf (129KB) [ReportLab AppleGothic]
[2026-04-15 20:51:16] 메모리 저장 완료. 볼트: None
[2026-04-15 20:51:19] 텔레그램 그룹 PDF: 성공 message_id=51832 error=None
[2026-04-15 20:51:22] PDF DM 전송: briefing_2026-04-15.pdf message_id=11641 error=None
EXIT_CODE=0
END_TS=2026-04-15 20:51:22
3) PDF 산출물
파일: /Users/ron/.hermes/workspace/memory/bond-briefing/briefing_2026-04-15.pdf
크기: 132,152 bytes
수정시각: Apr 15 20:51:16 2026
페이지: 5
pdfinfo 핵심 출력:
Title: 채권 트레이더 브리핑 2026-04-15
Author: OpenClaw/Hermes
Producer: ReportLab PDF Library - (opensource)
Pages: 5
Page size: 595.276 x 841.89 pts (A4)
File size: 132152 bytes
PDF version: 1.4
pdffonts 확인:
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
Helvetica Type 1 WinAnsi no no no 2 0
AAAAAA+AppleGothic TrueType WinAnsi yes yes yes 11 0
AAAAAB+AppleGothic TrueType WinAnsi yes yes yes 15 0
pdftotext로 한글 추출 확인:
채권 트레이더 브리핑 | 2026-04-15
오늘 시장 데이터를 가지고 의욕 넘치는 후배에게 채권 시장 읽는 법을 깊이 가르치는 일일 브리핑을 작성합니다.
**[작성 원칙]**
- 모든 수치 변화에 "왜 그랬는가" 원인 설명 필수
...
→ AppleGothic이 PDF에 임베드됐고, 한글 텍스트 추출도 정상이다.
4) Telegram 전송 증거
/Users/ron/.hermes/logs/bond_daily_last_telegram.tsv 최신 행:
2026-04-15T20:51:19+09:00 -1003076685086 39439 51832 success
2026-04-15T20:51:22+09:00 492860021 11641 success
- 그룹 PDF 전송:
message_id=51832 - DM PDF 전송:
message_id=11641
잔존 리스크
- fpdf2는 AppleGothic 파일을 직접 처리하지 못한다(
OS/2테이블 요구). 현재는 이를 감지해 ReportLab AppleGothic 렌더러로 성공 처리한다. - 기존 텍스트 폴백 경로는 그대로 유지했다. 향후 ReportLab까지 실패하면 기존처럼 텍스트 폴백으로 전송된다.
자체평가
- 정확성: 4.8/5 — AppleGothic 기반 PDF 생성과 Telegram 전송까지 실제 확인.
- 완성도: 4.7/5 — 텍스트 폴백 유지, fpdf2 실패 원인까지 방어.
- 검증: 5.0/5 — py_compile, 실제 실행, pdfinfo/pdffonts/pdftotext, Telegram message_id 확인.
- 최소 변경: 4.4/5 — fpdf2만으로는 AppleGothic이 실패해 ReportLab fallback 추가가 필요했다. PDF 섹션 밖 로직은 건드리지 않았다.
종합: 4.7/5