gpdf 표에 얼룩말 줄무늬 행을 넣으려면?
template.TableStripe만 넘기면 된다. gpdf가 본문 행에 한 줄 걸러 배경색을 칠한다. 행 루프도, 셀별 스타일 지정도 필요 없다.
질문을 다시 풀면
청구서, 거래내역, 로그 — 5행을 넘는 표는 시선이 다음 행을 놓치기 시작한다. Bootstrap의 .table-striped처럼 한 줄 걸러 회색 배경이 들어간 줄무늬를 gpdf에서도 넣고 싶다. 단, 행 루프는 직접 쓰고 싶지 않다.
한 줄 답변
c.Table(header, rows, template.TableStripe(pdf.RGBHex(0xF5F5F5)))
이게 전부다. gpdf가 교차 색칠을 처리한다. 헤더는 줄무늬 대상에서 빠지고 본문 행에만 적용된다. 1행은 그대로, 2행에 색, 3행 그대로, 4행에 색, 이런 식.
동작하는 코드
package main
import (
"log"
"os"
"github.com/gpdf-dev/gpdf"
"github.com/gpdf-dev/gpdf/document"
"github.com/gpdf-dev/gpdf/pdf"
"github.com/gpdf-dev/gpdf/template"
)
func main() {
doc := gpdf.NewDocument(
gpdf.WithPageSize(gpdf.A4),
gpdf.WithMargins(document.UniformEdges(document.Mm(20))),
)
brand := pdf.RGBHex(0x1A237E) // 헤더 배경
stripe := pdf.RGBHex(0xF5F5F5) // 한 줄 걸러 들어갈 줄무늬
page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("1분기 매출", template.FontSize(20), template.Bold())
c.Spacer(document.Mm(4))
c.Table(
[]string{"제품", "지역", "수량", "매출"},
[][]string{
{"Laptop Pro 15", "북미", "120", "₩208,800,000"},
{"Wireless Mouse", "EU", "640", "₩25,728,000"},
{"USB-C Hub", "APAC", "410", "₩27,470,000"},
{"Monitor 27\"", "북미", "180", "₩96,300,000"},
{"Keyboard", "EU", "320", "₩34,304,000"},
{"Webcam HD", "APAC", "260", "₩31,356,000"},
},
template.ColumnWidths(40, 20, 15, 25),
template.TableHeaderStyle(
template.TextColor(pdf.White),
template.BgColor(brand),
),
template.TableStripe(stripe),
)
})
})
data, err := doc.Generate()
if err != nil {
log.Fatal(err)
}
if err := os.WriteFile("sales.pdf", data, 0o644); err != nil {
log.Fatal(err)
}
}
go run main.go. 본문 6행 중 3행에 색이 들어가고, 헤더는 진한 남색에 흰 글씨. 월요일 아침 메일에 첨부되는 그 보고서 모양 그대로다.
교차 색칠이 작동하는 방식
내부적으로 gpdf는 본문 행을 0부터 시작하는 인덱스 i로 순회하면서 i%2 == 1인 행에만 줄무늬 색을 칠한다. 헤더는 별도 슬라이스라 카운트에 포함되지 않는다.
| 본문 행 인덱스 (0부터) | 시각 위치 | 줄무늬? |
|---|---|---|
| 0 | 1행 | 없음 |
| 1 | 2행 | 있음 |
| 2 | 3행 | 없음 |
| 3 | 4행 | 있음 |
| ... | ... | ... |
Bootstrap과 동일한 패리티다. 첫 행은 깔끔하고, 줄무늬는 시각적인 "쉼표" 역할을 한다. 흰 행 → 옅은 색 행 → 흰 행으로 시선이 자연스럽게 흐른다.
패리티를 뒤집는 옵션(짝수 대신 홀수 행에 색)은 없다. 정 뒤집고 싶으면 본문 맨 앞에 빈 행을 넣으면 되지만, 그렇게까지 하는 사람은 보지 못했다.
색 고르기
줄무늬의 본질은 눈에 띄지 않게다. 본문과 경쟁하는 색을 고른 순간 줄무늬는 의미를 잃는다.
pdf.RGBHex(0xF5F5F5) // 부드러운 따뜻한 회색. Bootstrap 기본값 근처
pdf.RGBHex(0xFAFAFA) // 더 옅게, 작은 글씨에선 거의 안 보임
pdf.RGBHex(0xEEF2FF) // 브랜드 색의 아주 옅은 변형 (헤더가 같은 계열일 때 좋음)
pdf.Gray(0.96) // 그레이스케일. PDF/A 워크플로에서 몇 바이트 절약
채도가 높은 색은 피한다. 60% 채도의 파란 줄무늬는 "이 행이 선택됨/중요함"으로 읽히고, 행을 가로지르는 시선 흐름을 끊어버린다. 그건 줄무늬의 목적과 정반대다.
다크 테마(슬라이드형 보고서에서 가끔 본다) 0x1A1A1A 페이지엔 pdf.RGBHex(0x202020) 정도. 낮은 대비를 유지한다는 원칙은 같다.
셀 테두리와 조합
짧은 표라면 줄무늬만으로 충분하다. 회계 보고서처럼 밀도가 높은 표에선 WithTableCellBorder로 셀 사이에 헤어라인을 깔면 깔끔해진다:
hairline := template.Border(
template.BorderWidth(document.Pt(0.5)),
template.BorderColor(pdf.Gray(0.85)),
)
c.Table(header, rows,
template.ColumnWidths(40, 20, 15, 25),
template.TableHeaderStyle(
template.TextColor(pdf.White),
template.BgColor(brand),
),
template.TableStripe(pdf.RGBHex(0xF5F5F5)),
template.WithTableCellBorder(hairline),
)
헤어라인 + 옅은 줄무늬 = 회계 부서가 출력하는 그 익숙한 양식 그대로다. 테두리 색은 줄무늬보다 더 옅게. 줄무늬가 주, 테두리는 보조라는 순서를 유지한다.
외곽선만 원한다면 WithTableCellBorder 대신 WithTableBorder를 쓴다.
10분 날리는 함정
- 색 값의 범위 착각.
pdf.RGB(245, 245, 245)는 새카만 박스가 된다. 생성자는 0–255가 아니라 0.0–1.0을 받는다. CSS 감각으로 쓰고 싶다면pdf.RGBHex(0xF5F5F5). - 헤더에 줄무늬를 적용하려는 시도.
TableStripe는 헤더를 건드리지 않는다. 헤더에 색을 넣으려면TableHeaderStyle(template.BgColor(...))을 써야 한다. 둘을 헷갈려서 "왜 헤더에 색이 안 들어가지" 하다가 30분 보내는 게 가장 흔한 첫 실수다. - 두 색을 번갈아 쓰고 싶다. gpdf는 줄무늬 색을 하나만 받는다. white → gray → blue 3색 사이클은 없다. 만들 순 있지만 가독성에 도움이 안 돼서 안 넣었다.
- 3행짜리 표에 줄무늬. 줄무늬는 본문 4–5행 이상이어야 효과가 난다. 2–3행이면 "한 칸만 선택된 것처럼" 보일 뿐이다. 짧은 표는 그냥 줄무늬 없이 둔다.
관련 레시피
- 표 컬럼 너비를 직접 지정하려면? —
ColumnWidths상세. - gpdf에 사용자 TrueType 폰트를 등록하려면? — 줄무늬 표를 브랜드 폰트로 렌더.
- Go로 50줄 이내에 청구서 PDF 만들기 — 헤더 스타일, 줄무늬, 합계행이 들어간 실전 표.
gpdf 써보기
gpdf는 Go용 PDF 생성 라이브러리. MIT 라이선스, 외부 의존성 0, 순수 Go TrueType 처리.
go get github.com/gpdf-dev/gpdf