You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用go-wkhtmltopdf设置带页码计数的动态页脚

Go后端生成带页码计数动态页脚的PDF问题

我用Go语言编写函数将HTML文件生成PDF,但无法生成包含页码计数的动态页脚。必须在后端通过Go/HTML实现,JavaScript方案不适用。

现有代码

HTML模板部分

{{define "Count"}}Invoice Footer{{end}}

{{define "invoiceFooter"}}
<table style="border-bottom: 1px solid black; width: 100%">
    <tr>
        <td class="--footer-center"></td>
        <td style="text-align:center">
            Page [page] of [topage]
        </td>
    </tr>
</table>
{{end}}

Go生成代码部分

func generatePDF(data *cs.FileData) (pdfgBytes []byte, err error) {
    var templ *template.Template

    _, err = os.Getwd()
    if err != nil {
        return nil, err
    }

    tmplFiles, err := fs.ReadDir(templateDir, "templates")
    if err != nil {
        return nil, err
    }

    files := []string{}
    for _, file := range tmplFiles {
        if file.IsDir() {
            continue
        }
        files = append(files, fmt.Sprintf("templates/%s", file.Name()))
    }

    // 解析HTML模板
    templ = template.Must(template.ParseFS(templateDir, files...))

    // 执行模板生成HTML内容
    var body bytes.Buffer
    if err = templ.Execute(&body, data); err != nil {
        return
    }

    // 创建PDF生成器
    pdfg, err := pdf.NewPDFGenerator()
    if err != nil {
        return
    }

    // 创建PDF页面
    page := pdf.NewPageReader(bytes.NewReader(body.Bytes()))
    page.EnableLocalFileAccess.Set(true)

    // 修正后的页脚设置
    // 方式1:直接使用内置变量设置页脚内容
    page.FooterCenter.Set("Page [page] of [topage]")
    page.FooterFontSize.Set(7)

    // 方式2:使用HTML模板作为页脚(如果需要更复杂的样式)
    // var footerBuf bytes.Buffer
    // if err = templ.ExecuteTemplate(&footerBuf, "invoiceFooter", data); err != nil {
    //     return nil, err
    // }
    // page.FooterHTML.Set(footerBuf.String())
    // page.FooterFontSize.Set(7)

    pdfg.AddPage(page)

    // 生成PDF字节流
    pdfgBytes, err = pdfg.Create()
    if err != nil {
        return nil, err
    }

    return pdfgBytes, nil
}

问题分析与解决方案

你之前的核心问题:

  • 错误尝试用JavaScript填充页码,不符合后端实现要求,且wkhtmltopdf后端渲染默认禁用JS
  • FooterHTML.Set(--footer-html)用法错误,该参数需传入完整HTML内容,而非命令行参数名
  • 未正确利用wkhtmltopdf内置的[page](当前页码)和[topage](总页数)变量

正确实现步骤

  1. 简化HTML模板:移除所有JavaScript代码,直接使用wkhtmltopdf内置占位符,生成PDF时会自动替换为实际页码
  2. 修正Go代码配置:
    • 简单页码需求:直接通过FooterCenter/FooterLeft/FooterRight传入带占位符的文本
    • 复杂样式需求:执行invoiceFooter模板生成HTML片段,再通过FooterHTML.Set()传入
  3. 依赖版本检查:确保使用最新版SebastiaanKlippert/go-wkhtmltopdf库,保证内置变量正常解析

注意事项

  • 页脚样式需用内联CSS,wkhtmltopdf对页脚/页眉的外部CSS支持有限
  • 使用FooterHTML时,模板无需包含<html>/<body>标签,仅传入页脚内容片段即可

内容的提问来源于stack exchange,提问作者NachoShaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:10:27