[{"data":1,"prerenderedAt":1426},["ShallowReactive",2],{"blog-es-table-column-widths":3},{"id":4,"title":5,"author":6,"body":10,"date":1395,"description":1396,"draft":1397,"extension":1398,"howTo":1399,"image":1417,"meta":1418,"navigation":156,"path":1419,"seo":1420,"stem":1421,"tags":1422,"updated":1417,"__hash__":1425},"blogEs/es/blog/014.table-column-widths.md","¿Cómo defino el ancho de columnas en una tabla de 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":1384},"minimark",[13,18,36,40,51,123,130,133,137,890,900,904,915,930,936,940,943,957,960,970,1023,1030,1083,1094,1098,1105,1111,1115,1118,1288,1309,1316,1320,1342,1346,1349,1366,1380],[14,15,17],"h2",{"id":16},"la-pregunta-dicho-de-otra-forma","La pregunta, dicho de otra forma",[19,20,21,22,26,27,31,32,35],"p",{},"Tengo una tabla con cuatro columnas. Por defecto, ",[23,24,25],"code",{},"c.Table(header, rows)"," las hace todas del mismo ancho, pero para una factura la columna ",[28,29,30],"strong",{},"Descripción"," debería ser ancha y ",[28,33,34],{},"Cantidad"," debería ser estrecha. ¿Cómo le digo a gpdf el ancho por columna y qué unidad estoy fijando exactamente?",[14,37,39],{"id":38},"la-respuesta-rápida","La respuesta rápida",[19,41,42,43,46,47,50],{},"Pasa ",[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],{},"Los valores son ",[28,127,128],{},"porcentajes del ancho de contenido de la columna padre",", no puntos. No tienen que sumar 100, pero normalmente deberían — lo que falte deja espacio en blanco a la derecha, lo que sobre se desborda de la celda.",[19,131,132],{},"Ese es el caso común. Lo interesante está en qué pasa cuando los porcentajes no suman 100, cuando pasas menos valores que columnas, y qué es realmente el \"ancho padre\".",[14,134,136],{"id":135},"código-que-funciona-tabla-de-factura-de-cuatro-columnas","Código que funciona (tabla de factura de cuatro columnas)",[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{\"Descripción\", \"Cant.\", \"Precio unit.\", \"Total\"}\n    rows := [][]string{\n        {\"Contrato anual de soporte\", \"1\", \"1.200,00 €\", \"1.200,00 €\"},\n        {\"Formación in situ (por día)\", \"3\", \"800,00 €\", \"2.400,00 €\"},\n        {\"Desarrollo de plantilla a medida\", \"12\", \"95,00 €\", \"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,410,426,468,509,550,556,561,580,614,649,670,698,734,740,746,752,757,779,795,813,818,865,880,885],{"__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,387,389,391,393,396,398,400,402,405,407],{"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,386],{"class":376},"Cant.",[61,388,373],{"class":71},[61,390,85],{"class":71},[61,392,383],{"class":71},[61,394,395],{"class":376},"Precio unit.",[61,397,373],{"class":71},[61,399,85],{"class":71},[61,401,383],{"class":71},[61,403,404],{"class":376},"Total",[61,406,373],{"class":71},[61,408,409],{"class":71},"}\n",[61,411,413,416,418,421,423],{"class":63,"line":412},20,[61,414,415],{"class":67},"    rows ",[61,417,269],{"class":71},[61,419,420],{"class":71}," [][]",[61,422,367],{"class":366},[61,424,425],{"class":71},"{\n",[61,427,429,432,434,437,439,441,443,446,448,450,452,455,457,459,461,463,465],{"class":63,"line":428},21,[61,430,431],{"class":71},"        {",[61,433,373],{"class":71},[61,435,436],{"class":376},"Contrato anual de soporte",[61,438,373],{"class":71},[61,440,85],{"class":71},[61,442,383],{"class":71},[61,444,445],{"class":376},"1",[61,447,373],{"class":71},[61,449,85],{"class":71},[61,451,383],{"class":71},[61,453,454],{"class":376},"1.200,00 €",[61,456,373],{"class":71},[61,458,85],{"class":71},[61,460,383],{"class":71},[61,462,454],{"class":376},[61,464,373],{"class":71},[61,466,467],{"class":71},"},\n",[61,469,471,473,475,478,480,482,484,487,489,491,493,496,498,500,502,505,507],{"class":63,"line":470},22,[61,472,431],{"class":71},[61,474,373],{"class":71},[61,476,477],{"class":376},"Formación in situ (por día)",[61,479,373],{"class":71},[61,481,85],{"class":71},[61,483,383],{"class":71},[61,485,486],{"class":376},"3",[61,488,373],{"class":71},[61,490,85],{"class":71},[61,492,383],{"class":71},[61,494,495],{"class":376},"800,00 €",[61,497,373],{"class":71},[61,499,85],{"class":71},[61,501,383],{"class":71},[61,503,504],{"class":376},"2.400,00 €",[61,506,373],{"class":71},[61,508,467],{"class":71},[61,510,512,514,516,519,521,523,525,528,530,532,534,537,539,541,543,546,548],{"class":63,"line":511},23,[61,513,431],{"class":71},[61,515,373],{"class":71},[61,517,518],{"class":376},"Desarrollo de plantilla a medida",[61,520,373],{"class":71},[61,522,85],{"class":71},[61,524,383],{"class":71},[61,526,527],{"class":376},"12",[61,529,373],{"class":71},[61,531,85],{"class":71},[61,533,383],{"class":71},[61,535,536],{"class":376},"95,00 €",[61,538,373],{"class":71},[61,540,85],{"class":71},[61,542,383],{"class":71},[61,544,545],{"class":376},"1.140,00 €",[61,547,373],{"class":71},[61,549,467],{"class":71},[61,551,553],{"class":63,"line":552},24,[61,554,555],{"class":71},"    }\n",[61,557,559],{"class":63,"line":558},25,[61,560,157],{"emptyLinePlaceholder":156},[61,562,564,567,569,572,574,577],{"class":63,"line":563},26,[61,565,566],{"class":67},"    page ",[61,568,269],{"class":71},[61,570,571],{"class":67}," doc",[61,573,72],{"class":71},[61,575,576],{"class":75},"AddPage",[61,578,579],{"class":71},"()\n",[61,581,583,586,588,591,594,598,601,604,606,609,612],{"class":63,"line":582},27,[61,584,585],{"class":67},"    page",[61,587,72],{"class":71},[61,589,590],{"class":75},"AutoRow",[61,592,593],{"class":71},"(func(",[61,595,597],{"class":596},"sHdIc","r",[61,599,600],{"class":71}," *",[61,602,603],{"class":149},"template",[61,605,72],{"class":71},[61,607,608],{"class":149},"RowBuilder",[61,610,611],{"class":71},")",[61,613,260],{"class":71},[61,615,617,620,622,625,627,629,631,634,636,638,640,642,645,647],{"class":63,"line":616},28,[61,618,619],{"class":67},"        r",[61,621,72],{"class":71},[61,623,624],{"class":75},"Col",[61,626,79],{"class":71},[61,628,527],{"class":103},[61,630,85],{"class":71},[61,632,633],{"class":71}," func(",[61,635,68],{"class":596},[61,637,600],{"class":71},[61,639,603],{"class":149},[61,641,72],{"class":71},[61,643,644],{"class":149},"ColBuilder",[61,646,611],{"class":71},[61,648,260],{"class":71},[61,650,652,655,657,659,661,663,665,667],{"class":63,"line":651},29,[61,653,654],{"class":67},"            c",[61,656,72],{"class":71},[61,658,76],{"class":75},[61,660,79],{"class":71},[61,662,82],{"class":67},[61,664,85],{"class":71},[61,666,88],{"class":67},[61,668,669],{"class":71},",\n",[61,671,673,676,678,680,682,684,686,688,690,692,694,696],{"class":63,"line":672},30,[61,674,675],{"class":67},"                template",[61,677,72],{"class":71},[61,679,98],{"class":75},[61,681,79],{"class":71},[61,683,104],{"class":103},[61,685,85],{"class":71},[61,687,109],{"class":103},[61,689,85],{"class":71},[61,691,114],{"class":103},[61,693,85],{"class":71},[61,695,119],{"class":103},[61,697,304],{"class":71},[61,699,701,703,705,708,710,712,714,717,719,722,724,727,729,732],{"class":63,"line":700},31,[61,702,675],{"class":67},[61,704,72],{"class":71},[61,706,707],{"class":75},"TableHeaderStyle",[61,709,79],{"class":71},[61,711,603],{"class":67},[61,713,72],{"class":71},[61,715,716],{"class":75},"BgColor",[61,718,79],{"class":71},[61,720,721],{"class":67},"pdf",[61,723,72],{"class":71},[61,725,726],{"class":75},"Gray",[61,728,79],{"class":71},[61,730,731],{"class":103},"0.92",[61,733,341],{"class":71},[61,735,737],{"class":63,"line":736},32,[61,738,739],{"class":71},"            )\n",[61,741,743],{"class":63,"line":742},33,[61,744,745],{"class":71},"        })\n",[61,747,749],{"class":63,"line":748},34,[61,750,751],{"class":71},"    })\n",[61,753,755],{"class":63,"line":754},35,[61,756,157],{"emptyLinePlaceholder":156},[61,758,760,763,765,768,770,772,774,777],{"class":63,"line":759},36,[61,761,762],{"class":67},"    data",[61,764,85],{"class":71},[61,766,767],{"class":67}," err ",[61,769,269],{"class":71},[61,771,571],{"class":67},[61,773,72],{"class":71},[61,775,776],{"class":75},"Generate",[61,778,579],{"class":71},[61,780,782,785,787,790,793],{"class":63,"line":781},37,[61,783,784],{"class":163},"    if",[61,786,767],{"class":67},[61,788,789],{"class":71},"!=",[61,791,792],{"class":71}," nil",[61,794,260],{"class":71},[61,796,798,801,803,806,808,811],{"class":63,"line":797},38,[61,799,800],{"class":67},"        log",[61,802,72],{"class":71},[61,804,805],{"class":75},"Fatal",[61,807,79],{"class":71},[61,809,810],{"class":67},"err",[61,812,240],{"class":71},[61,814,816],{"class":63,"line":815},39,[61,817,555],{"class":71},[61,819,821,823,825,827,830,832,835,837,839,842,844,846,849,851,854,857,859,861,863],{"class":63,"line":820},40,[61,822,784],{"class":163},[61,824,767],{"class":67},[61,826,269],{"class":71},[61,828,829],{"class":67}," os",[61,831,72],{"class":71},[61,833,834],{"class":75},"WriteFile",[61,836,79],{"class":71},[61,838,373],{"class":71},[61,840,841],{"class":376},"invoice.pdf",[61,843,373],{"class":71},[61,845,85],{"class":71},[61,847,848],{"class":67}," data",[61,850,85],{"class":71},[61,852,853],{"class":103}," 0o644",[61,855,856],{"class":71},");",[61,858,767],{"class":67},[61,860,789],{"class":71},[61,862,792],{"class":71},[61,864,260],{"class":71},[61,866,868,870,872,874,876,878],{"class":63,"line":867},41,[61,869,800],{"class":67},[61,871,72],{"class":71},[61,873,805],{"class":75},[61,875,79],{"class":71},[61,877,810],{"class":67},[61,879,240],{"class":71},[61,881,883],{"class":63,"line":882},42,[61,884,555],{"class":71},[61,886,888],{"class":63,"line":887},43,[61,889,409],{"class":71},[19,891,892,895,896,899],{},[23,893,894],{},"r.Col(12, ...)"," ocupa todo el ancho de la fila. La tabla vive dentro de esa columna, así que el 100% de la tabla = 100% del área de contenido de la grid Col. Con ",[23,897,898],{},"ColumnWidths(40, 15, 20, 25)"," sumando 100, cada punto PDF horizontal queda usado.",[14,901,903],{"id":902},"de-qué-son-los-porcentajes-un-porcentaje","¿De qué son los porcentajes un porcentaje?",[19,905,906,907,910,911,914],{},"El número que pasas se envuelve en ",[23,908,909],{},"document.Pct(w)"," y se resuelve contra el ",[28,912,913],{},"ancho de contenido de la tabla",". Eso es el ancho de la grid Col en la que vive la tabla, menos el margen, padding y borde de la tabla (en la práctica, el ancho de la Col tal cual — el estilo de la tabla viene sin decoración por defecto).",[19,916,917,918,921,922,925,926,929],{},"Así que con ",[23,919,920],{},"r.Col(6, ...)"," (la mitad de la fila) y ",[23,923,924],{},"ColumnWidths(50, 50)",", cada columna de la tabla es ",[28,927,928],{},"el 25% del ancho de la fila",", no el 50%. Los porcentajes son locales a la tabla, no relativos a la página.",[19,931,932,933,935],{},"Esto importa cuando cambias una tabla de fila completa a una disposición lado a lado. La llamada a ",[23,934,98],{}," no necesita cambiar — escala sola.",[14,937,939],{"id":938},"qué-hace-gpdf-cuando-las-cuentas-no-cuadran","Qué hace gpdf cuando las cuentas no cuadran",[19,941,942],{},"Aparecen dos casos constantemente. La capa de layout los maneja de forma específica que vale la pena conocer.",[19,944,945,948,949,952,953,956],{},[28,946,947],{},"Caso 1: los porcentajes no suman 100."," Cada valor se toma tal cual. ",[23,950,951],{},"ColumnWidths(40, 30, 20)"," en una tabla de tres columnas produce columnas al 40%, 30% y 20% del padre — dejando el 10% libre a la derecha. ",[23,954,955],{},"ColumnWidths(50, 50, 50)"," se desborda; la tercera columna se sale del borde del padre y puede invadir la columna adyacente o salirse de la página.",[19,958,959],{},"No hay paso de normalización. gpdf confía en que tú hagas la aritmética.",[19,961,962,965,966,969],{},[28,963,964],{},"Caso 2: menos anchos que columnas."," Este es el más interesante. Las columnas finales se vuelven ",[28,967,968],{},"auto-width"," y reparten el resto por igual:",[52,971,973],{"className":54,"code":972,"language":56,"meta":57,"style":57},"// Tabla de tres columnas, solo dos anchos.\nc.Table(header3, rows3, template.ColumnWidths(40, 30))\n// → 40% / 30% / 30%   (la tercera columna recibe 100 - 40 - 30 = 30%)\n",[23,974,975,981,1018],{"__ignoreMap":57},[61,976,977],{"class":63,"line":64},[61,978,980],{"class":979},"sHwdD","// Tabla de tres columnas, solo dos anchos.\n",[61,982,983,985,987,989,991,994,996,999,1001,1003,1005,1007,1009,1011,1013,1016],{"class":63,"line":153},[61,984,68],{"class":67},[61,986,72],{"class":71},[61,988,76],{"class":75},[61,990,79],{"class":71},[61,992,993],{"class":67},"header3",[61,995,85],{"class":71},[61,997,998],{"class":67}," rows3",[61,1000,85],{"class":71},[61,1002,93],{"class":67},[61,1004,72],{"class":71},[61,1006,98],{"class":75},[61,1008,79],{"class":71},[61,1010,104],{"class":103},[61,1012,85],{"class":71},[61,1014,1015],{"class":103}," 30",[61,1017,122],{"class":71},[61,1019,1020],{"class":63,"line":160},[61,1021,1022],{"class":979},"// → 40% / 30% / 30%   (la tercera columna recibe 100 - 40 - 30 = 30%)\n",[19,1024,1025,1026,1029],{},"Si los anchos explícitos ya suman 100 o más, las columnas auto se quedan con ",[28,1027,1028],{},"ancho cero"," y desaparecen de hecho. Si suman menos de 100, lo que sobra se divide a partes iguales entre las columnas auto:",[52,1031,1033],{"className":54,"code":1032,"language":56,"meta":57,"style":57},"// Tabla de cinco columnas, dos anchos dados.\nc.Table(header5, rows5, template.ColumnWidths(50, 10))\n// → 50% / 10% / 13,33% / 13,33% / 13,33%   (40% repartido entre tres)\n",[23,1034,1035,1040,1078],{"__ignoreMap":57},[61,1036,1037],{"class":63,"line":64},[61,1038,1039],{"class":979},"// Tabla de cinco columnas, dos anchos dados.\n",[61,1041,1042,1044,1046,1048,1050,1053,1055,1058,1060,1062,1064,1066,1068,1071,1073,1076],{"class":63,"line":153},[61,1043,68],{"class":67},[61,1045,72],{"class":71},[61,1047,76],{"class":75},[61,1049,79],{"class":71},[61,1051,1052],{"class":67},"header5",[61,1054,85],{"class":71},[61,1056,1057],{"class":67}," rows5",[61,1059,85],{"class":71},[61,1061,93],{"class":67},[61,1063,72],{"class":71},[61,1065,98],{"class":75},[61,1067,79],{"class":71},[61,1069,1070],{"class":103},"50",[61,1072,85],{"class":71},[61,1074,1075],{"class":103}," 10",[61,1077,122],{"class":71},[61,1079,1080],{"class":63,"line":160},[61,1081,1082],{"class":979},"// → 50% / 10% / 13,33% / 13,33% / 13,33%   (40% repartido entre tres)\n",[19,1084,1085,1086,1089,1090,1093],{},"Hay un truco útil escondido en esta regla: pasar ",[23,1087,1088],{},"0"," también convierte una columna en auto. Así, ",[23,1091,1092],{},"ColumnWidths(0, 30, 30)"," en una tabla de tres columnas fija las dos últimas en 30% cada una y entrega el 40% restante a la primera columna. Es la forma de decir \"me importan estos anchos concretos; el resto que lo decida gpdf\".",[14,1095,1097],{"id":1096},"la-dirección-contraria-demasiados-anchos","La dirección contraria: demasiados anchos",[19,1099,1100,1101,1104],{},"Los valores extra más allá del número de columnas se ignoran en silencio. ",[23,1102,1103],{},"ColumnWidths(40, 30, 20, 10)"," en una tabla de dos columnas usa solo los dos primeros. Es indulgente pero también un imán para bugs — si borras una columna de la cabecera pero olvidas quitar el ancho correspondiente, gpdf no avisa. No hay log de advertencia.",[19,1106,1107,1108,1110],{},"El número de columnas en sí se deriva de la longitud de la fila de cabecera (o de la primera fila de body, si no hay cabecera). Añade una celda de cabecera y has añadido una columna; gpdf se dará cuenta y reequilibrará el ",[23,1109,98],{}," que pasaste.",[14,1112,1114],{"id":1113},"cuando-los-porcentajes-no-son-lo-que-quieres","Cuando los porcentajes no son lo que quieres",[19,1116,1117],{},"La API del builder solo expone porcentajes. Si realmente necesitas una columna de ancho fijo — por ejemplo, una columna \"Cant.\" de 50 pt que no escale con la página — tienes que bajar una capa al árbol del documento:",[52,1119,1121],{"className":54,"code":1120,"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,1122,1123,1133,1137,1155,1173,1192,1214,1235,1255,1260,1272,1284],{"__ignoreMap":57},[61,1124,1125,1127,1129,1131],{"class":63,"line":64},[61,1126,164],{"class":163},[61,1128,383],{"class":71},[61,1130,212],{"class":149},[61,1132,179],{"class":71},[61,1134,1135],{"class":63,"line":153},[61,1136,157],{"emptyLinePlaceholder":156},[61,1138,1139,1142,1144,1147,1149,1151,1153],{"class":63,"line":160},[61,1140,1141],{"class":67},"tbl ",[61,1143,269],{"class":71},[61,1145,1146],{"class":71}," &",[61,1148,319],{"class":149},[61,1150,72],{"class":71},[61,1152,76],{"class":149},[61,1154,425],{"class":71},[61,1156,1157,1160,1162,1164,1166,1168,1171],{"class":63,"line":170},[61,1158,1159],{"class":67},"    Columns",[61,1161,50],{"class":71},[61,1163,363],{"class":71},[61,1165,319],{"class":149},[61,1167,72],{"class":71},[61,1169,1170],{"class":149},"TableColumn",[61,1172,425],{"class":71},[61,1174,1175,1177,1180,1182,1185,1187,1190],{"class":63,"line":182},[61,1176,431],{"class":71},[61,1178,1179],{"class":67},"Width",[61,1181,50],{"class":71},[61,1183,1184],{"class":67}," document",[61,1186,72],{"class":71},[61,1188,1189],{"class":67},"Auto",[61,1191,467],{"class":71},[61,1193,1194,1196,1198,1200,1202,1204,1207,1209,1211],{"class":63,"line":192},[61,1195,431],{"class":71},[61,1197,1179],{"class":67},[61,1199,50],{"class":71},[61,1201,1184],{"class":67},[61,1203,72],{"class":71},[61,1205,1206],{"class":75},"Pt",[61,1208,79],{"class":71},[61,1210,1070],{"class":103},[61,1212,1213],{"class":71},")},\n",[61,1215,1216,1218,1220,1222,1224,1226,1228,1230,1233],{"class":63,"line":197},[61,1217,431],{"class":71},[61,1219,1179],{"class":67},[61,1221,50],{"class":71},[61,1223,1184],{"class":67},[61,1225,72],{"class":71},[61,1227,1206],{"class":75},[61,1229,79],{"class":71},[61,1231,1232],{"class":103},"80",[61,1234,1213],{"class":71},[61,1236,1237,1239,1241,1243,1245,1247,1249,1251,1253],{"class":63,"line":207},[61,1238,431],{"class":71},[61,1240,1179],{"class":67},[61,1242,50],{"class":71},[61,1244,1184],{"class":67},[61,1246,72],{"class":71},[61,1248,1206],{"class":75},[61,1250,79],{"class":71},[61,1252,1232],{"class":103},[61,1254,1213],{"class":71},[61,1256,1257],{"class":63,"line":217},[61,1258,1259],{"class":71},"    },\n",[61,1261,1262,1265,1267,1270],{"class":63,"line":227},[61,1263,1264],{"class":67},"    Header",[61,1266,50],{"class":71},[61,1268,1269],{"class":979}," /* ... */",[61,1271,669],{"class":71},[61,1273,1274,1277,1279,1282],{"class":63,"line":237},[61,1275,1276],{"class":67},"    Body",[61,1278,50],{"class":71},[61,1280,1281],{"class":979},"   /* ... */",[61,1283,669],{"class":71},[61,1285,1286],{"class":63,"line":243},[61,1287,409],{"class":71},[19,1289,1290,1291,1293,1294,1293,1296,1293,1298,1301,1302,1304,1305,1308],{},"Mezcla y combina: ",[23,1292,1189],{},", ",[23,1295,1206],{},[23,1297,333],{},[23,1299,1300],{},"Pct"," funcionan en la capa document. La primera columna con ",[23,1303,1189],{}," recoge lo que sobre tras restar las tres columnas fijas. Esto se parece más al elemento ",[23,1306,1307],{},"\u003Ccol>"," de CSS que a un sistema de porcentajes.",[19,1310,1311,1312,1315],{},"Renuncias a la comodidad de que ",[23,1313,1314],{},"c.Table(header, rows, ...)"," te construya las celdas, pero para facturas que se imprimen sobre papel timbrado físico con posiciones de columna estables, el cambio merece la pena.",[14,1317,1319],{"id":1318},"recetas-relacionadas","Recetas relacionadas",[1321,1322,1323,1332],"ul",{},[1324,1325,1326,1331],"li",{},[1327,1328,1330],"a",{"href":1329},"/es/blog/12-column-grid","¿Cómo funciona la cuadrícula de 12 columnas en gpdf?"," — cómo las 12 columnas de la fila se convierten en el ancho padre contra el que se resuelven los porcentajes de la tabla",[1324,1333,1334,1338,1339,1341],{},[1327,1335,1337],{"href":1336},"/es/blog/invoice-pdf-go-under-50-lines","Generar un PDF de factura en Go en menos de 50 líneas"," — ",[23,1340,898],{}," en el contexto del resto de un documento de factura",[14,1343,1345],{"id":1344},"prueba-gpdf","Prueba gpdf",[19,1347,1348],{},"gpdf es una biblioteca Go para generar PDFs. Licencia MIT, cero dependencias externas, soporte CJK nativo.",[52,1350,1354],{"className":1351,"code":1352,"language":1353,"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,1355,1356],{"__ignoreMap":57},[61,1357,1358,1360,1363],{"class":63,"line":64},[61,1359,56],{"class":149},[61,1361,1362],{"class":376}," get",[61,1364,1365],{"class":376}," github.com/gpdf-dev/gpdf\n",[19,1367,1368,1374,1375],{},[1327,1369,1373],{"href":1370,"rel":1371},"https://github.com/gpdf-dev/gpdf",[1372],"nofollow","⭐ Star en GitHub"," · ",[1327,1376,1379],{"href":1377,"rel":1378},"https://gpdf.dev/es/docs/quickstart",[1372],"Lee la documentación",[1381,1382,1383],"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":1385},[1386,1387,1388,1389,1390,1391,1392,1393,1394],{"id":16,"depth":153,"text":17},{"id":38,"depth":153,"text":39},{"id":135,"depth":153,"text":136},{"id":902,"depth":153,"text":903},{"id":938,"depth":153,"text":939},{"id":1096,"depth":153,"text":1097},{"id":1113,"depth":153,"text":1114},{"id":1318,"depth":153,"text":1319},{"id":1344,"depth":153,"text":1345},"2026-04-28","Pasa template.ColumnWidths(...) a c.Table. Los valores son porcentajes del ancho de la Col padre. Suman 100 para cubrir todo; los valores finales que falten se reparten automáticamente.",false,"md",{"name":1400,"totalTime":1401,"tools":1402,"steps":1404},"Asignar anchos por columna en una tabla construida con gpdf","PT10M",[1403],"Go 1.22+",[1405,1408,1411,1414],{"name":1406,"text":1407},"Construye la tabla sin anchos para confirmar el número de columnas","Llama a c.Table(header, rows). Sin la opción ColumnWidths, gpdf infiere el número de columnas desde la cabecera y reparte el ancho de la Col padre por igual.",{"name":1409,"text":1410},"Pasa porcentajes que sumen 100 con ColumnWidths","Añade template.ColumnWidths(40, 15, 20, 25) como tercer argumento de c.Table. Cada valor es un porcentaje del ancho padre de la tabla — la grid Col en la que vive.",{"name":1412,"text":1413},"Usa 0 para marcar una columna como autodistribuida","ColumnWidths(0, 30, 30) en una tabla de tres columnas fija las dos últimas en 30% cada una y entrega el 40% restante a la primera columna.",{"name":1415,"text":1416},"Pasa menos anchos que columnas para que las finales repartan lo que sobra","ColumnWidths(40, 30) en una tabla de tres columnas asigna 40 / 30 / 30 — la tercera columna recoge el 30% sobrante porque no tenía valor explícito.",null,{},"/es/blog/table-column-widths",{"title":5,"description":1396},"es/blog/014.table-column-widths",[1423,1424],"recipe","tutorial","hKJ9ROEvLEGyE2T28lrhnm8KCJ6m851hbPvZJyQEZEY",1779199042327]