[{"data":1,"prerenderedAt":1128},["ShallowReactive",2],{"blog-pt-embed-png-transparency":3},{"id":4,"title":5,"author":6,"body":10,"date":1096,"description":1097,"draft":1098,"extension":1099,"howTo":1100,"image":1119,"meta":1120,"navigation":171,"path":1121,"seo":1122,"stem":1123,"tags":1124,"updated":1119,"__hash__":1127},"blogPt/pt/blog/015.embed-png-transparency.md","Como embuto um PNG com transparência no 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":1085},"minimark",[13,18,27,31,38,134,142,146,153,868,874,878,885,892,909,920,939,943,946,955,961,965,968,982,991,994,998,1005,1015,1019,1043,1047,1050,1067,1081],[14,15,17],"h2",{"id":16},"a-pergunta-em-outras-palavras","A pergunta, em outras palavras",[19,20,21,22,26],"p",{},"Tenho um logo ou um carimbo salvo como PNG com fundo transparente — ",[23,24,25],"code",{},"logo.png",", RGBA, o tipo que o Photoshop ou o Figma exportam. Quando eu embuto isso em um PDF gerado pelo gpdf, a área transparente continua transparente para a cor da minha página aparecer? Ou eu vou acabar com um quadrado branco em volta do logo?",[14,28,30],{"id":29},"a-resposta-rápida","A resposta rápida",[19,32,33,34,37],{},"Passe os bytes do PNG para ",[23,35,36],{},"c.Image"," e nada mais. O gpdf decodifica o canal alpha e escreve um objeto SMask (máscara suave) do PDF junto com a imagem. Pixels transparentes são renderizados 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],{},"Essa é a receita inteira. ",[138,139,140],"strong",{},"Você não achata o alpha contra um fundo branco. Não converte RGBA em RGB. Não passa nenhuma opção para \"ativar transparência\"."," O PNG continua sendo PNG até chegar no PDF.",[14,143,145],{"id":144},"um-exemplo-completo-que-você-pode-rodar","Um exemplo completo que você pode rodar",[19,147,148,149,152],{},"Para ver o alpha funcionando de verdade, precisa ter algo embaixo do PNG. Marca d'água sobre o texto do corpo é o caso clássico — ",[23,150,151],{},"page.Absolute"," prende o logo em coordenadas fixas enquanto o conteúdo de fluxo normal preenche a página abaixo.",[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(\"Relatório trimestral — Q1 2026\", template.FontSize(20), template.Bold())\n            c.Text(\"A receita cresceu 38% em base anual, impulsionada por renovações enterprise e três novos clientes em serviços financeiros. A margem operacional expandiu para 24% conforme o gasto com infraestrutura se estabilizou.\")\n            c.Text(\"O quadro encerrou o trimestre com 142 pessoas, contra 128 no fim do Q4. Engenharia respondeu por 9 das 14 contratações líquidas.\")\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,602,622,628,634,639,694,732,737,742,763,776,791,796,842,857,862],{"__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},"Relatório 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,589,592,595,598,600],{"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},"A receita cresceu 38",[48,586,588],{"class":587},"swJcz","% e",[48,590,591],{"class":84},"m base anual, impulsionada por renovações enterprise e três novos clientes em serviços financeiros. A margem operacional expandiu para 24",[48,593,594],{"class":587},"% c",[48,596,597],{"class":84},"onforme o gasto com infraestrutura se estabilizou.",[48,599,81],{"class":58},[48,601,89],{"class":58},[48,603,605,607,609,611,613,615,618,620],{"class":50,"line":604},29,[48,606,528],{"class":54},[48,608,71],{"class":58},[48,610,533],{"class":74},[48,612,78],{"class":58},[48,614,81],{"class":58},[48,616,617],{"class":84},"O quadro encerrou o trimestre com 142 pessoas, contra 128 no fim do Q4. Engenharia respondeu por 9 das 14 contratações líquidas.",[48,619,81],{"class":58},[48,621,89],{"class":58},[48,623,625],{"class":50,"line":624},30,[48,626,627],{"class":58},"        })\n",[48,629,631],{"class":50,"line":630},31,[48,632,633],{"class":58},"    })\n",[48,635,637],{"class":50,"line":636},32,[48,638,172],{"emptyLinePlaceholder":171},[48,640,642,644,646,649,651,653,655,657,659,662,664,667,669,671,673,676,678,680,682,684,686,688,690,692],{"class":50,"line":641},33,[48,643,458],{"class":54},[48,645,71],{"class":58},[48,647,648],{"class":74},"Absolute",[48,650,78],{"class":58},[48,652,119],{"class":54},[48,654,71],{"class":58},[48,656,124],{"class":74},[48,658,78],{"class":58},[48,660,661],{"class":129},"60",[48,663,558],{"class":58},[48,665,666],{"class":54}," document",[48,668,71],{"class":58},[48,670,124],{"class":74},[48,672,78],{"class":58},[48,674,675],{"class":129},"120",[48,677,558],{"class":58},[48,679,507],{"class":58},[48,681,95],{"class":469},[48,683,473],{"class":58},[48,685,476],{"class":165},[48,687,71],{"class":58},[48,689,518],{"class":165},[48,691,484],{"class":58},[48,693,264],{"class":58},[48,695,697,700,702,704,706,709,711,713,715,717,719,721,723,725,727,730],{"class":50,"line":696},34,[48,698,699],{"class":54},"        c",[48,701,71],{"class":58},[48,703,100],{"class":74},[48,705,78],{"class":58},[48,707,708],{"class":54},"stamp",[48,710,59],{"class":58},[48,712,109],{"class":54},[48,714,71],{"class":58},[48,716,114],{"class":74},[48,718,78],{"class":58},[48,720,119],{"class":54},[48,722,71],{"class":58},[48,724,124],{"class":74},[48,726,78],{"class":58},[48,728,729],{"class":129},"80",[48,731,133],{"class":58},[48,733,735],{"class":50,"line":734},35,[48,736,633],{"class":58},[48,738,740],{"class":50,"line":739},36,[48,741,172],{"emptyLinePlaceholder":171},[48,743,745,748,750,752,754,756,758,761],{"class":50,"line":744},37,[48,746,747],{"class":54},"    data",[48,749,59],{"class":58},[48,751,275],{"class":54},[48,753,65],{"class":58},[48,755,439],{"class":54},[48,757,71],{"class":58},[48,759,760],{"class":74},"Generate",[48,762,447],{"class":58},[48,764,766,768,770,772,774],{"class":50,"line":765},38,[48,767,300],{"class":178},[48,769,275],{"class":54},[48,771,305],{"class":58},[48,773,308],{"class":58},[48,775,264],{"class":58},[48,777,779,781,783,785,787,789],{"class":50,"line":778},39,[48,780,316],{"class":54},[48,782,71],{"class":58},[48,784,321],{"class":74},[48,786,78],{"class":58},[48,788,326],{"class":54},[48,790,89],{"class":58},[48,792,794],{"class":50,"line":793},40,[48,795,334],{"class":58},[48,797,799,801,803,805,807,809,812,814,816,819,821,823,826,828,831,834,836,838,840],{"class":50,"line":798},41,[48,800,300],{"class":178},[48,802,275],{"class":54},[48,804,65],{"class":58},[48,806,68],{"class":54},[48,808,71],{"class":58},[48,810,811],{"class":74},"WriteFile",[48,813,78],{"class":58},[48,815,81],{"class":58},[48,817,818],{"class":84},"report-draft.pdf",[48,820,81],{"class":58},[48,822,59],{"class":58},[48,824,825],{"class":54}," data",[48,827,59],{"class":58},[48,829,830],{"class":129}," 0o644",[48,832,833],{"class":58},");",[48,835,275],{"class":54},[48,837,305],{"class":58},[48,839,308],{"class":58},[48,841,264],{"class":58},[48,843,845,847,849,851,853,855],{"class":50,"line":844},42,[48,846,316],{"class":54},[48,848,71],{"class":58},[48,850,321],{"class":74},[48,852,78],{"class":58},[48,854,326],{"class":54},[48,856,89],{"class":58},[48,858,860],{"class":50,"line":859},43,[48,861,334],{"class":58},[48,863,865],{"class":50,"line":864},44,[48,866,867],{"class":58},"}\n",[19,869,870,871,873],{},"O carimbo \"DRAFT\" é um PNG RGBA com letras vermelhas em negrito e fundo totalmente transparente. Quando ele cai em cima do texto do corpo, cada pixel transparente revela o parágrafo de baixo. Substitua ",[23,872,290],{}," por qualquer logo, selo ou imagem de assinatura — mesmo caminho de código, mesmo tratamento do SMask.",[14,875,877],{"id":876},"o-que-o-gpdf-realmente-faz-com-o-png","O que o gpdf realmente faz com o PNG",[19,879,880,881,884],{},"A parte interessante está no lado do writer. O PDF não tem um único objeto \"imagem RGBA\". Ele tem um objeto de imagem RGB mais uma imagem ",[138,882,883],{},"SMask"," (máscara suave) opcional em escala de cinza, onde cada pixel da máscara é o valor alpha do pixel correspondente da imagem principal. O leitor de PDF compõe os dois em tempo de render.",[19,886,887,888,891],{},"Quando você entrega um PNG ao gpdf, o renderer (",[23,889,890],{},"document/render/pdftarget.go",") percorre a grade de pixels uma vez:",[893,894,895,899,902],"ul",{},[896,897,898],"li",{},"24 bits de RGB vão para o stream principal da imagem, comprimidos com FlateDecode.",[896,900,901],{},"8 bits de alpha vão para um stream SMask separado, também com FlateDecode.",[896,903,904,905,908],{},"O dicionário da imagem recebe ",[23,906,907],{},"/SMask \u003Cref>"," apontando para o stream alpha.",[19,910,911,912,915,916,919],{},"Se cada amostra alpha acabar sendo ",[23,913,914],{},"0xFF"," (totalmente opaca), o gpdf joga o buffer alpha fora e pula a escrita do SMask. ",[138,917,918],{},"Então um PNG opaco no estilo JPEG não te custa nada a mais na saída."," O custo só aparece quando o alpha está fazendo trabalho real.",[19,921,922,923,926,927,930,931,934,935,938],{},"Esse caminho todo é Go puro — ",[23,924,925],{},"image/png"," da biblioteca padrão faz a decodificação, ",[23,928,929],{},"compress/flate"," faz a compressão. ",[138,932,933],{},"Sem CGO, sem dependência de libpng."," Cross-compilar de macOS para ",[23,936,937],{},"linux/arm64"," para uma Lambda continua produzindo um binário estático.",[14,940,942],{"id":941},"a-armadilha-do-jpeg","A armadilha do JPEG",[19,944,945],{},"Se o seu logo \"transparente\" saiu de alguma ferramenta como JPEG, a transparência já se foi antes do gpdf ver o arquivo. JPEG não pode carregar canal alpha. A ferramenta que exportou achatou o alpha contra alguma cor de fundo (geralmente branco).",[19,947,948,951,952],{},[23,949,950],{},"c.Image(jpegBytes)"," funciona normalmente, mas a imagem embutida vai ter um retângulo opaco branco (ou preto, ou rosa) onde antes havia pixels transparentes. A correção é a montante: re-exporte como PNG. ",[138,953,954],{},"Não há opção no gpdf que traga a transparência de volta a partir de um JPEG.",[19,956,957,958,960],{},"O mesmo vale para o \"PNG-8\" com transparência de paleta. O decoder do gpdf usa o ",[23,959,925],{}," padrão do Go, que trata PNGs de paleta corretamente, então esse caso funciona. Mas se o seu pipeline de assets passou sem querer por uma etapa JPEG, os dados foram embora.",[14,962,964],{"id":963},"escala-e-marcas-dágua","Escala e marcas d'água",[19,966,967],{},"Duas extensões práticas cobrem a maioria dos casos reais.",[19,969,970,973,974,977,978,981],{},[138,971,972],{},"Escalando o logo",": passe ",[23,975,976],{},"template.FitWidth(document.Mm(40))"," ou ",[23,979,980],{},"template.FitHeight(document.Mm(20))",". O PNG é decodificado em resolução total e depois escalado em tempo de render usando a transformação de coordenadas do PDF — sem etapa de reamostragem no alpha. Bordas nítidas de qualquer jeito.",[19,983,984,987,988,990],{},[138,985,986],{},"Marcas d'água \"DRAFT\" diagonais",": gere a marca d'água como um PNG com alpha fraco (cerca de 25–40%) e solte na página com ",[23,989,151],{},", do mesmo jeito que o exemplo acima coloca o carimbo. Como o alpha é por pixel, dá para variar a opacidade dentro da marca d'água — degradês de fade, preenchimentos semitransparentes em volta de linhas sólidas do logo. O leitor de PDF compõe corretamente com o texto debaixo.",[19,992,993],{},"Se você precisa de um overlay com 30% de opacidade pixel-perfect, isso é uma decisão de hornear o alpha no seu editor de imagem. O gpdf reproduz os valores alpha que recebe; não há um multiplicador de opacidade por imagem na API do builder.",[14,995,997],{"id":996},"verificação-rápida-de-tamanho-de-arquivo","Verificação rápida de tamanho de arquivo",[19,999,1000,1001,1004],{},"PNG com alpha → stream RGB + stream SMask em escala de cinza significa ",[138,1002,1003],{},"cerca de 33% mais bytes"," que a mesma imagem sem alpha. Um embed de PNG opaco de 100 KB vira ~133 KB com o canal alpha junto. Para um logo, é invisível. Para um relatório de 50 páginas com marca d'água em todas elas, também é invisível — o SMask é registrado uma vez e referenciado em cada página, não duplicado.",[19,1006,1007,1008,977,1011,1014],{},"Se uma única imagem de repente custa megabytes, é o PNG fonte, não a codificação do gpdf. Passe por ",[23,1009,1010],{},"pngquant",[23,1012,1013],{},"oxipng"," antes de embutir. O canal alpha sobrevive a ambos.",[14,1016,1018],{"id":1017},"receitas-relacionadas","Receitas relacionadas",[893,1020,1021,1029,1036],{},[896,1022,1023,1028],{},[1024,1025,1027],"a",{"href":1026},"/pt/blog/embed-japanese-font","Como embuto uma fonte japonesa no gpdf?"," — o mesmo padrão \"passe os bytes e pronto\", mas para TrueType",[896,1030,1031,1035],{},[1024,1032,1034],{"href":1033},"/pt/blog/invoice-pdf-go-under-50-lines","Gere um PDF de fatura em Go em menos de 50 linhas"," — onde um logo corporativo transparente normalmente cai num documento real",[896,1037,1038,1042],{},[1024,1039,1041],{"href":1040},"/pt/blog/why-gpdf-is-faster","Por que o gpdf é 10–30× mais rápido que outras bibliotecas Go de PDF"," — o que o caminho de decodificação em Go puro custa (e economiza) na escala de microssegundos",[14,1044,1046],{"id":1045},"experimente-o-gpdf","Experimente o gpdf",[19,1048,1049],{},"O gpdf é uma biblioteca Go para gerar PDFs. Licença MIT, zero dependências externas, manuseio de PNG e TrueType em Go puro.",[39,1051,1055],{"className":1052,"code":1053,"language":1054,"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,1056,1057],{"__ignoreMap":44},[48,1058,1059,1061,1064],{"class":50,"line":51},[48,1060,43],{"class":165},[48,1062,1063],{"class":84}," get",[48,1065,1066],{"class":84}," github.com/gpdf-dev/gpdf\n",[19,1068,1069,1075,1076],{},[1024,1070,1074],{"href":1071,"rel":1072},"https://github.com/gpdf-dev/gpdf",[1073],"nofollow","⭐ Star on GitHub"," · ",[1024,1077,1080],{"href":1078,"rel":1079},"https://gpdf.dev/docs/quickstart",[1073],"Read the docs",[1082,1083,1084],"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}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":44,"searchDepth":92,"depth":92,"links":1086},[1087,1088,1089,1090,1091,1092,1093,1094,1095],{"id":16,"depth":92,"text":17},{"id":29,"depth":92,"text":30},{"id":144,"depth":92,"text":145},{"id":876,"depth":92,"text":877},{"id":941,"depth":92,"text":942},{"id":963,"depth":92,"text":964},{"id":996,"depth":92,"text":997},{"id":1017,"depth":92,"text":1018},{"id":1045,"depth":92,"text":1046},"2026-04-28","Passe os bytes do PNG para c.Image. O gpdf decodifica o canal alpha em um objeto SMask do PDF e fundos transparentes são renderizados corretamente.",false,"md",{"name":1101,"totalTime":1102,"tools":1103,"steps":1106},"Embutir um PNG transparente (RGBA com alpha) em um documento gpdf","PT5M",[1104,1105],"Go 1.22+","Um PNG RGBA com canal alpha (logo.png, stamp.png, etc.)",[1107,1110,1113,1116],{"name":1108,"text":1109},"Leia os bytes do PNG","Carregue o PNG com os.ReadFile em um []byte. Se quiser compilar o asset dentro do binário, //go:embed também serve.",{"name":1111,"text":1112},"Passe os bytes direto para c.Image","Dentro de uma coluna, chame c.Image(pngBytes). Não converta o PNG para RGB primeiro — o gpdf precisa do canal alpha intacto para reproduzir a transparência.",{"name":1114,"text":1115},"Coloque a imagem por cima do conteúdo existente com page.Absolute para uma marca d'água","Use page.Absolute(x, y, fn) para soltar o PNG em cima do texto do corpo. Os pixels transparentes deixam o texto debaixo aparecer — esse é o ponto de uma marca d'água.",{"name":1117,"text":1118},"Se o PNG for maior que sua coluna, escale com FitWidth ou FitHeight","Passe template.FitWidth(document.Mm(40)) para escalar o logo proporcionalmente. A proporção é mantida e o alpha sobrevive à reamostragem.",null,{},"/pt/blog/embed-png-transparency",{"title":5,"description":1097},"pt/blog/015.embed-png-transparency",[1125,1126],"recipe","tutorial","7QKx_exSiuX8QJUi-n3CqsY8gYGNydADsVhumyfsXbU",1779199037387]