[{"data":1,"prerenderedAt":1114},["ShallowReactive",2],{"blog-ja-embed-png-transparency":3},{"id":4,"title":5,"author":6,"body":10,"date":1082,"description":1083,"draft":1084,"extension":1085,"howTo":1086,"image":1105,"meta":1106,"navigation":169,"path":1107,"seo":1108,"stem":1109,"tags":1110,"updated":1105,"__hash__":1113},"blogJa/ja/blog/015.embed-png-transparency.md","gpdf で透過 PNG を埋め込む方法",{"name":7,"url":8,"avatar":9},"野田大貴","https://nadai.dev/ja/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":1071},"minimark",[13,17,26,29,37,134,141,144,151,853,861,865,872,879,896,907,926,930,933,943,949,952,955,969,978,981,984,991,1002,1005,1029,1033,1036,1053,1067],[14,15,16],"h2",{"id":16},"質問を言い換えると",[18,19,20,21,25],"p",{},"ロゴや印影を ",[22,23,24],"strong",{},"背景透過の PNG"," で持っている。Photoshop や Figma が書き出す RGBA の PNG だ。これを gpdf で PDF に埋め込んだとき、透過部分はそのまま透過になるのか? それとも周りに白い四角が出てしまうのか?",[14,27,28],{"id":28},"即答",[18,30,31,32,36],{},"PNG のバイト列を ",[33,34,35],"code",{},"c.Image"," に渡すだけ。それ以上の指定はいらない。gpdf がアルファチャンネルをデコードして、PDF の SMask (ソフトマスク) オブジェクトを画像と一緒に書き出す。透明画素はそのまま透明として描画される。",[38,39,44],"pre",{"className":40,"code":41,"language":42,"meta":43,"style":43},"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","",[33,45,46,90],{"__ignoreMap":43},[47,48,51,55,59,62,65,68,71,75,78,81,85,87],"span",{"class":49,"line":50},"line",1,[47,52,54],{"class":53},"sTEyZ","logo",[47,56,58],{"class":57},"sMK4o",",",[47,60,61],{"class":53}," _ ",[47,63,64],{"class":57},":=",[47,66,67],{"class":53}," os",[47,69,70],{"class":57},".",[47,72,74],{"class":73},"s2Zo4","ReadFile",[47,76,77],{"class":57},"(",[47,79,80],{"class":57},"\"",[47,82,84],{"class":83},"sfazB","logo.png",[47,86,80],{"class":57},[47,88,89],{"class":57},")\n",[47,91,93,96,98,101,103,105,107,110,112,115,117,120,122,125,127,131],{"class":49,"line":92},2,[47,94,95],{"class":53},"c",[47,97,70],{"class":57},[47,99,100],{"class":73},"Image",[47,102,77],{"class":57},[47,104,54],{"class":53},[47,106,58],{"class":57},[47,108,109],{"class":53}," template",[47,111,70],{"class":57},[47,113,114],{"class":73},"FitWidth",[47,116,77],{"class":57},[47,118,119],{"class":53},"document",[47,121,70],{"class":57},[47,123,124],{"class":73},"Mm",[47,126,77],{"class":57},[47,128,130],{"class":129},"sbssI","40",[47,132,133],{"class":57},")))\n",[18,135,136,137,140],{},"これで全部。",[22,138,139],{},"白背景にフラット化する必要も、RGBA を RGB に変換する必要も、「透過を有効化する」フラグも要らない。"," PNG は PNG のまま PDF に届く。",[14,142,143],{"id":143},"動くサンプルコード",[18,145,146,147,150],{},"透過を実際に確認するには、PNG の下に何かが見えていないと意味がない。本文の上に透かしを重ねるパターンが定番で、",[33,148,149],{},"page.Absolute"," でロゴを座標固定し、通常フローのコンテンツがその下に流れる構図にする。",[38,152,154],{"className":40,"code":153,"language":42,"meta":43,"style":43},"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(\"第 1 四半期の売上は前年同期比 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",[33,155,156,165,171,181,193,203,208,218,228,238,243,248,263,293,309,327,333,338,357,381,416,422,427,446,451,485,521,567,587,607,613,619,624,679,717,722,727,748,761,776,781,827,842,847],{"__ignoreMap":43},[47,157,158,161],{"class":49,"line":50},[47,159,160],{"class":57},"package",[47,162,164],{"class":163},"sBMFI"," main\n",[47,166,167],{"class":49,"line":92},[47,168,170],{"emptyLinePlaceholder":169},true,"\n",[47,172,174,178],{"class":49,"line":173},3,[47,175,177],{"class":176},"s7zQu","import",[47,179,180],{"class":57}," (\n",[47,182,184,187,190],{"class":49,"line":183},4,[47,185,186],{"class":57},"    \"",[47,188,189],{"class":163},"log",[47,191,192],{"class":57},"\"\n",[47,194,196,198,201],{"class":49,"line":195},5,[47,197,186],{"class":57},[47,199,200],{"class":163},"os",[47,202,192],{"class":57},[47,204,206],{"class":49,"line":205},6,[47,207,170],{"emptyLinePlaceholder":169},[47,209,211,213,216],{"class":49,"line":210},7,[47,212,186],{"class":57},[47,214,215],{"class":163},"github.com/gpdf-dev/gpdf",[47,217,192],{"class":57},[47,219,221,223,226],{"class":49,"line":220},8,[47,222,186],{"class":57},[47,224,225],{"class":163},"github.com/gpdf-dev/gpdf/document",[47,227,192],{"class":57},[47,229,231,233,236],{"class":49,"line":230},9,[47,232,186],{"class":57},[47,234,235],{"class":163},"github.com/gpdf-dev/gpdf/template",[47,237,192],{"class":57},[47,239,241],{"class":49,"line":240},10,[47,242,89],{"class":57},[47,244,246],{"class":49,"line":245},11,[47,247,170],{"emptyLinePlaceholder":169},[47,249,251,254,257,260],{"class":49,"line":250},12,[47,252,253],{"class":57},"func",[47,255,256],{"class":73}," main",[47,258,259],{"class":57},"()",[47,261,262],{"class":57}," {\n",[47,264,266,269,271,274,276,278,280,282,284,286,289,291],{"class":49,"line":265},13,[47,267,268],{"class":53},"    stamp",[47,270,58],{"class":57},[47,272,273],{"class":53}," err ",[47,275,64],{"class":57},[47,277,67],{"class":53},[47,279,70],{"class":57},[47,281,74],{"class":73},[47,283,77],{"class":57},[47,285,80],{"class":57},[47,287,288],{"class":83},"draft-stamp.png",[47,290,80],{"class":57},[47,292,89],{"class":57},[47,294,296,299,301,304,307],{"class":49,"line":295},14,[47,297,298],{"class":176},"    if",[47,300,273],{"class":53},[47,302,303],{"class":57},"!=",[47,305,306],{"class":57}," nil",[47,308,262],{"class":57},[47,310,312,315,317,320,322,325],{"class":49,"line":311},15,[47,313,314],{"class":53},"        log",[47,316,70],{"class":57},[47,318,319],{"class":73},"Fatal",[47,321,77],{"class":57},[47,323,324],{"class":53},"err",[47,326,89],{"class":57},[47,328,330],{"class":49,"line":329},16,[47,331,332],{"class":57},"    }\n",[47,334,336],{"class":49,"line":335},17,[47,337,170],{"emptyLinePlaceholder":169},[47,339,341,344,346,349,351,354],{"class":49,"line":340},18,[47,342,343],{"class":53},"    doc ",[47,345,64],{"class":57},[47,347,348],{"class":53}," gpdf",[47,350,70],{"class":57},[47,352,353],{"class":73},"NewDocument",[47,355,356],{"class":57},"(\n",[47,358,360,363,365,368,370,373,375,378],{"class":49,"line":359},19,[47,361,362],{"class":53},"        gpdf",[47,364,70],{"class":57},[47,366,367],{"class":73},"WithPageSize",[47,369,77],{"class":57},[47,371,372],{"class":53},"gpdf",[47,374,70],{"class":57},[47,376,377],{"class":53},"A4",[47,379,380],{"class":57},"),\n",[47,382,384,386,388,391,393,395,397,400,402,404,406,408,410,413],{"class":49,"line":383},20,[47,385,362],{"class":53},[47,387,70],{"class":57},[47,389,390],{"class":73},"WithMargins",[47,392,77],{"class":57},[47,394,119],{"class":53},[47,396,70],{"class":57},[47,398,399],{"class":73},"UniformEdges",[47,401,77],{"class":57},[47,403,119],{"class":53},[47,405,70],{"class":57},[47,407,124],{"class":73},[47,409,77],{"class":57},[47,411,412],{"class":129},"20",[47,414,415],{"class":57},"))),\n",[47,417,419],{"class":49,"line":418},21,[47,420,421],{"class":57},"    )\n",[47,423,425],{"class":49,"line":424},22,[47,426,170],{"emptyLinePlaceholder":169},[47,428,430,433,435,438,440,443],{"class":49,"line":429},23,[47,431,432],{"class":53},"    page ",[47,434,64],{"class":57},[47,436,437],{"class":53}," doc",[47,439,70],{"class":57},[47,441,442],{"class":73},"AddPage",[47,444,445],{"class":57},"()\n",[47,447,449],{"class":49,"line":448},24,[47,450,170],{"emptyLinePlaceholder":169},[47,452,454,457,459,462,465,469,472,475,477,480,483],{"class":49,"line":453},25,[47,455,456],{"class":53},"    page",[47,458,70],{"class":57},[47,460,461],{"class":73},"AutoRow",[47,463,464],{"class":57},"(func(",[47,466,468],{"class":467},"sHdIc","r",[47,470,471],{"class":57}," *",[47,473,474],{"class":163},"template",[47,476,70],{"class":57},[47,478,479],{"class":163},"RowBuilder",[47,481,482],{"class":57},")",[47,484,262],{"class":57},[47,486,488,491,493,496,498,501,503,506,508,510,512,514,517,519],{"class":49,"line":487},26,[47,489,490],{"class":53},"        r",[47,492,70],{"class":57},[47,494,495],{"class":73},"Col",[47,497,77],{"class":57},[47,499,500],{"class":129},"12",[47,502,58],{"class":57},[47,504,505],{"class":57}," func(",[47,507,95],{"class":467},[47,509,471],{"class":57},[47,511,474],{"class":163},[47,513,70],{"class":57},[47,515,516],{"class":163},"ColBuilder",[47,518,482],{"class":57},[47,520,262],{"class":57},[47,522,524,527,529,532,534,536,539,541,543,545,547,550,552,554,557,559,561,564],{"class":49,"line":523},27,[47,525,526],{"class":53},"            c",[47,528,70],{"class":57},[47,530,531],{"class":73},"Text",[47,533,77],{"class":57},[47,535,80],{"class":57},[47,537,538],{"class":83},"四半期レポート — 2026 Q1",[47,540,80],{"class":57},[47,542,58],{"class":57},[47,544,109],{"class":53},[47,546,70],{"class":57},[47,548,549],{"class":73},"FontSize",[47,551,77],{"class":57},[47,553,412],{"class":129},[47,555,556],{"class":57},"),",[47,558,109],{"class":53},[47,560,70],{"class":57},[47,562,563],{"class":73},"Bold",[47,565,566],{"class":57},"())\n",[47,568,570,572,574,576,578,580,583,585],{"class":49,"line":569},28,[47,571,526],{"class":53},[47,573,70],{"class":57},[47,575,531],{"class":73},[47,577,77],{"class":57},[47,579,80],{"class":57},[47,581,582],{"class":83},"第 1 四半期の売上は前年同期比 38% 増。エンタープライズ顧客の更新と、金融機関 3 社の新規獲得が牽引した。インフラ投資が頭打ちとなったことで営業利益率は 24% に拡大。",[47,584,80],{"class":57},[47,586,89],{"class":57},[47,588,590,592,594,596,598,600,603,605],{"class":49,"line":589},29,[47,591,526],{"class":53},[47,593,70],{"class":57},[47,595,531],{"class":73},[47,597,77],{"class":57},[47,599,80],{"class":57},[47,601,602],{"class":83},"期末の従業員数は 142 名。前期末の 128 名から 14 名増加し、うち 9 名がエンジニアリング部門の採用。",[47,604,80],{"class":57},[47,606,89],{"class":57},[47,608,610],{"class":49,"line":609},30,[47,611,612],{"class":57},"        })\n",[47,614,616],{"class":49,"line":615},31,[47,617,618],{"class":57},"    })\n",[47,620,622],{"class":49,"line":621},32,[47,623,170],{"emptyLinePlaceholder":169},[47,625,627,629,631,634,636,638,640,642,644,647,649,652,654,656,658,661,663,665,667,669,671,673,675,677],{"class":49,"line":626},33,[47,628,456],{"class":53},[47,630,70],{"class":57},[47,632,633],{"class":73},"Absolute",[47,635,77],{"class":57},[47,637,119],{"class":53},[47,639,70],{"class":57},[47,641,124],{"class":73},[47,643,77],{"class":57},[47,645,646],{"class":129},"60",[47,648,556],{"class":57},[47,650,651],{"class":53}," document",[47,653,70],{"class":57},[47,655,124],{"class":73},[47,657,77],{"class":57},[47,659,660],{"class":129},"120",[47,662,556],{"class":57},[47,664,505],{"class":57},[47,666,95],{"class":467},[47,668,471],{"class":57},[47,670,474],{"class":163},[47,672,70],{"class":57},[47,674,516],{"class":163},[47,676,482],{"class":57},[47,678,262],{"class":57},[47,680,682,685,687,689,691,694,696,698,700,702,704,706,708,710,712,715],{"class":49,"line":681},34,[47,683,684],{"class":53},"        c",[47,686,70],{"class":57},[47,688,100],{"class":73},[47,690,77],{"class":57},[47,692,693],{"class":53},"stamp",[47,695,58],{"class":57},[47,697,109],{"class":53},[47,699,70],{"class":57},[47,701,114],{"class":73},[47,703,77],{"class":57},[47,705,119],{"class":53},[47,707,70],{"class":57},[47,709,124],{"class":73},[47,711,77],{"class":57},[47,713,714],{"class":129},"80",[47,716,133],{"class":57},[47,718,720],{"class":49,"line":719},35,[47,721,618],{"class":57},[47,723,725],{"class":49,"line":724},36,[47,726,170],{"emptyLinePlaceholder":169},[47,728,730,733,735,737,739,741,743,746],{"class":49,"line":729},37,[47,731,732],{"class":53},"    data",[47,734,58],{"class":57},[47,736,273],{"class":53},[47,738,64],{"class":57},[47,740,437],{"class":53},[47,742,70],{"class":57},[47,744,745],{"class":73},"Generate",[47,747,445],{"class":57},[47,749,751,753,755,757,759],{"class":49,"line":750},38,[47,752,298],{"class":176},[47,754,273],{"class":53},[47,756,303],{"class":57},[47,758,306],{"class":57},[47,760,262],{"class":57},[47,762,764,766,768,770,772,774],{"class":49,"line":763},39,[47,765,314],{"class":53},[47,767,70],{"class":57},[47,769,319],{"class":73},[47,771,77],{"class":57},[47,773,324],{"class":53},[47,775,89],{"class":57},[47,777,779],{"class":49,"line":778},40,[47,780,332],{"class":57},[47,782,784,786,788,790,792,794,797,799,801,804,806,808,811,813,816,819,821,823,825],{"class":49,"line":783},41,[47,785,298],{"class":176},[47,787,273],{"class":53},[47,789,64],{"class":57},[47,791,67],{"class":53},[47,793,70],{"class":57},[47,795,796],{"class":73},"WriteFile",[47,798,77],{"class":57},[47,800,80],{"class":57},[47,802,803],{"class":83},"report-draft.pdf",[47,805,80],{"class":57},[47,807,58],{"class":57},[47,809,810],{"class":53}," data",[47,812,58],{"class":57},[47,814,815],{"class":129}," 0o644",[47,817,818],{"class":57},");",[47,820,273],{"class":53},[47,822,303],{"class":57},[47,824,306],{"class":57},[47,826,262],{"class":57},[47,828,830,832,834,836,838,840],{"class":49,"line":829},42,[47,831,314],{"class":53},[47,833,70],{"class":57},[47,835,319],{"class":73},[47,837,77],{"class":57},[47,839,324],{"class":53},[47,841,89],{"class":57},[47,843,845],{"class":49,"line":844},43,[47,846,332],{"class":57},[47,848,850],{"class":49,"line":849},44,[47,851,852],{"class":57},"}\n",[18,854,855,857,858,860],{},[33,856,288],{}," は赤の太字で「DRAFT」と書かれた、背景完全透過の RGBA PNG を想定している。本文の上に乗ると、透明な画素を通して下の段落が透けて見える。",[33,859,288],{}," をロゴでも印影でも署名画像でも置き換えていい — 同じコードパス、同じ SMask 処理が走る。",[14,862,864],{"id":863},"gpdf-が-png-に対して何をしているのか","gpdf が PNG に対して何をしているのか",[18,866,867,868,871],{},"面白いのは Writer 側の処理。PDF には「RGBA 画像」という単一オブジェクトは存在しない。RGB 画像オブジェクトと、それに対応するグレースケールの ",[22,869,870],{},"SMask (ソフトマスク)"," 画像がペアになり、SMask の各画素値がメイン画像の各画素のアルファ値として扱われる。レンダリング時に PDF リーダーが両者を合成する。",[18,873,874,875,878],{},"PNG を渡すと、レンダラ (",[33,876,877],{},"document/render/pdftarget.go",") は画素を 1 周走査する:",[880,881,882,886,889],"ul",{},[883,884,885],"li",{},"24 bit の RGB がメイン画像ストリームに格納され、FlateDecode で圧縮される",[883,887,888],{},"8 bit のアルファが別の SMask ストリームに格納され、同じく FlateDecode される",[883,890,891,892,895],{},"画像辞書に ",[33,893,894],{},"/SMask \u003Cref>"," が追加され、アルファストリームを参照する",[18,897,898,899,902,903,906],{},"すべてのアルファサンプルが ",[33,900,901],{},"0xFF"," (完全不透明) だった場合、gpdf はアルファバッファを破棄して SMask の書き出しもスキップする。",[22,904,905],{},"JPEG 相当の不透明 PNG なら追加コストはゼロ","。コストが発生するのはアルファが実際に意味を持つ場合だけ。",[18,908,909,910,913,914,917,918,921,922,925],{},"このパス全体が pure Go で動く — 標準ライブラリの ",[33,911,912],{},"image/png"," がデコードを担当し、",[33,915,916],{},"compress/flate"," が圧縮する。",[22,919,920],{},"CGO も libpng 依存もない。"," macOS から ",[33,923,924],{},"linux/arm64"," (Lambda 等) へのクロスコンパイルも、依然として 1 個のスタティックバイナリにまとまる。",[14,927,929],{"id":928},"jpeg-の罠","JPEG の罠",[18,931,932],{},"「透過 PNG のはずがいつの間にか JPEG だった」というケースは要注意。JPEG はアルファチャンネルを持てないので、書き出した時点で既に透過は失われている。書き出しツールは適当な背景色 (たいていは白) にアルファをフラット化する。",[18,934,935,938,939,942],{},[33,936,937],{},"c.Image(jpegBytes)"," 自体は普通に動くが、本来透明だった部分には不透明な白 (黒、ピンクのこともある) の四角形が残る。修正は上流側 — PNG として再書き出しするしかない。",[22,940,941],{},"gpdf 側に JPEG から透過を復元するフラグはない","。",[18,944,945,946,948],{},"「PNG-8」のパレット透過は別件で、gpdf は標準の ",[33,947,912],{}," を使うのでパレット PNG も正しく扱える。問題は資産管理のパイプラインのどこかで JPEG 化されるケース — 一度落ちたデータは戻らない。",[14,950,951],{"id":951},"サイズ調整と透かし",[18,953,954],{},"実用上カバーすべき拡張は 2 つ。",[18,956,957,960,961,964,965,968],{},[22,958,959],{},"ロゴのスケーリング",": ",[33,962,963],{},"template.FitWidth(document.Mm(40))"," または ",[33,966,967],{},"template.FitHeight(document.Mm(20))"," を渡す。PNG はフル解像度のままデコードされ、レンダリング時に PDF の座標変換で縮小される — アルファ側もリサンプリングなし。エッジは鮮鋭なまま。",[18,970,971,974,975,977],{},[22,972,973],{},"斜めの「DRAFT」透かし",": 透かしを薄いアルファ (25〜40% 程度) の PNG として書き出し、上のサンプルと同じ要領で ",[33,976,149],{}," で配置する。アルファは画素単位なので、透かし内で不透明度を変化させるのも自由 — グラデーションのフェード、ロゴの実線部分の周りだけ半透明、など。PDF リーダーが下のテキストとちゃんと合成してくれる。",[18,979,980],{},"ピクセル単位で 30% 透過を保証したいなら、画像エディタ側でアルファをベイクする判断が必要。gpdf は受け取ったアルファ値をそのまま再現するだけで、Builder API には画像単位の不透明度乗算オプションは用意していない。",[14,982,983],{"id":983},"ファイルサイズの目安",[18,985,986,987,990],{},"アルファ付き PNG → RGB ストリーム + グレースケール SMask ストリームになるので、",[22,988,989],{},"アルファなしと比べておよそ 33% 大きくなる","。100 KB の不透明 PNG が 133 KB 程度になる、というイメージ。ロゴ 1 個ならまったく気にならない。50 ページのレポートに毎ページ透かしを入れた場合も、SMask は 1 度登録されて各ページから参照されるだけなので、データの重複はない。",[18,992,993,994,997,998,1001],{},"画像 1 枚で何 MB にも膨れる場合、原因は gpdf のエンコーディングではなく元 PNG のほう。",[33,995,996],{},"pngquant"," や ",[33,999,1000],{},"oxipng"," を通してから埋め込むといい。アルファチャンネルはどちらの最適化でも壊れない。",[14,1003,1004],{"id":1004},"関連レシピ",[880,1006,1007,1015,1022],{},[883,1008,1009,1014],{},[1010,1011,1013],"a",{"href":1012},"/ja/blog/embed-japanese-font","gpdf で日本語フォントを埋め込む方法"," — 「バイト列をそのまま渡す」の TrueType 版",[883,1016,1017,1021],{},[1010,1018,1020],{"href":1019},"/ja/blog/invoice-pdf-go-under-50-lines","Go で 50 行以内に請求書 PDF を作る"," — 透過のある会社ロゴが実際の文書でどこに収まるか",[883,1023,1024,1028],{},[1010,1025,1027],{"href":1026},"/ja/blog/why-gpdf-is-faster","なぜ gpdf は他の Go PDF ライブラリより 10〜30 倍速いのか"," — pure Go のデコードパスが何マイクロ秒を消費し、何を節約しているか",[14,1030,1032],{"id":1031},"gpdf-を使ってみる","gpdf を使ってみる",[18,1034,1035],{},"gpdf は Go の PDF 生成ライブラリ。MIT、ゼロ依存、PNG と TrueType を pure Go で処理する。",[38,1037,1041],{"className":1038,"code":1039,"language":1040,"meta":43,"style":43},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[33,1042,1043],{"__ignoreMap":43},[47,1044,1045,1047,1050],{"class":49,"line":50},[47,1046,42],{"class":163},[47,1048,1049],{"class":83}," get",[47,1051,1052],{"class":83}," github.com/gpdf-dev/gpdf\n",[18,1054,1055,1061,1062],{},[1010,1056,1060],{"href":1057,"rel":1058},"https://github.com/gpdf-dev/gpdf",[1059],"nofollow","⭐ Star on GitHub"," · ",[1010,1063,1066],{"href":1064,"rel":1065},"https://gpdf.dev/docs/quickstart",[1059],"Read the docs",[1068,1069,1070],"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":43,"searchDepth":92,"depth":92,"links":1072},[1073,1074,1075,1076,1077,1078,1079,1080,1081],{"id":16,"depth":92,"text":16},{"id":28,"depth":92,"text":28},{"id":143,"depth":92,"text":143},{"id":863,"depth":92,"text":864},{"id":928,"depth":92,"text":929},{"id":951,"depth":92,"text":951},{"id":983,"depth":92,"text":983},{"id":1004,"depth":92,"text":1004},{"id":1031,"depth":92,"text":1032},"2026-04-28","PNG のバイト列を c.Image にそのまま渡す。gpdf がアルファチャンネルを PDF の SMask に変換し、透過部分はそのまま描画される。",false,"md",{"name":1087,"totalTime":1088,"tools":1089,"steps":1092},"gpdf ドキュメントに RGBA の透過 PNG を埋め込む","PT5M",[1090,1091],"Go 1.22+","アルファチャンネル付きの RGBA PNG (logo.png, stamp.png など)",[1093,1096,1099,1102],{"name":1094,"text":1095},"PNG のバイト列を読み込む","os.ReadFile で PNG を []byte として読み込む。バイナリに同梱したいなら //go:embed でも構わない。",{"name":1097,"text":1098},"そのまま c.Image に渡す","ColBuilder の中で c.Image(pngBytes) を呼ぶ。RGB に変換してはいけない — gpdf は透過を再現するためにアルファチャンネルをそのまま必要とする。",{"name":1100,"text":1101},"page.Absolute で本文の上に重ねて透かしを作る","page.Absolute(x, y, fn) で本文テキストの上に PNG を配置する。透明な画素から下のテキストが透けて見える。これが透かしの本来の使い方。",{"name":1103,"text":1104},"PNG が大きいなら FitWidth / FitHeight で縮小する","template.FitWidth(document.Mm(40)) を渡せばロゴが等比で縮小される。アスペクト比は維持され、リサンプリングしてもアルファは保たれる。",null,{},"/ja/blog/embed-png-transparency",{"title":5,"description":1083},"ja/blog/015.embed-png-transparency",[1111,1112],"recipe","tutorial","X8uFCaOBV3x_gzp6UVdGEk-Zwsu917XCOboW_cx03ic",1779199022101]