전체 글

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부터)시각 위치줄무늬?
01행없음
12행있음
23행없음
34행있음
.........

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행이면 "한 칸만 선택된 것처럼" 보일 뿐이다. 짧은 표는 그냥 줄무늬 없이 둔다.

관련 레시피

gpdf 써보기

gpdf는 Go용 PDF 생성 라이브러리. MIT 라이선스, 외부 의존성 0, 순수 Go TrueType 처리.

go get github.com/gpdf-dev/gpdf

⭐ GitHub에서 Star · 문서 보기