# Python으로 Money Forward 스타일 재무 PDF 리포트 만들기 - Part 2 ## Python 환경 설정 (uv + venv) ### uv란? `uv`는 Rust로 작성된 초고속 Python 패키지 매니저입니다. pip보다 10-100배 빠르며, venv 생성도 지원합니다. ### uv 설치 ```bash # macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # 또는 pip로 설치 pip install uv ``` ### 프로젝트 초기화 ```bash # 프로젝트 디렉토리 이동 cd /var/www/tkim.planitai.co.jp/gemegg/20251207-make-pdf-report # uv로 프로젝트 초기화 uv init # 또는 수동으로 pyproject.toml 생성 ``` ### pyproject.toml 작성 ```toml [project] name = "pdf-report-generator" version = "0.1.0" description = "Money Forward 스타일 재무 PDF 리포트 생성기" readme = "README.md" requires-python = ">=3.12" dependencies = [ "google-api-python-client>=2.0.0", "google-auth>=2.0.0", "reportlab>=4.0.0", "matplotlib>=3.8.0", "pandas>=2.0.0", "python-dotenv>=1.0.0", ] [project.optional-dependencies] dev = [ "pytest>=7.0.0", "black>=23.0.0", "ruff>=0.1.0", ] [tool.uv] dev-dependencies = [ "pytest>=7.0.0", ] ``` ### 가상환경 생성 및 의존성 설치 ```bash # venv 생성 uv venv # 가상환경 활성화 (Linux/macOS) source .venv/bin/activate # 가상환경 활성화 (Windows) .venv\Scripts\activate # 의존성 설치 uv pip install -e . # 또는 sync 사용 uv sync ``` ### 디렉토리 구조 생성 ```bash # 소스 디렉토리 생성 mkdir -p src/charts src/pdf/pages output # __init__.py 파일 생성 touch src/__init__.py touch src/charts/__init__.py touch src/pdf/__init__.py touch src/pdf/pages/__init__.py ``` ### 환경 변수 설정 `.env` 파일을 생성합니다: ```bash # .env GOOGLE_SPREADSHEET_ID=17AUAHQQB0nZVje9QXtdISEPtMoa8RXKkuCk4R5iHbd4 GOOGLE_SERVICE_ACCOUNT_KEY=../20251205-worksheet-17AUAHQQB0nZVje9QXtdISEPtMoa8RXKkuCk4R5iHbd4/project/service-account-key.json OUTPUT_DIR=./output ``` ### 설정 파일 작성 `src/config.py`: ```python """설정 모듈""" import os from pathlib import Path from dotenv import load_dotenv # .env 파일 로드 load_dotenv() # 프로젝트 루트 PROJECT_ROOT = Path(__file__).parent.parent # Google Sheets 설정 SPREADSHEET_ID = os.getenv( "GOOGLE_SPREADSHEET_ID", "17AUAHQQB0nZVje9QXtdISEPtMoa8RXKkuCk4R5iHbd4" ) # 서비스 계정 키 경로 SERVICE_ACCOUNT_KEY = Path(os.getenv( "GOOGLE_SERVICE_ACCOUNT_KEY", PROJECT_ROOT.parent / "20251205-worksheet-17AUAHQQB0nZVje9QXtdISEPtMoa8RXKkuCk4R5iHbd4/project/service-account-key.json" )) # 출력 디렉토리 OUTPUT_DIR = Path(os.getenv("OUTPUT_DIR", PROJECT_ROOT / "output")) # PDF 설정 PDF_CONFIG = { "page_size": "A4", "orientation": "landscape", # 가로 방향 "margin": { "top": 30, "bottom": 30, "left": 40, "right": 40, }, "font": { "default": "HeiseiKakuGo-W5", # 일본어 지원 폰트 "title_size": 18, "header_size": 12, "body_size": 9, }, } # 회사 정보 COMPANY_INFO = { "name": "株式会社GemEgg", "fiscal_year": "2025年度", "period": "4月1日〜3月31日", } ``` ### 설치 확인 ```bash # Python 버전 확인 python --version # 설치된 패키지 확인 uv pip list # 간단한 테스트 python -c " from reportlab.lib.pagesizes import A4, landscape from google.oauth2 import service_account import matplotlib import pandas as pd print('✓ reportlab:', landscape(A4)) print('✓ google-auth: OK') print('✓ matplotlib:', matplotlib.__version__) print('✓ pandas:', pd.__version__) print('모든 패키지 설치 완료!') " ``` ### 예상 출력 ``` ✓ reportlab: (841.8897637795275, 595.275590551181) ✓ google-auth: OK ✓ matplotlib: 3.8.0 ✓ pandas: 2.0.0 모든 패키지 설치 완료! ``` ### 일본어 폰트 설정 ReportLab에서 일본어를 표시하려면 CID 폰트를 사용합니다: ```python # 일본어 폰트 테스트 from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.cidfonts import UnicodeCIDFont # 일본어 폰트 등록 pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5')) pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3')) print("일본어 폰트 등록 완료!") ``` ### 최종 디렉토리 구조 ``` 20251207-make-pdf-report/ ├── .venv/ # 가상환경 ├── .env # 환경 변수 ├── pyproject.toml # 프로젝트 설정 ├── sample-report.pdf # 참고 PDF ├── src/ │ ├── __init__.py │ ├── config.py # 설정 ✓ │ ├── charts/ │ │ └── __init__.py │ └── pdf/ │ ├── __init__.py │ └── pages/ │ └── __init__.py ├── output/ # 생성된 PDF 저장 └── make-pdf-report-v*.md # 블로그 시리즈 ``` ### 다음 단계 Part 3에서는 Google Sheets API를 연동하여 스프레드시트에서 예실 데이터를 읽어옵니다. --- **시리즈 네비게이션** - [x] Part 1: 프로젝트 소개 - [x] Part 2: 환경 설정 (현재) - [ ] Part 3: Sheets API 연동 - [ ] Part 4: 데이터 모델 - [ ] Part 5: PDF 기본 레이아웃 - [ ] Part 6: KPI 대시보드 - [ ] Part 7: 테이블 구현 - [ ] Part 8: 차트 생성 - [ ] Part 9: 복합 차트 - [ ] Part 10: 완성