[{"data":1,"prerenderedAt":1109},["ShallowReactive",2],{"blog-zh-embed-png-transparency":3},{"id":4,"title":5,"author":6,"body":10,"date":1077,"description":1078,"draft":1079,"extension":1080,"howTo":1081,"image":1100,"meta":1101,"navigation":165,"path":1102,"seo":1103,"stem":1104,"tags":1105,"updated":1100,"__hash__":1108},"blogZh/zh/blog/015.embed-png-transparency.md","如何在 gpdf 中嵌入带透明度的 PNG？",{"name":7,"url":8,"avatar":9},"Taiki Noda","https://nadai.dev/en/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":1066},"minimark",[13,17,21,24,32,129,137,140,147,849,857,861,868,875,892,903,922,926,929,939,945,948,951,965,974,977,980,987,997,1000,1024,1028,1031,1048,1062],[14,15,16],"h2",{"id":16},"换个说法的问题",[18,19,20],"p",{},"我有一个 logo 或印章，存成了背景透明的 PNG —— 就是 Photoshop、Figma 通常导出的那种 RGBA PNG。把它嵌进 gpdf 生成的 PDF 时，透明区域会保持透明吗？还是 logo 周围会出现一个白色矩形？",[14,22,23],{"id":23},"一句话回答",[18,25,26,27,31],{},"把 PNG 字节传给 ",[28,29,30],"code",{},"c.Image"," 就够了，不需要其他设置。gpdf 会解码 alpha 通道，并和图像一起写出一个 PDF SMask (软掩码) 对象。透明像素会被正确渲染成透明。",[33,34,39],"pre",{"className":35,"code":36,"language":37,"meta":38,"style":38},"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","",[28,40,41,85],{"__ignoreMap":38},[42,43,46,50,54,57,60,63,66,70,73,76,80,82],"span",{"class":44,"line":45},"line",1,[42,47,49],{"class":48},"sTEyZ","logo",[42,51,53],{"class":52},"sMK4o",",",[42,55,56],{"class":48}," _ ",[42,58,59],{"class":52},":=",[42,61,62],{"class":48}," os",[42,64,65],{"class":52},".",[42,67,69],{"class":68},"s2Zo4","ReadFile",[42,71,72],{"class":52},"(",[42,74,75],{"class":52},"\"",[42,77,79],{"class":78},"sfazB","logo.png",[42,81,75],{"class":52},[42,83,84],{"class":52},")\n",[42,86,88,91,93,96,98,100,102,105,107,110,112,115,117,120,122,126],{"class":44,"line":87},2,[42,89,90],{"class":48},"c",[42,92,65],{"class":52},[42,94,95],{"class":68},"Image",[42,97,72],{"class":52},[42,99,49],{"class":48},[42,101,53],{"class":52},[42,103,104],{"class":48}," template",[42,106,65],{"class":52},[42,108,109],{"class":68},"FitWidth",[42,111,72],{"class":52},[42,113,114],{"class":48},"document",[42,116,65],{"class":52},[42,118,119],{"class":68},"Mm",[42,121,72],{"class":52},[42,123,125],{"class":124},"sbssI","40",[42,127,128],{"class":52},")))\n",[18,130,131,132,136],{},"整个食谱就是这个。",[133,134,135],"strong",{},"不用先把 alpha 平铺到白色背景上，不用把 RGBA 转成 RGB，也不用传什么\"启用透明度\"的选项。"," PNG 还是 PNG，一路保留到 PDF。",[14,138,139],{"id":139},"一段可以直接跑的完整代码",[18,141,142,143,146],{},"要让透明度真的可见，PNG 下面得有东西能透出来。在正文上盖水印是最经典的场景 —— ",[28,144,145],{},"page.Absolute"," 把 logo 钉在固定坐标，正常流式内容在它下方铺满页面。",[33,148,150],{"className":35,"code":149,"language":37,"meta":38,"style":38},"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(\"季度报告 — 2026 年 Q1\", template.FontSize(20), template.Bold())\n            c.Text(\"第一季度营收同比增长 38%，主要来自企业客户续约和金融服务行业 3 个新客户的签约。基础设施支出趋于平稳，营业利润率扩张到 24%。\")\n            c.Text(\"季末员工总数 142 人，比上季度末 128 人净增 14 人，其中工程团队招聘 9 人。\")\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",[28,151,152,161,167,177,189,199,204,214,224,234,239,244,259,289,305,323,329,334,353,377,412,418,423,442,447,481,517,563,583,603,609,615,620,675,713,718,723,744,757,772,777,823,838,843],{"__ignoreMap":38},[42,153,154,157],{"class":44,"line":45},[42,155,156],{"class":52},"package",[42,158,160],{"class":159},"sBMFI"," main\n",[42,162,163],{"class":44,"line":87},[42,164,166],{"emptyLinePlaceholder":165},true,"\n",[42,168,170,174],{"class":44,"line":169},3,[42,171,173],{"class":172},"s7zQu","import",[42,175,176],{"class":52}," (\n",[42,178,180,183,186],{"class":44,"line":179},4,[42,181,182],{"class":52},"    \"",[42,184,185],{"class":159},"log",[42,187,188],{"class":52},"\"\n",[42,190,192,194,197],{"class":44,"line":191},5,[42,193,182],{"class":52},[42,195,196],{"class":159},"os",[42,198,188],{"class":52},[42,200,202],{"class":44,"line":201},6,[42,203,166],{"emptyLinePlaceholder":165},[42,205,207,209,212],{"class":44,"line":206},7,[42,208,182],{"class":52},[42,210,211],{"class":159},"github.com/gpdf-dev/gpdf",[42,213,188],{"class":52},[42,215,217,219,222],{"class":44,"line":216},8,[42,218,182],{"class":52},[42,220,221],{"class":159},"github.com/gpdf-dev/gpdf/document",[42,223,188],{"class":52},[42,225,227,229,232],{"class":44,"line":226},9,[42,228,182],{"class":52},[42,230,231],{"class":159},"github.com/gpdf-dev/gpdf/template",[42,233,188],{"class":52},[42,235,237],{"class":44,"line":236},10,[42,238,84],{"class":52},[42,240,242],{"class":44,"line":241},11,[42,243,166],{"emptyLinePlaceholder":165},[42,245,247,250,253,256],{"class":44,"line":246},12,[42,248,249],{"class":52},"func",[42,251,252],{"class":68}," main",[42,254,255],{"class":52},"()",[42,257,258],{"class":52}," {\n",[42,260,262,265,267,270,272,274,276,278,280,282,285,287],{"class":44,"line":261},13,[42,263,264],{"class":48},"    stamp",[42,266,53],{"class":52},[42,268,269],{"class":48}," err ",[42,271,59],{"class":52},[42,273,62],{"class":48},[42,275,65],{"class":52},[42,277,69],{"class":68},[42,279,72],{"class":52},[42,281,75],{"class":52},[42,283,284],{"class":78},"draft-stamp.png",[42,286,75],{"class":52},[42,288,84],{"class":52},[42,290,292,295,297,300,303],{"class":44,"line":291},14,[42,293,294],{"class":172},"    if",[42,296,269],{"class":48},[42,298,299],{"class":52},"!=",[42,301,302],{"class":52}," nil",[42,304,258],{"class":52},[42,306,308,311,313,316,318,321],{"class":44,"line":307},15,[42,309,310],{"class":48},"        log",[42,312,65],{"class":52},[42,314,315],{"class":68},"Fatal",[42,317,72],{"class":52},[42,319,320],{"class":48},"err",[42,322,84],{"class":52},[42,324,326],{"class":44,"line":325},16,[42,327,328],{"class":52},"    }\n",[42,330,332],{"class":44,"line":331},17,[42,333,166],{"emptyLinePlaceholder":165},[42,335,337,340,342,345,347,350],{"class":44,"line":336},18,[42,338,339],{"class":48},"    doc ",[42,341,59],{"class":52},[42,343,344],{"class":48}," gpdf",[42,346,65],{"class":52},[42,348,349],{"class":68},"NewDocument",[42,351,352],{"class":52},"(\n",[42,354,356,359,361,364,366,369,371,374],{"class":44,"line":355},19,[42,357,358],{"class":48},"        gpdf",[42,360,65],{"class":52},[42,362,363],{"class":68},"WithPageSize",[42,365,72],{"class":52},[42,367,368],{"class":48},"gpdf",[42,370,65],{"class":52},[42,372,373],{"class":48},"A4",[42,375,376],{"class":52},"),\n",[42,378,380,382,384,387,389,391,393,396,398,400,402,404,406,409],{"class":44,"line":379},20,[42,381,358],{"class":48},[42,383,65],{"class":52},[42,385,386],{"class":68},"WithMargins",[42,388,72],{"class":52},[42,390,114],{"class":48},[42,392,65],{"class":52},[42,394,395],{"class":68},"UniformEdges",[42,397,72],{"class":52},[42,399,114],{"class":48},[42,401,65],{"class":52},[42,403,119],{"class":68},[42,405,72],{"class":52},[42,407,408],{"class":124},"20",[42,410,411],{"class":52},"))),\n",[42,413,415],{"class":44,"line":414},21,[42,416,417],{"class":52},"    )\n",[42,419,421],{"class":44,"line":420},22,[42,422,166],{"emptyLinePlaceholder":165},[42,424,426,429,431,434,436,439],{"class":44,"line":425},23,[42,427,428],{"class":48},"    page ",[42,430,59],{"class":52},[42,432,433],{"class":48}," doc",[42,435,65],{"class":52},[42,437,438],{"class":68},"AddPage",[42,440,441],{"class":52},"()\n",[42,443,445],{"class":44,"line":444},24,[42,446,166],{"emptyLinePlaceholder":165},[42,448,450,453,455,458,461,465,468,471,473,476,479],{"class":44,"line":449},25,[42,451,452],{"class":48},"    page",[42,454,65],{"class":52},[42,456,457],{"class":68},"AutoRow",[42,459,460],{"class":52},"(func(",[42,462,464],{"class":463},"sHdIc","r",[42,466,467],{"class":52}," *",[42,469,470],{"class":159},"template",[42,472,65],{"class":52},[42,474,475],{"class":159},"RowBuilder",[42,477,478],{"class":52},")",[42,480,258],{"class":52},[42,482,484,487,489,492,494,497,499,502,504,506,508,510,513,515],{"class":44,"line":483},26,[42,485,486],{"class":48},"        r",[42,488,65],{"class":52},[42,490,491],{"class":68},"Col",[42,493,72],{"class":52},[42,495,496],{"class":124},"12",[42,498,53],{"class":52},[42,500,501],{"class":52}," func(",[42,503,90],{"class":463},[42,505,467],{"class":52},[42,507,470],{"class":159},[42,509,65],{"class":52},[42,511,512],{"class":159},"ColBuilder",[42,514,478],{"class":52},[42,516,258],{"class":52},[42,518,520,523,525,528,530,532,535,537,539,541,543,546,548,550,553,555,557,560],{"class":44,"line":519},27,[42,521,522],{"class":48},"            c",[42,524,65],{"class":52},[42,526,527],{"class":68},"Text",[42,529,72],{"class":52},[42,531,75],{"class":52},[42,533,534],{"class":78},"季度报告 — 2026 年 Q1",[42,536,75],{"class":52},[42,538,53],{"class":52},[42,540,104],{"class":48},[42,542,65],{"class":52},[42,544,545],{"class":68},"FontSize",[42,547,72],{"class":52},[42,549,408],{"class":124},[42,551,552],{"class":52},"),",[42,554,104],{"class":48},[42,556,65],{"class":52},[42,558,559],{"class":68},"Bold",[42,561,562],{"class":52},"())\n",[42,564,566,568,570,572,574,576,579,581],{"class":44,"line":565},28,[42,567,522],{"class":48},[42,569,65],{"class":52},[42,571,527],{"class":68},[42,573,72],{"class":52},[42,575,75],{"class":52},[42,577,578],{"class":78},"第一季度营收同比增长 38%，主要来自企业客户续约和金融服务行业 3 个新客户的签约。基础设施支出趋于平稳，营业利润率扩张到 24%。",[42,580,75],{"class":52},[42,582,84],{"class":52},[42,584,586,588,590,592,594,596,599,601],{"class":44,"line":585},29,[42,587,522],{"class":48},[42,589,65],{"class":52},[42,591,527],{"class":68},[42,593,72],{"class":52},[42,595,75],{"class":52},[42,597,598],{"class":78},"季末员工总数 142 人，比上季度末 128 人净增 14 人，其中工程团队招聘 9 人。",[42,600,75],{"class":52},[42,602,84],{"class":52},[42,604,606],{"class":44,"line":605},30,[42,607,608],{"class":52},"        })\n",[42,610,612],{"class":44,"line":611},31,[42,613,614],{"class":52},"    })\n",[42,616,618],{"class":44,"line":617},32,[42,619,166],{"emptyLinePlaceholder":165},[42,621,623,625,627,630,632,634,636,638,640,643,645,648,650,652,654,657,659,661,663,665,667,669,671,673],{"class":44,"line":622},33,[42,624,452],{"class":48},[42,626,65],{"class":52},[42,628,629],{"class":68},"Absolute",[42,631,72],{"class":52},[42,633,114],{"class":48},[42,635,65],{"class":52},[42,637,119],{"class":68},[42,639,72],{"class":52},[42,641,642],{"class":124},"60",[42,644,552],{"class":52},[42,646,647],{"class":48}," document",[42,649,65],{"class":52},[42,651,119],{"class":68},[42,653,72],{"class":52},[42,655,656],{"class":124},"120",[42,658,552],{"class":52},[42,660,501],{"class":52},[42,662,90],{"class":463},[42,664,467],{"class":52},[42,666,470],{"class":159},[42,668,65],{"class":52},[42,670,512],{"class":159},[42,672,478],{"class":52},[42,674,258],{"class":52},[42,676,678,681,683,685,687,690,692,694,696,698,700,702,704,706,708,711],{"class":44,"line":677},34,[42,679,680],{"class":48},"        c",[42,682,65],{"class":52},[42,684,95],{"class":68},[42,686,72],{"class":52},[42,688,689],{"class":48},"stamp",[42,691,53],{"class":52},[42,693,104],{"class":48},[42,695,65],{"class":52},[42,697,109],{"class":68},[42,699,72],{"class":52},[42,701,114],{"class":48},[42,703,65],{"class":52},[42,705,119],{"class":68},[42,707,72],{"class":52},[42,709,710],{"class":124},"80",[42,712,128],{"class":52},[42,714,716],{"class":44,"line":715},35,[42,717,614],{"class":52},[42,719,721],{"class":44,"line":720},36,[42,722,166],{"emptyLinePlaceholder":165},[42,724,726,729,731,733,735,737,739,742],{"class":44,"line":725},37,[42,727,728],{"class":48},"    data",[42,730,53],{"class":52},[42,732,269],{"class":48},[42,734,59],{"class":52},[42,736,433],{"class":48},[42,738,65],{"class":52},[42,740,741],{"class":68},"Generate",[42,743,441],{"class":52},[42,745,747,749,751,753,755],{"class":44,"line":746},38,[42,748,294],{"class":172},[42,750,269],{"class":48},[42,752,299],{"class":52},[42,754,302],{"class":52},[42,756,258],{"class":52},[42,758,760,762,764,766,768,770],{"class":44,"line":759},39,[42,761,310],{"class":48},[42,763,65],{"class":52},[42,765,315],{"class":68},[42,767,72],{"class":52},[42,769,320],{"class":48},[42,771,84],{"class":52},[42,773,775],{"class":44,"line":774},40,[42,776,328],{"class":52},[42,778,780,782,784,786,788,790,793,795,797,800,802,804,807,809,812,815,817,819,821],{"class":44,"line":779},41,[42,781,294],{"class":172},[42,783,269],{"class":48},[42,785,59],{"class":52},[42,787,62],{"class":48},[42,789,65],{"class":52},[42,791,792],{"class":68},"WriteFile",[42,794,72],{"class":52},[42,796,75],{"class":52},[42,798,799],{"class":78},"report-draft.pdf",[42,801,75],{"class":52},[42,803,53],{"class":52},[42,805,806],{"class":48}," data",[42,808,53],{"class":52},[42,810,811],{"class":124}," 0o644",[42,813,814],{"class":52},");",[42,816,269],{"class":48},[42,818,299],{"class":52},[42,820,302],{"class":52},[42,822,258],{"class":52},[42,824,826,828,830,832,834,836],{"class":44,"line":825},42,[42,827,310],{"class":48},[42,829,65],{"class":52},[42,831,315],{"class":68},[42,833,72],{"class":52},[42,835,320],{"class":48},[42,837,84],{"class":52},[42,839,841],{"class":44,"line":840},43,[42,842,328],{"class":52},[42,844,846],{"class":44,"line":845},44,[42,847,848],{"class":52},"}\n",[18,850,851,853,854,856],{},[28,852,284],{}," 想象成一张红色加粗的 \"DRAFT\" 字样、背景完全透明的 RGBA PNG。盖在正文上方时，每个透明像素都会让下面的段落透出来。把 ",[28,855,284],{}," 换成任何 logo、印章或签名图都行 —— 同一条代码路径，同一套 SMask 处理。",[14,858,860],{"id":859},"gpdf-对-png-实际做了什么","gpdf 对 PNG 实际做了什么",[18,862,863,864,867],{},"有意思的部分在 writer 这一侧。PDF 没有\"RGBA 图像\"这种单一对象，而是一个 RGB 图像加一个可选的灰度 ",[133,865,866],{},"SMask (软掩码) 图像","：mask 上每个像素的取值就是主图像对应像素的 alpha 值，渲染时由 PDF 阅读器合成。",[18,869,870,871,874],{},"把 PNG 交给 gpdf 后，渲染器 (",[28,872,873],{},"document/render/pdftarget.go",") 对像素网格走一遍：",[876,877,878,882,885],"ul",{},[879,880,881],"li",{},"24 bit RGB 进入主图像流，用 FlateDecode 压缩",[879,883,884],{},"8 bit alpha 进入单独的 SMask 流，同样用 FlateDecode 压缩",[879,886,887,888,891],{},"图像字典里加上 ",[28,889,890],{},"/SMask \u003Cref>"," 指向 alpha 流",[18,893,894,895,898,899,902],{},"如果所有 alpha 采样最终都是 ",[28,896,897],{},"0xFF"," (完全不透明)，gpdf 会丢掉 alpha 缓冲并跳过 SMask 的写入。",[133,900,901],{},"所以一张 JPEG 风格的不透明 PNG 不会带来任何额外开销","，只有 alpha 真正在工作时才会付出成本。",[18,904,905,906,909,910,913,914,917,918,921],{},"整条路径都是 pure Go —— 标准库的 ",[28,907,908],{},"image/png"," 负责解码，",[28,911,912],{},"compress/flate"," 负责压缩。",[133,915,916],{},"没有 CGO，也不依赖 libpng","。从 macOS 交叉编译到 ",[28,919,920],{},"linux/arm64"," (比如 Lambda) 仍然产出一个静态二进制。",[14,923,925],{"id":924},"jpeg-陷阱","JPEG 陷阱",[18,927,928],{},"如果你那张\"透明\" logo 被某个工具导出成了 JPEG，透明度在 gpdf 看到这个文件之前就已经丢了。JPEG 不能携带 alpha 通道，导出工具会用某个背景色 (通常是白色) 把 alpha 平铺掉。",[18,930,931,934,935,938],{},[28,932,933],{},"c.Image(jpegBytes)"," 仍然能工作，但嵌入的图像在原本透明的位置会留下不透明的白色矩形 (有时是黑色、粉色)。修复要往上游走 —— 重新导出成 PNG。",[133,936,937],{},"gpdf 没有任何选项能把 JPEG 里丢失的透明度恢复回来","。",[18,940,941,942,944],{},"\"PNG-8\"的调色板透明度是另外一回事，gpdf 用的是 Go 标准库 ",[28,943,908],{},"，调色板 PNG 它能正确处理。问题出在资源管线中途意外走了一遍 JPEG —— 数据丢了就丢了。",[14,946,947],{"id":947},"缩放和水印",[18,949,950],{},"实用扩展主要两个。",[18,952,953,956,957,960,961,964],{},[133,954,955],{},"缩放 logo",": 传 ",[28,958,959],{},"template.FitWidth(document.Mm(40))"," 或 ",[28,962,963],{},"template.FitHeight(document.Mm(20))","。PNG 按全分辨率解码，渲染时用 PDF 的坐标变换缩放 —— alpha 不会被重新采样。边缘依然清晰。",[18,966,967,970,971,973],{},[133,968,969],{},"对角\"DRAFT\"水印",": 把水印做成 alpha 较弱 (25–40% 左右) 的 PNG，再用上面例子里的 ",[28,972,145],{}," 放上去。因为 alpha 是逐像素的，水印内部的不透明度可以变化 —— 渐变淡出、logo 实线周围半透明填充等等。PDF 阅读器会和下面的文字正确合成。",[18,975,976],{},"如果你需要像素级精确的 30% 不透明度叠加，那是图像编辑器一侧的 alpha 烘焙决策。gpdf 只会忠实复现它接收到的 alpha 值，Builder API 中没有提供按图像设置整体不透明度的选项。",[14,978,979],{"id":979},"文件大小心算",[18,981,982,983,986],{},"带 alpha 的 PNG → RGB 流 + 灰度 SMask 流，意味着",[133,984,985],{},"比不带 alpha 的版本大约多 33%","。100 KB 的不透明 PNG 嵌进去会变成约 133 KB。一张 logo 完全感觉不到差别。一份 50 页的报告每页都加水印也感觉不到 —— SMask 只注册一次，每页都引用它，不会重复。",[18,988,989,990,960,993,996],{},"如果一张图突然占用好几 MB，问题在原始 PNG 而不在 gpdf 的编码。先让它过一遍 ",[28,991,992],{},"pngquant",[28,994,995],{},"oxipng"," 再嵌入，alpha 通道在两种工具下都不会丢。",[14,998,999],{"id":999},"相关菜谱",[876,1001,1002,1010,1017],{},[879,1003,1004,1009],{},[1005,1006,1008],"a",{"href":1007},"/zh/blog/embed-japanese-font","如何在 gpdf 中嵌入日文字体？"," —— 同样是\"直接传字节\"的模式，只不过对象是 TrueType",[879,1011,1012,1016],{},[1005,1013,1015],{"href":1014},"/zh/blog/invoice-pdf-go-under-50-lines","用 Go 50 行以内生成发票 PDF"," —— 透明公司 logo 在真实文档里通常落在哪",[879,1018,1019,1023],{},[1005,1020,1022],{"href":1021},"/zh/blog/why-gpdf-is-faster","为什么 gpdf 比其他 Go PDF 库快 10–30 倍"," —— pure Go 的解码路径在微秒维度耗费了什么、又节省了什么",[14,1025,1027],{"id":1026},"试试-gpdf","试试 gpdf",[18,1029,1030],{},"gpdf 是一个 Go 的 PDF 生成库。MIT 协议、零依赖、PNG 和 TrueType 都用 pure Go 处理。",[33,1032,1036],{"className":1033,"code":1034,"language":1035,"meta":38,"style":38},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[28,1037,1038],{"__ignoreMap":38},[42,1039,1040,1042,1045],{"class":44,"line":45},[42,1041,37],{"class":159},[42,1043,1044],{"class":78}," get",[42,1046,1047],{"class":78}," github.com/gpdf-dev/gpdf\n",[18,1049,1050,1056,1057],{},[1005,1051,1055],{"href":1052,"rel":1053},"https://github.com/gpdf-dev/gpdf",[1054],"nofollow","⭐ Star on GitHub"," · ",[1005,1058,1061],{"href":1059,"rel":1060},"https://gpdf.dev/docs/quickstart",[1054],"Read the docs",[1063,1064,1065],"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":38,"searchDepth":87,"depth":87,"links":1067},[1068,1069,1070,1071,1072,1073,1074,1075,1076],{"id":16,"depth":87,"text":16},{"id":23,"depth":87,"text":23},{"id":139,"depth":87,"text":139},{"id":859,"depth":87,"text":860},{"id":924,"depth":87,"text":925},{"id":947,"depth":87,"text":947},{"id":979,"depth":87,"text":979},{"id":999,"depth":87,"text":999},{"id":1026,"depth":87,"text":1027},"2026-04-28","把 PNG 字节直接传给 c.Image。gpdf 会把 alpha 通道解码成 PDF 的 SMask 对象，透明背景能正确渲染出来。",false,"md",{"name":1082,"totalTime":1083,"tools":1084,"steps":1087},"在 gpdf 文档中嵌入带 alpha 通道的透明 PNG","PT5M",[1085,1086],"Go 1.22+","一张带 alpha 通道的 RGBA PNG (logo.png、stamp.png 等)",[1088,1091,1094,1097],{"name":1089,"text":1090},"读取 PNG 字节","用 os.ReadFile 把 PNG 读成 []byte。如果想把资源编进二进制，用 //go:embed 也可以。",{"name":1092,"text":1093},"把字节直接传给 c.Image","在 column 内调用 c.Image(pngBytes)。不要先把 PNG 转成 RGB —— gpdf 需要保留 alpha 通道才能还原透明度。",{"name":1095,"text":1096},"用 page.Absolute 把图覆盖在已有内容上做水印","调用 page.Absolute(x, y, fn) 把 PNG 叠在正文文字上方。透明像素会让下面的文字透出来，这正是水印的目的。",{"name":1098,"text":1099},"PNG 比列宽大就用 FitWidth 或 FitHeight 缩放","传 template.FitWidth(document.Mm(40)) 让 logo 等比缩小。比例保持不变，重新采样后 alpha 也不会丢。",null,{},"/zh/blog/embed-png-transparency",{"title":5,"description":1078},"zh/blog/015.embed-png-transparency",[1106,1107],"recipe","tutorial","sqBLFWHMcJ8dbJs81Ac-i-2Xx6chhGU5-3zjvTLuB3c",1779199017919]