[{"data":1,"prerenderedAt":1425},["ShallowReactive",2],{"blog-pt-table-column-widths":3},{"id":4,"title":5,"author":6,"body":10,"date":1394,"description":1395,"draft":1396,"extension":1397,"howTo":1398,"image":1416,"meta":1417,"navigation":156,"path":1418,"seo":1419,"stem":1420,"tags":1421,"updated":1416,"__hash__":1424},"blogPt/pt/blog/014.table-column-widths.md","Como defino a largura das colunas em uma tabela do 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":1383},"minimark",[13,18,36,40,51,123,130,133,137,889,899,903,914,929,935,939,942,956,959,969,1022,1029,1082,1093,1097,1104,1110,1114,1117,1287,1308,1315,1319,1341,1345,1348,1365,1379],[14,15,17],"h2",{"id":16},"a-pergunta-em-outras-palavras","A pergunta, em outras palavras",[19,20,21,22,26,27,31,32,35],"p",{},"Tenho uma tabela com quatro colunas. Por padrão, ",[23,24,25],"code",{},"c.Table(header, rows)"," deixa todas com a mesma largura, mas em uma fatura a coluna ",[28,29,30],"strong",{},"Descrição"," deveria ser larga e ",[28,33,34],{},"Qtd."," deveria ser estreita. Como digo ao gpdf as larguras por coluna, e qual unidade estou ajustando de fato?",[14,37,39],{"id":38},"a-resposta-rápida","A resposta rápida",[19,41,42,43,46,47,50],{},"Passe ",[23,44,45],{},"template.ColumnWidths(...)"," como ",[23,48,49],{},"TableOption",":",[52,53,58],"pre",{"className":54,"code":55,"language":56,"meta":57,"style":57},"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,59,60],{"__ignoreMap":57},[61,62,65,69,73,77,80,83,86,89,91,94,96,99,101,105,107,110,112,115,117,120],"span",{"class":63,"line":64},"line",1,[61,66,68],{"class":67},"sTEyZ","c",[61,70,72],{"class":71},"sMK4o",".",[61,74,76],{"class":75},"s2Zo4","Table",[61,78,79],{"class":71},"(",[61,81,82],{"class":67},"header",[61,84,85],{"class":71},",",[61,87,88],{"class":67}," rows",[61,90,85],{"class":71},[61,92,93],{"class":67}," template",[61,95,72],{"class":71},[61,97,98],{"class":75},"ColumnWidths",[61,100,79],{"class":71},[61,102,104],{"class":103},"sbssI","40",[61,106,85],{"class":71},[61,108,109],{"class":103}," 15",[61,111,85],{"class":71},[61,113,114],{"class":103}," 20",[61,116,85],{"class":71},[61,118,119],{"class":103}," 25",[61,121,122],{"class":71},"))\n",[19,124,125,126,129],{},"Os valores são ",[28,127,128],{},"porcentagens da largura de conteúdo da coluna pai",", não pontos. Não precisam somar 100, mas geralmente devem — o que faltar deixa espaço em branco à direita, o que sobrar transborda da célula.",[19,131,132],{},"Esse é o caso comum. As partes interessantes são o que acontece quando as porcentagens não somam 100, quando você passa menos valores do que colunas, e o que a \"largura pai\" é, exatamente.",[14,134,136],{"id":135},"código-que-funciona-tabela-de-fatura-com-quatro-colunas","Código que funciona (tabela de fatura com quatro colunas)",[52,138,140],{"className":54,"code":139,"language":56,"meta":57,"style":57},"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{\"Descrição\", \"Qtd.\", \"Preço unit.\", \"Total\"}\n    rows := [][]string{\n        {\"Contrato anual de suporte\", \"1\", \"R$ 1.200,00\", \"R$ 1.200,00\"},\n        {\"Treinamento presencial (por dia)\", \"3\", \"R$ 800,00\", \"R$ 2.400,00\"},\n        {\"Desenvolvimento de template sob medida\", \"12\", \"R$ 95,00\", \"R$ 1.140,00\"},\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,141,142,151,158,168,180,190,195,205,215,225,235,241,246,261,281,305,342,348,353,409,425,467,508,549,555,560,579,613,648,669,697,733,739,745,751,756,778,794,812,817,864,879,884],{"__ignoreMap":57},[61,143,144,147],{"class":63,"line":64},[61,145,146],{"class":71},"package",[61,148,150],{"class":149},"sBMFI"," main\n",[61,152,154],{"class":63,"line":153},2,[61,155,157],{"emptyLinePlaceholder":156},true,"\n",[61,159,161,165],{"class":63,"line":160},3,[61,162,164],{"class":163},"s7zQu","import",[61,166,167],{"class":71}," (\n",[61,169,171,174,177],{"class":63,"line":170},4,[61,172,173],{"class":71},"    \"",[61,175,176],{"class":149},"log",[61,178,179],{"class":71},"\"\n",[61,181,183,185,188],{"class":63,"line":182},5,[61,184,173],{"class":71},[61,186,187],{"class":149},"os",[61,189,179],{"class":71},[61,191,193],{"class":63,"line":192},6,[61,194,157],{"emptyLinePlaceholder":156},[61,196,198,200,203],{"class":63,"line":197},7,[61,199,173],{"class":71},[61,201,202],{"class":149},"github.com/gpdf-dev/gpdf",[61,204,179],{"class":71},[61,206,208,210,213],{"class":63,"line":207},8,[61,209,173],{"class":71},[61,211,212],{"class":149},"github.com/gpdf-dev/gpdf/document",[61,214,179],{"class":71},[61,216,218,220,223],{"class":63,"line":217},9,[61,219,173],{"class":71},[61,221,222],{"class":149},"github.com/gpdf-dev/gpdf/pdf",[61,224,179],{"class":71},[61,226,228,230,233],{"class":63,"line":227},10,[61,229,173],{"class":71},[61,231,232],{"class":149},"github.com/gpdf-dev/gpdf/template",[61,234,179],{"class":71},[61,236,238],{"class":63,"line":237},11,[61,239,240],{"class":71},")\n",[61,242,244],{"class":63,"line":243},12,[61,245,157],{"emptyLinePlaceholder":156},[61,247,249,252,255,258],{"class":63,"line":248},13,[61,250,251],{"class":71},"func",[61,253,254],{"class":75}," main",[61,256,257],{"class":71},"()",[61,259,260],{"class":71}," {\n",[61,262,264,267,270,273,275,278],{"class":63,"line":263},14,[61,265,266],{"class":67},"    doc ",[61,268,269],{"class":71},":=",[61,271,272],{"class":67}," gpdf",[61,274,72],{"class":71},[61,276,277],{"class":75},"NewDocument",[61,279,280],{"class":71},"(\n",[61,282,284,287,289,292,294,297,299,302],{"class":63,"line":283},15,[61,285,286],{"class":67},"        gpdf",[61,288,72],{"class":71},[61,290,291],{"class":75},"WithPageSize",[61,293,79],{"class":71},[61,295,296],{"class":67},"gpdf",[61,298,72],{"class":71},[61,300,301],{"class":67},"A4",[61,303,304],{"class":71},"),\n",[61,306,308,310,312,315,317,320,322,325,327,329,331,334,336,339],{"class":63,"line":307},16,[61,309,286],{"class":67},[61,311,72],{"class":71},[61,313,314],{"class":75},"WithMargins",[61,316,79],{"class":71},[61,318,319],{"class":67},"document",[61,321,72],{"class":71},[61,323,324],{"class":75},"UniformEdges",[61,326,79],{"class":71},[61,328,319],{"class":67},[61,330,72],{"class":71},[61,332,333],{"class":75},"Mm",[61,335,79],{"class":71},[61,337,338],{"class":103},"20",[61,340,341],{"class":71},"))),\n",[61,343,345],{"class":63,"line":344},17,[61,346,347],{"class":71},"    )\n",[61,349,351],{"class":63,"line":350},18,[61,352,157],{"emptyLinePlaceholder":156},[61,354,356,359,361,364,368,371,374,377,379,381,384,386,388,390,392,395,397,399,401,404,406],{"class":63,"line":355},19,[61,357,358],{"class":67},"    header ",[61,360,269],{"class":71},[61,362,363],{"class":71}," []",[61,365,367],{"class":366},"spNyl","string",[61,369,370],{"class":71},"{",[61,372,373],{"class":71},"\"",[61,375,30],{"class":376},"sfazB",[61,378,373],{"class":71},[61,380,85],{"class":71},[61,382,383],{"class":71}," \"",[61,385,34],{"class":376},[61,387,373],{"class":71},[61,389,85],{"class":71},[61,391,383],{"class":71},[61,393,394],{"class":376},"Preço unit.",[61,396,373],{"class":71},[61,398,85],{"class":71},[61,400,383],{"class":71},[61,402,403],{"class":376},"Total",[61,405,373],{"class":71},[61,407,408],{"class":71},"}\n",[61,410,412,415,417,420,422],{"class":63,"line":411},20,[61,413,414],{"class":67},"    rows ",[61,416,269],{"class":71},[61,418,419],{"class":71}," [][]",[61,421,367],{"class":366},[61,423,424],{"class":71},"{\n",[61,426,428,431,433,436,438,440,442,445,447,449,451,454,456,458,460,462,464],{"class":63,"line":427},21,[61,429,430],{"class":71},"        {",[61,432,373],{"class":71},[61,434,435],{"class":376},"Contrato anual de suporte",[61,437,373],{"class":71},[61,439,85],{"class":71},[61,441,383],{"class":71},[61,443,444],{"class":376},"1",[61,446,373],{"class":71},[61,448,85],{"class":71},[61,450,383],{"class":71},[61,452,453],{"class":376},"R$ 1.200,00",[61,455,373],{"class":71},[61,457,85],{"class":71},[61,459,383],{"class":71},[61,461,453],{"class":376},[61,463,373],{"class":71},[61,465,466],{"class":71},"},\n",[61,468,470,472,474,477,479,481,483,486,488,490,492,495,497,499,501,504,506],{"class":63,"line":469},22,[61,471,430],{"class":71},[61,473,373],{"class":71},[61,475,476],{"class":376},"Treinamento presencial (por dia)",[61,478,373],{"class":71},[61,480,85],{"class":71},[61,482,383],{"class":71},[61,484,485],{"class":376},"3",[61,487,373],{"class":71},[61,489,85],{"class":71},[61,491,383],{"class":71},[61,493,494],{"class":376},"R$ 800,00",[61,496,373],{"class":71},[61,498,85],{"class":71},[61,500,383],{"class":71},[61,502,503],{"class":376},"R$ 2.400,00",[61,505,373],{"class":71},[61,507,466],{"class":71},[61,509,511,513,515,518,520,522,524,527,529,531,533,536,538,540,542,545,547],{"class":63,"line":510},23,[61,512,430],{"class":71},[61,514,373],{"class":71},[61,516,517],{"class":376},"Desenvolvimento de template sob medida",[61,519,373],{"class":71},[61,521,85],{"class":71},[61,523,383],{"class":71},[61,525,526],{"class":376},"12",[61,528,373],{"class":71},[61,530,85],{"class":71},[61,532,383],{"class":71},[61,534,535],{"class":376},"R$ 95,00",[61,537,373],{"class":71},[61,539,85],{"class":71},[61,541,383],{"class":71},[61,543,544],{"class":376},"R$ 1.140,00",[61,546,373],{"class":71},[61,548,466],{"class":71},[61,550,552],{"class":63,"line":551},24,[61,553,554],{"class":71},"    }\n",[61,556,558],{"class":63,"line":557},25,[61,559,157],{"emptyLinePlaceholder":156},[61,561,563,566,568,571,573,576],{"class":63,"line":562},26,[61,564,565],{"class":67},"    page ",[61,567,269],{"class":71},[61,569,570],{"class":67}," doc",[61,572,72],{"class":71},[61,574,575],{"class":75},"AddPage",[61,577,578],{"class":71},"()\n",[61,580,582,585,587,590,593,597,600,603,605,608,611],{"class":63,"line":581},27,[61,583,584],{"class":67},"    page",[61,586,72],{"class":71},[61,588,589],{"class":75},"AutoRow",[61,591,592],{"class":71},"(func(",[61,594,596],{"class":595},"sHdIc","r",[61,598,599],{"class":71}," *",[61,601,602],{"class":149},"template",[61,604,72],{"class":71},[61,606,607],{"class":149},"RowBuilder",[61,609,610],{"class":71},")",[61,612,260],{"class":71},[61,614,616,619,621,624,626,628,630,633,635,637,639,641,644,646],{"class":63,"line":615},28,[61,617,618],{"class":67},"        r",[61,620,72],{"class":71},[61,622,623],{"class":75},"Col",[61,625,79],{"class":71},[61,627,526],{"class":103},[61,629,85],{"class":71},[61,631,632],{"class":71}," func(",[61,634,68],{"class":595},[61,636,599],{"class":71},[61,638,602],{"class":149},[61,640,72],{"class":71},[61,642,643],{"class":149},"ColBuilder",[61,645,610],{"class":71},[61,647,260],{"class":71},[61,649,651,654,656,658,660,662,664,666],{"class":63,"line":650},29,[61,652,653],{"class":67},"            c",[61,655,72],{"class":71},[61,657,76],{"class":75},[61,659,79],{"class":71},[61,661,82],{"class":67},[61,663,85],{"class":71},[61,665,88],{"class":67},[61,667,668],{"class":71},",\n",[61,670,672,675,677,679,681,683,685,687,689,691,693,695],{"class":63,"line":671},30,[61,673,674],{"class":67},"                template",[61,676,72],{"class":71},[61,678,98],{"class":75},[61,680,79],{"class":71},[61,682,104],{"class":103},[61,684,85],{"class":71},[61,686,109],{"class":103},[61,688,85],{"class":71},[61,690,114],{"class":103},[61,692,85],{"class":71},[61,694,119],{"class":103},[61,696,304],{"class":71},[61,698,700,702,704,707,709,711,713,716,718,721,723,726,728,731],{"class":63,"line":699},31,[61,701,674],{"class":67},[61,703,72],{"class":71},[61,705,706],{"class":75},"TableHeaderStyle",[61,708,79],{"class":71},[61,710,602],{"class":67},[61,712,72],{"class":71},[61,714,715],{"class":75},"BgColor",[61,717,79],{"class":71},[61,719,720],{"class":67},"pdf",[61,722,72],{"class":71},[61,724,725],{"class":75},"Gray",[61,727,79],{"class":71},[61,729,730],{"class":103},"0.92",[61,732,341],{"class":71},[61,734,736],{"class":63,"line":735},32,[61,737,738],{"class":71},"            )\n",[61,740,742],{"class":63,"line":741},33,[61,743,744],{"class":71},"        })\n",[61,746,748],{"class":63,"line":747},34,[61,749,750],{"class":71},"    })\n",[61,752,754],{"class":63,"line":753},35,[61,755,157],{"emptyLinePlaceholder":156},[61,757,759,762,764,767,769,771,773,776],{"class":63,"line":758},36,[61,760,761],{"class":67},"    data",[61,763,85],{"class":71},[61,765,766],{"class":67}," err ",[61,768,269],{"class":71},[61,770,570],{"class":67},[61,772,72],{"class":71},[61,774,775],{"class":75},"Generate",[61,777,578],{"class":71},[61,779,781,784,786,789,792],{"class":63,"line":780},37,[61,782,783],{"class":163},"    if",[61,785,766],{"class":67},[61,787,788],{"class":71},"!=",[61,790,791],{"class":71}," nil",[61,793,260],{"class":71},[61,795,797,800,802,805,807,810],{"class":63,"line":796},38,[61,798,799],{"class":67},"        log",[61,801,72],{"class":71},[61,803,804],{"class":75},"Fatal",[61,806,79],{"class":71},[61,808,809],{"class":67},"err",[61,811,240],{"class":71},[61,813,815],{"class":63,"line":814},39,[61,816,554],{"class":71},[61,818,820,822,824,826,829,831,834,836,838,841,843,845,848,850,853,856,858,860,862],{"class":63,"line":819},40,[61,821,783],{"class":163},[61,823,766],{"class":67},[61,825,269],{"class":71},[61,827,828],{"class":67}," os",[61,830,72],{"class":71},[61,832,833],{"class":75},"WriteFile",[61,835,79],{"class":71},[61,837,373],{"class":71},[61,839,840],{"class":376},"invoice.pdf",[61,842,373],{"class":71},[61,844,85],{"class":71},[61,846,847],{"class":67}," data",[61,849,85],{"class":71},[61,851,852],{"class":103}," 0o644",[61,854,855],{"class":71},");",[61,857,766],{"class":67},[61,859,788],{"class":71},[61,861,791],{"class":71},[61,863,260],{"class":71},[61,865,867,869,871,873,875,877],{"class":63,"line":866},41,[61,868,799],{"class":67},[61,870,72],{"class":71},[61,872,804],{"class":75},[61,874,79],{"class":71},[61,876,809],{"class":67},[61,878,240],{"class":71},[61,880,882],{"class":63,"line":881},42,[61,883,554],{"class":71},[61,885,887],{"class":63,"line":886},43,[61,888,408],{"class":71},[19,890,891,894,895,898],{},[23,892,893],{},"r.Col(12, ...)"," ocupa toda a largura da linha. A tabela vive dentro dessa coluna, então 100% da tabela = 100% da área de conteúdo da grid Col. Com ",[23,896,897],{},"ColumnWidths(40, 15, 20, 25)"," somando 100, cada ponto PDF horizontal é usado.",[14,900,902],{"id":901},"a-porcentagem-é-porcentagem-de-quê","A porcentagem é porcentagem de quê",[19,904,905,906,909,910,913],{},"O número que você passa é embrulhado em ",[23,907,908],{},"document.Pct(w)"," e resolvido contra a ",[28,911,912],{},"largura de conteúdo da tabela",". Isso é a largura da grid Col em que a tabela vive, menos qualquer margem, padding e borda da própria tabela (na prática, a largura da Col mesma — o estilo da tabela vem sem decoração por padrão).",[19,915,916,917,920,921,924,925,928],{},"Então, com ",[23,918,919],{},"r.Col(6, ...)"," (metade da linha) e ",[23,922,923],{},"ColumnWidths(50, 50)",", cada coluna da tabela é ",[28,926,927],{},"25% da largura da linha",", não 50%. As porcentagens são locais à tabela, não à página.",[19,930,931,932,934],{},"Isso importa quando você troca uma tabela de uma linha de largura total para um layout lado a lado. A chamada de ",[23,933,98],{}," não precisa mudar — ela escala sozinha.",[14,936,938],{"id":937},"o-que-o-gpdf-faz-quando-a-conta-não-fecha","O que o gpdf faz quando a conta não fecha",[19,940,941],{},"Dois casos aparecem o tempo todo. A camada de layout lida com eles de uma forma específica que vale a pena conhecer.",[19,943,944,947,948,951,952,955],{},[28,945,946],{},"Caso 1: as porcentagens não somam 100."," Cada valor é usado como está. ",[23,949,950],{},"ColumnWidths(40, 30, 20)"," em uma tabela de três colunas produz colunas em 40%, 30% e 20% da pai — deixando 10% vazio à direita. ",[23,953,954],{},"ColumnWidths(50, 50, 50)"," extravasa; a terceira coluna passa da borda direita da pai e pode invadir a coluna vizinha ou sair da página.",[19,957,958],{},"Não há um passo de normalização. gpdf confia em você para fazer a aritmética.",[19,960,961,964,965,968],{},[28,962,963],{},"Caso 2: menos larguras do que colunas."," Esse é o mais interessante. As colunas finais viram ",[28,966,967],{},"auto-width"," e dividem o resto igualmente:",[52,970,972],{"className":54,"code":971,"language":56,"meta":57,"style":57},"// Tabela de três colunas, só duas larguras dadas.\nc.Table(header3, rows3, template.ColumnWidths(40, 30))\n// → 40% / 30% / 30%   (a terceira coluna recebe 100 - 40 - 30 = 30%)\n",[23,973,974,980,1017],{"__ignoreMap":57},[61,975,976],{"class":63,"line":64},[61,977,979],{"class":978},"sHwdD","// Tabela de três colunas, só duas larguras dadas.\n",[61,981,982,984,986,988,990,993,995,998,1000,1002,1004,1006,1008,1010,1012,1015],{"class":63,"line":153},[61,983,68],{"class":67},[61,985,72],{"class":71},[61,987,76],{"class":75},[61,989,79],{"class":71},[61,991,992],{"class":67},"header3",[61,994,85],{"class":71},[61,996,997],{"class":67}," rows3",[61,999,85],{"class":71},[61,1001,93],{"class":67},[61,1003,72],{"class":71},[61,1005,98],{"class":75},[61,1007,79],{"class":71},[61,1009,104],{"class":103},[61,1011,85],{"class":71},[61,1013,1014],{"class":103}," 30",[61,1016,122],{"class":71},[61,1018,1019],{"class":63,"line":160},[61,1020,1021],{"class":978},"// → 40% / 30% / 30%   (a terceira coluna recebe 100 - 40 - 30 = 30%)\n",[19,1023,1024,1025,1028],{},"Se as larguras explícitas já somam 100 ou mais, as colunas auto recebem ",[28,1026,1027],{},"largura zero"," e somem efetivamente. Se somam menos de 100, o que sobra é dividido igualmente entre as colunas auto:",[52,1030,1032],{"className":54,"code":1031,"language":56,"meta":57,"style":57},"// Tabela de cinco colunas, duas larguras dadas.\nc.Table(header5, rows5, template.ColumnWidths(50, 10))\n// → 50% / 10% / 13,33% / 13,33% / 13,33%   (40% divididos entre três)\n",[23,1033,1034,1039,1077],{"__ignoreMap":57},[61,1035,1036],{"class":63,"line":64},[61,1037,1038],{"class":978},"// Tabela de cinco colunas, duas larguras dadas.\n",[61,1040,1041,1043,1045,1047,1049,1052,1054,1057,1059,1061,1063,1065,1067,1070,1072,1075],{"class":63,"line":153},[61,1042,68],{"class":67},[61,1044,72],{"class":71},[61,1046,76],{"class":75},[61,1048,79],{"class":71},[61,1050,1051],{"class":67},"header5",[61,1053,85],{"class":71},[61,1055,1056],{"class":67}," rows5",[61,1058,85],{"class":71},[61,1060,93],{"class":67},[61,1062,72],{"class":71},[61,1064,98],{"class":75},[61,1066,79],{"class":71},[61,1068,1069],{"class":103},"50",[61,1071,85],{"class":71},[61,1073,1074],{"class":103}," 10",[61,1076,122],{"class":71},[61,1078,1079],{"class":63,"line":160},[61,1080,1081],{"class":978},"// → 50% / 10% / 13,33% / 13,33% / 13,33%   (40% divididos entre três)\n",[19,1083,1084,1085,1088,1089,1092],{},"Há um truque útil escondido nessa regra: passar ",[23,1086,1087],{},"0"," também transforma uma coluna em auto. Assim, ",[23,1090,1091],{},"ColumnWidths(0, 30, 30)"," em uma tabela de três colunas fixa as duas últimas em 30% cada e entrega os 40% restantes à primeira coluna. É como dizer \"eu me importo com estas larguras específicas; o resto, gpdf que decida\".",[14,1094,1096],{"id":1095},"a-direção-oposta-largura-demais","A direção oposta: largura demais",[19,1098,1099,1100,1103],{},"Valores extras além da contagem de colunas são ignorados silenciosamente. ",[23,1101,1102],{},"ColumnWidths(40, 30, 20, 10)"," em uma tabela de duas colunas usa só os dois primeiros. É tolerante mas também um ímã de bugs — se você apaga uma coluna do cabeçalho e esquece de remover a largura correspondente, gpdf não avisa. Sem log de aviso.",[19,1105,1106,1107,1109],{},"A contagem de colunas em si vem do tamanho da linha de cabeçalho (ou da primeira linha de body, se não houver cabeçalho). Adicione uma célula de cabeçalho e você adicionou uma coluna; gpdf vai descobrir e rebalancear qualquer ",[23,1108,98],{}," que você tenha passado.",[14,1111,1113],{"id":1112},"quando-porcentagens-não-são-o-que-você-quer","Quando porcentagens não são o que você quer",[19,1115,1116],{},"A API do builder só expõe porcentagens. Se você realmente precisa de uma coluna de largura fixa — digamos, uma coluna \"Qtd.\" de 50 pt que não escale com a página — tem que descer uma camada para a árvore do documento:",[52,1118,1120],{"className":54,"code":1119,"language":56,"meta":57,"style":57},"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,1121,1122,1132,1136,1154,1172,1191,1213,1234,1254,1259,1271,1283],{"__ignoreMap":57},[61,1123,1124,1126,1128,1130],{"class":63,"line":64},[61,1125,164],{"class":163},[61,1127,383],{"class":71},[61,1129,212],{"class":149},[61,1131,179],{"class":71},[61,1133,1134],{"class":63,"line":153},[61,1135,157],{"emptyLinePlaceholder":156},[61,1137,1138,1141,1143,1146,1148,1150,1152],{"class":63,"line":160},[61,1139,1140],{"class":67},"tbl ",[61,1142,269],{"class":71},[61,1144,1145],{"class":71}," &",[61,1147,319],{"class":149},[61,1149,72],{"class":71},[61,1151,76],{"class":149},[61,1153,424],{"class":71},[61,1155,1156,1159,1161,1163,1165,1167,1170],{"class":63,"line":170},[61,1157,1158],{"class":67},"    Columns",[61,1160,50],{"class":71},[61,1162,363],{"class":71},[61,1164,319],{"class":149},[61,1166,72],{"class":71},[61,1168,1169],{"class":149},"TableColumn",[61,1171,424],{"class":71},[61,1173,1174,1176,1179,1181,1184,1186,1189],{"class":63,"line":182},[61,1175,430],{"class":71},[61,1177,1178],{"class":67},"Width",[61,1180,50],{"class":71},[61,1182,1183],{"class":67}," document",[61,1185,72],{"class":71},[61,1187,1188],{"class":67},"Auto",[61,1190,466],{"class":71},[61,1192,1193,1195,1197,1199,1201,1203,1206,1208,1210],{"class":63,"line":192},[61,1194,430],{"class":71},[61,1196,1178],{"class":67},[61,1198,50],{"class":71},[61,1200,1183],{"class":67},[61,1202,72],{"class":71},[61,1204,1205],{"class":75},"Pt",[61,1207,79],{"class":71},[61,1209,1069],{"class":103},[61,1211,1212],{"class":71},")},\n",[61,1214,1215,1217,1219,1221,1223,1225,1227,1229,1232],{"class":63,"line":197},[61,1216,430],{"class":71},[61,1218,1178],{"class":67},[61,1220,50],{"class":71},[61,1222,1183],{"class":67},[61,1224,72],{"class":71},[61,1226,1205],{"class":75},[61,1228,79],{"class":71},[61,1230,1231],{"class":103},"80",[61,1233,1212],{"class":71},[61,1235,1236,1238,1240,1242,1244,1246,1248,1250,1252],{"class":63,"line":207},[61,1237,430],{"class":71},[61,1239,1178],{"class":67},[61,1241,50],{"class":71},[61,1243,1183],{"class":67},[61,1245,72],{"class":71},[61,1247,1205],{"class":75},[61,1249,79],{"class":71},[61,1251,1231],{"class":103},[61,1253,1212],{"class":71},[61,1255,1256],{"class":63,"line":217},[61,1257,1258],{"class":71},"    },\n",[61,1260,1261,1264,1266,1269],{"class":63,"line":227},[61,1262,1263],{"class":67},"    Header",[61,1265,50],{"class":71},[61,1267,1268],{"class":978}," /* ... */",[61,1270,668],{"class":71},[61,1272,1273,1276,1278,1281],{"class":63,"line":237},[61,1274,1275],{"class":67},"    Body",[61,1277,50],{"class":71},[61,1279,1280],{"class":978},"   /* ... */",[61,1282,668],{"class":71},[61,1284,1285],{"class":63,"line":243},[61,1286,408],{"class":71},[19,1288,1289,1290,1292,1293,1292,1295,1292,1297,1300,1301,1303,1304,1307],{},"Misture e combine: ",[23,1291,1188],{},", ",[23,1294,1205],{},[23,1296,333],{},[23,1298,1299],{},"Pct"," funcionam na camada document. A primeira coluna com ",[23,1302,1188],{}," recebe o que sobrar depois que as três colunas fixas forem subtraídas. Isso é mais próximo do elemento ",[23,1305,1306],{},"\u003Ccol>"," do CSS do que de um sistema de porcentagens.",[19,1309,1310,1311,1314],{},"Você abre mão da conveniência de ",[23,1312,1313],{},"c.Table(header, rows, ...)"," montar as células para você, mas para faturas que precisam ser impressas em papel timbrado físico com posições de coluna estáveis, a troca compensa.",[14,1316,1318],{"id":1317},"receitas-relacionadas","Receitas relacionadas",[1320,1321,1322,1331],"ul",{},[1323,1324,1325,1330],"li",{},[1326,1327,1329],"a",{"href":1328},"/pt/blog/12-column-grid","Como funciona a grade de 12 colunas no gpdf?"," — como as 12 colunas da linha se tornam a largura pai contra a qual as porcentagens da tabela são resolvidas",[1323,1332,1333,1337,1338,1340],{},[1326,1334,1336],{"href":1335},"/pt/blog/invoice-pdf-go-under-50-lines","Gerar um PDF de fatura em Go com menos de 50 linhas"," — ",[23,1339,897],{}," no contexto do resto de um documento de fatura",[14,1342,1344],{"id":1343},"experimente-o-gpdf","Experimente o gpdf",[19,1346,1347],{},"gpdf é uma biblioteca Go para gerar PDFs. Licença MIT, zero dependências externas, suporte CJK nativo.",[52,1349,1353],{"className":1350,"code":1351,"language":1352,"meta":57,"style":57},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[23,1354,1355],{"__ignoreMap":57},[61,1356,1357,1359,1362],{"class":63,"line":64},[61,1358,56],{"class":149},[61,1360,1361],{"class":376}," get",[61,1363,1364],{"class":376}," github.com/gpdf-dev/gpdf\n",[19,1366,1367,1373,1374],{},[1326,1368,1372],{"href":1369,"rel":1370},"https://github.com/gpdf-dev/gpdf",[1371],"nofollow","⭐ Star no GitHub"," · ",[1326,1375,1378],{"href":1376,"rel":1377},"https://gpdf.dev/pt/docs/quickstart",[1371],"Leia a documentação",[1380,1381,1382],"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":57,"searchDepth":153,"depth":153,"links":1384},[1385,1386,1387,1388,1389,1390,1391,1392,1393],{"id":16,"depth":153,"text":17},{"id":38,"depth":153,"text":39},{"id":135,"depth":153,"text":136},{"id":901,"depth":153,"text":902},{"id":937,"depth":153,"text":938},{"id":1095,"depth":153,"text":1096},{"id":1112,"depth":153,"text":1113},{"id":1317,"depth":153,"text":1318},{"id":1343,"depth":153,"text":1344},"2026-04-28","Passe template.ColumnWidths(...) para c.Table. Os valores são porcentagens da largura da Col pai. Some 100 para preencher tudo; valores finais ausentes são distribuídos automaticamente.",false,"md",{"name":1399,"totalTime":1400,"tools":1401,"steps":1403},"Definir larguras por coluna em uma tabela construída com gpdf","PT10M",[1402],"Go 1.22+",[1404,1407,1410,1413],{"name":1405,"text":1406},"Construa a tabela sem larguras primeiro para confirmar a contagem de colunas","Chame c.Table(header, rows). Sem a opção ColumnWidths, gpdf infere o número de colunas pelo cabeçalho e divide a largura da Col pai igualmente.",{"name":1408,"text":1409},"Passe ColumnWidths como porcentagens que somem 100","Adicione template.ColumnWidths(40, 15, 20, 25) como terceiro argumento de c.Table. Cada valor é uma porcentagem da largura pai da tabela — a grid Col em que ela vive.",{"name":1411,"text":1412},"Use 0 para marcar uma coluna como autodistribuída","ColumnWidths(0, 30, 30) em uma tabela de três colunas fixa as duas últimas em 30% cada e entrega os 40% restantes para a primeira coluna.",{"name":1414,"text":1415},"Passe menos larguras do que colunas para deixar as finais dividirem o que sobra","ColumnWidths(40, 30) em uma tabela de três colunas atribui 40 / 30 / 30 — a terceira coluna pega os 30% que sobram porque não tinha valor explícito.",null,{},"/pt/blog/table-column-widths",{"title":5,"description":1395},"pt/blog/014.table-column-widths",[1422,1423],"recipe","tutorial","tDSFdCTxgnpAuifCjf3LFWHCXkY7uxYEeSgrvvKdKHs",1779199037365]