[{"data":1,"prerenderedAt":1796},["ShallowReactive",2],{"blog-ja-multi-page-table":3},{"id":4,"title":5,"author":6,"body":10,"date":1761,"description":1762,"draft":1763,"extension":1764,"howTo":1765,"image":1786,"meta":1787,"navigation":140,"path":1788,"seo":1789,"stem":1790,"tags":1791,"updated":1786,"__hash__":1795},"blogJa/ja/blog/024.multi-page-table.md","テーブルを複数ページにまたがって出力するには?",{"name":7,"url":8,"avatar":9},"野田大貴","https://nadai.dev/ja/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":1749},"minimark",[13,17,29,32,40,84,103,106,121,1138,1145,1170,1173,1197,1200,1224,1227,1234,1432,1446,1449,1452,1574,1585,1588,1627,1631,1671,1674,1709,1713,1716,1733,1745],[14,15,16],"h2",{"id":16},"質問を言い換えると",[18,19,20,21,28],"p",{},"請求明細、取引ログ、300 行のエクスポート — どう見ても A4 一枚には収まらないテーブルがある。Go の PDF ライブラリで、これを 2 ページ目・3 ページ目に流し、各ページの先頭にヘッダーを再表示させるには何をすればいい? ",[22,23,27],"a",{"href":24,"rel":25},"https://github.com/gpdf-dev/gpdf",[26],"nofollow","gpdf"," なら答えは短い。",[14,30,31],{"id":31},"結論",[18,33,34,35,39],{},"何もしなくていい。",[36,37,38],"code",{},"Table"," を 1 回呼んで全行を渡せば、gpdf が改ページする:",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","c.Table(header, rows) // rows が 300 行 — gpdf がページに分割する\n","go","",[36,48,49],{"__ignoreMap":46},[50,51,54,58,62,65,68,71,74,77,80],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"sTEyZ","c",[50,59,61],{"class":60},"sMK4o",".",[50,63,38],{"class":64},"s2Zo4",[50,66,67],{"class":60},"(",[50,69,70],{"class":56},"header",[50,72,73],{"class":60},",",[50,75,76],{"class":56}," rows",[50,78,79],{"class":60},")",[50,81,83],{"class":82},"sHwdD"," // rows が 300 行 — gpdf がページに分割する\n",[18,85,86,87,89,90,94,95,98,99,102],{},"ボディは 1 行ずつ必要なページ数に分割される。",[36,88,70],{}," スライスは",[91,92,93],"strong",{},"継続ページの先頭に自動で再描画","される — 列幅もスタイルも同じ。",[36,96,97],{},"PageBreak()"," メソッドも ",[36,100,101],{},"MaxRowsPerPage"," オプションも行数カウントのループも無い。オーバーフロー処理はレイアウトエンジンの仕事であって、あなたの仕事ではない。",[14,104,105],{"id":105},"動くコード",[18,107,108,109,112,113,116,117,120],{},"複数ページのテーブルを出力する完全なプログラム。",[36,110,111],{},"main.go"," として保存し ",[36,114,115],{},"go run .","、",[36,118,119],{},"report.pdf"," が出る。",[41,122,124],{"className":43,"code":123,"language":45,"meta":46,"style":46},"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{\"日付\", \"請求書番号\", \"顧客名\", \"金額\"}\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(\"顧客 #%d\", i),\n            fmt.Sprintf(\"￥%d\", (100+i*7)*100),\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 年 請求台帳\", 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",[36,125,126,135,142,152,164,174,184,189,199,209,219,229,235,240,255,275,298,336,342,347,370,375,433,461,495,521,587,620,647,691,697,703,708,727,760,796,844,870,875,895,926,938,961,978,984,990,995,1001,1006,1028,1044,1062,1067,1113,1128,1133],{"__ignoreMap":46},[50,127,128,131],{"class":52,"line":53},[50,129,130],{"class":60},"package",[50,132,134],{"class":133},"sBMFI"," main\n",[50,136,138],{"class":52,"line":137},2,[50,139,141],{"emptyLinePlaceholder":140},true,"\n",[50,143,145,149],{"class":52,"line":144},3,[50,146,148],{"class":147},"s7zQu","import",[50,150,151],{"class":60}," (\n",[50,153,155,158,161],{"class":52,"line":154},4,[50,156,157],{"class":60},"    \"",[50,159,160],{"class":133},"fmt",[50,162,163],{"class":60},"\"\n",[50,165,167,169,172],{"class":52,"line":166},5,[50,168,157],{"class":60},[50,170,171],{"class":133},"log",[50,173,163],{"class":60},[50,175,177,179,182],{"class":52,"line":176},6,[50,178,157],{"class":60},[50,180,181],{"class":133},"os",[50,183,163],{"class":60},[50,185,187],{"class":52,"line":186},7,[50,188,141],{"emptyLinePlaceholder":140},[50,190,192,194,197],{"class":52,"line":191},8,[50,193,157],{"class":60},[50,195,196],{"class":133},"github.com/gpdf-dev/gpdf",[50,198,163],{"class":60},[50,200,202,204,207],{"class":52,"line":201},9,[50,203,157],{"class":60},[50,205,206],{"class":133},"github.com/gpdf-dev/gpdf/document",[50,208,163],{"class":60},[50,210,212,214,217],{"class":52,"line":211},10,[50,213,157],{"class":60},[50,215,216],{"class":133},"github.com/gpdf-dev/gpdf/pdf",[50,218,163],{"class":60},[50,220,222,224,227],{"class":52,"line":221},11,[50,223,157],{"class":60},[50,225,226],{"class":133},"github.com/gpdf-dev/gpdf/template",[50,228,163],{"class":60},[50,230,232],{"class":52,"line":231},12,[50,233,234],{"class":60},")\n",[50,236,238],{"class":52,"line":237},13,[50,239,141],{"emptyLinePlaceholder":140},[50,241,243,246,249,252],{"class":52,"line":242},14,[50,244,245],{"class":60},"func",[50,247,248],{"class":64}," main",[50,250,251],{"class":60},"()",[50,253,254],{"class":60}," {\n",[50,256,258,261,264,267,269,272],{"class":52,"line":257},15,[50,259,260],{"class":56},"    doc ",[50,262,263],{"class":60},":=",[50,265,266],{"class":56}," gpdf",[50,268,61],{"class":60},[50,270,271],{"class":64},"NewDocument",[50,273,274],{"class":60},"(\n",[50,276,278,281,283,286,288,290,292,295],{"class":52,"line":277},16,[50,279,280],{"class":56},"        gpdf",[50,282,61],{"class":60},[50,284,285],{"class":64},"WithPageSize",[50,287,67],{"class":60},[50,289,27],{"class":56},[50,291,61],{"class":60},[50,293,294],{"class":56},"A4",[50,296,297],{"class":60},"),\n",[50,299,301,303,305,308,310,313,315,318,320,322,324,327,329,333],{"class":52,"line":300},17,[50,302,280],{"class":56},[50,304,61],{"class":60},[50,306,307],{"class":64},"WithMargins",[50,309,67],{"class":60},[50,311,312],{"class":56},"document",[50,314,61],{"class":60},[50,316,317],{"class":64},"UniformEdges",[50,319,67],{"class":60},[50,321,312],{"class":56},[50,323,61],{"class":60},[50,325,326],{"class":64},"Mm",[50,328,67],{"class":60},[50,330,332],{"class":331},"sbssI","20",[50,334,335],{"class":60},"))),\n",[50,337,339],{"class":52,"line":338},18,[50,340,341],{"class":60},"    )\n",[50,343,345],{"class":52,"line":344},19,[50,346,141],{"emptyLinePlaceholder":140},[50,348,350,353,355,358,360,363,365,368],{"class":52,"line":349},20,[50,351,352],{"class":56},"    brand ",[50,354,263],{"class":60},[50,356,357],{"class":56}," pdf",[50,359,61],{"class":60},[50,361,362],{"class":64},"RGBHex",[50,364,67],{"class":60},[50,366,367],{"class":331},"0x1A237E",[50,369,234],{"class":60},[50,371,373],{"class":52,"line":372},21,[50,374,141],{"emptyLinePlaceholder":140},[50,376,378,381,383,386,390,393,396,400,402,404,407,410,412,414,416,419,421,423,425,428,430],{"class":52,"line":377},22,[50,379,380],{"class":56},"    header ",[50,382,263],{"class":60},[50,384,385],{"class":60}," []",[50,387,389],{"class":388},"spNyl","string",[50,391,392],{"class":60},"{",[50,394,395],{"class":60},"\"",[50,397,399],{"class":398},"sfazB","日付",[50,401,395],{"class":60},[50,403,73],{"class":60},[50,405,406],{"class":60}," \"",[50,408,409],{"class":398},"請求書番号",[50,411,395],{"class":60},[50,413,73],{"class":60},[50,415,406],{"class":60},[50,417,418],{"class":398},"顧客名",[50,420,395],{"class":60},[50,422,73],{"class":60},[50,424,406],{"class":60},[50,426,427],{"class":398},"金額",[50,429,395],{"class":60},[50,431,432],{"class":60},"}\n",[50,434,436,439,441,444,447,449,451,454,456,459],{"class":52,"line":435},23,[50,437,438],{"class":56},"    rows ",[50,440,263],{"class":60},[50,442,443],{"class":64}," make",[50,445,446],{"class":60},"([][]",[50,448,389],{"class":388},[50,450,73],{"class":60},[50,452,453],{"class":331}," 0",[50,455,73],{"class":60},[50,457,458],{"class":331}," 200",[50,460,234],{"class":60},[50,462,464,467,470,472,475,478,480,483,485,487,490,493],{"class":52,"line":463},24,[50,465,466],{"class":147},"    for",[50,468,469],{"class":56}," i ",[50,471,263],{"class":60},[50,473,474],{"class":331}," 1",[50,476,477],{"class":60},";",[50,479,469],{"class":56},[50,481,482],{"class":60},"\u003C=",[50,484,458],{"class":331},[50,486,477],{"class":60},[50,488,489],{"class":56}," i",[50,491,492],{"class":60},"++",[50,494,254],{"class":60},[50,496,498,501,504,507,509,512,514,516,518],{"class":52,"line":497},25,[50,499,500],{"class":56},"        rows ",[50,502,503],{"class":60},"=",[50,505,506],{"class":64}," append",[50,508,67],{"class":60},[50,510,511],{"class":56},"rows",[50,513,73],{"class":60},[50,515,385],{"class":60},[50,517,389],{"class":388},[50,519,520],{"class":60},"{\n",[50,522,524,527,529,532,534,536,539,543,546,548,550,552,555,558,561,564,567,570,572,574,576,578,581,583,585],{"class":52,"line":523},26,[50,525,526],{"class":56},"            fmt",[50,528,61],{"class":60},[50,530,531],{"class":64},"Sprintf",[50,533,67],{"class":60},[50,535,395],{"class":60},[50,537,538],{"class":398},"2026-",[50,540,542],{"class":541},"swJcz","%02d",[50,544,545],{"class":398},"-",[50,547,542],{"class":541},[50,549,395],{"class":60},[50,551,73],{"class":60},[50,553,554],{"class":60}," (",[50,556,557],{"class":56},"i",[50,559,560],{"class":60},"%",[50,562,563],{"class":331},"6",[50,565,566],{"class":60},")+",[50,568,569],{"class":331},"1",[50,571,73],{"class":60},[50,573,554],{"class":60},[50,575,557],{"class":56},[50,577,560],{"class":60},[50,579,580],{"class":331},"28",[50,582,566],{"class":60},[50,584,569],{"class":331},[50,586,297],{"class":60},[50,588,590,592,594,596,598,600,603,606,608,610,613,616,618],{"class":52,"line":589},27,[50,591,526],{"class":56},[50,593,61],{"class":60},[50,595,531],{"class":64},[50,597,67],{"class":60},[50,599,395],{"class":60},[50,601,602],{"class":398},"INV-",[50,604,605],{"class":541},"%05d",[50,607,395],{"class":60},[50,609,73],{"class":60},[50,611,612],{"class":331}," 10000",[50,614,615],{"class":60},"+",[50,617,557],{"class":56},[50,619,297],{"class":60},[50,621,623,625,627,629,631,633,636,639,641,643,645],{"class":52,"line":622},28,[50,624,526],{"class":56},[50,626,61],{"class":60},[50,628,531],{"class":64},[50,630,67],{"class":60},[50,632,395],{"class":60},[50,634,635],{"class":398},"顧客 #",[50,637,638],{"class":541},"%d",[50,640,395],{"class":60},[50,642,73],{"class":60},[50,644,489],{"class":56},[50,646,297],{"class":60},[50,648,650,652,654,656,658,660,663,665,667,669,671,674,676,678,681,684,687,689],{"class":52,"line":649},29,[50,651,526],{"class":56},[50,653,61],{"class":60},[50,655,531],{"class":64},[50,657,67],{"class":60},[50,659,395],{"class":60},[50,661,662],{"class":398},"￥",[50,664,638],{"class":541},[50,666,395],{"class":60},[50,668,73],{"class":60},[50,670,554],{"class":60},[50,672,673],{"class":331},"100",[50,675,615],{"class":60},[50,677,557],{"class":56},[50,679,680],{"class":60},"*",[50,682,683],{"class":331},"7",[50,685,686],{"class":60},")*",[50,688,673],{"class":331},[50,690,297],{"class":60},[50,692,694],{"class":52,"line":693},30,[50,695,696],{"class":60},"        })\n",[50,698,700],{"class":52,"line":699},31,[50,701,702],{"class":60},"    }\n",[50,704,706],{"class":52,"line":705},32,[50,707,141],{"emptyLinePlaceholder":140},[50,709,711,714,716,719,721,724],{"class":52,"line":710},33,[50,712,713],{"class":56},"    page ",[50,715,263],{"class":60},[50,717,718],{"class":56}," doc",[50,720,61],{"class":60},[50,722,723],{"class":64},"AddPage",[50,725,726],{"class":60},"()\n",[50,728,730,733,735,738,741,745,748,751,753,756,758],{"class":52,"line":729},34,[50,731,732],{"class":56},"    page",[50,734,61],{"class":60},[50,736,737],{"class":64},"AutoRow",[50,739,740],{"class":60},"(func(",[50,742,744],{"class":743},"sHdIc","r",[50,746,747],{"class":60}," *",[50,749,750],{"class":133},"template",[50,752,61],{"class":60},[50,754,755],{"class":133},"RowBuilder",[50,757,79],{"class":60},[50,759,254],{"class":60},[50,761,763,766,768,771,773,776,778,781,783,785,787,789,792,794],{"class":52,"line":762},35,[50,764,765],{"class":56},"        r",[50,767,61],{"class":60},[50,769,770],{"class":64},"Col",[50,772,67],{"class":60},[50,774,775],{"class":331},"12",[50,777,73],{"class":60},[50,779,780],{"class":60}," func(",[50,782,57],{"class":743},[50,784,747],{"class":60},[50,786,750],{"class":133},[50,788,61],{"class":60},[50,790,791],{"class":133},"ColBuilder",[50,793,79],{"class":60},[50,795,254],{"class":60},[50,797,799,802,804,807,809,811,814,816,818,821,823,826,828,831,834,836,838,841],{"class":52,"line":798},36,[50,800,801],{"class":56},"            c",[50,803,61],{"class":60},[50,805,806],{"class":64},"Text",[50,808,67],{"class":60},[50,810,395],{"class":60},[50,812,813],{"class":398},"2026 年 請求台帳",[50,815,395],{"class":60},[50,817,73],{"class":60},[50,819,820],{"class":56}," template",[50,822,61],{"class":60},[50,824,825],{"class":64},"FontSize",[50,827,67],{"class":60},[50,829,830],{"class":331},"18",[50,832,833],{"class":60},"),",[50,835,820],{"class":56},[50,837,61],{"class":60},[50,839,840],{"class":64},"Bold",[50,842,843],{"class":60},"())\n",[50,845,847,849,851,854,856,858,860,862,864,867],{"class":52,"line":846},37,[50,848,801],{"class":56},[50,850,61],{"class":60},[50,852,853],{"class":64},"Spacer",[50,855,67],{"class":60},[50,857,312],{"class":56},[50,859,61],{"class":60},[50,861,326],{"class":64},[50,863,67],{"class":60},[50,865,866],{"class":331},"4",[50,868,869],{"class":60},"))\n",[50,871,873],{"class":52,"line":872},38,[50,874,141],{"emptyLinePlaceholder":140},[50,876,878,880,882,884,886,888,890,892],{"class":52,"line":877},39,[50,879,801],{"class":56},[50,881,61],{"class":60},[50,883,38],{"class":64},[50,885,67],{"class":60},[50,887,70],{"class":56},[50,889,73],{"class":60},[50,891,76],{"class":56},[50,893,894],{"class":60},",\n",[50,896,898,901,903,906,908,910,912,915,917,920,922,924],{"class":52,"line":897},40,[50,899,900],{"class":56},"                template",[50,902,61],{"class":60},[50,904,905],{"class":64},"ColumnWidths",[50,907,67],{"class":60},[50,909,332],{"class":331},[50,911,73],{"class":60},[50,913,914],{"class":331}," 20",[50,916,73],{"class":60},[50,918,919],{"class":331}," 40",[50,921,73],{"class":60},[50,923,914],{"class":331},[50,925,297],{"class":60},[50,927,929,931,933,936],{"class":52,"line":928},41,[50,930,900],{"class":56},[50,932,61],{"class":60},[50,934,935],{"class":64},"TableHeaderStyle",[50,937,274],{"class":60},[50,939,941,944,946,949,951,954,956,959],{"class":52,"line":940},42,[50,942,943],{"class":56},"                    template",[50,945,61],{"class":60},[50,947,948],{"class":64},"TextColor",[50,950,67],{"class":60},[50,952,953],{"class":56},"pdf",[50,955,61],{"class":60},[50,957,958],{"class":56},"White",[50,960,297],{"class":60},[50,962,964,966,968,971,973,976],{"class":52,"line":963},43,[50,965,943],{"class":56},[50,967,61],{"class":60},[50,969,970],{"class":64},"BgColor",[50,972,67],{"class":60},[50,974,975],{"class":56},"brand",[50,977,297],{"class":60},[50,979,981],{"class":52,"line":980},44,[50,982,983],{"class":60},"                ),\n",[50,985,987],{"class":52,"line":986},45,[50,988,989],{"class":60},"            )\n",[50,991,993],{"class":52,"line":992},46,[50,994,696],{"class":60},[50,996,998],{"class":52,"line":997},47,[50,999,1000],{"class":60},"    })\n",[50,1002,1004],{"class":52,"line":1003},48,[50,1005,141],{"emptyLinePlaceholder":140},[50,1007,1009,1012,1014,1017,1019,1021,1023,1026],{"class":52,"line":1008},49,[50,1010,1011],{"class":56},"    data",[50,1013,73],{"class":60},[50,1015,1016],{"class":56}," err ",[50,1018,263],{"class":60},[50,1020,718],{"class":56},[50,1022,61],{"class":60},[50,1024,1025],{"class":64},"Generate",[50,1027,726],{"class":60},[50,1029,1031,1034,1036,1039,1042],{"class":52,"line":1030},50,[50,1032,1033],{"class":147},"    if",[50,1035,1016],{"class":56},[50,1037,1038],{"class":60},"!=",[50,1040,1041],{"class":60}," nil",[50,1043,254],{"class":60},[50,1045,1047,1050,1052,1055,1057,1060],{"class":52,"line":1046},51,[50,1048,1049],{"class":56},"        log",[50,1051,61],{"class":60},[50,1053,1054],{"class":64},"Fatal",[50,1056,67],{"class":60},[50,1058,1059],{"class":56},"err",[50,1061,234],{"class":60},[50,1063,1065],{"class":52,"line":1064},52,[50,1066,702],{"class":60},[50,1068,1070,1072,1074,1076,1079,1081,1084,1086,1088,1090,1092,1094,1097,1099,1102,1105,1107,1109,1111],{"class":52,"line":1069},53,[50,1071,1033],{"class":147},[50,1073,1016],{"class":56},[50,1075,263],{"class":60},[50,1077,1078],{"class":56}," os",[50,1080,61],{"class":60},[50,1082,1083],{"class":64},"WriteFile",[50,1085,67],{"class":60},[50,1087,395],{"class":60},[50,1089,119],{"class":398},[50,1091,395],{"class":60},[50,1093,73],{"class":60},[50,1095,1096],{"class":56}," data",[50,1098,73],{"class":60},[50,1100,1101],{"class":331}," 0o644",[50,1103,1104],{"class":60},");",[50,1106,1016],{"class":56},[50,1108,1038],{"class":60},[50,1110,1041],{"class":60},[50,1112,254],{"class":60},[50,1114,1116,1118,1120,1122,1124,1126],{"class":52,"line":1115},54,[50,1117,1049],{"class":56},[50,1119,61],{"class":60},[50,1121,1054],{"class":64},[50,1123,67],{"class":60},[50,1125,1059],{"class":56},[50,1127,234],{"class":60},[50,1129,1131],{"class":52,"line":1130},55,[50,1132,702],{"class":60},[50,1134,1136],{"class":52,"line":1135},56,[50,1137,432],{"class":60},[18,1139,1140,1141,1144],{},"200 行を A4 に流すと約 8 ページになる。そのどのページにも紺色のヘッダーが先頭に乗り、ボディは前ページが止まった場所からちょうど続く。このコードで「複数ページ」を匂わせているのはループ上限の ",[36,1142,1143],{},"200"," だけだ。",[18,1146,1147,1148,1150,1151,1153,1154,1157,1158,1161,1162,1164,1165,1169],{},"(日本語の ",[36,1149,399],{}," ヘッダー・",[36,1152,635],{}," などを描くには日本語 TTF の登録が必要。",[36,1155,1156],{},"gpdf.WithFont(\"NotoSansJP\", ttf)"," と ",[36,1159,1160],{},"gpdf.WithDefaultFont(\"NotoSansJP\")"," を ",[36,1163,271],{}," に渡す。詳しくは",[22,1166,1168],{"href":1167},"/ja/blog/embed-japanese-font","日本語 TrueType フォントを埋め込む","。)",[14,1171,1172],{"id":1172},"仕組み",[18,1174,1175,1176,1180,1181,116,1187,1192,1193,1196],{},"信頼するために知っておく価値がある。レイアウトエンジンはテーブルをレイアウトするとき、ボディ行を順に測り、次の行が利用可能な高さを超える直前まで現在のページに足していく。収まらなかった行は",[1177,1178,1179],"em",{},"オーバーフロー用テーブル","になる — ",[91,1182,1183,1184],{},"同じ ",[36,1185,1186],{},"Header",[91,1188,1183,1189],{},[36,1190,1191],{},"Footer","、残りのボディ行を持つ新しい ",[36,1194,1195],{},"*document.Table"," だ。gpdf はレイアウト済みの部分をページに流し、次ページを開き、新しいページの高さでオーバーフロー用テーブルを再びレイアウトエンジンに渡す。残りが無くなるまで繰り返す。",[18,1198,1199],{},"ここから 2 つのことが導かれる:",[1201,1202,1203,1214],"ul",{},[1204,1205,1206,1213],"li",{},[91,1207,1208,1209,1212],{},"ヘッダーが繰り返されるのは、それがあなたのループではなく ",[36,1210,1211],{},"tbl.Header"," にあるから。"," オーバーフロー用テーブルは同じスライスを再利用するので、各ページで同一に再描画される。これはタダで手に入る。",[1204,1215,1216,1219,1220,1223],{},[91,1217,1218],{},"「ヘッダーが収まらない」エッジケースが存在しない。"," エンジンは何行のボディが入るかを測る",[1177,1221,1222],{},"前に","ヘッダー分の高さを確保する。ヘッダー + 最低 1 行のボディがページに収まらないなら、中途半端に分割せずテーブル全体を次ページに送る。",[14,1225,1226],{"id":1226},"フッターも繰り返す",[18,1228,1229,1230,1233],{},"合計行(あるいは「ページ集計」)をページ下部にも出したいなら、それは ",[36,1231,1232],{},"document.Table.Footer"," — ビルダー経由ではなく document レイヤーでテーブルを組んだときに使える:",[41,1235,1237],{"className":43,"code":1236,"language":45,"meta":46,"style":46},"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",[36,1238,1239,1249,1253,1271,1290,1335,1372,1377,1392,1404,1428],{"__ignoreMap":46},[50,1240,1241,1243,1245,1247],{"class":52,"line":53},[50,1242,148],{"class":147},[50,1244,406],{"class":60},[50,1246,206],{"class":133},[50,1248,163],{"class":60},[50,1250,1251],{"class":52,"line":137},[50,1252,141],{"emptyLinePlaceholder":140},[50,1254,1255,1258,1260,1263,1265,1267,1269],{"class":52,"line":144},[50,1256,1257],{"class":56},"tbl ",[50,1259,263],{"class":60},[50,1261,1262],{"class":60}," &",[50,1264,312],{"class":133},[50,1266,61],{"class":60},[50,1268,38],{"class":133},[50,1270,520],{"class":60},[50,1272,1273,1276,1279,1281,1283,1285,1288],{"class":52,"line":154},[50,1274,1275],{"class":56},"    Columns",[50,1277,1278],{"class":60},":",[50,1280,385],{"class":60},[50,1282,312],{"class":133},[50,1284,61],{"class":60},[50,1286,1287],{"class":133},"TableColumn",[50,1289,520],{"class":60},[50,1291,1292,1295,1298,1300,1303,1305,1308,1310,1312,1315,1318,1320,1322,1324,1326,1328,1330,1332],{"class":52,"line":166},[50,1293,1294],{"class":60},"        {",[50,1296,1297],{"class":56},"Width",[50,1299,1278],{"class":60},[50,1301,1302],{"class":56}," document",[50,1304,61],{"class":60},[50,1306,1307],{"class":64},"Pct",[50,1309,67],{"class":60},[50,1311,332],{"class":331},[50,1313,1314],{"class":60},")},",[50,1316,1317],{"class":60}," {",[50,1319,1297],{"class":56},[50,1321,1278],{"class":60},[50,1323,1302],{"class":56},[50,1325,61],{"class":60},[50,1327,1307],{"class":64},[50,1329,67],{"class":60},[50,1331,332],{"class":331},[50,1333,1334],{"class":60},")},\n",[50,1336,1337,1339,1341,1343,1345,1347,1350,1353,1356,1358,1360,1362,1364,1366,1368,1370],{"class":52,"line":176},[50,1338,1294],{"class":60},[50,1340,1297],{"class":56},[50,1342,1278],{"class":60},[50,1344,1302],{"class":56},[50,1346,61],{"class":60},[50,1348,1349],{"class":56},"Auto",[50,1351,1352],{"class":60},"},",[50,1354,1355],{"class":60},"    {",[50,1357,1297],{"class":56},[50,1359,1278],{"class":60},[50,1361,1302],{"class":56},[50,1363,61],{"class":60},[50,1365,1307],{"class":64},[50,1367,67],{"class":60},[50,1369,332],{"class":331},[50,1371,1334],{"class":60},[50,1373,1374],{"class":52,"line":186},[50,1375,1376],{"class":60},"    },\n",[50,1378,1379,1382,1384,1387,1389],{"class":52,"line":191},[50,1380,1381],{"class":56},"    Header",[50,1383,1278],{"class":60},[50,1385,1386],{"class":56}," headerRows",[50,1388,73],{"class":60},[50,1390,1391],{"class":82}," // []document.TableRow\n",[50,1393,1394,1397,1399,1402],{"class":52,"line":201},[50,1395,1396],{"class":56},"    Body",[50,1398,1278],{"class":60},[50,1400,1401],{"class":56},"   bodyRows",[50,1403,894],{"class":60},[50,1405,1406,1409,1411,1413,1415,1417,1420,1422,1425],{"class":52,"line":211},[50,1407,1408],{"class":56},"    Footer",[50,1410,1278],{"class":60},[50,1412,385],{"class":60},[50,1414,312],{"class":133},[50,1416,61],{"class":60},[50,1418,1419],{"class":133},"TableRow",[50,1421,392],{"class":60},[50,1423,1424],{"class":56},"footerRow",[50,1426,1427],{"class":60},"},\n",[50,1429,1430],{"class":52,"line":221},[50,1431,432],{"class":60},[18,1433,1434,1436,1437,1440,1441,1445],{},[36,1435,1191],{}," スライスは継続ページごとに繰り返される。ヘッダーと同じ仕組みだ。ビルダーの ",[36,1438,1439],{},"c.Table(...)"," がフッターを露出していないのは、短いテーブルの大半に不要だから — 必要になった時点で「よくあるケース」の外に出ている。",[22,1442,1444],{"href":1443},"/ja/blog/tables-in-go-pdfs","テーブルの詳説","が document レイヤーを解説している。",[14,1447,1448],{"id":1448},"テーブルを新しいページから始める",[18,1450,1451],{},"テーブル単位の「新ページで開始」オプションは無い。ページレベルでやる — テーブルを持つ行の前にページを足す:",[41,1453,1455],{"className":43,"code":1454,"language":45,"meta":46,"style":46},"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",[36,1456,1457,1471,1486,1511,1542,1565,1569],{"__ignoreMap":46},[50,1458,1459,1462,1464,1466,1468],{"class":52,"line":53},[50,1460,1461],{"class":56},"doc",[50,1463,61],{"class":60},[50,1465,723],{"class":64},[50,1467,251],{"class":60},[50,1469,1470],{"class":82}," // 下のテーブルはこのページの先頭から始まる\n",[50,1472,1473,1476,1478,1480,1482,1484],{"class":52,"line":137},[50,1474,1475],{"class":56},"page2 ",[50,1477,263],{"class":60},[50,1479,718],{"class":56},[50,1481,61],{"class":60},[50,1483,723],{"class":64},[50,1485,726],{"class":60},[50,1487,1488,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509],{"class":52,"line":144},[50,1489,1490],{"class":56},"page2",[50,1492,61],{"class":60},[50,1494,737],{"class":64},[50,1496,740],{"class":60},[50,1498,744],{"class":743},[50,1500,747],{"class":60},[50,1502,750],{"class":133},[50,1504,61],{"class":60},[50,1506,755],{"class":133},[50,1508,79],{"class":60},[50,1510,254],{"class":60},[50,1512,1513,1516,1518,1520,1522,1524,1526,1528,1530,1532,1534,1536,1538,1540],{"class":52,"line":154},[50,1514,1515],{"class":56},"    r",[50,1517,61],{"class":60},[50,1519,770],{"class":64},[50,1521,67],{"class":60},[50,1523,775],{"class":331},[50,1525,73],{"class":60},[50,1527,780],{"class":60},[50,1529,57],{"class":743},[50,1531,747],{"class":60},[50,1533,750],{"class":133},[50,1535,61],{"class":60},[50,1537,791],{"class":133},[50,1539,79],{"class":60},[50,1541,254],{"class":60},[50,1543,1544,1547,1549,1551,1553,1555,1557,1560,1563],{"class":52,"line":166},[50,1545,1546],{"class":56},"        c",[50,1548,61],{"class":60},[50,1550,38],{"class":64},[50,1552,67],{"class":60},[50,1554,70],{"class":56},[50,1556,73],{"class":60},[50,1558,1559],{"class":56}," rows ",[50,1561,1562],{"class":82},"/* , opts... */",[50,1564,234],{"class":60},[50,1566,1567],{"class":52,"line":176},[50,1568,1000],{"class":60},[50,1570,1571],{"class":52,"line":186},[50,1572,1573],{"class":60},"})\n",[18,1575,1576,1577,1580,1581,1584],{},"テーブルに必要な「改ページ」制御はこれだけだ。テーブルの",[1177,1578,1579],{},"内側","の改ページは自動で処理され、",[1177,1582,1583],{},"外側","の改ページは単に「このブロックがどこから始まるか」でしかない。",[14,1586,1587],{"id":1587},"できないこと",[1201,1589,1590,1596,1617],{},[1204,1591,1592,1595],{},[91,1593,1594],{},"「この行はまとめておく」。"," ボディ行はすべて分割対象。「4〜7 行目のグループは同じページに残す」というアノテーションは無い。既知の欠落だ。請求明細とその小計を絶対にページ間で裂きたくないなら、そのグループの前で新ページを始めるか、document レイヤーでテーブルを組んで自前の改ページヒントを入れる。",[1204,1597,1598,1601,1602,1604,1605,1608,1609,1612,1613,1616],{},[91,1599,1600],{},"最終ページだけのフッター。"," ",[36,1603,1232],{}," は設計上",[1177,1606,1607],{},"すべての","ページで繰り返す(ページごとの列合計がよくあるケースだから)。文書末尾に一度だけの総計が欲しいなら、テーブルの",[1177,1610,1611],{},"中","ではなく",[1177,1614,1615],{},"後","に別ブロックとして足す。",[1204,1618,1619,1622,1623,1626],{},[91,1620,1621],{},"テーブル内のページ番号。"," 「3 / 8 ページ」はテーブルではなく文書のフッターに属する。それがどこに置かれるかは",[22,1624,1625],{"href":1443},"ページ番号・ヘッダー・フッター","を参照。",[14,1628,1630],{"id":1629},"_10-分溶かすミス","10 分溶かすミス",[1201,1632,1633,1642,1656,1665],{},[1204,1634,1635,1641],{},[91,1636,1637,1640],{},[36,1638,1639],{},"PageBreak"," オプションを探す。"," 無いし、欲しくもない — それを手で呼んでいる時点でもう負けている。全行を渡せばいい。",[1204,1643,1644,1647,1648,1651,1652,1655],{},[91,1645,1646],{},"データを自分でページ単位に切る。"," 1 ページ目に ",[36,1649,1650],{},"rows[0:40]","、2 ページ目に ",[36,1653,1654],{},"rows[40:80]","… やめたほうがいい。行の計算をどこかで間違え、最終ページが短くなり、ヘッダーのスタイルがズレる。スライス全体を gpdf に渡す。",[1204,1657,1658,1661,1662,1664],{},[91,1659,1660],{},"1 ページ目にだけヘッダーが出ると思う。"," そういうライブラリもある。gpdf は",[1177,1663,1607],{},"ページで繰り返す。印刷してめくる人にとってはこれが正しい。",[1204,1666,1667,1670],{},[91,1668,1669],{},"150 ページのテーブルに 6 MB の CJK フォント。"," フォントは実際に使うグリフだけにサブセットされるので問題ない — 出力は小さいまま。ただしサブセット化を何らかの理由で無効にしていたら、長いテーブルで効いてくる。サブセット化はオンのまま(デフォルト)にしておく。",[14,1672,1673],{"id":1673},"関連レシピ",[1201,1675,1676,1686,1695,1702],{},[1204,1677,1678,1681,1682,1685],{},[22,1679,1680],{"href":1443},"Go の PDF でテーブルを作る:列幅・縞模様・改ページ"," — ",[36,1683,1684],{},"document.Table"," とフッターを含む長編。",[1204,1687,1688,1681,1692,1694],{},[22,1689,1691],{"href":1690},"/ja/blog/table-column-widths","テーブルの列幅を指定するには?",[36,1693,905],{}," のコーナーケース。",[1204,1696,1697,1701],{},[22,1698,1700],{"href":1699},"/ja/blog/zebra-striped-table-rows","テーブルに縞模様(ゼブラ)の行を入れるには?"," — 縞が改ページをまたいでも揃う理由。",[1204,1703,1704,1708],{},[22,1705,1707],{"href":1706},"/ja/blog/invoice-pdf-go-under-50-lines","Go で 50 行以内に請求書 PDF を作る"," — 改ページするテーブルを含む実際の文書。",[14,1710,1712],{"id":1711},"gpdf-を使ってみる","gpdf を使ってみる",[18,1714,1715],{},"gpdf は Go の PDF 生成ライブラリ。MIT、ゼロ依存、CJK 対応。",[41,1717,1721],{"className":1718,"code":1719,"language":1720,"meta":46,"style":46},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[36,1722,1723],{"__ignoreMap":46},[50,1724,1725,1727,1730],{"class":52,"line":53},[50,1726,45],{"class":133},[50,1728,1729],{"class":398}," get",[50,1731,1732],{"class":398}," github.com/gpdf-dev/gpdf\n",[18,1734,1735,1739,1740],{},[22,1736,1738],{"href":24,"rel":1737},[26],"⭐ Star on GitHub"," · ",[22,1741,1744],{"href":1742,"rel":1743},"https://gpdf.dev/docs/quickstart",[26],"Read the docs",[1746,1747,1748],"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":46,"searchDepth":137,"depth":137,"links":1750},[1751,1752,1753,1754,1755,1756,1757,1758,1759,1760],{"id":16,"depth":137,"text":16},{"id":31,"depth":137,"text":31},{"id":105,"depth":137,"text":105},{"id":1172,"depth":137,"text":1172},{"id":1226,"depth":137,"text":1226},{"id":1448,"depth":137,"text":1448},{"id":1587,"depth":137,"text":1587},{"id":1629,"depth":137,"text":1630},{"id":1673,"depth":137,"text":1673},{"id":1711,"depth":137,"text":1712},"2026-05-12","何もしなくていい。1 ページに収まらない行数のテーブルを渡せば、gpdf がボディを自動で改ページし、各ページの先頭にヘッダーを繰り返す。",false,"md",{"name":1766,"totalTime":1767,"tools":1768,"steps":1770},"gpdf でヘッダーが繰り返される複数ページのテーブルを出力する","PT10M",[1769,196],"Go 1.22+",[1771,1774,1777,1780,1783],{"name":1772,"text":1773},"Col の中で Table を 1 回呼ぶ","page.AutoRow → r.Col(12, ...) の中で c.Table(header, rows) と呼ぶ。header は []string、rows は [][]string。ループも行数カウントも改ページメソッドも書かない。",{"name":1775,"text":1776},"1 ページに収まらない行数を渡す","データの全行をそのまま append する。ボディが現在のページを溢れると、gpdf のレイアウトエンジンが残り行を持つオーバーフロー用テーブルを作り、次ページに続きを描く。",{"name":1778,"text":1779},"ヘッダーは gpdf が繰り返す","Header スライスは継続ページの先頭に自動的に再描画される — スタイルも列幅も同じ。これを有効にするオプションは無い。デフォルト動作。",{"name":1781,"text":1782},"ページごとの合計には document.Table.Footer を使う","ページ下部にも繰り返されるフッター行(列合計やページ表記)が欲しいときは &document.Table{Header, Body, Footer} を document レイヤーで組む。",{"name":1784,"text":1785},"新しいページから始めたいときは先に doc.AddPage() を呼ぶ","直前のコンテンツの続きからではなく新ページの先頭からテーブルを始めたい場合は、先にページを足す。テーブル単位の「新ページで開始」オプションは無い。",null,{},"/ja/blog/multi-page-table",{"title":5,"description":1762},"ja/blog/024.multi-page-table",[1792,1793,1794],"recipe","tutorial","templates","VMUH7h7Dyy0Sfp5Yiqm28o9KlVveW7qdJniJwk6_uk4",1779199019709]