[{"data":1,"prerenderedAt":2127},["ShallowReactive",2],{"blog-zh-align-column-right-edge":3},{"id":4,"title":5,"author":6,"body":10,"date":2091,"description":2092,"draft":2093,"extension":2094,"howTo":2095,"image":2117,"meta":2118,"navigation":261,"path":2119,"seo":2120,"stem":2121,"tags":2122,"updated":2117,"__hash__":2126},"blogZh/zh/blog/028.align-column-right-edge.md","如何把 gpdf 的 Col 对齐到行的右边缘？",{"name":7,"url":8,"avatar":9},"Taiki Noda","https://nadai.dev/zh/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":2080},"minimark",[13,17,34,37,64,238,241,244,1292,1295,1298,1309,1429,1484,1490,1497,1513,1517,1520,1611,1619,1640,1644,1647,1790,1809,1812,1815,1984,1987,2001,2004,2040,2044,2047,2064,2076],[14,15,16],"h2",{"id":16},"换个说法",[18,19,20,21,25,26,33],"p",{},"你写了一个只包含一个 ",[22,23,24],"code",{},"r.Col(4, ...)"," 的行，以为这个列会落在页面右侧。结果它渲染在左边，占了三分之一宽度，右侧留下一大片空白。或者列确实到了右边，但里面的文本还是贴着左边。在 ",[27,28,32],"a",{"href":29,"rel":30},"https://github.com/gpdf-dev/gpdf",[31],"nofollow","gpdf"," 里正确的写法是什么？",[14,35,36],{"id":36},"结论",[18,38,39,40,43,44,47,48,51,52,63],{},"gpdf 没有 ",[22,41,42],{},"Offset","，没有 ",[22,45,46],{},"Push","，也没有行级别的 ",[22,49,50],{},"Justify","。",[53,54,55,56,59,60,51],"strong",{},"把列推到右边靠的是一个空的填充 ",[22,57,58],{},"Col","，让列内文本靠右靠的是 ",[22,61,62],{},"template.AlignRight()"," 这是两件不同的事，而且几乎总是两个都要。",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","page.AutoRow(func(r *template.RowBuilder) {\n    r.Col(8, func(c *template.ColBuilder) {}) // 填充\n    r.Col(4, func(c *template.ColBuilder) {\n        c.Text(\"合计: ¥25,575.00\", template.AlignRight())\n    })\n})\n","go","",[22,72,73,115,159,191,226,232],{"__ignoreMap":70},[74,75,78,82,86,90,93,97,100,104,106,109,112],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"sTEyZ","page",[74,83,85],{"class":84},"sMK4o",".",[74,87,89],{"class":88},"s2Zo4","AutoRow",[74,91,92],{"class":84},"(func(",[74,94,96],{"class":95},"sHdIc","r",[74,98,99],{"class":84}," *",[74,101,103],{"class":102},"sBMFI","template",[74,105,85],{"class":84},[74,107,108],{"class":102},"RowBuilder",[74,110,111],{"class":84},")",[74,113,114],{"class":84}," {\n",[74,116,118,121,123,125,128,132,135,138,141,143,145,147,150,152,155],{"class":76,"line":117},2,[74,119,120],{"class":80},"    r",[74,122,85],{"class":84},[74,124,58],{"class":88},[74,126,127],{"class":84},"(",[74,129,131],{"class":130},"sbssI","8",[74,133,134],{"class":84},",",[74,136,137],{"class":84}," func(",[74,139,140],{"class":95},"c",[74,142,99],{"class":84},[74,144,103],{"class":102},[74,146,85],{"class":84},[74,148,149],{"class":102},"ColBuilder",[74,151,111],{"class":84},[74,153,154],{"class":84}," {})",[74,156,158],{"class":157},"sHwdD"," // 填充\n",[74,160,162,164,166,168,170,173,175,177,179,181,183,185,187,189],{"class":76,"line":161},3,[74,163,120],{"class":80},[74,165,85],{"class":84},[74,167,58],{"class":88},[74,169,127],{"class":84},[74,171,172],{"class":130},"4",[74,174,134],{"class":84},[74,176,137],{"class":84},[74,178,140],{"class":95},[74,180,99],{"class":84},[74,182,103],{"class":102},[74,184,85],{"class":84},[74,186,149],{"class":102},[74,188,111],{"class":84},[74,190,114],{"class":84},[74,192,194,197,199,202,204,207,211,213,215,218,220,223],{"class":76,"line":193},4,[74,195,196],{"class":80},"        c",[74,198,85],{"class":84},[74,200,201],{"class":88},"Text",[74,203,127],{"class":84},[74,205,206],{"class":84},"\"",[74,208,210],{"class":209},"sfazB","合计: ¥25,575.00",[74,212,206],{"class":84},[74,214,134],{"class":84},[74,216,217],{"class":80}," template",[74,219,85],{"class":84},[74,221,222],{"class":88},"AlignRight",[74,224,225],{"class":84},"())\n",[74,227,229],{"class":76,"line":228},5,[74,230,231],{"class":84},"    })\n",[74,233,235],{"class":76,"line":234},6,[74,236,237],{"class":84},"})\n",[14,239,240],{"id":240},"代码",[18,242,243],{},"一个完整的程序 —— 也就是大多数人因此来搜索的那种发票抬头结构：",[65,245,247],{"className":67,"code":246,"language":69,"meta":70,"style":70},"package main\n\nimport (\n    \"log\"\n    \"os\"\n\n    \"github.com/gpdf-dev/gpdf/document\"\n    \"github.com/gpdf-dev/gpdf/pdf\"\n    \"github.com/gpdf-dev/gpdf/template\"\n)\n\nfunc main() {\n    doc := template.New(\n        template.WithPageSize(document.A4),\n        template.WithMargins(document.UniformEdges(document.Mm(20))),\n    )\n\n    page := doc.AddPage()\n\n    // 左右两块放在一行：8 + 4 = 12。\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(8, func(c *template.ColBuilder) {\n            c.Text(\"艾克梅有限公司\", template.Bold(), template.FontSize(16))\n            c.Text(\"上海市浦东新区世纪大道 1-2-3 号\", template.TextColor(pdf.Gray(0.4)))\n        })\n        r.Col(4, func(c *template.ColBuilder) {\n            c.Text(\"发票 No.1042\", template.AlignRight(), template.Bold())\n            c.Text(\"开具日期 2026-09-02\", template.AlignRight(),\n                template.TextColor(pdf.Gray(0.4)))\n        })\n    })\n\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Spacer(document.Mm(10))\n        })\n    })\n\n    // 合计区块：8 跨度的空白，然后 4 跨度紧贴边距。\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(8, func(c *template.ColBuilder) {})\n        r.Col(4, func(c *template.ColBuilder) {\n            c.Text(\"小计:      ¥23,250.00\", template.AlignRight())\n            c.Text(\"增值税 10%:  ¥2,325.00\", template.AlignRight())\n            c.Spacer(document.Mm(2))\n            c.Line(template.LineThickness(document.Pt(1)))\n            c.Spacer(document.Mm(2))\n            c.Text(\"合计:      ¥25,575.00\", template.AlignRight(),\n                template.Bold(), template.FontSize(14))\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"right_aligned.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n",[22,248,249,257,263,272,283,292,296,306,316,326,332,337,351,370,394,430,436,441,460,465,471,497,529,575,620,626,657,693,722,746,751,756,761,786,818,843,848,853,858,864,889,921,952,980,1008,1032,1067,1090,1118,1142,1147,1152,1157,1179,1195,1213,1219,1266,1281,1286],{"__ignoreMap":70},[74,250,251,254],{"class":76,"line":77},[74,252,253],{"class":84},"package",[74,255,256],{"class":102}," main\n",[74,258,259],{"class":76,"line":117},[74,260,262],{"emptyLinePlaceholder":261},true,"\n",[74,264,265,269],{"class":76,"line":161},[74,266,268],{"class":267},"s7zQu","import",[74,270,271],{"class":84}," (\n",[74,273,274,277,280],{"class":76,"line":193},[74,275,276],{"class":84},"    \"",[74,278,279],{"class":102},"log",[74,281,282],{"class":84},"\"\n",[74,284,285,287,290],{"class":76,"line":228},[74,286,276],{"class":84},[74,288,289],{"class":102},"os",[74,291,282],{"class":84},[74,293,294],{"class":76,"line":234},[74,295,262],{"emptyLinePlaceholder":261},[74,297,299,301,304],{"class":76,"line":298},7,[74,300,276],{"class":84},[74,302,303],{"class":102},"github.com/gpdf-dev/gpdf/document",[74,305,282],{"class":84},[74,307,309,311,314],{"class":76,"line":308},8,[74,310,276],{"class":84},[74,312,313],{"class":102},"github.com/gpdf-dev/gpdf/pdf",[74,315,282],{"class":84},[74,317,319,321,324],{"class":76,"line":318},9,[74,320,276],{"class":84},[74,322,323],{"class":102},"github.com/gpdf-dev/gpdf/template",[74,325,282],{"class":84},[74,327,329],{"class":76,"line":328},10,[74,330,331],{"class":84},")\n",[74,333,335],{"class":76,"line":334},11,[74,336,262],{"emptyLinePlaceholder":261},[74,338,340,343,346,349],{"class":76,"line":339},12,[74,341,342],{"class":84},"func",[74,344,345],{"class":88}," main",[74,347,348],{"class":84},"()",[74,350,114],{"class":84},[74,352,354,357,360,362,364,367],{"class":76,"line":353},13,[74,355,356],{"class":80},"    doc ",[74,358,359],{"class":84},":=",[74,361,217],{"class":80},[74,363,85],{"class":84},[74,365,366],{"class":88},"New",[74,368,369],{"class":84},"(\n",[74,371,373,376,378,381,383,386,388,391],{"class":76,"line":372},14,[74,374,375],{"class":80},"        template",[74,377,85],{"class":84},[74,379,380],{"class":88},"WithPageSize",[74,382,127],{"class":84},[74,384,385],{"class":80},"document",[74,387,85],{"class":84},[74,389,390],{"class":80},"A4",[74,392,393],{"class":84},"),\n",[74,395,397,399,401,404,406,408,410,413,415,417,419,422,424,427],{"class":76,"line":396},15,[74,398,375],{"class":80},[74,400,85],{"class":84},[74,402,403],{"class":88},"WithMargins",[74,405,127],{"class":84},[74,407,385],{"class":80},[74,409,85],{"class":84},[74,411,412],{"class":88},"UniformEdges",[74,414,127],{"class":84},[74,416,385],{"class":80},[74,418,85],{"class":84},[74,420,421],{"class":88},"Mm",[74,423,127],{"class":84},[74,425,426],{"class":130},"20",[74,428,429],{"class":84},"))),\n",[74,431,433],{"class":76,"line":432},16,[74,434,435],{"class":84},"    )\n",[74,437,439],{"class":76,"line":438},17,[74,440,262],{"emptyLinePlaceholder":261},[74,442,444,447,449,452,454,457],{"class":76,"line":443},18,[74,445,446],{"class":80},"    page ",[74,448,359],{"class":84},[74,450,451],{"class":80}," doc",[74,453,85],{"class":84},[74,455,456],{"class":88},"AddPage",[74,458,459],{"class":84},"()\n",[74,461,463],{"class":76,"line":462},19,[74,464,262],{"emptyLinePlaceholder":261},[74,466,468],{"class":76,"line":467},20,[74,469,470],{"class":157},"    // 左右两块放在一行：8 + 4 = 12。\n",[74,472,474,477,479,481,483,485,487,489,491,493,495],{"class":76,"line":473},21,[74,475,476],{"class":80},"    page",[74,478,85],{"class":84},[74,480,89],{"class":88},[74,482,92],{"class":84},[74,484,96],{"class":95},[74,486,99],{"class":84},[74,488,103],{"class":102},[74,490,85],{"class":84},[74,492,108],{"class":102},[74,494,111],{"class":84},[74,496,114],{"class":84},[74,498,500,503,505,507,509,511,513,515,517,519,521,523,525,527],{"class":76,"line":499},22,[74,501,502],{"class":80},"        r",[74,504,85],{"class":84},[74,506,58],{"class":88},[74,508,127],{"class":84},[74,510,131],{"class":130},[74,512,134],{"class":84},[74,514,137],{"class":84},[74,516,140],{"class":95},[74,518,99],{"class":84},[74,520,103],{"class":102},[74,522,85],{"class":84},[74,524,149],{"class":102},[74,526,111],{"class":84},[74,528,114],{"class":84},[74,530,532,535,537,539,541,543,546,548,550,552,554,557,560,562,564,567,569,572],{"class":76,"line":531},23,[74,533,534],{"class":80},"            c",[74,536,85],{"class":84},[74,538,201],{"class":88},[74,540,127],{"class":84},[74,542,206],{"class":84},[74,544,545],{"class":209},"艾克梅有限公司",[74,547,206],{"class":84},[74,549,134],{"class":84},[74,551,217],{"class":80},[74,553,85],{"class":84},[74,555,556],{"class":88},"Bold",[74,558,559],{"class":84},"(),",[74,561,217],{"class":80},[74,563,85],{"class":84},[74,565,566],{"class":88},"FontSize",[74,568,127],{"class":84},[74,570,571],{"class":130},"16",[74,573,574],{"class":84},"))\n",[74,576,578,580,582,584,586,588,591,593,595,597,599,602,604,607,609,612,614,617],{"class":76,"line":577},24,[74,579,534],{"class":80},[74,581,85],{"class":84},[74,583,201],{"class":88},[74,585,127],{"class":84},[74,587,206],{"class":84},[74,589,590],{"class":209},"上海市浦东新区世纪大道 1-2-3 号",[74,592,206],{"class":84},[74,594,134],{"class":84},[74,596,217],{"class":80},[74,598,85],{"class":84},[74,600,601],{"class":88},"TextColor",[74,603,127],{"class":84},[74,605,606],{"class":80},"pdf",[74,608,85],{"class":84},[74,610,611],{"class":88},"Gray",[74,613,127],{"class":84},[74,615,616],{"class":130},"0.4",[74,618,619],{"class":84},")))\n",[74,621,623],{"class":76,"line":622},25,[74,624,625],{"class":84},"        })\n",[74,627,629,631,633,635,637,639,641,643,645,647,649,651,653,655],{"class":76,"line":628},26,[74,630,502],{"class":80},[74,632,85],{"class":84},[74,634,58],{"class":88},[74,636,127],{"class":84},[74,638,172],{"class":130},[74,640,134],{"class":84},[74,642,137],{"class":84},[74,644,140],{"class":95},[74,646,99],{"class":84},[74,648,103],{"class":102},[74,650,85],{"class":84},[74,652,149],{"class":102},[74,654,111],{"class":84},[74,656,114],{"class":84},[74,658,660,662,664,666,668,670,673,675,677,679,681,683,685,687,689,691],{"class":76,"line":659},27,[74,661,534],{"class":80},[74,663,85],{"class":84},[74,665,201],{"class":88},[74,667,127],{"class":84},[74,669,206],{"class":84},[74,671,672],{"class":209},"发票 No.1042",[74,674,206],{"class":84},[74,676,134],{"class":84},[74,678,217],{"class":80},[74,680,85],{"class":84},[74,682,222],{"class":88},[74,684,559],{"class":84},[74,686,217],{"class":80},[74,688,85],{"class":84},[74,690,556],{"class":88},[74,692,225],{"class":84},[74,694,696,698,700,702,704,706,709,711,713,715,717,719],{"class":76,"line":695},28,[74,697,534],{"class":80},[74,699,85],{"class":84},[74,701,201],{"class":88},[74,703,127],{"class":84},[74,705,206],{"class":84},[74,707,708],{"class":209},"开具日期 2026-09-02",[74,710,206],{"class":84},[74,712,134],{"class":84},[74,714,217],{"class":80},[74,716,85],{"class":84},[74,718,222],{"class":88},[74,720,721],{"class":84},"(),\n",[74,723,725,728,730,732,734,736,738,740,742,744],{"class":76,"line":724},29,[74,726,727],{"class":80},"                template",[74,729,85],{"class":84},[74,731,601],{"class":88},[74,733,127],{"class":84},[74,735,606],{"class":80},[74,737,85],{"class":84},[74,739,611],{"class":88},[74,741,127],{"class":84},[74,743,616],{"class":130},[74,745,619],{"class":84},[74,747,749],{"class":76,"line":748},30,[74,750,625],{"class":84},[74,752,754],{"class":76,"line":753},31,[74,755,231],{"class":84},[74,757,759],{"class":76,"line":758},32,[74,760,262],{"emptyLinePlaceholder":261},[74,762,764,766,768,770,772,774,776,778,780,782,784],{"class":76,"line":763},33,[74,765,476],{"class":80},[74,767,85],{"class":84},[74,769,89],{"class":88},[74,771,92],{"class":84},[74,773,96],{"class":95},[74,775,99],{"class":84},[74,777,103],{"class":102},[74,779,85],{"class":84},[74,781,108],{"class":102},[74,783,111],{"class":84},[74,785,114],{"class":84},[74,787,789,791,793,795,797,800,802,804,806,808,810,812,814,816],{"class":76,"line":788},34,[74,790,502],{"class":80},[74,792,85],{"class":84},[74,794,58],{"class":88},[74,796,127],{"class":84},[74,798,799],{"class":130},"12",[74,801,134],{"class":84},[74,803,137],{"class":84},[74,805,140],{"class":95},[74,807,99],{"class":84},[74,809,103],{"class":102},[74,811,85],{"class":84},[74,813,149],{"class":102},[74,815,111],{"class":84},[74,817,114],{"class":84},[74,819,821,823,825,828,830,832,834,836,838,841],{"class":76,"line":820},35,[74,822,534],{"class":80},[74,824,85],{"class":84},[74,826,827],{"class":88},"Spacer",[74,829,127],{"class":84},[74,831,385],{"class":80},[74,833,85],{"class":84},[74,835,421],{"class":88},[74,837,127],{"class":84},[74,839,840],{"class":130},"10",[74,842,574],{"class":84},[74,844,846],{"class":76,"line":845},36,[74,847,625],{"class":84},[74,849,851],{"class":76,"line":850},37,[74,852,231],{"class":84},[74,854,856],{"class":76,"line":855},38,[74,857,262],{"emptyLinePlaceholder":261},[74,859,861],{"class":76,"line":860},39,[74,862,863],{"class":157},"    // 合计区块：8 跨度的空白，然后 4 跨度紧贴边距。\n",[74,865,867,869,871,873,875,877,879,881,883,885,887],{"class":76,"line":866},40,[74,868,476],{"class":80},[74,870,85],{"class":84},[74,872,89],{"class":88},[74,874,92],{"class":84},[74,876,96],{"class":95},[74,878,99],{"class":84},[74,880,103],{"class":102},[74,882,85],{"class":84},[74,884,108],{"class":102},[74,886,111],{"class":84},[74,888,114],{"class":84},[74,890,892,894,896,898,900,902,904,906,908,910,912,914,916,918],{"class":76,"line":891},41,[74,893,502],{"class":80},[74,895,85],{"class":84},[74,897,58],{"class":88},[74,899,127],{"class":84},[74,901,131],{"class":130},[74,903,134],{"class":84},[74,905,137],{"class":84},[74,907,140],{"class":95},[74,909,99],{"class":84},[74,911,103],{"class":102},[74,913,85],{"class":84},[74,915,149],{"class":102},[74,917,111],{"class":84},[74,919,920],{"class":84}," {})\n",[74,922,924,926,928,930,932,934,936,938,940,942,944,946,948,950],{"class":76,"line":923},42,[74,925,502],{"class":80},[74,927,85],{"class":84},[74,929,58],{"class":88},[74,931,127],{"class":84},[74,933,172],{"class":130},[74,935,134],{"class":84},[74,937,137],{"class":84},[74,939,140],{"class":95},[74,941,99],{"class":84},[74,943,103],{"class":102},[74,945,85],{"class":84},[74,947,149],{"class":102},[74,949,111],{"class":84},[74,951,114],{"class":84},[74,953,955,957,959,961,963,965,968,970,972,974,976,978],{"class":76,"line":954},43,[74,956,534],{"class":80},[74,958,85],{"class":84},[74,960,201],{"class":88},[74,962,127],{"class":84},[74,964,206],{"class":84},[74,966,967],{"class":209},"小计:      ¥23,250.00",[74,969,206],{"class":84},[74,971,134],{"class":84},[74,973,217],{"class":80},[74,975,85],{"class":84},[74,977,222],{"class":88},[74,979,225],{"class":84},[74,981,983,985,987,989,991,993,996,998,1000,1002,1004,1006],{"class":76,"line":982},44,[74,984,534],{"class":80},[74,986,85],{"class":84},[74,988,201],{"class":88},[74,990,127],{"class":84},[74,992,206],{"class":84},[74,994,995],{"class":209},"增值税 10%:  ¥2,325.00",[74,997,206],{"class":84},[74,999,134],{"class":84},[74,1001,217],{"class":80},[74,1003,85],{"class":84},[74,1005,222],{"class":88},[74,1007,225],{"class":84},[74,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1030],{"class":76,"line":1010},45,[74,1012,534],{"class":80},[74,1014,85],{"class":84},[74,1016,827],{"class":88},[74,1018,127],{"class":84},[74,1020,385],{"class":80},[74,1022,85],{"class":84},[74,1024,421],{"class":88},[74,1026,127],{"class":84},[74,1028,1029],{"class":130},"2",[74,1031,574],{"class":84},[74,1033,1035,1037,1039,1042,1044,1046,1048,1051,1053,1055,1057,1060,1062,1065],{"class":76,"line":1034},46,[74,1036,534],{"class":80},[74,1038,85],{"class":84},[74,1040,1041],{"class":88},"Line",[74,1043,127],{"class":84},[74,1045,103],{"class":80},[74,1047,85],{"class":84},[74,1049,1050],{"class":88},"LineThickness",[74,1052,127],{"class":84},[74,1054,385],{"class":80},[74,1056,85],{"class":84},[74,1058,1059],{"class":88},"Pt",[74,1061,127],{"class":84},[74,1063,1064],{"class":130},"1",[74,1066,619],{"class":84},[74,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088],{"class":76,"line":1069},47,[74,1071,534],{"class":80},[74,1073,85],{"class":84},[74,1075,827],{"class":88},[74,1077,127],{"class":84},[74,1079,385],{"class":80},[74,1081,85],{"class":84},[74,1083,421],{"class":88},[74,1085,127],{"class":84},[74,1087,1029],{"class":130},[74,1089,574],{"class":84},[74,1091,1093,1095,1097,1099,1101,1103,1106,1108,1110,1112,1114,1116],{"class":76,"line":1092},48,[74,1094,534],{"class":80},[74,1096,85],{"class":84},[74,1098,201],{"class":88},[74,1100,127],{"class":84},[74,1102,206],{"class":84},[74,1104,1105],{"class":209},"合计:      ¥25,575.00",[74,1107,206],{"class":84},[74,1109,134],{"class":84},[74,1111,217],{"class":80},[74,1113,85],{"class":84},[74,1115,222],{"class":88},[74,1117,721],{"class":84},[74,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1140],{"class":76,"line":1120},49,[74,1122,727],{"class":80},[74,1124,85],{"class":84},[74,1126,556],{"class":88},[74,1128,559],{"class":84},[74,1130,217],{"class":80},[74,1132,85],{"class":84},[74,1134,566],{"class":88},[74,1136,127],{"class":84},[74,1138,1139],{"class":130},"14",[74,1141,574],{"class":84},[74,1143,1145],{"class":76,"line":1144},50,[74,1146,625],{"class":84},[74,1148,1150],{"class":76,"line":1149},51,[74,1151,231],{"class":84},[74,1153,1155],{"class":76,"line":1154},52,[74,1156,262],{"emptyLinePlaceholder":261},[74,1158,1160,1163,1165,1168,1170,1172,1174,1177],{"class":76,"line":1159},53,[74,1161,1162],{"class":80},"    data",[74,1164,134],{"class":84},[74,1166,1167],{"class":80}," err ",[74,1169,359],{"class":84},[74,1171,451],{"class":80},[74,1173,85],{"class":84},[74,1175,1176],{"class":88},"Generate",[74,1178,459],{"class":84},[74,1180,1182,1185,1187,1190,1193],{"class":76,"line":1181},54,[74,1183,1184],{"class":267},"    if",[74,1186,1167],{"class":80},[74,1188,1189],{"class":84},"!=",[74,1191,1192],{"class":84}," nil",[74,1194,114],{"class":84},[74,1196,1198,1201,1203,1206,1208,1211],{"class":76,"line":1197},55,[74,1199,1200],{"class":80},"        log",[74,1202,85],{"class":84},[74,1204,1205],{"class":88},"Fatal",[74,1207,127],{"class":84},[74,1209,1210],{"class":80},"err",[74,1212,331],{"class":84},[74,1214,1216],{"class":76,"line":1215},56,[74,1217,1218],{"class":84},"    }\n",[74,1220,1222,1224,1226,1228,1231,1233,1236,1238,1240,1243,1245,1247,1250,1252,1255,1258,1260,1262,1264],{"class":76,"line":1221},57,[74,1223,1184],{"class":267},[74,1225,1167],{"class":80},[74,1227,359],{"class":84},[74,1229,1230],{"class":80}," os",[74,1232,85],{"class":84},[74,1234,1235],{"class":88},"WriteFile",[74,1237,127],{"class":84},[74,1239,206],{"class":84},[74,1241,1242],{"class":209},"right_aligned.pdf",[74,1244,206],{"class":84},[74,1246,134],{"class":84},[74,1248,1249],{"class":80}," data",[74,1251,134],{"class":84},[74,1253,1254],{"class":130}," 0o644",[74,1256,1257],{"class":84},");",[74,1259,1167],{"class":80},[74,1261,1189],{"class":84},[74,1263,1192],{"class":84},[74,1265,114],{"class":84},[74,1267,1269,1271,1273,1275,1277,1279],{"class":76,"line":1268},58,[74,1270,1200],{"class":80},[74,1272,85],{"class":84},[74,1274,1205],{"class":88},[74,1276,127],{"class":84},[74,1278,1210],{"class":80},[74,1280,331],{"class":84},[74,1282,1284],{"class":76,"line":1283},59,[74,1285,1218],{"class":84},[74,1287,1289],{"class":76,"line":1288},60,[74,1290,1291],{"class":84},"}\n",[14,1293,1294],{"id":1294},"为什么必须要填充列",[18,1296,1297],{},"这一段值得理解而不是死记，因为它同时解释了 gpdf 排版中其他几个让人意外的行为。",[18,1299,1300,1301,1304,1305,1308],{},"行是一个水平方向的盒子。",[22,1302,1303],{},"RowBuilder.build"," 按顺序遍历 ",[22,1306,1307],{},"r.cols","，每个列生成一个子盒子，而它给这个子盒子设置的样式只有宽度：",[65,1310,1312],{"className":67,"code":1311,"language":69,"meta":70,"style":70},"colBox := &document.Box{\n    Content: cb.buildNodes(),\n    BoxStyle: document.BoxStyle{\n        Width: document.Pct(float64(col.span) / float64(gridColumns) * 100),\n    },\n}\n",[22,1313,1314,1334,1352,1369,1420,1425],{"__ignoreMap":70},[74,1315,1316,1319,1321,1324,1326,1328,1331],{"class":76,"line":77},[74,1317,1318],{"class":80},"colBox ",[74,1320,359],{"class":84},[74,1322,1323],{"class":84}," &",[74,1325,385],{"class":102},[74,1327,85],{"class":84},[74,1329,1330],{"class":102},"Box",[74,1332,1333],{"class":84},"{\n",[74,1335,1336,1339,1342,1345,1347,1350],{"class":76,"line":117},[74,1337,1338],{"class":80},"    Content",[74,1340,1341],{"class":84},":",[74,1343,1344],{"class":80}," cb",[74,1346,85],{"class":84},[74,1348,1349],{"class":88},"buildNodes",[74,1351,721],{"class":84},[74,1353,1354,1357,1359,1362,1364,1367],{"class":76,"line":161},[74,1355,1356],{"class":80},"    BoxStyle",[74,1358,1341],{"class":84},[74,1360,1361],{"class":102}," document",[74,1363,85],{"class":84},[74,1365,1366],{"class":102},"BoxStyle",[74,1368,1333],{"class":84},[74,1370,1371,1374,1376,1378,1380,1383,1385,1389,1391,1394,1396,1398,1400,1403,1406,1408,1411,1413,1415,1418],{"class":76,"line":193},[74,1372,1373],{"class":80},"        Width",[74,1375,1341],{"class":84},[74,1377,1361],{"class":80},[74,1379,85],{"class":84},[74,1381,1382],{"class":88},"Pct",[74,1384,127],{"class":84},[74,1386,1388],{"class":1387},"spNyl","float64",[74,1390,127],{"class":84},[74,1392,1393],{"class":80},"col",[74,1395,85],{"class":84},[74,1397,74],{"class":80},[74,1399,111],{"class":84},[74,1401,1402],{"class":84}," /",[74,1404,1405],{"class":1387}," float64",[74,1407,127],{"class":84},[74,1409,1410],{"class":80},"gridColumns",[74,1412,111],{"class":84},[74,1414,99],{"class":84},[74,1416,1417],{"class":130}," 100",[74,1419,393],{"class":84},[74,1421,1422],{"class":76,"line":228},[74,1423,1424],{"class":84},"    },\n",[74,1426,1427],{"class":76,"line":234},[74,1428,1291],{"class":84},[18,1430,1431,1433,1434,1437,1438,1441,1442,1445,1446,1449,1450,1449,1453,1449,1456,1449,1459,1449,1462,1449,1465,1449,1468,1449,1471,1449,1474,1449,1477,1449,1480,1483],{},[22,1432,1410],{}," 是 12。所以 ",[22,1435,1436],{},"Col(4)"," 字面意思就是「一个宽度为行宽 33.33% 的盒子」，仅此而已。行从左到右排列子元素，子元素排完就停。它没有「剩余空间」这个概念，因为 ",[22,1439,1440],{},"document.BoxStyle"," 根本没有 ",[22,1443,1444],{},"JustifyContent"," 字段 —— 在整个仓库里 grep 也找不到。它只有 ",[22,1447,1448],{},"Width","、",[22,1451,1452],{},"Height",[22,1454,1455],{},"MinWidth",[22,1457,1458],{},"MaxWidth",[22,1460,1461],{},"MinHeight",[22,1463,1464],{},"MaxHeight",[22,1466,1467],{},"Margin",[22,1469,1470],{},"Padding",[22,1472,1473],{},"Border",[22,1475,1476],{},"Background",[22,1478,1479],{},"Direction",[22,1481,1482],{},"Position","。这就是全部词汇。",[18,1485,1486,1487,1489],{},"所以单独一个 ",[22,1488,1436],{}," 产生的是一个只含 33.33% 宽盒子的行，位于水平流的起点。剩下的 66.67% 不是「你的列右边的空白」，而是根本什么都没有。那里没有元素可以顶住。",[18,1491,1492,1493,1496],{},"填充用的 ",[22,1494,1495],{},"Col(8)"," 给了布局引擎一个占据这段空间的东西。代价是树里多一个空盒子，渲染出来什么都没有。",[18,1498,1499,1500,1502,1503,1506,1507,1506,1510,1512],{},"顺带一提，",[22,1501,1495],{}," 并不特殊。",[22,1504,1505],{},"Col(6)"," + ",[22,1508,1509],{},"Col(3)",[22,1511,1509],{}," 同样能把最后一块推到右边，而且以后往填充列里塞内容也不用重构结构。",[14,1514,1516],{"id":1515},"陷阱列在右文本在左","陷阱：列在右，文本在左",[18,1518,1519],{},"最浪费时间的错误是这个：",[65,1521,1523],{"className":67,"code":1522,"language":69,"meta":70,"style":70},"r.Col(8, func(c *template.ColBuilder) {})\nr.Col(4, func(c *template.ColBuilder) {\n    c.Text(\"合计: ¥25,575.00\") // ← 少了 AlignRight\n})\n",[22,1524,1525,1555,1585,1607],{"__ignoreMap":70},[74,1526,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553],{"class":76,"line":77},[74,1528,96],{"class":80},[74,1530,85],{"class":84},[74,1532,58],{"class":88},[74,1534,127],{"class":84},[74,1536,131],{"class":130},[74,1538,134],{"class":84},[74,1540,137],{"class":84},[74,1542,140],{"class":95},[74,1544,99],{"class":84},[74,1546,103],{"class":102},[74,1548,85],{"class":84},[74,1550,149],{"class":102},[74,1552,111],{"class":84},[74,1554,920],{"class":84},[74,1556,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583],{"class":76,"line":117},[74,1558,96],{"class":80},[74,1560,85],{"class":84},[74,1562,58],{"class":88},[74,1564,127],{"class":84},[74,1566,172],{"class":130},[74,1568,134],{"class":84},[74,1570,137],{"class":84},[74,1572,140],{"class":95},[74,1574,99],{"class":84},[74,1576,103],{"class":102},[74,1578,85],{"class":84},[74,1580,149],{"class":102},[74,1582,111],{"class":84},[74,1584,114],{"class":84},[74,1586,1587,1590,1592,1594,1596,1598,1600,1602,1604],{"class":76,"line":161},[74,1588,1589],{"class":80},"    c",[74,1591,85],{"class":84},[74,1593,201],{"class":88},[74,1595,127],{"class":84},[74,1597,206],{"class":84},[74,1599,210],{"class":209},[74,1601,206],{"class":84},[74,1603,111],{"class":84},[74,1605,1606],{"class":157}," // ← 少了 AlignRight\n",[74,1608,1609],{"class":76,"line":193},[74,1610,237],{"class":84},[18,1612,1613,1614,1618],{},"列在你想要的位置。文本不在。它从列的左边界开始 —— 也就是页面 66.67% 的位置 —— 所以看上去",[1615,1616,1617],"em",{},"有点像","右对齐。如果你的数字位数恰好都一样，可能一直没发现，直到三位数的合计和五位数的排在一起，小数点对不齐了才注意到。",[18,1620,1621,1623,1624,1627,1628,1631,1632,1635,1636,1639],{},[22,1622,62],{}," 是一个 ",[22,1625,1626],{},"TextOption","（设置 ",[22,1629,1630],{},"TextAlign"," 的 ",[22,1633,1634],{},"func(*document.Style)","），所以它加在单个 ",[22,1637,1638],{},"c.Text"," 调用上。没有办法给整个列设置一次。块里每一行都要写。",[14,1641,1643],{"id":1642},"表格图片页码","表格、图片、页码",[18,1645,1646],{},"文本选项进不到其他元素内部。每种元素都有自己的对齐入口：",[65,1648,1650],{"className":67,"code":1649,"language":69,"meta":70,"style":70},"// Table：按位置对应 header 切片的逐列对齐。\nc.Table(header, rows, template.ColumnAlign(\n    document.AlignLeft, document.AlignRight, document.AlignRight,\n))\n\n// Image：在所属列内的对齐。\nc.Image(logoBytes, template.WithAlign(document.AlignRight))\n\n// 页码接受 TextOption，所以 AlignRight 直接可用。\nc.PageNumber(template.AlignRight())\n",[22,1651,1652,1657,1687,1716,1720,1724,1729,1762,1766,1771],{"__ignoreMap":70},[74,1653,1654],{"class":76,"line":77},[74,1655,1656],{"class":157},"// Table：按位置对应 header 切片的逐列对齐。\n",[74,1658,1659,1661,1663,1666,1668,1671,1673,1676,1678,1680,1682,1685],{"class":76,"line":117},[74,1660,140],{"class":80},[74,1662,85],{"class":84},[74,1664,1665],{"class":88},"Table",[74,1667,127],{"class":84},[74,1669,1670],{"class":80},"header",[74,1672,134],{"class":84},[74,1674,1675],{"class":80}," rows",[74,1677,134],{"class":84},[74,1679,217],{"class":80},[74,1681,85],{"class":84},[74,1683,1684],{"class":88},"ColumnAlign",[74,1686,369],{"class":84},[74,1688,1689,1692,1694,1697,1699,1701,1703,1705,1707,1709,1711,1713],{"class":76,"line":161},[74,1690,1691],{"class":80},"    document",[74,1693,85],{"class":84},[74,1695,1696],{"class":80},"AlignLeft",[74,1698,134],{"class":84},[74,1700,1361],{"class":80},[74,1702,85],{"class":84},[74,1704,222],{"class":80},[74,1706,134],{"class":84},[74,1708,1361],{"class":80},[74,1710,85],{"class":84},[74,1712,222],{"class":80},[74,1714,1715],{"class":84},",\n",[74,1717,1718],{"class":76,"line":193},[74,1719,574],{"class":84},[74,1721,1722],{"class":76,"line":228},[74,1723,262],{"emptyLinePlaceholder":261},[74,1725,1726],{"class":76,"line":234},[74,1727,1728],{"class":157},"// Image：在所属列内的对齐。\n",[74,1730,1731,1733,1735,1738,1740,1743,1745,1747,1749,1752,1754,1756,1758,1760],{"class":76,"line":298},[74,1732,140],{"class":80},[74,1734,85],{"class":84},[74,1736,1737],{"class":88},"Image",[74,1739,127],{"class":84},[74,1741,1742],{"class":80},"logoBytes",[74,1744,134],{"class":84},[74,1746,217],{"class":80},[74,1748,85],{"class":84},[74,1750,1751],{"class":88},"WithAlign",[74,1753,127],{"class":84},[74,1755,385],{"class":80},[74,1757,85],{"class":84},[74,1759,222],{"class":80},[74,1761,574],{"class":84},[74,1763,1764],{"class":76,"line":308},[74,1765,262],{"emptyLinePlaceholder":261},[74,1767,1768],{"class":76,"line":318},[74,1769,1770],{"class":157},"// 页码接受 TextOption，所以 AlignRight 直接可用。\n",[74,1772,1773,1775,1777,1780,1782,1784,1786,1788],{"class":76,"line":328},[74,1774,140],{"class":80},[74,1776,85],{"class":84},[74,1778,1779],{"class":88},"PageNumber",[74,1781,127],{"class":84},[74,1783,103],{"class":80},[74,1785,85],{"class":84},[74,1787,222],{"class":88},[74,1789,225],{"class":84},[18,1791,1792,1794,1795,1798,1799,1801,1802,1805,1806,1808],{},[22,1793,1684],{}," 接受的是 ",[22,1796,1797],{},"document.TextAlign"," 值，不是 ",[22,1800,1626],{}," —— 是 ",[22,1803,1804],{},"document.AlignRight","，不是 ",[22,1807,62],{},"。容易搞混，不过编译器会立刻告诉你。",[14,1810,1811],{"id":1811},"当行帮不上忙时",[18,1813,1814],{},"对于要固定在某个坐标、和页面上其他内容无关的东西 —— 已付印章、斜向水印、角标 —— 就离开网格：",[65,1816,1818],{"className":67,"code":1817,"language":69,"meta":70,"style":70},"page.Absolute(document.Mm(140), document.Mm(60),\n    func(c *template.ColBuilder) {\n        c.Text(\"已付款\", template.AlignRight(), template.Bold(),\n            template.FontSize(28), template.TextColor(pdf.RGBHex(0xC62828)))\n    },\n    template.AbsoluteWidth(document.Mm(50)),\n)\n",[22,1819,1820,1858,1877,1912,1950,1954,1980],{"__ignoreMap":70},[74,1821,1822,1824,1826,1829,1831,1833,1835,1837,1839,1842,1845,1847,1849,1851,1853,1856],{"class":76,"line":77},[74,1823,81],{"class":80},[74,1825,85],{"class":84},[74,1827,1828],{"class":88},"Absolute",[74,1830,127],{"class":84},[74,1832,385],{"class":80},[74,1834,85],{"class":84},[74,1836,421],{"class":88},[74,1838,127],{"class":84},[74,1840,1841],{"class":130},"140",[74,1843,1844],{"class":84},"),",[74,1846,1361],{"class":80},[74,1848,85],{"class":84},[74,1850,421],{"class":88},[74,1852,127],{"class":84},[74,1854,1855],{"class":130},"60",[74,1857,393],{"class":84},[74,1859,1860,1863,1865,1867,1869,1871,1873,1875],{"class":76,"line":117},[74,1861,1862],{"class":84},"    func(",[74,1864,140],{"class":95},[74,1866,99],{"class":84},[74,1868,103],{"class":102},[74,1870,85],{"class":84},[74,1872,149],{"class":102},[74,1874,111],{"class":84},[74,1876,114],{"class":84},[74,1878,1879,1881,1883,1885,1887,1889,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910],{"class":76,"line":161},[74,1880,196],{"class":80},[74,1882,85],{"class":84},[74,1884,201],{"class":88},[74,1886,127],{"class":84},[74,1888,206],{"class":84},[74,1890,1891],{"class":209},"已付款",[74,1893,206],{"class":84},[74,1895,134],{"class":84},[74,1897,217],{"class":80},[74,1899,85],{"class":84},[74,1901,222],{"class":88},[74,1903,559],{"class":84},[74,1905,217],{"class":80},[74,1907,85],{"class":84},[74,1909,556],{"class":88},[74,1911,721],{"class":84},[74,1913,1914,1917,1919,1921,1923,1926,1928,1930,1932,1934,1936,1938,1940,1943,1945,1948],{"class":76,"line":193},[74,1915,1916],{"class":80},"            template",[74,1918,85],{"class":84},[74,1920,566],{"class":88},[74,1922,127],{"class":84},[74,1924,1925],{"class":130},"28",[74,1927,1844],{"class":84},[74,1929,217],{"class":80},[74,1931,85],{"class":84},[74,1933,601],{"class":88},[74,1935,127],{"class":84},[74,1937,606],{"class":80},[74,1939,85],{"class":84},[74,1941,1942],{"class":88},"RGBHex",[74,1944,127],{"class":84},[74,1946,1947],{"class":130},"0xC62828",[74,1949,619],{"class":84},[74,1951,1952],{"class":76,"line":228},[74,1953,1424],{"class":84},[74,1955,1956,1959,1961,1964,1966,1968,1970,1972,1974,1977],{"class":76,"line":234},[74,1957,1958],{"class":80},"    template",[74,1960,85],{"class":84},[74,1962,1963],{"class":88},"AbsoluteWidth",[74,1965,127],{"class":84},[74,1967,385],{"class":80},[74,1969,85],{"class":84},[74,1971,421],{"class":88},[74,1973,127],{"class":84},[74,1975,1976],{"class":130},"50",[74,1978,1979],{"class":84},")),\n",[74,1981,1982],{"class":76,"line":298},[74,1983,331],{"class":84},[18,1985,1986],{},"这是逃生口，不是惯用写法。如果你发现自己在为普通内容计算 x 坐标，答案其实是填充列。",[18,1988,1989,1990,1992,1993,1996,1997,2000],{},"最后还有一点：",[22,1991,58],{}," 会把单个跨度限制在 1〜12，但没有人检查",[1615,1994,1995],{},"总和","。一行里写三个 ",[22,1998,1999],{},"Col(5)","，宽度百分比加起来是 125%，第三列不会换行，而是溢出右边距。gpdf 不会警告你。跨度请自己数。",[14,2002,2003],{"id":2003},"相关做法",[2005,2006,2007,2015,2022,2033],"ul",{},[2008,2009,2010,2014],"li",{},[27,2011,2013],{"href":2012},"/zh/blog/12-column-grid","gpdf 的 12 列网格如何工作？"," —— 网格的完整说明",[2008,2016,2017,2021],{},[27,2018,2020],{"href":2019},"/zh/blog/nest-row-in-col","如何在 Col 中嵌套一个 Row？"," —— 扁平网格的另一个问题",[2008,2023,2024,2028,2029,2032],{},[27,2025,2027],{"href":2026},"/zh/blog/table-column-widths","如何设置表格的列宽？"," —— ",[22,2030,2031],{},"c.Table"," 内部的宽度与对齐",[2008,2034,2035,2039],{},[27,2036,2038],{"href":2037},"/zh/blog/invoice-pdf-go-under-50-lines","50 行以内用 Go 生成发票 PDF"," —— 在完整文档里使用这个模式",[14,2041,2043],{"id":2042},"试试-gpdf","试试 gpdf",[18,2045,2046],{},"gpdf 是一个 Go 的 PDF 生成库。MIT 许可，零外部依赖，原生支持 CJK。",[65,2048,2052],{"className":2049,"code":2050,"language":2051,"meta":70,"style":70},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[22,2053,2054],{"__ignoreMap":70},[74,2055,2056,2058,2061],{"class":76,"line":77},[74,2057,69],{"class":102},[74,2059,2060],{"class":209}," get",[74,2062,2063],{"class":209}," github.com/gpdf-dev/gpdf\n",[18,2065,2066,2070,2071],{},[27,2067,2069],{"href":29,"rel":2068},[31],"⭐ 在 GitHub 上 Star"," · ",[27,2072,2075],{"href":2073,"rel":2074},"https://gpdf.dev/zh/docs/quickstart",[31],"阅读文档",[2077,2078,2079],"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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":70,"searchDepth":117,"depth":117,"links":2081},[2082,2083,2084,2085,2086,2087,2088,2089,2090],{"id":16,"depth":117,"text":16},{"id":36,"depth":117,"text":36},{"id":240,"depth":117,"text":240},{"id":1294,"depth":117,"text":1294},{"id":1515,"depth":117,"text":1516},{"id":1642,"depth":117,"text":1643},{"id":1811,"depth":117,"text":1811},{"id":2003,"depth":117,"text":2003},{"id":2042,"depth":117,"text":2043},"2026-09-02","需要做两件事：用一个空的填充 Col 把列推到右边缘，再用 template.AlignRight() 让列内文本右对齐。两者是分开的，通常都要。",false,"md",{"name":2096,"totalTime":2097,"tools":2098,"steps":2101},"在 gpdf 中把一个 Col 对齐到行的右边缘","PT10M",[2099,2100],"Go 1.22+","github.com/gpdf-dev/gpdf",[2102,2105,2108,2111,2114],{"name":2103,"text":2104},"先分清你说的是哪个「右」","把列的盒子放到行的右边缘，和让列内文本右对齐，是两个独立的问题，解法也不同。大多数排版两者都需要。",{"name":2106,"text":2107},"加一个填充 Col 让跨度总和为 12","在你想靠右的列前面写一个空回调的 r.Col。r.Col(8, func(c *template.ColBuilder) {}) 后面接 r.Col(4, ...)，4 跨度的列就会紧贴右边距。",{"name":2109,"text":2110},"给文本选项传入 AlignRight","给该列内的每一个 c.Text 加上 template.AlignRight()。不加的话文本会停在一个靠右的列的左边缘，这是这里最常见的错误。",{"name":2112,"text":2113},"表格和图片使用各自的选项","文本对齐选项不会作用到 Table 或 Image 内部。表格用 template.ColumnAlign(document.AlignRight)，图片用 template.WithAlign(document.AlignRight)。",{"name":2115,"text":2116},"只在行解决不了时才用 page.Absolute","page.Absolute(x, y, fn, template.AbsoluteWidth(w)) 会在网格之外的固定坐标放置内容。它适合印章和水印，不适合普通的右对齐内容。",null,{},"/zh/blog/align-column-right-edge",{"title":5,"description":2092},"zh/blog/028.align-column-right-edge",[2123,2124,2125],"recipe","tutorial","templates","5cvRHcFOBunZzljr2W-p3-mr4GINECRhkVeU4SHzCV4",1788360657602]