页眉和页脚

页眉

使用 doc.Header() 定义在每一页重复的页眉:

doc := template.New(
    template.WithPageSize(document.A4),
    template.WithMargins(document.UniformEdges(document.Mm(20))),
)

doc.Header(func(p *template.PageBuilder) {
    p.AutoRow(func(r *template.RowBuilder) {
        r.Col(6, func(c *template.ColBuilder) {
            c.Text("ACME Corporation", template.Bold(), template.FontSize(10))
        })
        r.Col(6, func(c *template.ColBuilder) {
            c.Text("Confidential Report", template.AlignRight(), template.FontSize(10),
                template.TextColor(pdf.Gray(0.5)))
        })
    })
    p.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Line(template.LineColor(pdf.RGBHex(0x1565C0)), template.LineThickness(document.Pt(2)))
            c.Spacer(document.Mm(5))
        })
    })
})

页脚

使用 doc.Footer() 定义在每一页重复的页脚:

doc.Footer(func(p *template.PageBuilder) {
    p.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Spacer(document.Mm(5))
            c.Line(template.LineColor(pdf.Gray(0.7)))
            c.Spacer(document.Mm(2))
        })
    })
    p.AutoRow(func(r *template.RowBuilder) {
        r.Col(6, func(c *template.ColBuilder) {
            c.Text("Generated by gpdf", template.FontSize(8),
                template.TextColor(pdf.Gray(0.5)))
        })
        r.Col(6, func(c *template.ColBuilder) {
            c.Text("Confidential", template.FontSize(8),
                template.AlignRight(), template.TextColor(pdf.Gray(0.5)))
        })
    })
})

完整示例

// Three pages of content — header and footer repeat on each page
for range 3 {
    page := doc.AddPage()
    page.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Text("Main Content Area", template.FontSize(16), template.Bold())
            c.Spacer(document.Mm(5))
            c.Text("The header and footer repeat on every page automatically.")
        })
    })
}
┌─ Page 1 ──────────────────────────────────────┐
│  ACME Corporation        Confidential Report  │  ← 页眉
│  ─────────────────────────────────────────── │
│                                               │
│  Main Content Area                            │
│  The header and footer repeat on every page.  │
│                                               │
│  ─────────────────────────────────────────── │
│  Generated by gpdf                Confidential│  ← 页脚
└───────────────────────────────────────────────┘

┌─ Page 2 ──────────────────────────────────────┐
│  ACME Corporation        Confidential Report  │  ← 相同的页眉
│  ─────────────────────────────────────────── │
│                                               │
│  Main Content Area                            │
│  The header and footer repeat on every page.  │
│                                               │
│  ─────────────────────────────────────────── │
│  Generated by gpdf                Confidential│  ← 相同的页脚
└───────────────────────────────────────────────┘

页码

使用 PageNumber()TotalPages() 实现自动页码编号:

// Header with total pages
doc.Header(func(p *template.PageBuilder) {
    p.AutoRow(func(r *template.RowBuilder) {
        r.Col(6, func(c *template.ColBuilder) {
            c.Text("Page Number Demo", template.Bold(), template.FontSize(10))
        })
        r.Col(6, func(c *template.ColBuilder) {
            c.TotalPages(template.AlignRight(), template.FontSize(9),
                template.TextColor(pdf.Gray(0.5)))
        })
    })
    p.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Line(template.LineColor(pdf.RGBHex(0x1565C0)))
            c.Spacer(document.Mm(3))
        })
    })
})

// Footer with page number
doc.Footer(func(p *template.PageBuilder) {
    p.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Spacer(document.Mm(3))
            c.Line(template.LineColor(pdf.Gray(0.7)))
            c.Spacer(document.Mm(2))
        })
    })
    p.AutoRow(func(r *template.RowBuilder) {
        r.Col(6, func(c *template.ColBuilder) {
            c.Text("Generated by gpdf", template.FontSize(8),
                template.TextColor(pdf.Gray(0.5)))
        })
        r.Col(6, func(c *template.ColBuilder) {
            c.PageNumber(template.AlignRight(), template.FontSize(8),
                template.TextColor(pdf.Gray(0.5)))
        })
    })
})

// Create 4 pages
for i := range 4 {
    page := doc.AddPage()
    titles := []string{"Introduction", "Background", "Analysis", "Conclusion"}
    page.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Text(titles[i], template.FontSize(18), template.Bold())
        })
    })
}
┌─ Page 1 ──────────────────────────────────────┐
│  Page Number Demo               4 total pages │  ← TotalPages()
│  ──────────────────────────────────────────── │
│                                               │
│  Introduction                                 │
│                                               │
│  ──────────────────────────────────────────── │
│  Generated by gpdf                      Page 1│  ← PageNumber()
└───────────────────────────────────────────────┘

┌─ Page 4 ──────────────────────────────────────┐
│  Page Number Demo               4 total pages │
│  ──────────────────────────────────────────── │
│                                               │
│  Conclusion                                   │
│                                               │
│  ──────────────────────────────────────────── │
│  Generated by gpdf                      Page 4│
└───────────────────────────────────────────────┘

多页文档

当内容超出页面时,gpdf 会自动创建新页面。页眉和页脚(包括页码)会应用到每一页。

// Create explicit pages
for i := range 5 {
    page := doc.AddPage()
    page.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Text(fmt.Sprintf("Page %d content", i+1))
        })
    })
}

下一步

  • 元素 — 所有内容元素类型
  • 组件 — 预构建的文档组件