가이드
폰트
gpdf에서 폰트 및 CJK 텍스트 사용하기
폰트 등록
문서를 생성할 때 TrueType 폰트를 등록합니다:
fontData, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")
doc := template.New(
template.WithPageSize(document.A4),
template.WithFont("NotoSansJP", fontData),
template.WithDefaultFont("NotoSansJP", 12),
)
여러 폰트 패밀리
다양한 용도에 맞게 여러 폰트를 등록합니다:
regular, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")
bold, _ := os.ReadFile("fonts/NotoSansJP-Bold.ttf")
mono, _ := os.ReadFile("fonts/RobotoMono-Regular.ttf")
doc := template.New(
template.WithFont("NotoSansJP", regular),
template.WithFont("NotoSansJP-Bold", bold),
template.WithFont("RobotoMono", mono),
template.WithDefaultFont("NotoSansJP", 12),
)
FontFamily()를 사용하여 텍스트 요소에서 폰트를 전환합니다:
c.Text("Regular text") // uses default NotoSansJP
c.Text("Bold heading", template.FontFamily("NotoSansJP-Bold"), template.FontSize(18))
c.Text("Code snippet", template.FontFamily("RobotoMono"), template.FontSize(10))
CJK 지원
gpdf는 일본어, 중국어, 한국어 텍스트를 최우선으로 지원합니다. CJK 기능에는 금칙처리 규칙(줄 시작/끝에서 특정 문자 금지)에 따른 자동 줄바꿈이 포함됩니다.
fontData, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")
doc := template.New(
template.WithPageSize(document.A4),
template.WithMargins(document.UniformEdges(document.Mm(20))),
template.WithFont("NotoSansJP", fontData),
template.WithDefaultFont("NotoSansJP", 12),
)
page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("日本語テキストのサンプル", template.FontSize(18))
c.Text("gpdfは純Go・ゼロ依存のPDF生成ライブラリです。")
c.Text("CJKテキストの改行やレイアウトを正しく処理します。")
})
})
다국어 CJK 문서
여러 CJK 언어가 포함된 문서에서는 각 폰트를 개별적으로 등록하고 FontFamily()로 전환합니다:
jpFont, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")
scFont, _ := os.ReadFile("fonts/NotoSansSC-Regular.ttf")
krFont, _ := os.ReadFile("fonts/NotoSansKR-Regular.ttf")
doc := template.New(
template.WithPageSize(document.A4),
template.WithFont("NotoSansJP", jpFont),
template.WithFont("NotoSansSC", scFont),
template.WithFont("NotoSansKR", krFont),
template.WithDefaultFont("NotoSansKR", 12),
)
page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
r.Col(4, func(c *template.ColBuilder) {
c.Text("こんにちは", template.FontFamily("NotoSansJP"))
})
r.Col(4, func(c *template.ColBuilder) {
c.Text("你好", template.FontFamily("NotoSansSC"))
})
r.Col(4, func(c *template.ColBuilder) {
c.Text("안녕하세요", template.FontFamily("NotoSansKR"))
})
})
CJK 콘텐츠가 포함된 QR 코드
QR 코드는 일본어를 포함한 유니코드 콘텐츠를 지원합니다:
c.QRCode("こんにちは世界", template.QRSize(document.Mm(30)))
폰트 서브셋팅
gpdf는 자동으로 TrueType 폰트를 서브셋합니다 — 문서에서 실제로 사용된 글리프만 임베딩됩니다. 이는 특히 수만 개의 글리프를 포함할 수 있는 CJK 폰트의 파일 크기를 크게 줄여줍니다.
지원되는 폰트 형식
| 형식 | 지원 |
|---|---|
| TrueType (.ttf) | 완전 지원 |
| OpenType (.otf) | 부분 지원 (TrueType 아웃라인) |
| WOFF / WOFF2 | 미지원 |
| Type 1 | 미지원 |
텍스트 셰이핑 제한
gpdf 는 각 문자를 글리프에 일대일로 매핑하며, 텍스트 셰이핑 엔진을 포함하지 않습니다. 문맥에 따른 글리프 치환이나 양방향 텍스트 재정렬이 필요한 문자 체계는 올바르게 배치되지 않습니다.
| 문자 체계 | 상태 |
|---|---|
| 라틴, 키릴, 그리스 | 완전 지원 |
| CJK (일본어, 중국어, 한국어) | 완전 지원 |
| 아랍어, 히브리어, 페르시아어, 우르두어 | 글리프는 정상적으로 임베딩되지만 연결형과 RTL 재정렬은 미지원 |
| 데바나가리, 태국어 등 복잡한 문자 체계 | 문맥 셰이핑 미지원 |
아랍어처럼 연결되는 문자 체계에서는 글자가 연결된 오른쪽에서 왼쪽 배열이 아니라, 고립형 그대로 왼쪽에서 오른쪽으로 그려집니다. 폰트의 GSUB / GPOS 테이블에 정의된 합자와 커닝도 적용되지 않습니다.
텍스트 추출에는 영향이 없습니다. 문자는 ToUnicode CMap 과 함께 임베딩되므로 PDF 에서 복사하거나 pdftotext 를 실행하면 원래 문자열을 얻을 수 있습니다. 스캔한 페이지에 OCR 결과를 겹치는 경우처럼 검색과 선택만 가능하면 되는 용도에서는 이 제한이 결과에 영향을 주지 않습니다.
권장 폰트
| 폰트 | 용도 |
|---|---|
| Noto Sans JP | 일본어 텍스트 |
| Noto Sans SC | 중국어 간체 |
| Noto Sans KR | 한국어 텍스트 |
| Noto Sans | 라틴/서양 텍스트 |
| Inter | 모던 UI 스타일 문서 |
| Roboto Mono | 코드 및 고정폭 텍스트 |
JSON 스키마에서 폰트 사용
JSON 스키마를 사용할 때 폰트는 Go 옵션을 통해 등록합니다:
fontData, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")
schema := []byte(`{
"page": {"size": "A4"},
"body": [
{"row": {"cols": [
{"span": 12, "text": "日本語テキスト", "style": {"font": "NotoSansJP"}}
]}}
]
}`)
doc, err := template.FromJSON(schema, nil,
template.WithFont("NotoSansJP", fontData),
)