[{"data":1,"prerenderedAt":1115},["ShallowReactive",2],{"blog-es-embed-png-transparency":3},{"id":4,"title":5,"author":6,"body":10,"date":1083,"description":1084,"draft":1085,"extension":1086,"howTo":1087,"image":1106,"meta":1107,"navigation":171,"path":1108,"seo":1109,"stem":1110,"tags":1111,"updated":1106,"__hash__":1114},"blogEs/es/blog/015.embed-png-transparency.md","¿Cómo incrusto un PNG con transparencia en 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":1072},"minimark",[13,18,27,31,38,134,142,146,153,855,861,865,872,879,896,907,926,930,933,942,948,952,955,969,978,981,985,992,1002,1006,1030,1034,1037,1054,1068],[14,15,17],"h2",{"id":16},"la-pregunta-dicho-de-otra-forma","La pregunta, dicho de otra forma",[19,20,21,22,26],"p",{},"Tengo un logo o un sello guardado como PNG con fondo transparente — ",[23,24,25],"code",{},"logo.png",", RGBA, lo típico que exporta Photoshop o Figma. Cuando lo incrusto en un PDF generado por gpdf, ¿la zona transparente se queda transparente y mi color de página se ve a través? ¿O voy a acabar con un cuadrado blanco alrededor del logo?",[14,28,30],{"id":29},"la-respuesta-rápida","La respuesta rápida",[19,32,33,34,37],{},"Pasa los bytes del PNG a ",[23,35,36],{},"c.Image"," y nada más. gpdf decodifica el canal alfa y escribe un objeto SMask (máscara suave) de PDF junto a la imagen. Los píxeles transparentes se renderizan como transparentes.",[39,40,45],"pre",{"className":41,"code":42,"language":43,"meta":44,"style":44},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","logo, _ := os.ReadFile(\"logo.png\")\nc.Image(logo, template.FitWidth(document.Mm(40)))\n","go","",[23,46,47,90],{"__ignoreMap":44},[48,49,52,56,60,63,66,69,72,76,79,82,85,87],"span",{"class":50,"line":51},"line",1,[48,53,55],{"class":54},"sTEyZ","logo",[48,57,59],{"class":58},"sMK4o",",",[48,61,62],{"class":54}," _ ",[48,64,65],{"class":58},":=",[48,67,68],{"class":54}," os",[48,70,71],{"class":58},".",[48,73,75],{"class":74},"s2Zo4","ReadFile",[48,77,78],{"class":58},"(",[48,80,81],{"class":58},"\"",[48,83,25],{"class":84},"sfazB",[48,86,81],{"class":58},[48,88,89],{"class":58},")\n",[48,91,93,96,98,101,103,105,107,110,112,115,117,120,122,125,127,131],{"class":50,"line":92},2,[48,94,95],{"class":54},"c",[48,97,71],{"class":58},[48,99,100],{"class":74},"Image",[48,102,78],{"class":58},[48,104,55],{"class":54},[48,106,59],{"class":58},[48,108,109],{"class":54}," template",[48,111,71],{"class":58},[48,113,114],{"class":74},"FitWidth",[48,116,78],{"class":58},[48,118,119],{"class":54},"document",[48,121,71],{"class":58},[48,123,124],{"class":74},"Mm",[48,126,78],{"class":58},[48,128,130],{"class":129},"sbssI","40",[48,132,133],{"class":58},")))\n",[19,135,136,137,141],{},"Esa es toda la receta. ",[138,139,140],"strong",{},"No aplanas el alfa contra un fondo blanco. No conviertes RGBA a RGB. No pasas ninguna opción para \"activar la transparencia\"."," El PNG sigue siendo PNG hasta llegar al PDF.",[14,143,145],{"id":144},"un-ejemplo-completo-que-puedes-ejecutar","Un ejemplo completo que puedes ejecutar",[19,147,148,149,152],{},"Para ver el alfa funcionando de verdad necesitas algo bajo el PNG. Una marca de agua sobre el texto del cuerpo es el caso canónico — ",[23,150,151],{},"page.Absolute"," clava el logo en coordenadas fijas mientras el contenido en flujo normal llena la página debajo.",[39,154,156],{"className":41,"code":155,"language":43,"meta":44,"style":44},"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/template\"\n)\n\nfunc main() {\n    stamp, err := os.ReadFile(\"draft-stamp.png\")\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    doc := gpdf.NewDocument(\n        gpdf.WithPageSize(gpdf.A4),\n        gpdf.WithMargins(document.UniformEdges(document.Mm(20))),\n    )\n\n    page := doc.AddPage()\n\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Text(\"Informe trimestral — Q1 2026\", template.FontSize(20), template.Bold())\n            c.Text(\"Los ingresos crecieron un 38% interanual, impulsados por renovaciones empresariales y tres nuevos clientes en servicios financieros. El margen operativo se expandió al 24% al estabilizarse el gasto en infraestructura.\")\n            c.Text(\"La plantilla cerró el trimestre en 142 personas, frente a 128 al cierre del Q4. Ingeniería representó 9 de las 14 incorporaciones netas.\")\n        })\n    })\n\n    page.Absolute(document.Mm(60), document.Mm(120), func(c *template.ColBuilder) {\n        c.Image(stamp, template.FitWidth(document.Mm(80)))\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"report-draft.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n",[23,157,158,167,173,183,195,205,210,220,230,240,245,250,265,295,311,329,335,340,359,383,418,424,429,448,453,487,523,569,589,609,615,621,626,681,719,724,729,750,763,778,783,829,844,849],{"__ignoreMap":44},[48,159,160,163],{"class":50,"line":51},[48,161,162],{"class":58},"package",[48,164,166],{"class":165},"sBMFI"," main\n",[48,168,169],{"class":50,"line":92},[48,170,172],{"emptyLinePlaceholder":171},true,"\n",[48,174,176,180],{"class":50,"line":175},3,[48,177,179],{"class":178},"s7zQu","import",[48,181,182],{"class":58}," (\n",[48,184,186,189,192],{"class":50,"line":185},4,[48,187,188],{"class":58},"    \"",[48,190,191],{"class":165},"log",[48,193,194],{"class":58},"\"\n",[48,196,198,200,203],{"class":50,"line":197},5,[48,199,188],{"class":58},[48,201,202],{"class":165},"os",[48,204,194],{"class":58},[48,206,208],{"class":50,"line":207},6,[48,209,172],{"emptyLinePlaceholder":171},[48,211,213,215,218],{"class":50,"line":212},7,[48,214,188],{"class":58},[48,216,217],{"class":165},"github.com/gpdf-dev/gpdf",[48,219,194],{"class":58},[48,221,223,225,228],{"class":50,"line":222},8,[48,224,188],{"class":58},[48,226,227],{"class":165},"github.com/gpdf-dev/gpdf/document",[48,229,194],{"class":58},[48,231,233,235,238],{"class":50,"line":232},9,[48,234,188],{"class":58},[48,236,237],{"class":165},"github.com/gpdf-dev/gpdf/template",[48,239,194],{"class":58},[48,241,243],{"class":50,"line":242},10,[48,244,89],{"class":58},[48,246,248],{"class":50,"line":247},11,[48,249,172],{"emptyLinePlaceholder":171},[48,251,253,256,259,262],{"class":50,"line":252},12,[48,254,255],{"class":58},"func",[48,257,258],{"class":74}," main",[48,260,261],{"class":58},"()",[48,263,264],{"class":58}," {\n",[48,266,268,271,273,276,278,280,282,284,286,288,291,293],{"class":50,"line":267},13,[48,269,270],{"class":54},"    stamp",[48,272,59],{"class":58},[48,274,275],{"class":54}," err ",[48,277,65],{"class":58},[48,279,68],{"class":54},[48,281,71],{"class":58},[48,283,75],{"class":74},[48,285,78],{"class":58},[48,287,81],{"class":58},[48,289,290],{"class":84},"draft-stamp.png",[48,292,81],{"class":58},[48,294,89],{"class":58},[48,296,298,301,303,306,309],{"class":50,"line":297},14,[48,299,300],{"class":178},"    if",[48,302,275],{"class":54},[48,304,305],{"class":58},"!=",[48,307,308],{"class":58}," nil",[48,310,264],{"class":58},[48,312,314,317,319,322,324,327],{"class":50,"line":313},15,[48,315,316],{"class":54},"        log",[48,318,71],{"class":58},[48,320,321],{"class":74},"Fatal",[48,323,78],{"class":58},[48,325,326],{"class":54},"err",[48,328,89],{"class":58},[48,330,332],{"class":50,"line":331},16,[48,333,334],{"class":58},"    }\n",[48,336,338],{"class":50,"line":337},17,[48,339,172],{"emptyLinePlaceholder":171},[48,341,343,346,348,351,353,356],{"class":50,"line":342},18,[48,344,345],{"class":54},"    doc ",[48,347,65],{"class":58},[48,349,350],{"class":54}," gpdf",[48,352,71],{"class":58},[48,354,355],{"class":74},"NewDocument",[48,357,358],{"class":58},"(\n",[48,360,362,365,367,370,372,375,377,380],{"class":50,"line":361},19,[48,363,364],{"class":54},"        gpdf",[48,366,71],{"class":58},[48,368,369],{"class":74},"WithPageSize",[48,371,78],{"class":58},[48,373,374],{"class":54},"gpdf",[48,376,71],{"class":58},[48,378,379],{"class":54},"A4",[48,381,382],{"class":58},"),\n",[48,384,386,388,390,393,395,397,399,402,404,406,408,410,412,415],{"class":50,"line":385},20,[48,387,364],{"class":54},[48,389,71],{"class":58},[48,391,392],{"class":74},"WithMargins",[48,394,78],{"class":58},[48,396,119],{"class":54},[48,398,71],{"class":58},[48,400,401],{"class":74},"UniformEdges",[48,403,78],{"class":58},[48,405,119],{"class":54},[48,407,71],{"class":58},[48,409,124],{"class":74},[48,411,78],{"class":58},[48,413,414],{"class":129},"20",[48,416,417],{"class":58},"))),\n",[48,419,421],{"class":50,"line":420},21,[48,422,423],{"class":58},"    )\n",[48,425,427],{"class":50,"line":426},22,[48,428,172],{"emptyLinePlaceholder":171},[48,430,432,435,437,440,442,445],{"class":50,"line":431},23,[48,433,434],{"class":54},"    page ",[48,436,65],{"class":58},[48,438,439],{"class":54}," doc",[48,441,71],{"class":58},[48,443,444],{"class":74},"AddPage",[48,446,447],{"class":58},"()\n",[48,449,451],{"class":50,"line":450},24,[48,452,172],{"emptyLinePlaceholder":171},[48,454,456,459,461,464,467,471,474,477,479,482,485],{"class":50,"line":455},25,[48,457,458],{"class":54},"    page",[48,460,71],{"class":58},[48,462,463],{"class":74},"AutoRow",[48,465,466],{"class":58},"(func(",[48,468,470],{"class":469},"sHdIc","r",[48,472,473],{"class":58}," *",[48,475,476],{"class":165},"template",[48,478,71],{"class":58},[48,480,481],{"class":165},"RowBuilder",[48,483,484],{"class":58},")",[48,486,264],{"class":58},[48,488,490,493,495,498,500,503,505,508,510,512,514,516,519,521],{"class":50,"line":489},26,[48,491,492],{"class":54},"        r",[48,494,71],{"class":58},[48,496,497],{"class":74},"Col",[48,499,78],{"class":58},[48,501,502],{"class":129},"12",[48,504,59],{"class":58},[48,506,507],{"class":58}," func(",[48,509,95],{"class":469},[48,511,473],{"class":58},[48,513,476],{"class":165},[48,515,71],{"class":58},[48,517,518],{"class":165},"ColBuilder",[48,520,484],{"class":58},[48,522,264],{"class":58},[48,524,526,529,531,534,536,538,541,543,545,547,549,552,554,556,559,561,563,566],{"class":50,"line":525},27,[48,527,528],{"class":54},"            c",[48,530,71],{"class":58},[48,532,533],{"class":74},"Text",[48,535,78],{"class":58},[48,537,81],{"class":58},[48,539,540],{"class":84},"Informe trimestral — Q1 2026",[48,542,81],{"class":58},[48,544,59],{"class":58},[48,546,109],{"class":54},[48,548,71],{"class":58},[48,550,551],{"class":74},"FontSize",[48,553,78],{"class":58},[48,555,414],{"class":129},[48,557,558],{"class":58},"),",[48,560,109],{"class":54},[48,562,71],{"class":58},[48,564,565],{"class":74},"Bold",[48,567,568],{"class":58},"())\n",[48,570,572,574,576,578,580,582,585,587],{"class":50,"line":571},28,[48,573,528],{"class":54},[48,575,71],{"class":58},[48,577,533],{"class":74},[48,579,78],{"class":58},[48,581,81],{"class":58},[48,583,584],{"class":84},"Los ingresos crecieron un 38% interanual, impulsados por renovaciones empresariales y tres nuevos clientes en servicios financieros. El margen operativo se expandió al 24% al estabilizarse el gasto en infraestructura.",[48,586,81],{"class":58},[48,588,89],{"class":58},[48,590,592,594,596,598,600,602,605,607],{"class":50,"line":591},29,[48,593,528],{"class":54},[48,595,71],{"class":58},[48,597,533],{"class":74},[48,599,78],{"class":58},[48,601,81],{"class":58},[48,603,604],{"class":84},"La plantilla cerró el trimestre en 142 personas, frente a 128 al cierre del Q4. Ingeniería representó 9 de las 14 incorporaciones netas.",[48,606,81],{"class":58},[48,608,89],{"class":58},[48,610,612],{"class":50,"line":611},30,[48,613,614],{"class":58},"        })\n",[48,616,618],{"class":50,"line":617},31,[48,619,620],{"class":58},"    })\n",[48,622,624],{"class":50,"line":623},32,[48,625,172],{"emptyLinePlaceholder":171},[48,627,629,631,633,636,638,640,642,644,646,649,651,654,656,658,660,663,665,667,669,671,673,675,677,679],{"class":50,"line":628},33,[48,630,458],{"class":54},[48,632,71],{"class":58},[48,634,635],{"class":74},"Absolute",[48,637,78],{"class":58},[48,639,119],{"class":54},[48,641,71],{"class":58},[48,643,124],{"class":74},[48,645,78],{"class":58},[48,647,648],{"class":129},"60",[48,650,558],{"class":58},[48,652,653],{"class":54}," document",[48,655,71],{"class":58},[48,657,124],{"class":74},[48,659,78],{"class":58},[48,661,662],{"class":129},"120",[48,664,558],{"class":58},[48,666,507],{"class":58},[48,668,95],{"class":469},[48,670,473],{"class":58},[48,672,476],{"class":165},[48,674,71],{"class":58},[48,676,518],{"class":165},[48,678,484],{"class":58},[48,680,264],{"class":58},[48,682,684,687,689,691,693,696,698,700,702,704,706,708,710,712,714,717],{"class":50,"line":683},34,[48,685,686],{"class":54},"        c",[48,688,71],{"class":58},[48,690,100],{"class":74},[48,692,78],{"class":58},[48,694,695],{"class":54},"stamp",[48,697,59],{"class":58},[48,699,109],{"class":54},[48,701,71],{"class":58},[48,703,114],{"class":74},[48,705,78],{"class":58},[48,707,119],{"class":54},[48,709,71],{"class":58},[48,711,124],{"class":74},[48,713,78],{"class":58},[48,715,716],{"class":129},"80",[48,718,133],{"class":58},[48,720,722],{"class":50,"line":721},35,[48,723,620],{"class":58},[48,725,727],{"class":50,"line":726},36,[48,728,172],{"emptyLinePlaceholder":171},[48,730,732,735,737,739,741,743,745,748],{"class":50,"line":731},37,[48,733,734],{"class":54},"    data",[48,736,59],{"class":58},[48,738,275],{"class":54},[48,740,65],{"class":58},[48,742,439],{"class":54},[48,744,71],{"class":58},[48,746,747],{"class":74},"Generate",[48,749,447],{"class":58},[48,751,753,755,757,759,761],{"class":50,"line":752},38,[48,754,300],{"class":178},[48,756,275],{"class":54},[48,758,305],{"class":58},[48,760,308],{"class":58},[48,762,264],{"class":58},[48,764,766,768,770,772,774,776],{"class":50,"line":765},39,[48,767,316],{"class":54},[48,769,71],{"class":58},[48,771,321],{"class":74},[48,773,78],{"class":58},[48,775,326],{"class":54},[48,777,89],{"class":58},[48,779,781],{"class":50,"line":780},40,[48,782,334],{"class":58},[48,784,786,788,790,792,794,796,799,801,803,806,808,810,813,815,818,821,823,825,827],{"class":50,"line":785},41,[48,787,300],{"class":178},[48,789,275],{"class":54},[48,791,65],{"class":58},[48,793,68],{"class":54},[48,795,71],{"class":58},[48,797,798],{"class":74},"WriteFile",[48,800,78],{"class":58},[48,802,81],{"class":58},[48,804,805],{"class":84},"report-draft.pdf",[48,807,81],{"class":58},[48,809,59],{"class":58},[48,811,812],{"class":54}," data",[48,814,59],{"class":58},[48,816,817],{"class":129}," 0o644",[48,819,820],{"class":58},");",[48,822,275],{"class":54},[48,824,305],{"class":58},[48,826,308],{"class":58},[48,828,264],{"class":58},[48,830,832,834,836,838,840,842],{"class":50,"line":831},42,[48,833,316],{"class":54},[48,835,71],{"class":58},[48,837,321],{"class":74},[48,839,78],{"class":58},[48,841,326],{"class":54},[48,843,89],{"class":58},[48,845,847],{"class":50,"line":846},43,[48,848,334],{"class":58},[48,850,852],{"class":50,"line":851},44,[48,853,854],{"class":58},"}\n",[19,856,857,858,860],{},"El sello \"DRAFT\" es un PNG RGBA con letras rojas en negrita y fondo completamente transparente. Cuando aterriza encima del texto del cuerpo, cada píxel transparente revela el párrafo de abajo. Sustituye ",[23,859,290],{}," por cualquier logo, sello o imagen de firma — misma ruta de código, mismo tratamiento del SMask.",[14,862,864],{"id":863},"lo-que-gpdf-hace-de-verdad-con-el-png","Lo que gpdf hace de verdad con el PNG",[19,866,867,868,871],{},"La parte interesante está en el lado del writer. PDF no tiene un objeto único de \"imagen RGBA\". Tiene un objeto de imagen RGB más una imagen ",[138,869,870],{},"SMask"," (máscara suave) opcional en escala de grises, donde cada píxel de la máscara es el valor alfa del píxel correspondiente de la imagen principal. El lector de PDF las compone en tiempo de render.",[19,873,874,875,878],{},"Cuando le pasas un PNG a gpdf, el renderer (",[23,876,877],{},"document/render/pdftarget.go",") recorre la malla de píxeles una vez:",[880,881,882,886,889],"ul",{},[883,884,885],"li",{},"24 bits de RGB van al stream principal de la imagen, comprimidos con FlateDecode.",[883,887,888],{},"8 bits de alfa van a un stream SMask separado, también con FlateDecode.",[883,890,891,892,895],{},"El diccionario de la imagen recibe ",[23,893,894],{},"/SMask \u003Cref>"," apuntando al stream alfa.",[19,897,898,899,902,903,906],{},"Si todas las muestras alfa terminan siendo ",[23,900,901],{},"0xFF"," (totalmente opacas), gpdf descarta el buffer de alfa y se salta la escritura del SMask. ",[138,904,905],{},"Así, un PNG opaco al estilo JPEG no te cuesta nada extra en la salida."," El coste solo aparece cuando el alfa hace trabajo real.",[19,908,909,910,913,914,917,918,921,922,925],{},"Toda la ruta es Go puro — ",[23,911,912],{},"image/png"," de la biblioteca estándar hace la decodificación y ",[23,915,916],{},"compress/flate"," se encarga de la compresión. ",[138,919,920],{},"Sin CGO, sin dependencia de libpng."," Compilar de macOS a ",[23,923,924],{},"linux/arm64"," para una Lambda sigue produciendo un binario estático.",[14,927,929],{"id":928},"la-trampa-del-jpeg","La trampa del JPEG",[19,931,932],{},"Si tu logo \"transparente\" salió de una herramienta como JPEG, la transparencia ya no existe antes de que gpdf vea el archivo. JPEG no puede llevar canal alfa. La herramienta que exportó ha aplanado el alfa contra el color de fondo que le pareciera, normalmente blanco.",[19,934,935,938,939],{},[23,936,937],{},"c.Image(jpegBytes)"," funciona bien, pero la imagen incrustada tendrá un rectángulo opaco blanco (o negro, o rosa) donde antes había píxeles transparentes. La solución está aguas arriba: re-exporta como PNG. ",[138,940,941],{},"No hay opción en gpdf que recupere la transparencia perdida en el JPEG.",[19,943,944,945,947],{},"Lo mismo aplica al \"PNG-8\" con transparencia de paleta. El decoder de gpdf usa el ",[23,946,912],{}," estándar de Go, que maneja correctamente los PNG de paleta, así que ese caso funciona. Pero si tu pipeline de activos pasó por un paso JPEG sin querer, los datos ya están perdidos.",[14,949,951],{"id":950},"tamaño-y-marcas-de-agua","Tamaño y marcas de agua",[19,953,954],{},"Dos extensiones prácticas cubren la mayoría de casos reales.",[19,956,957,960,961,964,965,968],{},[138,958,959],{},"Escalar el logo",": pasa ",[23,962,963],{},"template.FitWidth(document.Mm(40))"," o ",[23,966,967],{},"template.FitHeight(document.Mm(20))",". El PNG se decodifica en su resolución completa y luego se escala en tiempo de render con la transformación de coordenadas de PDF — no hay paso de remuestreo sobre el alfa. Bordes nítidos en cualquier caso.",[19,970,971,974,975,977],{},[138,972,973],{},"Marcas de agua diagonales \"DRAFT\"",": cuece la marca de agua como un PNG con alfa tenue (en torno al 25–40%) y suéltala en la página con ",[23,976,151],{},", igual que el ejemplo de arriba con el sello. Como el alfa es por píxel, puedes variar la opacidad dentro de la marca — desvanecimientos en gradiente, rellenos semitransparentes alrededor de líneas sólidas del logo. El lector de PDF la compone correctamente con el texto debajo.",[19,979,980],{},"Si necesitas un overlay con un 30% de opacidad pixel-perfect, esa es una decisión de horneado del alfa en tu editor de imagen. gpdf reproduce los valores alfa que recibe; no ofrece un multiplicador de opacidad por imagen en la API del builder.",[14,982,984],{"id":983},"sanity-check-de-tamaño-de-archivo","Sanity check de tamaño de archivo",[19,986,987,988,991],{},"PNG con alfa → stream RGB + stream SMask en escala de grises significa ",[138,989,990],{},"alrededor de un 33% más de bytes"," que la misma imagen sin alfa. Una incrustación de PNG opaco de 100 KB pasa a unos 133 KB con el canal alfa adjunto. Para un logo es invisible. Para un informe de 50 páginas con marca de agua en cada página también es invisible — el SMask se registra una vez y se referencia desde cada página, no se duplica.",[19,993,994,995,964,998,1001],{},"Si una sola imagen empieza a costarte megabytes, es el PNG fuente, no la codificación de gpdf. Pásalo por ",[23,996,997],{},"pngquant",[23,999,1000],{},"oxipng"," antes de incrustar. El canal alfa sobrevive a ambos.",[14,1003,1005],{"id":1004},"recetas-relacionadas","Recetas relacionadas",[880,1007,1008,1016,1023],{},[883,1009,1010,1015],{},[1011,1012,1014],"a",{"href":1013},"/es/blog/embed-japanese-font","¿Cómo incrusto una fuente japonesa en gpdf?"," — el mismo patrón \"pasa los bytes y ya\", pero para TrueType",[883,1017,1018,1022],{},[1011,1019,1021],{"href":1020},"/es/blog/invoice-pdf-go-under-50-lines","Genera un PDF de factura en Go en menos de 50 líneas"," — donde un logo corporativo transparente acaba en un documento real",[883,1024,1025,1029],{},[1011,1026,1028],{"href":1027},"/es/blog/why-gpdf-is-faster","Por qué gpdf es 10–30× más rápido que otras librerías Go de PDF"," — qué cuesta (y qué ahorra) la ruta de decodificación pura en Go a nivel de microsegundos",[14,1031,1033],{"id":1032},"prueba-gpdf","Prueba gpdf",[19,1035,1036],{},"gpdf es una librería Go para generar PDFs. Licencia MIT, cero dependencias externas, manejo de PNG y TrueType en Go puro.",[39,1038,1042],{"className":1039,"code":1040,"language":1041,"meta":44,"style":44},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[23,1043,1044],{"__ignoreMap":44},[48,1045,1046,1048,1051],{"class":50,"line":51},[48,1047,43],{"class":165},[48,1049,1050],{"class":84}," get",[48,1052,1053],{"class":84}," github.com/gpdf-dev/gpdf\n",[19,1055,1056,1062,1063],{},[1011,1057,1061],{"href":1058,"rel":1059},"https://github.com/gpdf-dev/gpdf",[1060],"nofollow","⭐ Star on GitHub"," · ",[1011,1064,1067],{"href":1065,"rel":1066},"https://gpdf.dev/docs/quickstart",[1060],"Read the docs",[1069,1070,1071],"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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":44,"searchDepth":92,"depth":92,"links":1073},[1074,1075,1076,1077,1078,1079,1080,1081,1082],{"id":16,"depth":92,"text":17},{"id":29,"depth":92,"text":30},{"id":144,"depth":92,"text":145},{"id":863,"depth":92,"text":864},{"id":928,"depth":92,"text":929},{"id":950,"depth":92,"text":951},{"id":983,"depth":92,"text":984},{"id":1004,"depth":92,"text":1005},{"id":1032,"depth":92,"text":1033},"2026-04-28","Pasa los bytes del PNG a c.Image. gpdf decodifica el canal alfa en un objeto SMask de PDF y los fondos transparentes se renderizan correctamente.",false,"md",{"name":1088,"totalTime":1089,"tools":1090,"steps":1093},"Incrustar un PNG transparente (RGBA con alfa) en un documento gpdf","PT5M",[1091,1092],"Go 1.22+","Un PNG RGBA con canal alfa (logo.png, stamp.png, etc.)",[1094,1097,1100,1103],{"name":1095,"text":1096},"Lee los bytes del PNG","Carga el PNG con os.ReadFile en un []byte. Si quieres compilar el activo dentro del binario, //go:embed también funciona.",{"name":1098,"text":1099},"Pasa los bytes directos a c.Image","Dentro de una columna, llama a c.Image(pngBytes). No conviertas el PNG a RGB primero — gpdf necesita el canal alfa intacto para reproducir la transparencia.",{"name":1101,"text":1102},"Coloca la imagen sobre contenido existente con page.Absolute para una marca de agua","Usa page.Absolute(x, y, fn) para soltar el PNG encima del texto del cuerpo. Los píxeles transparentes dejan que el texto de abajo se vea — eso es lo que define una marca de agua.",{"name":1104,"text":1105},"Si el PNG es mayor que tu columna, escala con FitWidth o FitHeight","Pasa template.FitWidth(document.Mm(40)) para escalar el logo proporcionalmente. La relación de aspecto se conserva y el alfa sobrevive al remuestreo.",null,{},"/es/blog/embed-png-transparency",{"title":5,"description":1084},"es/blog/015.embed-png-transparency",[1112,1113],"recipe","tutorial","UP2zAvbQtePu4Nuv_2J1ZyedzZhp_yxpH35ZJtZdQig",1779199042333]