[{"data":1,"prerenderedAt":1424},["ShallowReactive",2],{"blog-ko-table-column-widths":3},{"id":4,"title":5,"author":6,"body":10,"date":1393,"description":1394,"draft":1395,"extension":1396,"howTo":1397,"image":1415,"meta":1416,"navigation":155,"path":1417,"seo":1418,"stem":1419,"tags":1420,"updated":1415,"__hash__":1423},"blogKo/ko/blog/014.table-column-widths.md","gpdf 테이블에서 열 너비를 지정하는 방법",{"name":7,"url":8,"avatar":9},"Taiki Noda","https://nadai.dev/en/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":1382},"minimark",[13,18,36,40,50,122,129,132,136,888,898,902,913,928,934,938,941,955,958,968,1021,1028,1081,1092,1096,1103,1109,1113,1116,1287,1308,1314,1318,1340,1344,1347,1364,1378],[14,15,17],"h2",{"id":16},"질문을-다시-표현하면","질문을 다시 표현하면",[19,20,21,22,26,27,31,32,35],"p",{},"4 열 테이블이 있다. 기본 ",[23,24,25],"code",{},"c.Table(header, rows)"," 는 모든 열을 동일한 폭으로 만들지만, 송장이라면 ",[28,29,30],"strong",{},"품목"," 열은 넓고 ",[28,33,34],{},"수량"," 열은 좁아야 한다. 열별 너비를 어떻게 지정하나? 그리고 그 값의 단위는 뭔가?",[14,37,39],{"id":38},"빠른-답","빠른 답",[19,41,42,45,46,49],{},[23,43,44],{},"template.ColumnWidths(...)"," 를 ",[23,47,48],{},"TableOption"," 으로 전달한다:",[51,52,57],"pre",{"className":53,"code":54,"language":55,"meta":56,"style":56},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","c.Table(header, rows, template.ColumnWidths(40, 15, 20, 25))\n","go","",[23,58,59],{"__ignoreMap":56},[60,61,64,68,72,76,79,82,85,88,90,93,95,98,100,104,106,109,111,114,116,119],"span",{"class":62,"line":63},"line",1,[60,65,67],{"class":66},"sTEyZ","c",[60,69,71],{"class":70},"sMK4o",".",[60,73,75],{"class":74},"s2Zo4","Table",[60,77,78],{"class":70},"(",[60,80,81],{"class":66},"header",[60,83,84],{"class":70},",",[60,86,87],{"class":66}," rows",[60,89,84],{"class":70},[60,91,92],{"class":66}," template",[60,94,71],{"class":70},[60,96,97],{"class":74},"ColumnWidths",[60,99,78],{"class":70},[60,101,103],{"class":102},"sbssI","40",[60,105,84],{"class":70},[60,107,108],{"class":102}," 15",[60,110,84],{"class":70},[60,112,113],{"class":102}," 20",[60,115,84],{"class":70},[60,117,118],{"class":102}," 25",[60,120,121],{"class":70},"))\n",[19,123,124,125,128],{},"값은 ",[28,126,127],{},"부모 Col 의 content 너비에 대한 백분율"," 이다. 포인트가 아니다. 합계가 100 일 필요는 없지만 보통 그래야 한다 — 부족하면 오른쪽에 빈 공간이 남고, 넘치면 셀에서 흘러나간다.",[19,130,131],{},"평범한 경우는 이게 전부다. 흥미로운 부분은 합계가 100 이 안 될 때, 열 개수보다 적은 값을 넘겼을 때, 그리고 \"부모 너비\" 가 실제로 가리키는 게 뭔가, 이 세 가지다.",[14,133,135],{"id":134},"동작하는-코드-4-열-송장-테이블","동작하는 코드 (4 열 송장 테이블)",[51,137,139],{"className":53,"code":138,"language":55,"meta":56,"style":56},"package main\n\nimport (\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    header := []string{\"품목\", \"수량\", \"단가\", \"금액\"}\n    rows := [][]string{\n        {\"연간 지원 계약\", \"1\", \"₩1,200,000\", \"₩1,200,000\"},\n        {\"현장 교육 (1 일)\", \"3\", \"₩800,000\", \"₩2,400,000\"},\n        {\"맞춤 템플릿 개발\", \"12\", \"₩95,000\", \"₩1,140,000\"},\n    }\n\n    page := doc.AddPage()\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Table(header, rows,\n                template.ColumnWidths(40, 15, 20, 25),\n                template.TableHeaderStyle(template.BgColor(pdf.Gray(0.92))),\n            )\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"invoice.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n",[23,140,141,150,157,167,179,189,194,204,214,224,234,240,245,260,280,304,341,347,352,408,424,466,507,548,554,559,578,612,647,668,696,732,738,744,750,755,777,793,811,816,863,878,883],{"__ignoreMap":56},[60,142,143,146],{"class":62,"line":63},[60,144,145],{"class":70},"package",[60,147,149],{"class":148},"sBMFI"," main\n",[60,151,153],{"class":62,"line":152},2,[60,154,156],{"emptyLinePlaceholder":155},true,"\n",[60,158,160,164],{"class":62,"line":159},3,[60,161,163],{"class":162},"s7zQu","import",[60,165,166],{"class":70}," (\n",[60,168,170,173,176],{"class":62,"line":169},4,[60,171,172],{"class":70},"    \"",[60,174,175],{"class":148},"log",[60,177,178],{"class":70},"\"\n",[60,180,182,184,187],{"class":62,"line":181},5,[60,183,172],{"class":70},[60,185,186],{"class":148},"os",[60,188,178],{"class":70},[60,190,192],{"class":62,"line":191},6,[60,193,156],{"emptyLinePlaceholder":155},[60,195,197,199,202],{"class":62,"line":196},7,[60,198,172],{"class":70},[60,200,201],{"class":148},"github.com/gpdf-dev/gpdf",[60,203,178],{"class":70},[60,205,207,209,212],{"class":62,"line":206},8,[60,208,172],{"class":70},[60,210,211],{"class":148},"github.com/gpdf-dev/gpdf/document",[60,213,178],{"class":70},[60,215,217,219,222],{"class":62,"line":216},9,[60,218,172],{"class":70},[60,220,221],{"class":148},"github.com/gpdf-dev/gpdf/pdf",[60,223,178],{"class":70},[60,225,227,229,232],{"class":62,"line":226},10,[60,228,172],{"class":70},[60,230,231],{"class":148},"github.com/gpdf-dev/gpdf/template",[60,233,178],{"class":70},[60,235,237],{"class":62,"line":236},11,[60,238,239],{"class":70},")\n",[60,241,243],{"class":62,"line":242},12,[60,244,156],{"emptyLinePlaceholder":155},[60,246,248,251,254,257],{"class":62,"line":247},13,[60,249,250],{"class":70},"func",[60,252,253],{"class":74}," main",[60,255,256],{"class":70},"()",[60,258,259],{"class":70}," {\n",[60,261,263,266,269,272,274,277],{"class":62,"line":262},14,[60,264,265],{"class":66},"    doc ",[60,267,268],{"class":70},":=",[60,270,271],{"class":66}," gpdf",[60,273,71],{"class":70},[60,275,276],{"class":74},"NewDocument",[60,278,279],{"class":70},"(\n",[60,281,283,286,288,291,293,296,298,301],{"class":62,"line":282},15,[60,284,285],{"class":66},"        gpdf",[60,287,71],{"class":70},[60,289,290],{"class":74},"WithPageSize",[60,292,78],{"class":70},[60,294,295],{"class":66},"gpdf",[60,297,71],{"class":70},[60,299,300],{"class":66},"A4",[60,302,303],{"class":70},"),\n",[60,305,307,309,311,314,316,319,321,324,326,328,330,333,335,338],{"class":62,"line":306},16,[60,308,285],{"class":66},[60,310,71],{"class":70},[60,312,313],{"class":74},"WithMargins",[60,315,78],{"class":70},[60,317,318],{"class":66},"document",[60,320,71],{"class":70},[60,322,323],{"class":74},"UniformEdges",[60,325,78],{"class":70},[60,327,318],{"class":66},[60,329,71],{"class":70},[60,331,332],{"class":74},"Mm",[60,334,78],{"class":70},[60,336,337],{"class":102},"20",[60,339,340],{"class":70},"))),\n",[60,342,344],{"class":62,"line":343},17,[60,345,346],{"class":70},"    )\n",[60,348,350],{"class":62,"line":349},18,[60,351,156],{"emptyLinePlaceholder":155},[60,353,355,358,360,363,367,370,373,376,378,380,383,385,387,389,391,394,396,398,400,403,405],{"class":62,"line":354},19,[60,356,357],{"class":66},"    header ",[60,359,268],{"class":70},[60,361,362],{"class":70}," []",[60,364,366],{"class":365},"spNyl","string",[60,368,369],{"class":70},"{",[60,371,372],{"class":70},"\"",[60,374,30],{"class":375},"sfazB",[60,377,372],{"class":70},[60,379,84],{"class":70},[60,381,382],{"class":70}," \"",[60,384,34],{"class":375},[60,386,372],{"class":70},[60,388,84],{"class":70},[60,390,382],{"class":70},[60,392,393],{"class":375},"단가",[60,395,372],{"class":70},[60,397,84],{"class":70},[60,399,382],{"class":70},[60,401,402],{"class":375},"금액",[60,404,372],{"class":70},[60,406,407],{"class":70},"}\n",[60,409,411,414,416,419,421],{"class":62,"line":410},20,[60,412,413],{"class":66},"    rows ",[60,415,268],{"class":70},[60,417,418],{"class":70}," [][]",[60,420,366],{"class":365},[60,422,423],{"class":70},"{\n",[60,425,427,430,432,435,437,439,441,444,446,448,450,453,455,457,459,461,463],{"class":62,"line":426},21,[60,428,429],{"class":70},"        {",[60,431,372],{"class":70},[60,433,434],{"class":375},"연간 지원 계약",[60,436,372],{"class":70},[60,438,84],{"class":70},[60,440,382],{"class":70},[60,442,443],{"class":375},"1",[60,445,372],{"class":70},[60,447,84],{"class":70},[60,449,382],{"class":70},[60,451,452],{"class":375},"₩1,200,000",[60,454,372],{"class":70},[60,456,84],{"class":70},[60,458,382],{"class":70},[60,460,452],{"class":375},[60,462,372],{"class":70},[60,464,465],{"class":70},"},\n",[60,467,469,471,473,476,478,480,482,485,487,489,491,494,496,498,500,503,505],{"class":62,"line":468},22,[60,470,429],{"class":70},[60,472,372],{"class":70},[60,474,475],{"class":375},"현장 교육 (1 일)",[60,477,372],{"class":70},[60,479,84],{"class":70},[60,481,382],{"class":70},[60,483,484],{"class":375},"3",[60,486,372],{"class":70},[60,488,84],{"class":70},[60,490,382],{"class":70},[60,492,493],{"class":375},"₩800,000",[60,495,372],{"class":70},[60,497,84],{"class":70},[60,499,382],{"class":70},[60,501,502],{"class":375},"₩2,400,000",[60,504,372],{"class":70},[60,506,465],{"class":70},[60,508,510,512,514,517,519,521,523,526,528,530,532,535,537,539,541,544,546],{"class":62,"line":509},23,[60,511,429],{"class":70},[60,513,372],{"class":70},[60,515,516],{"class":375},"맞춤 템플릿 개발",[60,518,372],{"class":70},[60,520,84],{"class":70},[60,522,382],{"class":70},[60,524,525],{"class":375},"12",[60,527,372],{"class":70},[60,529,84],{"class":70},[60,531,382],{"class":70},[60,533,534],{"class":375},"₩95,000",[60,536,372],{"class":70},[60,538,84],{"class":70},[60,540,382],{"class":70},[60,542,543],{"class":375},"₩1,140,000",[60,545,372],{"class":70},[60,547,465],{"class":70},[60,549,551],{"class":62,"line":550},24,[60,552,553],{"class":70},"    }\n",[60,555,557],{"class":62,"line":556},25,[60,558,156],{"emptyLinePlaceholder":155},[60,560,562,565,567,570,572,575],{"class":62,"line":561},26,[60,563,564],{"class":66},"    page ",[60,566,268],{"class":70},[60,568,569],{"class":66}," doc",[60,571,71],{"class":70},[60,573,574],{"class":74},"AddPage",[60,576,577],{"class":70},"()\n",[60,579,581,584,586,589,592,596,599,602,604,607,610],{"class":62,"line":580},27,[60,582,583],{"class":66},"    page",[60,585,71],{"class":70},[60,587,588],{"class":74},"AutoRow",[60,590,591],{"class":70},"(func(",[60,593,595],{"class":594},"sHdIc","r",[60,597,598],{"class":70}," *",[60,600,601],{"class":148},"template",[60,603,71],{"class":70},[60,605,606],{"class":148},"RowBuilder",[60,608,609],{"class":70},")",[60,611,259],{"class":70},[60,613,615,618,620,623,625,627,629,632,634,636,638,640,643,645],{"class":62,"line":614},28,[60,616,617],{"class":66},"        r",[60,619,71],{"class":70},[60,621,622],{"class":74},"Col",[60,624,78],{"class":70},[60,626,525],{"class":102},[60,628,84],{"class":70},[60,630,631],{"class":70}," func(",[60,633,67],{"class":594},[60,635,598],{"class":70},[60,637,601],{"class":148},[60,639,71],{"class":70},[60,641,642],{"class":148},"ColBuilder",[60,644,609],{"class":70},[60,646,259],{"class":70},[60,648,650,653,655,657,659,661,663,665],{"class":62,"line":649},29,[60,651,652],{"class":66},"            c",[60,654,71],{"class":70},[60,656,75],{"class":74},[60,658,78],{"class":70},[60,660,81],{"class":66},[60,662,84],{"class":70},[60,664,87],{"class":66},[60,666,667],{"class":70},",\n",[60,669,671,674,676,678,680,682,684,686,688,690,692,694],{"class":62,"line":670},30,[60,672,673],{"class":66},"                template",[60,675,71],{"class":70},[60,677,97],{"class":74},[60,679,78],{"class":70},[60,681,103],{"class":102},[60,683,84],{"class":70},[60,685,108],{"class":102},[60,687,84],{"class":70},[60,689,113],{"class":102},[60,691,84],{"class":70},[60,693,118],{"class":102},[60,695,303],{"class":70},[60,697,699,701,703,706,708,710,712,715,717,720,722,725,727,730],{"class":62,"line":698},31,[60,700,673],{"class":66},[60,702,71],{"class":70},[60,704,705],{"class":74},"TableHeaderStyle",[60,707,78],{"class":70},[60,709,601],{"class":66},[60,711,71],{"class":70},[60,713,714],{"class":74},"BgColor",[60,716,78],{"class":70},[60,718,719],{"class":66},"pdf",[60,721,71],{"class":70},[60,723,724],{"class":74},"Gray",[60,726,78],{"class":70},[60,728,729],{"class":102},"0.92",[60,731,340],{"class":70},[60,733,735],{"class":62,"line":734},32,[60,736,737],{"class":70},"            )\n",[60,739,741],{"class":62,"line":740},33,[60,742,743],{"class":70},"        })\n",[60,745,747],{"class":62,"line":746},34,[60,748,749],{"class":70},"    })\n",[60,751,753],{"class":62,"line":752},35,[60,754,156],{"emptyLinePlaceholder":155},[60,756,758,761,763,766,768,770,772,775],{"class":62,"line":757},36,[60,759,760],{"class":66},"    data",[60,762,84],{"class":70},[60,764,765],{"class":66}," err ",[60,767,268],{"class":70},[60,769,569],{"class":66},[60,771,71],{"class":70},[60,773,774],{"class":74},"Generate",[60,776,577],{"class":70},[60,778,780,783,785,788,791],{"class":62,"line":779},37,[60,781,782],{"class":162},"    if",[60,784,765],{"class":66},[60,786,787],{"class":70},"!=",[60,789,790],{"class":70}," nil",[60,792,259],{"class":70},[60,794,796,799,801,804,806,809],{"class":62,"line":795},38,[60,797,798],{"class":66},"        log",[60,800,71],{"class":70},[60,802,803],{"class":74},"Fatal",[60,805,78],{"class":70},[60,807,808],{"class":66},"err",[60,810,239],{"class":70},[60,812,814],{"class":62,"line":813},39,[60,815,553],{"class":70},[60,817,819,821,823,825,828,830,833,835,837,840,842,844,847,849,852,855,857,859,861],{"class":62,"line":818},40,[60,820,782],{"class":162},[60,822,765],{"class":66},[60,824,268],{"class":70},[60,826,827],{"class":66}," os",[60,829,71],{"class":70},[60,831,832],{"class":74},"WriteFile",[60,834,78],{"class":70},[60,836,372],{"class":70},[60,838,839],{"class":375},"invoice.pdf",[60,841,372],{"class":70},[60,843,84],{"class":70},[60,845,846],{"class":66}," data",[60,848,84],{"class":70},[60,850,851],{"class":102}," 0o644",[60,853,854],{"class":70},");",[60,856,765],{"class":66},[60,858,787],{"class":70},[60,860,790],{"class":70},[60,862,259],{"class":70},[60,864,866,868,870,872,874,876],{"class":62,"line":865},41,[60,867,798],{"class":66},[60,869,71],{"class":70},[60,871,803],{"class":74},[60,873,78],{"class":70},[60,875,808],{"class":66},[60,877,239],{"class":70},[60,879,881],{"class":62,"line":880},42,[60,882,553],{"class":70},[60,884,886],{"class":62,"line":885},43,[60,887,407],{"class":70},[19,889,890,893,894,897],{},[23,891,892],{},"r.Col(12, ...)"," 은 행 전체 너비를 차지한다. 테이블은 그 Col 안에 들어가므로, 테이블의 100% = grid Col content 너비의 100%. ",[23,895,896],{},"ColumnWidths(40, 15, 20, 25)"," 합계가 100 이므로 가로 PDF 포인트가 빠짐없이 사용된다.",[14,899,901],{"id":900},"백분율은-무엇-의-백분율인가","백분율은 \"무엇\" 의 백분율인가",[19,903,904,905,908,909,912],{},"전달한 숫자는 내부에서 ",[23,906,907],{},"document.Pct(w)"," 로 감싸지고, ",[28,910,911],{},"테이블의 content 너비"," 에 대해 해석된다. 테이블의 content 너비는 배치된 grid Col 의 너비에서 테이블 자체의 margin / padding / border 를 뺀 값 (실무에선 그냥 Col 너비 — 테이블 장식은 기본적으로 없음).",[19,914,915,916,919,920,923,924,927],{},"그래서 ",[23,917,918],{},"r.Col(6, ...)"," (행의 절반) 안에서 ",[23,921,922],{},"ColumnWidths(50, 50)"," 을 쓰면 각 테이블 열은 ",[28,925,926],{},"행 너비의 25%"," 가 된다. 50% 가 아니다. 백분율은 테이블 로컬이지 페이지 기준이 아니다.",[19,929,930,931,933],{},"이게 레이아웃 변경 시 효과를 본다. 테이블을 전체 폭에서 좌우 두 개로 바꿔도 ",[23,932,97],{}," 값을 고칠 필요가 없다 — 그대로 스케일된다.",[14,935,937],{"id":936},"수가-안-맞을-때-gpdf-가-하는-일","수가 안 맞을 때 gpdf 가 하는 일",[19,939,940],{},"실무에서 자주 마주치는 케이스 두 가지. 레이아웃 엔진의 동작이 명확하게 정해져 있으니 알아둘 가치가 있다.",[19,942,943,946,947,950,951,954],{},[28,944,945],{},"케이스 1: 백분율 합계가 100 이 안 된다."," 각 값은 그대로 사용된다. 3 열 테이블에서 ",[23,948,949],{},"ColumnWidths(40, 30, 20)"," 이면 열은 40% / 30% / 20% 가 되고 오른쪽에 10% 의 공백이 남는다. ",[23,952,953],{},"ColumnWidths(50, 50, 50)"," 은 overflow — 세 번째 열이 부모 오른쪽 끝을 넘어 옆 열에 침범하거나 페이지 밖으로 나간다.",[19,956,957],{},"정규화는 일어나지 않는다. 계산은 작성자 책임.",[19,959,960,963,964,967],{},[28,961,962],{},"케이스 2: 열 개수보다 값이 적다."," 이쪽이 더 흥미롭다. 명시값 없는 끝쪽 열들은 ",[28,965,966],{},"auto-width"," 가 되고, 남은 폭을 균등하게 나눠 갖는다:",[51,969,971],{"className":53,"code":970,"language":55,"meta":56,"style":56},"// 3 열 테이블, 값은 두 개만.\nc.Table(header3, rows3, template.ColumnWidths(40, 30))\n// → 40% / 30% / 30%   (세 번째 열은 100 - 40 - 30 = 30%)\n",[23,972,973,979,1016],{"__ignoreMap":56},[60,974,975],{"class":62,"line":63},[60,976,978],{"class":977},"sHwdD","// 3 열 테이블, 값은 두 개만.\n",[60,980,981,983,985,987,989,992,994,997,999,1001,1003,1005,1007,1009,1011,1014],{"class":62,"line":152},[60,982,67],{"class":66},[60,984,71],{"class":70},[60,986,75],{"class":74},[60,988,78],{"class":70},[60,990,991],{"class":66},"header3",[60,993,84],{"class":70},[60,995,996],{"class":66}," rows3",[60,998,84],{"class":70},[60,1000,92],{"class":66},[60,1002,71],{"class":70},[60,1004,97],{"class":74},[60,1006,78],{"class":70},[60,1008,103],{"class":102},[60,1010,84],{"class":70},[60,1012,1013],{"class":102}," 30",[60,1015,121],{"class":70},[60,1017,1018],{"class":62,"line":159},[60,1019,1020],{"class":977},"// → 40% / 30% / 30%   (세 번째 열은 100 - 40 - 30 = 30%)\n",[19,1022,1023,1024,1027],{},"명시값 합계가 이미 100 이상이면 auto 열은 ",[28,1025,1026],{},"너비 0"," 이 되어 사실상 사라진다. 100 미만이면 잔여분을 auto 열 수만큼 균등 분할한다:",[51,1029,1031],{"className":53,"code":1030,"language":55,"meta":56,"style":56},"// 5 열 테이블, 값은 두 개.\nc.Table(header5, rows5, template.ColumnWidths(50, 10))\n// → 50% / 10% / 13.33% / 13.33% / 13.33%   (40% 를 3 등분)\n",[23,1032,1033,1038,1076],{"__ignoreMap":56},[60,1034,1035],{"class":62,"line":63},[60,1036,1037],{"class":977},"// 5 열 테이블, 값은 두 개.\n",[60,1039,1040,1042,1044,1046,1048,1051,1053,1056,1058,1060,1062,1064,1066,1069,1071,1074],{"class":62,"line":152},[60,1041,67],{"class":66},[60,1043,71],{"class":70},[60,1045,75],{"class":74},[60,1047,78],{"class":70},[60,1049,1050],{"class":66},"header5",[60,1052,84],{"class":70},[60,1054,1055],{"class":66}," rows5",[60,1057,84],{"class":70},[60,1059,92],{"class":66},[60,1061,71],{"class":70},[60,1063,97],{"class":74},[60,1065,78],{"class":70},[60,1067,1068],{"class":102},"50",[60,1070,84],{"class":70},[60,1072,1073],{"class":102}," 10",[60,1075,121],{"class":70},[60,1077,1078],{"class":62,"line":159},[60,1079,1080],{"class":977},"// → 50% / 10% / 13.33% / 13.33% / 13.33%   (40% 를 3 등분)\n",[19,1082,1083,1084,1087,1088,1091],{},"이 규칙에는 유용한 트릭이 숨어 있다: ",[23,1085,1086],{},"0"," 을 넘겨도 열이 auto 가 된다. 3 열 테이블에서 ",[23,1089,1090],{},"ColumnWidths(0, 30, 30)"," 으로 쓰면 뒤 두 열을 30% 씩 고정하고 첫 열에 남은 40% 를 줄 수 있다. \"이 열들만 정확히 정하고 나머지는 맡긴다\" 라고 쓰고 싶을 때 유용하다.",[14,1093,1095],{"id":1094},"반대-방향-값이-너무-많을-때","반대 방향: 값이 너무 많을 때",[19,1097,1098,1099,1102],{},"열 개수를 초과한 값은 조용히 무시된다. 2 열 테이블에 ",[23,1100,1101],{},"ColumnWidths(40, 30, 20, 10)"," 을 넘겨도 앞의 두 개만 사용된다. 관대하지만 버그의 온상이기도 하다 — 헤더에서 열을 하나 빼고 대응 너비 값을 같이 빼는 걸 잊어도, gpdf 는 경고하지 않는다. 로그도 안 남는다.",[19,1104,1105,1106,1108],{},"열 개수 자체는 헤더 행 길이로 추론된다 (헤더가 없으면 첫 body 행으로). 헤더 셀을 하나 추가하면 열이 하나 늘고, gpdf 는 알아채서 넘긴 ",[23,1107,97],{}," 를 새 열 개수에 맞춰 재분배한다.",[14,1110,1112],{"id":1111},"백분율이-마음에-안-들-때","백분율이 마음에 안 들 때",[19,1114,1115],{},"빌더 API 는 백분율만 노출한다. \"수량\" 열을 50pt 로 고정해서 페이지 크기에 영향받지 않게 하고 싶다 — 그런 경우에는 한 단계 아래 (document 트리) 를 직접 짠다:",[51,1117,1119],{"className":53,"code":1118,"language":55,"meta":56,"style":56},"import \"github.com/gpdf-dev/gpdf/document\"\n\ntbl := &document.Table{\n    Columns: []document.TableColumn{\n        {Width: document.Auto},\n        {Width: document.Pt(50)},\n        {Width: document.Pt(80)},\n        {Width: document.Pt(80)},\n    },\n    Header: /* ... */,\n    Body:   /* ... */,\n}\n",[23,1120,1121,1131,1135,1153,1172,1191,1213,1234,1254,1259,1271,1283],{"__ignoreMap":56},[60,1122,1123,1125,1127,1129],{"class":62,"line":63},[60,1124,163],{"class":162},[60,1126,382],{"class":70},[60,1128,211],{"class":148},[60,1130,178],{"class":70},[60,1132,1133],{"class":62,"line":152},[60,1134,156],{"emptyLinePlaceholder":155},[60,1136,1137,1140,1142,1145,1147,1149,1151],{"class":62,"line":159},[60,1138,1139],{"class":66},"tbl ",[60,1141,268],{"class":70},[60,1143,1144],{"class":70}," &",[60,1146,318],{"class":148},[60,1148,71],{"class":70},[60,1150,75],{"class":148},[60,1152,423],{"class":70},[60,1154,1155,1158,1161,1163,1165,1167,1170],{"class":62,"line":169},[60,1156,1157],{"class":66},"    Columns",[60,1159,1160],{"class":70},":",[60,1162,362],{"class":70},[60,1164,318],{"class":148},[60,1166,71],{"class":70},[60,1168,1169],{"class":148},"TableColumn",[60,1171,423],{"class":70},[60,1173,1174,1176,1179,1181,1184,1186,1189],{"class":62,"line":181},[60,1175,429],{"class":70},[60,1177,1178],{"class":66},"Width",[60,1180,1160],{"class":70},[60,1182,1183],{"class":66}," document",[60,1185,71],{"class":70},[60,1187,1188],{"class":66},"Auto",[60,1190,465],{"class":70},[60,1192,1193,1195,1197,1199,1201,1203,1206,1208,1210],{"class":62,"line":191},[60,1194,429],{"class":70},[60,1196,1178],{"class":66},[60,1198,1160],{"class":70},[60,1200,1183],{"class":66},[60,1202,71],{"class":70},[60,1204,1205],{"class":74},"Pt",[60,1207,78],{"class":70},[60,1209,1068],{"class":102},[60,1211,1212],{"class":70},")},\n",[60,1214,1215,1217,1219,1221,1223,1225,1227,1229,1232],{"class":62,"line":196},[60,1216,429],{"class":70},[60,1218,1178],{"class":66},[60,1220,1160],{"class":70},[60,1222,1183],{"class":66},[60,1224,71],{"class":70},[60,1226,1205],{"class":74},[60,1228,78],{"class":70},[60,1230,1231],{"class":102},"80",[60,1233,1212],{"class":70},[60,1235,1236,1238,1240,1242,1244,1246,1248,1250,1252],{"class":62,"line":206},[60,1237,429],{"class":70},[60,1239,1178],{"class":66},[60,1241,1160],{"class":70},[60,1243,1183],{"class":66},[60,1245,71],{"class":70},[60,1247,1205],{"class":74},[60,1249,78],{"class":70},[60,1251,1231],{"class":102},[60,1253,1212],{"class":70},[60,1255,1256],{"class":62,"line":216},[60,1257,1258],{"class":70},"    },\n",[60,1260,1261,1264,1266,1269],{"class":62,"line":226},[60,1262,1263],{"class":66},"    Header",[60,1265,1160],{"class":70},[60,1267,1268],{"class":977}," /* ... */",[60,1270,667],{"class":70},[60,1272,1273,1276,1278,1281],{"class":62,"line":236},[60,1274,1275],{"class":66},"    Body",[60,1277,1160],{"class":70},[60,1279,1280],{"class":977},"   /* ... */",[60,1282,667],{"class":70},[60,1284,1285],{"class":62,"line":242},[60,1286,407],{"class":70},[19,1288,1289,1290,1292,1293,1292,1295,1292,1297,1300,1301,1303,1304,1307],{},"document 레이어에서는 ",[23,1291,1188],{}," / ",[23,1294,1205],{},[23,1296,332],{},[23,1298,1299],{},"Pct"," 를 섞어 쓸 수 있다. 첫 ",[23,1302,1188],{}," 열은 고정 3 열을 뺀 나머지를 가져간다. CSS 의 ",[23,1305,1306],{},"\u003Ccol>"," 요소에 가깝지, 백분율 시스템과는 다르다.",[19,1309,1310,1313],{},[23,1311,1312],{},"c.Table(header, rows, ...)"," 가 해주던 셀 구성을 직접 써야 하지만, 종이 레터헤드에 인쇄해야 하고 열 위치가 정확히 고정되어야 하는 송장에는 그만한 가치가 있는 트레이드오프다.",[14,1315,1317],{"id":1316},"관련-레시피","관련 레시피",[1319,1320,1321,1330],"ul",{},[1322,1323,1324,1329],"li",{},[1325,1326,1328],"a",{"href":1327},"/ko/blog/12-column-grid","gpdf 의 12 열 그리드는 어떻게 동작하나?"," — 행의 12 열이 테이블 백분율 계산의 기준 \"부모 너비\" 를 어떻게 정하는가",[1322,1331,1332,1336,1337,1339],{},[1325,1333,1335],{"href":1334},"/ko/blog/invoice-pdf-go-under-50-lines","Go 로 50 줄 이내에 송장 PDF 만들기"," — ",[23,1338,896],{}," 를 송장 문서 전체의 맥락에서 보기",[14,1341,1343],{"id":1342},"gpdf-사용해-보기","gpdf 사용해 보기",[19,1345,1346],{},"gpdf 는 PDF 생성을 위한 Go 라이브러리다. MIT 라이선스, 외부 의존성 0, CJK 네이티브 지원.",[51,1348,1352],{"className":1349,"code":1350,"language":1351,"meta":56,"style":56},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[23,1353,1354],{"__ignoreMap":56},[60,1355,1356,1358,1361],{"class":62,"line":63},[60,1357,55],{"class":148},[60,1359,1360],{"class":375}," get",[60,1362,1363],{"class":375}," github.com/gpdf-dev/gpdf\n",[19,1365,1366,1372,1373],{},[1325,1367,1371],{"href":1368,"rel":1369},"https://github.com/gpdf-dev/gpdf",[1370],"nofollow","⭐ Star on GitHub"," · ",[1325,1374,1377],{"href":1375,"rel":1376},"https://gpdf.dev/ko/docs/quickstart",[1370],"문서 읽기",[1379,1380,1381],"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .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}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}",{"title":56,"searchDepth":152,"depth":152,"links":1383},[1384,1385,1386,1387,1388,1389,1390,1391,1392],{"id":16,"depth":152,"text":17},{"id":38,"depth":152,"text":39},{"id":134,"depth":152,"text":135},{"id":900,"depth":152,"text":901},{"id":936,"depth":152,"text":937},{"id":1094,"depth":152,"text":1095},{"id":1111,"depth":152,"text":1112},{"id":1316,"depth":152,"text":1317},{"id":1342,"depth":152,"text":1343},"2026-04-28","c.Table 에 template.ColumnWidths(...) 를 전달한다. 값은 부모 Col 너비에 대한 백분율. 합계 100 으로 전체 폭, 끝부분을 생략하면 남은 공간이 자동 분배된다.",false,"md",{"name":1398,"totalTime":1399,"tools":1400,"steps":1402},"gpdf 로 만든 테이블에 열별 너비 지정하기","PT10M",[1401],"Go 1.22+",[1403,1406,1409,1412],{"name":1404,"text":1405},"ColumnWidths 없이 먼저 만들어 열 개수를 확인한다","c.Table(header, rows) 를 호출한다. ColumnWidths 옵션이 없으면 gpdf 는 헤더에서 열 개수를 추론하고 부모 Col 너비를 균등하게 분할한다.",{"name":1407,"text":1408},"합계 100 의 백분율을 ColumnWidths 로 전달한다","c.Table 의 세 번째 인자에 template.ColumnWidths(40, 15, 20, 25) 를 추가한다. 각 값은 테이블 부모 너비 (= 배치된 grid Col 의 너비) 에 대한 백분율이다.",{"name":1410,"text":1411},"0 을 넘기면 그 열은 자동 분배된다","3 열 테이블에서 ColumnWidths(0, 30, 30) 으로 쓰면 뒤쪽 두 열이 각 30% 로 고정되고 남은 40% 가 첫 열에 할당된다.",{"name":1413,"text":1414},"열 개수보다 적은 값을 넘기면 끝부분이 균등 분배된다","3 열 테이블에서 ColumnWidths(40, 30) 을 넘기면 세 번째 열은 명시값이 없으니 남은 30% 를 가져가 40 / 30 / 30 이 된다.",null,{},"/ko/blog/table-column-widths",{"title":5,"description":1394},"ko/blog/014.table-column-widths",[1421,1422],"recipe","tutorial","QydlvODKxqIdHqGJOZZcafmJ_DkWK8AACY0yCon4Vsg",1779199026831]