[{"data":1,"prerenderedAt":1774},["ShallowReactive",2],{"blog-ko-multi-page-table":3},{"id":4,"title":5,"author":6,"body":10,"date":1739,"description":1740,"draft":1741,"extension":1742,"howTo":1743,"image":1764,"meta":1765,"navigation":142,"path":1766,"seo":1767,"stem":1768,"tags":1769,"updated":1764,"__hash__":1773},"blogKo/ko/blog/024.multi-page-table.md","테이블을 여러 페이지에 걸쳐 출력하려면?",{"name":7,"url":8,"avatar":9},"Taiki Noda","https://nadai.dev/en/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":1727},"minimark",[13,18,30,33,41,85,104,108,123,1136,1143,1147,1171,1174,1198,1202,1209,1407,1421,1425,1428,1550,1561,1565,1604,1608,1648,1652,1687,1691,1694,1711,1723],[14,15,17],"h2",{"id":16},"질문을-바꿔-말하면","질문을 바꿔 말하면",[19,20,21,22,29],"p",{},"리포트가 있다 — 청구 명세, 거래 로그, 300행짜리 내보내기 — 누가 봐도 A4 한 장에 안 들어간다. Go의 PDF 라이브러리에서 이 테이블을 2페이지, 3페이지로 흘려보내고 각 페이지 맨 위에 헤더가 다시 나오게 하려면 뭘 해야 하나? ",[23,24,28],"a",{"href":25,"rel":26},"https://github.com/gpdf-dev/gpdf",[27],"nofollow","gpdf","에서는 답이 짧다.",[14,31,32],{"id":32},"결론",[19,34,35,36,40],{},"아무것도 안 해도 된다. ",[37,38,39],"code",{},"Table","을 한 번 호출하고 모든 행을 넘기면 gpdf가 페이지를 나눈다:",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","c.Table(header, rows) // rows가 300행 — gpdf가 여러 페이지로 나눈다\n","go","",[37,49,50],{"__ignoreMap":47},[51,52,55,59,63,66,69,72,75,78,81],"span",{"class":53,"line":54},"line",1,[51,56,58],{"class":57},"sTEyZ","c",[51,60,62],{"class":61},"sMK4o",".",[51,64,39],{"class":65},"s2Zo4",[51,67,68],{"class":61},"(",[51,70,71],{"class":57},"header",[51,73,74],{"class":61},",",[51,76,77],{"class":57}," rows",[51,79,80],{"class":61},")",[51,82,84],{"class":83},"sHwdD"," // rows가 300행 — gpdf가 여러 페이지로 나눈다\n",[19,86,87,88,90,91,95,96,99,100,103],{},"본문은 필요한 페이지 수만큼 한 행씩 분할된다. ",[37,89,71],{}," 슬라이스는 ",[92,93,94],"strong",{},"이어지는 페이지 맨 위에 자동으로 다시 렌더링","된다 — 열 너비도 스타일도 동일하다. ",[37,97,98],{},"PageBreak()"," 메서드도, ",[37,101,102],{},"MaxRowsPerPage"," 옵션도, 행을 세는 루프도 없다. 오버플로 처리는 레이아웃 엔진의 일이지 당신의 일이 아니다.",[14,105,107],{"id":106},"동작하는-코드","동작하는 코드",[19,109,110,111,114,115,118,119,122],{},"여러 페이지 테이블을 출력하는 완전한 프로그램. ",[37,112,113],{},"main.go","로 저장하고 ",[37,116,117],{},"go run .",", ",[37,120,121],{},"report.pdf","가 나온다.",[42,124,126],{"className":44,"code":125,"language":46,"meta":47,"style":47},"package main\n\nimport (\n    \"fmt\"\n    \"log\"\n    \"os\"\n\n    \"github.com/gpdf-dev/gpdf\"\n    \"github.com/gpdf-dev/gpdf/document\"\n    \"github.com/gpdf-dev/gpdf/pdf\"\n    \"github.com/gpdf-dev/gpdf/template\"\n)\n\nfunc main() {\n    doc := gpdf.NewDocument(\n        gpdf.WithPageSize(gpdf.A4),\n        gpdf.WithMargins(document.UniformEdges(document.Mm(20))),\n    )\n\n    brand := pdf.RGBHex(0x1A237E)\n\n    header := []string{\"Date\", \"Invoice #\", \"Customer\", \"Amount\"}\n    rows := make([][]string, 0, 200)\n    for i := 1; i \u003C= 200; i++ {\n        rows = append(rows, []string{\n            fmt.Sprintf(\"2026-%02d-%02d\", (i%6)+1, (i%28)+1),\n            fmt.Sprintf(\"INV-%05d\", 10000+i),\n            fmt.Sprintf(\"Customer #%d\", i),\n            fmt.Sprintf(\"$%d.00\", 100+i*7),\n        })\n    }\n\n    page := doc.AddPage()\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Text(\"2026 Invoice Ledger\", template.FontSize(18), template.Bold())\n            c.Spacer(document.Mm(4))\n\n            c.Table(header, rows,\n                template.ColumnWidths(20, 20, 40, 20),\n                template.TableHeaderStyle(\n                    template.TextColor(pdf.White),\n                    template.BgColor(brand),\n                ),\n            )\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"report.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n",[37,127,128,137,144,154,166,176,186,191,201,211,221,231,237,242,257,277,300,338,344,349,372,377,435,463,497,523,589,622,649,689,695,701,706,725,758,794,842,868,873,893,924,936,959,976,982,988,993,999,1004,1026,1042,1060,1065,1111,1126,1131],{"__ignoreMap":47},[51,129,130,133],{"class":53,"line":54},[51,131,132],{"class":61},"package",[51,134,136],{"class":135},"sBMFI"," main\n",[51,138,140],{"class":53,"line":139},2,[51,141,143],{"emptyLinePlaceholder":142},true,"\n",[51,145,147,151],{"class":53,"line":146},3,[51,148,150],{"class":149},"s7zQu","import",[51,152,153],{"class":61}," (\n",[51,155,157,160,163],{"class":53,"line":156},4,[51,158,159],{"class":61},"    \"",[51,161,162],{"class":135},"fmt",[51,164,165],{"class":61},"\"\n",[51,167,169,171,174],{"class":53,"line":168},5,[51,170,159],{"class":61},[51,172,173],{"class":135},"log",[51,175,165],{"class":61},[51,177,179,181,184],{"class":53,"line":178},6,[51,180,159],{"class":61},[51,182,183],{"class":135},"os",[51,185,165],{"class":61},[51,187,189],{"class":53,"line":188},7,[51,190,143],{"emptyLinePlaceholder":142},[51,192,194,196,199],{"class":53,"line":193},8,[51,195,159],{"class":61},[51,197,198],{"class":135},"github.com/gpdf-dev/gpdf",[51,200,165],{"class":61},[51,202,204,206,209],{"class":53,"line":203},9,[51,205,159],{"class":61},[51,207,208],{"class":135},"github.com/gpdf-dev/gpdf/document",[51,210,165],{"class":61},[51,212,214,216,219],{"class":53,"line":213},10,[51,215,159],{"class":61},[51,217,218],{"class":135},"github.com/gpdf-dev/gpdf/pdf",[51,220,165],{"class":61},[51,222,224,226,229],{"class":53,"line":223},11,[51,225,159],{"class":61},[51,227,228],{"class":135},"github.com/gpdf-dev/gpdf/template",[51,230,165],{"class":61},[51,232,234],{"class":53,"line":233},12,[51,235,236],{"class":61},")\n",[51,238,240],{"class":53,"line":239},13,[51,241,143],{"emptyLinePlaceholder":142},[51,243,245,248,251,254],{"class":53,"line":244},14,[51,246,247],{"class":61},"func",[51,249,250],{"class":65}," main",[51,252,253],{"class":61},"()",[51,255,256],{"class":61}," {\n",[51,258,260,263,266,269,271,274],{"class":53,"line":259},15,[51,261,262],{"class":57},"    doc ",[51,264,265],{"class":61},":=",[51,267,268],{"class":57}," gpdf",[51,270,62],{"class":61},[51,272,273],{"class":65},"NewDocument",[51,275,276],{"class":61},"(\n",[51,278,280,283,285,288,290,292,294,297],{"class":53,"line":279},16,[51,281,282],{"class":57},"        gpdf",[51,284,62],{"class":61},[51,286,287],{"class":65},"WithPageSize",[51,289,68],{"class":61},[51,291,28],{"class":57},[51,293,62],{"class":61},[51,295,296],{"class":57},"A4",[51,298,299],{"class":61},"),\n",[51,301,303,305,307,310,312,315,317,320,322,324,326,329,331,335],{"class":53,"line":302},17,[51,304,282],{"class":57},[51,306,62],{"class":61},[51,308,309],{"class":65},"WithMargins",[51,311,68],{"class":61},[51,313,314],{"class":57},"document",[51,316,62],{"class":61},[51,318,319],{"class":65},"UniformEdges",[51,321,68],{"class":61},[51,323,314],{"class":57},[51,325,62],{"class":61},[51,327,328],{"class":65},"Mm",[51,330,68],{"class":61},[51,332,334],{"class":333},"sbssI","20",[51,336,337],{"class":61},"))),\n",[51,339,341],{"class":53,"line":340},18,[51,342,343],{"class":61},"    )\n",[51,345,347],{"class":53,"line":346},19,[51,348,143],{"emptyLinePlaceholder":142},[51,350,352,355,357,360,362,365,367,370],{"class":53,"line":351},20,[51,353,354],{"class":57},"    brand ",[51,356,265],{"class":61},[51,358,359],{"class":57}," pdf",[51,361,62],{"class":61},[51,363,364],{"class":65},"RGBHex",[51,366,68],{"class":61},[51,368,369],{"class":333},"0x1A237E",[51,371,236],{"class":61},[51,373,375],{"class":53,"line":374},21,[51,376,143],{"emptyLinePlaceholder":142},[51,378,380,383,385,388,392,395,398,402,404,406,409,412,414,416,418,421,423,425,427,430,432],{"class":53,"line":379},22,[51,381,382],{"class":57},"    header ",[51,384,265],{"class":61},[51,386,387],{"class":61}," []",[51,389,391],{"class":390},"spNyl","string",[51,393,394],{"class":61},"{",[51,396,397],{"class":61},"\"",[51,399,401],{"class":400},"sfazB","Date",[51,403,397],{"class":61},[51,405,74],{"class":61},[51,407,408],{"class":61}," \"",[51,410,411],{"class":400},"Invoice #",[51,413,397],{"class":61},[51,415,74],{"class":61},[51,417,408],{"class":61},[51,419,420],{"class":400},"Customer",[51,422,397],{"class":61},[51,424,74],{"class":61},[51,426,408],{"class":61},[51,428,429],{"class":400},"Amount",[51,431,397],{"class":61},[51,433,434],{"class":61},"}\n",[51,436,438,441,443,446,449,451,453,456,458,461],{"class":53,"line":437},23,[51,439,440],{"class":57},"    rows ",[51,442,265],{"class":61},[51,444,445],{"class":65}," make",[51,447,448],{"class":61},"([][]",[51,450,391],{"class":390},[51,452,74],{"class":61},[51,454,455],{"class":333}," 0",[51,457,74],{"class":61},[51,459,460],{"class":333}," 200",[51,462,236],{"class":61},[51,464,466,469,472,474,477,480,482,485,487,489,492,495],{"class":53,"line":465},24,[51,467,468],{"class":149},"    for",[51,470,471],{"class":57}," i ",[51,473,265],{"class":61},[51,475,476],{"class":333}," 1",[51,478,479],{"class":61},";",[51,481,471],{"class":57},[51,483,484],{"class":61},"\u003C=",[51,486,460],{"class":333},[51,488,479],{"class":61},[51,490,491],{"class":57}," i",[51,493,494],{"class":61},"++",[51,496,256],{"class":61},[51,498,500,503,506,509,511,514,516,518,520],{"class":53,"line":499},25,[51,501,502],{"class":57},"        rows ",[51,504,505],{"class":61},"=",[51,507,508],{"class":65}," append",[51,510,68],{"class":61},[51,512,513],{"class":57},"rows",[51,515,74],{"class":61},[51,517,387],{"class":61},[51,519,391],{"class":390},[51,521,522],{"class":61},"{\n",[51,524,526,529,531,534,536,538,541,545,548,550,552,554,557,560,563,566,569,572,574,576,578,580,583,585,587],{"class":53,"line":525},26,[51,527,528],{"class":57},"            fmt",[51,530,62],{"class":61},[51,532,533],{"class":65},"Sprintf",[51,535,68],{"class":61},[51,537,397],{"class":61},[51,539,540],{"class":400},"2026-",[51,542,544],{"class":543},"swJcz","%02d",[51,546,547],{"class":400},"-",[51,549,544],{"class":543},[51,551,397],{"class":61},[51,553,74],{"class":61},[51,555,556],{"class":61}," (",[51,558,559],{"class":57},"i",[51,561,562],{"class":61},"%",[51,564,565],{"class":333},"6",[51,567,568],{"class":61},")+",[51,570,571],{"class":333},"1",[51,573,74],{"class":61},[51,575,556],{"class":61},[51,577,559],{"class":57},[51,579,562],{"class":61},[51,581,582],{"class":333},"28",[51,584,568],{"class":61},[51,586,571],{"class":333},[51,588,299],{"class":61},[51,590,592,594,596,598,600,602,605,608,610,612,615,618,620],{"class":53,"line":591},27,[51,593,528],{"class":57},[51,595,62],{"class":61},[51,597,533],{"class":65},[51,599,68],{"class":61},[51,601,397],{"class":61},[51,603,604],{"class":400},"INV-",[51,606,607],{"class":543},"%05d",[51,609,397],{"class":61},[51,611,74],{"class":61},[51,613,614],{"class":333}," 10000",[51,616,617],{"class":61},"+",[51,619,559],{"class":57},[51,621,299],{"class":61},[51,623,625,627,629,631,633,635,638,641,643,645,647],{"class":53,"line":624},28,[51,626,528],{"class":57},[51,628,62],{"class":61},[51,630,533],{"class":65},[51,632,68],{"class":61},[51,634,397],{"class":61},[51,636,637],{"class":400},"Customer #",[51,639,640],{"class":543},"%d",[51,642,397],{"class":61},[51,644,74],{"class":61},[51,646,491],{"class":57},[51,648,299],{"class":61},[51,650,652,654,656,658,660,662,665,667,670,672,674,677,679,681,684,687],{"class":53,"line":651},29,[51,653,528],{"class":57},[51,655,62],{"class":61},[51,657,533],{"class":65},[51,659,68],{"class":61},[51,661,397],{"class":61},[51,663,664],{"class":400},"$",[51,666,640],{"class":543},[51,668,669],{"class":400},".00",[51,671,397],{"class":61},[51,673,74],{"class":61},[51,675,676],{"class":333}," 100",[51,678,617],{"class":61},[51,680,559],{"class":57},[51,682,683],{"class":61},"*",[51,685,686],{"class":333},"7",[51,688,299],{"class":61},[51,690,692],{"class":53,"line":691},30,[51,693,694],{"class":61},"        })\n",[51,696,698],{"class":53,"line":697},31,[51,699,700],{"class":61},"    }\n",[51,702,704],{"class":53,"line":703},32,[51,705,143],{"emptyLinePlaceholder":142},[51,707,709,712,714,717,719,722],{"class":53,"line":708},33,[51,710,711],{"class":57},"    page ",[51,713,265],{"class":61},[51,715,716],{"class":57}," doc",[51,718,62],{"class":61},[51,720,721],{"class":65},"AddPage",[51,723,724],{"class":61},"()\n",[51,726,728,731,733,736,739,743,746,749,751,754,756],{"class":53,"line":727},34,[51,729,730],{"class":57},"    page",[51,732,62],{"class":61},[51,734,735],{"class":65},"AutoRow",[51,737,738],{"class":61},"(func(",[51,740,742],{"class":741},"sHdIc","r",[51,744,745],{"class":61}," *",[51,747,748],{"class":135},"template",[51,750,62],{"class":61},[51,752,753],{"class":135},"RowBuilder",[51,755,80],{"class":61},[51,757,256],{"class":61},[51,759,761,764,766,769,771,774,776,779,781,783,785,787,790,792],{"class":53,"line":760},35,[51,762,763],{"class":57},"        r",[51,765,62],{"class":61},[51,767,768],{"class":65},"Col",[51,770,68],{"class":61},[51,772,773],{"class":333},"12",[51,775,74],{"class":61},[51,777,778],{"class":61}," func(",[51,780,58],{"class":741},[51,782,745],{"class":61},[51,784,748],{"class":135},[51,786,62],{"class":61},[51,788,789],{"class":135},"ColBuilder",[51,791,80],{"class":61},[51,793,256],{"class":61},[51,795,797,800,802,805,807,809,812,814,816,819,821,824,826,829,832,834,836,839],{"class":53,"line":796},36,[51,798,799],{"class":57},"            c",[51,801,62],{"class":61},[51,803,804],{"class":65},"Text",[51,806,68],{"class":61},[51,808,397],{"class":61},[51,810,811],{"class":400},"2026 Invoice Ledger",[51,813,397],{"class":61},[51,815,74],{"class":61},[51,817,818],{"class":57}," template",[51,820,62],{"class":61},[51,822,823],{"class":65},"FontSize",[51,825,68],{"class":61},[51,827,828],{"class":333},"18",[51,830,831],{"class":61},"),",[51,833,818],{"class":57},[51,835,62],{"class":61},[51,837,838],{"class":65},"Bold",[51,840,841],{"class":61},"())\n",[51,843,845,847,849,852,854,856,858,860,862,865],{"class":53,"line":844},37,[51,846,799],{"class":57},[51,848,62],{"class":61},[51,850,851],{"class":65},"Spacer",[51,853,68],{"class":61},[51,855,314],{"class":57},[51,857,62],{"class":61},[51,859,328],{"class":65},[51,861,68],{"class":61},[51,863,864],{"class":333},"4",[51,866,867],{"class":61},"))\n",[51,869,871],{"class":53,"line":870},38,[51,872,143],{"emptyLinePlaceholder":142},[51,874,876,878,880,882,884,886,888,890],{"class":53,"line":875},39,[51,877,799],{"class":57},[51,879,62],{"class":61},[51,881,39],{"class":65},[51,883,68],{"class":61},[51,885,71],{"class":57},[51,887,74],{"class":61},[51,889,77],{"class":57},[51,891,892],{"class":61},",\n",[51,894,896,899,901,904,906,908,910,913,915,918,920,922],{"class":53,"line":895},40,[51,897,898],{"class":57},"                template",[51,900,62],{"class":61},[51,902,903],{"class":65},"ColumnWidths",[51,905,68],{"class":61},[51,907,334],{"class":333},[51,909,74],{"class":61},[51,911,912],{"class":333}," 20",[51,914,74],{"class":61},[51,916,917],{"class":333}," 40",[51,919,74],{"class":61},[51,921,912],{"class":333},[51,923,299],{"class":61},[51,925,927,929,931,934],{"class":53,"line":926},41,[51,928,898],{"class":57},[51,930,62],{"class":61},[51,932,933],{"class":65},"TableHeaderStyle",[51,935,276],{"class":61},[51,937,939,942,944,947,949,952,954,957],{"class":53,"line":938},42,[51,940,941],{"class":57},"                    template",[51,943,62],{"class":61},[51,945,946],{"class":65},"TextColor",[51,948,68],{"class":61},[51,950,951],{"class":57},"pdf",[51,953,62],{"class":61},[51,955,956],{"class":57},"White",[51,958,299],{"class":61},[51,960,962,964,966,969,971,974],{"class":53,"line":961},43,[51,963,941],{"class":57},[51,965,62],{"class":61},[51,967,968],{"class":65},"BgColor",[51,970,68],{"class":61},[51,972,973],{"class":57},"brand",[51,975,299],{"class":61},[51,977,979],{"class":53,"line":978},44,[51,980,981],{"class":61},"                ),\n",[51,983,985],{"class":53,"line":984},45,[51,986,987],{"class":61},"            )\n",[51,989,991],{"class":53,"line":990},46,[51,992,694],{"class":61},[51,994,996],{"class":53,"line":995},47,[51,997,998],{"class":61},"    })\n",[51,1000,1002],{"class":53,"line":1001},48,[51,1003,143],{"emptyLinePlaceholder":142},[51,1005,1007,1010,1012,1015,1017,1019,1021,1024],{"class":53,"line":1006},49,[51,1008,1009],{"class":57},"    data",[51,1011,74],{"class":61},[51,1013,1014],{"class":57}," err ",[51,1016,265],{"class":61},[51,1018,716],{"class":57},[51,1020,62],{"class":61},[51,1022,1023],{"class":65},"Generate",[51,1025,724],{"class":61},[51,1027,1029,1032,1034,1037,1040],{"class":53,"line":1028},50,[51,1030,1031],{"class":149},"    if",[51,1033,1014],{"class":57},[51,1035,1036],{"class":61},"!=",[51,1038,1039],{"class":61}," nil",[51,1041,256],{"class":61},[51,1043,1045,1048,1050,1053,1055,1058],{"class":53,"line":1044},51,[51,1046,1047],{"class":57},"        log",[51,1049,62],{"class":61},[51,1051,1052],{"class":65},"Fatal",[51,1054,68],{"class":61},[51,1056,1057],{"class":57},"err",[51,1059,236],{"class":61},[51,1061,1063],{"class":53,"line":1062},52,[51,1064,700],{"class":61},[51,1066,1068,1070,1072,1074,1077,1079,1082,1084,1086,1088,1090,1092,1095,1097,1100,1103,1105,1107,1109],{"class":53,"line":1067},53,[51,1069,1031],{"class":149},[51,1071,1014],{"class":57},[51,1073,265],{"class":61},[51,1075,1076],{"class":57}," os",[51,1078,62],{"class":61},[51,1080,1081],{"class":65},"WriteFile",[51,1083,68],{"class":61},[51,1085,397],{"class":61},[51,1087,121],{"class":400},[51,1089,397],{"class":61},[51,1091,74],{"class":61},[51,1093,1094],{"class":57}," data",[51,1096,74],{"class":61},[51,1098,1099],{"class":333}," 0o644",[51,1101,1102],{"class":61},");",[51,1104,1014],{"class":57},[51,1106,1036],{"class":61},[51,1108,1039],{"class":61},[51,1110,256],{"class":61},[51,1112,1114,1116,1118,1120,1122,1124],{"class":53,"line":1113},54,[51,1115,1047],{"class":57},[51,1117,62],{"class":61},[51,1119,1052],{"class":65},[51,1121,68],{"class":61},[51,1123,1057],{"class":57},[51,1125,236],{"class":61},[51,1127,1129],{"class":53,"line":1128},55,[51,1130,700],{"class":61},[51,1132,1134],{"class":53,"line":1133},56,[51,1135,434],{"class":61},[19,1137,1138,1139,1142],{},"200행을 A4에 흘리면 약 8페이지가 된다. 그 모든 페이지 맨 위에 짙은 파란색 헤더가 앉아 있고, 본문은 이전 페이지가 멈춘 자리에서 정확히 이어진다. 이 코드에서 '여러 페이지'를 암시하는 건 루프 상한의 ",[37,1140,1141],{},"200","뿐이다.",[14,1144,1146],{"id":1145},"작동-원리","작동 원리",[19,1148,1149,1150,1154,1155,118,1161,1166,1167,1170],{},"신뢰하기 위해 알아둘 가치가 있다. 레이아웃 엔진은 테이블을 배치할 때 본문 행을 순서대로 측정하면서, 다음 행이 가용 높이를 초과하기 직전까지 현재 페이지에 더한다. 안 들어간 행은 ",[1151,1152,1153],"em",{},"오버플로 테이블","이 된다 — ",[92,1156,1157,1158],{},"같은 ",[37,1159,1160],{},"Header",[92,1162,1157,1163],{},[37,1164,1165],{},"Footer",", 남은 본문 행을 가진 새 ",[37,1168,1169],{},"*document.Table","이다. gpdf는 배치된 부분을 페이지에 흘려보내고, 다음 페이지를 열고, 새 페이지의 높이로 오버플로 테이블을 다시 레이아웃 엔진에 넘긴다. 남은 게 없을 때까지 반복한다.",[19,1172,1173],{},"여기서 두 가지가 따라 나온다:",[1175,1176,1177,1188],"ul",{},[1178,1179,1180,1187],"li",{},[92,1181,1182,1183,1186],{},"헤더가 반복되는 건 그것이 당신의 루프가 아니라 ",[37,1184,1185],{},"tbl.Header","에 있기 때문이다."," 오버플로 테이블은 같은 슬라이스를 재사용하므로 매 페이지에서 동일하게 다시 렌더링된다. 공짜로 얻는다.",[1178,1189,1190,1193,1194,1197],{},[92,1191,1192],{},"'헤더가 안 들어감' 같은 경계 사례가 없다."," 엔진은 본문이 몇 행 들어가는지 측정하기 ",[1151,1195,1196],{},"전에"," 헤더 분량의 높이를 확보한다. 헤더 + 최소 한 행의 본문이 페이지에 안 들어가면, 어색하게 쪼개지 않고 테이블 전체를 다음 페이지로 보낸다.",[14,1199,1201],{"id":1200},"푸터도-반복된다","푸터도 반복된다",[19,1203,1204,1205,1208],{},"합계 행(또는 '페이지 소계')을 페이지 하단에도 내고 싶으면 그건 ",[37,1206,1207],{},"document.Table.Footer"," — builder 경유가 아니라 document 레이어에서 테이블을 구성할 때 쓸 수 있다:",[42,1210,1212],{"className":44,"code":1211,"language":46,"meta":47,"style":47},"import \"github.com/gpdf-dev/gpdf/document\"\n\ntbl := &document.Table{\n    Columns: []document.TableColumn{\n        {Width: document.Pct(20)}, {Width: document.Pct(20)},\n        {Width: document.Auto},    {Width: document.Pct(20)},\n    },\n    Header: headerRows, // []document.TableRow\n    Body:   bodyRows,\n    Footer: []document.TableRow{footerRow},\n}\n",[37,1213,1214,1224,1228,1246,1265,1310,1347,1352,1367,1379,1403],{"__ignoreMap":47},[51,1215,1216,1218,1220,1222],{"class":53,"line":54},[51,1217,150],{"class":149},[51,1219,408],{"class":61},[51,1221,208],{"class":135},[51,1223,165],{"class":61},[51,1225,1226],{"class":53,"line":139},[51,1227,143],{"emptyLinePlaceholder":142},[51,1229,1230,1233,1235,1238,1240,1242,1244],{"class":53,"line":146},[51,1231,1232],{"class":57},"tbl ",[51,1234,265],{"class":61},[51,1236,1237],{"class":61}," &",[51,1239,314],{"class":135},[51,1241,62],{"class":61},[51,1243,39],{"class":135},[51,1245,522],{"class":61},[51,1247,1248,1251,1254,1256,1258,1260,1263],{"class":53,"line":156},[51,1249,1250],{"class":57},"    Columns",[51,1252,1253],{"class":61},":",[51,1255,387],{"class":61},[51,1257,314],{"class":135},[51,1259,62],{"class":61},[51,1261,1262],{"class":135},"TableColumn",[51,1264,522],{"class":61},[51,1266,1267,1270,1273,1275,1278,1280,1283,1285,1287,1290,1293,1295,1297,1299,1301,1303,1305,1307],{"class":53,"line":168},[51,1268,1269],{"class":61},"        {",[51,1271,1272],{"class":57},"Width",[51,1274,1253],{"class":61},[51,1276,1277],{"class":57}," document",[51,1279,62],{"class":61},[51,1281,1282],{"class":65},"Pct",[51,1284,68],{"class":61},[51,1286,334],{"class":333},[51,1288,1289],{"class":61},")},",[51,1291,1292],{"class":61}," {",[51,1294,1272],{"class":57},[51,1296,1253],{"class":61},[51,1298,1277],{"class":57},[51,1300,62],{"class":61},[51,1302,1282],{"class":65},[51,1304,68],{"class":61},[51,1306,334],{"class":333},[51,1308,1309],{"class":61},")},\n",[51,1311,1312,1314,1316,1318,1320,1322,1325,1328,1331,1333,1335,1337,1339,1341,1343,1345],{"class":53,"line":178},[51,1313,1269],{"class":61},[51,1315,1272],{"class":57},[51,1317,1253],{"class":61},[51,1319,1277],{"class":57},[51,1321,62],{"class":61},[51,1323,1324],{"class":57},"Auto",[51,1326,1327],{"class":61},"},",[51,1329,1330],{"class":61},"    {",[51,1332,1272],{"class":57},[51,1334,1253],{"class":61},[51,1336,1277],{"class":57},[51,1338,62],{"class":61},[51,1340,1282],{"class":65},[51,1342,68],{"class":61},[51,1344,334],{"class":333},[51,1346,1309],{"class":61},[51,1348,1349],{"class":53,"line":188},[51,1350,1351],{"class":61},"    },\n",[51,1353,1354,1357,1359,1362,1364],{"class":53,"line":193},[51,1355,1356],{"class":57},"    Header",[51,1358,1253],{"class":61},[51,1360,1361],{"class":57}," headerRows",[51,1363,74],{"class":61},[51,1365,1366],{"class":83}," // []document.TableRow\n",[51,1368,1369,1372,1374,1377],{"class":53,"line":203},[51,1370,1371],{"class":57},"    Body",[51,1373,1253],{"class":61},[51,1375,1376],{"class":57},"   bodyRows",[51,1378,892],{"class":61},[51,1380,1381,1384,1386,1388,1390,1392,1395,1397,1400],{"class":53,"line":213},[51,1382,1383],{"class":57},"    Footer",[51,1385,1253],{"class":61},[51,1387,387],{"class":61},[51,1389,314],{"class":135},[51,1391,62],{"class":61},[51,1393,1394],{"class":135},"TableRow",[51,1396,394],{"class":61},[51,1398,1399],{"class":57},"footerRow",[51,1401,1402],{"class":61},"},\n",[51,1404,1405],{"class":53,"line":223},[51,1406,434],{"class":61},[19,1408,1409,1411,1412,1415,1416,1420],{},[37,1410,1165],{}," 슬라이스는 이어지는 페이지마다 반복되며, 메커니즘은 헤더와 같다. builder의 ",[37,1413,1414],{},"c.Table(...)","이 푸터를 노출하지 않는 건 짧은 테이블 대부분에 필요 없기 때문이다 — 필요해진 순간 당신은 이미 '일반적인 경우' 구역 밖이다. ",[23,1417,1419],{"href":1418},"/ko/blog/tables-in-go-pdfs","테이블 심층 설명","이 document 레이어를 짚어준다.",[14,1422,1424],{"id":1423},"테이블을-새-페이지에서-시작하기","테이블을 새 페이지에서 시작하기",[19,1426,1427],{},"테이블 단위의 '새 페이지에서 시작' 옵션은 없다. 페이지 레벨에서 한다 — 테이블을 담은 행 앞에 페이지를 추가한다:",[42,1429,1431],{"className":44,"code":1430,"language":46,"meta":47,"style":47},"doc.AddPage() // 아래 테이블은 이 페이지 맨 위에서 시작한다\npage2 := doc.AddPage()\npage2.AutoRow(func(r *template.RowBuilder) {\n    r.Col(12, func(c *template.ColBuilder) {\n        c.Table(header, rows /* , opts... */)\n    })\n})\n",[37,1432,1433,1447,1462,1487,1518,1541,1545],{"__ignoreMap":47},[51,1434,1435,1438,1440,1442,1444],{"class":53,"line":54},[51,1436,1437],{"class":57},"doc",[51,1439,62],{"class":61},[51,1441,721],{"class":65},[51,1443,253],{"class":61},[51,1445,1446],{"class":83}," // 아래 테이블은 이 페이지 맨 위에서 시작한다\n",[51,1448,1449,1452,1454,1456,1458,1460],{"class":53,"line":139},[51,1450,1451],{"class":57},"page2 ",[51,1453,265],{"class":61},[51,1455,716],{"class":57},[51,1457,62],{"class":61},[51,1459,721],{"class":65},[51,1461,724],{"class":61},[51,1463,1464,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485],{"class":53,"line":146},[51,1465,1466],{"class":57},"page2",[51,1468,62],{"class":61},[51,1470,735],{"class":65},[51,1472,738],{"class":61},[51,1474,742],{"class":741},[51,1476,745],{"class":61},[51,1478,748],{"class":135},[51,1480,62],{"class":61},[51,1482,753],{"class":135},[51,1484,80],{"class":61},[51,1486,256],{"class":61},[51,1488,1489,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512,1514,1516],{"class":53,"line":156},[51,1490,1491],{"class":57},"    r",[51,1493,62],{"class":61},[51,1495,768],{"class":65},[51,1497,68],{"class":61},[51,1499,773],{"class":333},[51,1501,74],{"class":61},[51,1503,778],{"class":61},[51,1505,58],{"class":741},[51,1507,745],{"class":61},[51,1509,748],{"class":135},[51,1511,62],{"class":61},[51,1513,789],{"class":135},[51,1515,80],{"class":61},[51,1517,256],{"class":61},[51,1519,1520,1523,1525,1527,1529,1531,1533,1536,1539],{"class":53,"line":168},[51,1521,1522],{"class":57},"        c",[51,1524,62],{"class":61},[51,1526,39],{"class":65},[51,1528,68],{"class":61},[51,1530,71],{"class":57},[51,1532,74],{"class":61},[51,1534,1535],{"class":57}," rows ",[51,1537,1538],{"class":83},"/* , opts... */",[51,1540,236],{"class":61},[51,1542,1543],{"class":53,"line":178},[51,1544,998],{"class":61},[51,1546,1547],{"class":53,"line":188},[51,1548,1549],{"class":61},"})\n",[19,1551,1552,1553,1556,1557,1560],{},"테이블에 필요한 '페이지 나누기' 제어는 이 하나뿐이다. 테이블 ",[1151,1554,1555],{},"내부","의 분할은 알아서 처리되고, ",[1151,1558,1559],{},"외부","의 분할은 그냥 '이 블록이 어디서 시작하는가'일 뿐이기 때문이다.",[14,1562,1564],{"id":1563},"안-되는-것","안 되는 것",[1175,1566,1567,1573,1594],{},[1178,1568,1569,1572],{},[92,1570,1571],{},"'이 행들은 같이 둬라'."," 모든 본문 행은 분할 대상이다. '4–7행 그룹은 한 페이지에 유지하라' 같은 주석은 없다. 알려진 빈틈이다. 청구 명세 한 줄과 그 하위 행이 절대 페이지를 가로질러 찢기면 안 된다면, 우회책은 그 그룹 앞에서 새 페이지를 시작하거나 document 레이어에서 테이블을 구성해 자체 분할 힌트를 넣는 것이다.",[1178,1574,1575,1578,1579,1581,1582,1585,1586,1589,1590,1593],{},[92,1576,1577],{},"마지막 페이지에만 있는 푸터."," ",[37,1580,1207],{},"는 설계상 ",[1151,1583,1584],{},"모든"," 페이지에서 반복된다(페이지별 열 합계가 일반적인 경우다). 문서 끝에 한 번만 나오는 총계가 필요하면, 테이블 ",[1151,1587,1588],{},"안","이 아니라 ",[1151,1591,1592],{},"뒤","에 별도 블록으로 추가한다.",[1178,1595,1596,1599,1600,1603],{},[92,1597,1598],{},"테이블 안의 페이지 번호."," '3 / 8 페이지'는 테이블이 아니라 문서 푸터에 속한다. 그게 어디 놓이는지는 ",[23,1601,1602],{"href":1418},"페이지 번호, 헤더, 푸터","를 참고.",[14,1605,1607],{"id":1606},"_10분-날리는-실수","10분 날리는 실수",[1175,1609,1610,1619,1633,1642],{},[1178,1611,1612,1618],{},[92,1613,1614,1617],{},[37,1615,1616],{},"PageBreak"," 옵션을 찾는 것."," 없고, 원하지도 않을 것이다 — 그걸 수동으로 호출하는 시점에 이미 졌다. 모든 행을 넘기면 된다.",[1178,1620,1621,1624,1625,1628,1629,1632],{},[92,1622,1623],{},"데이터를 직접 페이지 단위로 자르는 것."," 1페이지에 ",[37,1626,1627],{},"rows[0:40]",", 2페이지에 ",[37,1630,1631],{},"rows[40:80]","… 하지 마라. 어딘가에서 행 계산을 틀리고, 마지막 페이지가 짧아지고, 헤더 스타일이 어긋난다. 슬라이스 전체를 gpdf에 넘겨라.",[1178,1634,1635,1638,1639,1641],{},[92,1636,1637],{},"헤더가 1페이지에만 있을 거라고 생각하는 것."," 그런 라이브러리도 있다. gpdf는 ",[1151,1640,1584],{}," 페이지에서 반복하며, 이건 인쇄해서 넘겨 보는 리포트에 필요한 동작이다.",[1178,1643,1644,1647],{},[92,1645,1646],{},"150페이지 테이블에 6 MB CJK 폰트."," 폰트는 실제 사용된 글리프로 서브셋되므로 괜찮다 — 출력은 작게 유지된다. 다만 어떤 이유로 서브셋을 꺼뒀다면, 긴 테이블이 바로 그게 무는 곳이다. 서브셋은 켜둔 채(기본값)로 둬라.",[14,1649,1651],{"id":1650},"관련-레시피","관련 레시피",[1175,1653,1654,1664,1673,1680],{},[1178,1655,1656,1659,1660,1663],{},[23,1657,1658],{"href":1418},"Go PDF의 테이블: 열 너비, 줄무늬, 페이지 분할"," — ",[37,1661,1662],{},"document.Table","과 푸터를 포함한 장문.",[1178,1665,1666,1659,1670,1672],{},[23,1667,1669],{"href":1668},"/ko/blog/table-column-widths","테이블 열 너비를 지정하려면?",[37,1671,903],{},"의 경계 사례.",[1178,1674,1675,1679],{},[23,1676,1678],{"href":1677},"/ko/blog/zebra-striped-table-rows","테이블에 줄무늬(제브라) 행을 넣으려면?"," — 줄무늬가 페이지를 넘어도 맞춰지는 이유.",[1178,1681,1682,1686],{},[23,1683,1685],{"href":1684},"/ko/blog/invoice-pdf-go-under-50-lines","Go로 50줄 이내에 청구서 PDF 만들기"," — 페이지가 나뉘는 테이블이 있는 실제 문서.",[14,1688,1690],{"id":1689},"gpdf-써보기","gpdf 써보기",[19,1692,1693],{},"gpdf는 Go의 PDF 생성 라이브러리다. MIT 라이선스, 외부 의존성 제로, CJK 기본 지원.",[42,1695,1699],{"className":1696,"code":1697,"language":1698,"meta":47,"style":47},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[37,1700,1701],{"__ignoreMap":47},[51,1702,1703,1705,1708],{"class":53,"line":54},[51,1704,46],{"class":135},[51,1706,1707],{"class":400}," get",[51,1709,1710],{"class":400}," github.com/gpdf-dev/gpdf\n",[19,1712,1713,1717,1718],{},[23,1714,1716],{"href":25,"rel":1715},[27],"⭐ Star on GitHub"," · ",[23,1719,1722],{"href":1720,"rel":1721},"https://gpdf.dev/docs/quickstart",[27],"Read the docs",[1724,1725,1726],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":47,"searchDepth":139,"depth":139,"links":1728},[1729,1730,1731,1732,1733,1734,1735,1736,1737,1738],{"id":16,"depth":139,"text":17},{"id":32,"depth":139,"text":32},{"id":106,"depth":139,"text":107},{"id":1145,"depth":139,"text":1146},{"id":1200,"depth":139,"text":1201},{"id":1423,"depth":139,"text":1424},{"id":1563,"depth":139,"text":1564},{"id":1606,"depth":139,"text":1607},{"id":1650,"depth":139,"text":1651},{"id":1689,"depth":139,"text":1690},"2026-05-12","아무것도 하지 않아도 된다. 한 페이지에 안 들어가는 행 수의 테이블을 넘기면 gpdf가 본문을 자동으로 페이지 분할하고 각 페이지 맨 위에 헤더를 반복한다.",false,"md",{"name":1744,"totalTime":1745,"tools":1746,"steps":1748},"gpdf에서 헤더가 반복되는 여러 페이지 테이블 출력하기","PT10M",[1747,198],"Go 1.22+",[1749,1752,1755,1758,1761],{"name":1750,"text":1751},"Col 안에서 Table을 한 번 호출","page.AutoRow → r.Col(12, ...) 안에서 c.Table(header, rows)를 호출한다. header는 []string, rows는 [][]string. 루프도, 행 수 카운트도, 페이지 분할 메서드도 쓰지 않는다.",{"name":1753,"text":1754},"한 페이지에 안 들어가는 행 수를 넘긴다","데이터의 전체 행을 그대로 append한다. 본문이 현재 페이지를 넘치면 gpdf의 레이아웃 엔진이 남은 행을 가진 오버플로 테이블을 만들어 다음 페이지에 이어 그린다.",{"name":1756,"text":1757},"헤더는 gpdf가 반복한다","Header 슬라이스는 이어지는 페이지 맨 위에 자동으로 다시 렌더링된다 — 스타일도 열 너비도 동일하다. 이를 켜는 옵션은 없다. 기본 동작이다.",{"name":1759,"text":1760},"페이지별 소계는 document.Table.Footer를 쓴다","페이지 하단에도 반복되는 푸터 행(열 합계, 페이지 표기)이 필요하면 document 레이어에서 &document.Table{Header, Body, Footer}로 구성한다.",{"name":1762,"text":1763},"새 페이지에서 시작하려면 먼저 doc.AddPage()를 호출","직전 콘텐츠에 이어서가 아니라 새 페이지 맨 위에서 테이블을 시작하려면 먼저 페이지를 추가한다. 테이블 단위의 '새 페이지에서 시작' 옵션은 없다.",null,{},"/ko/blog/multi-page-table",{"title":5,"description":1740},"ko/blog/024.multi-page-table",[1770,1771,1772],"recipe","tutorial","templates","RncHmimQeJ4oNbHdrIVdwMc3T6Q9lUBiYGoXx0lERQE",1779199026593]