PDF 合并

概述

Since v1.0.2

gpdf 可以将多个 PDF 文档合并为一个。你可以合并完整文档,也可以从每个源中提取特定的页面范围。

常见用例:

  • 将封面页与生成的内容合并
  • 将多张发票合并为一个包
  • 从大型文档中提取特定页面
  • 从多个来源组装报告

基本合并

使用 gpdf.Merge() 合并两个或多个 PDF:

import gpdf "github.com/gpdf-dev/gpdf"

cover, _ := os.ReadFile("cover.pdf")
body, _ := os.ReadFile("body.pdf")

merged, err := gpdf.Merge([]gpdf.Source{
    {Data: cover},
    {Data: body},
})
if err != nil {
    log.Fatal(err)
}

os.WriteFile("output.pdf", merged, 0644)

每个 Source 包含原始 PDF 字节。默认情况下,会包含每个源的所有页面。

页面范围提取

使用 PageRange 仅包含源中的特定页面(基于 1,包含边界):

full, _ := os.ReadFile("report.pdf")

// 提取第 2 至第 4 页
extracted, err := gpdf.Merge([]gpdf.Source{
    {Data: full, Pages: gpdf.PageRange{From: 2, To: 4}},
})

PageRange 规则:

  • From: 0 或省略 — 从第一页开始
  • To: 0 或省略 — 到最后一页结束
  • 零值 PageRange{} — 包含所有页面

设置元数据

使用 WithMergeMetadata 为合并输出设置文档信息:

merged, err := gpdf.Merge(
    []gpdf.Source{
        {Data: cover},
        {Data: body},
        {Data: appendix},
    },
    gpdf.WithMergeMetadata("Policy Bundle", "Example Ltd", "gpdf"),
)

参数:title(标题)、author(作者)、producer(制作者)。

合并 + 叠加

将合并与叠加结合使用,在合并后添加页码或水印:

// 步骤 1:合并文档
merged, _ := gpdf.Merge([]gpdf.Source{
    {Data: cover},
    {Data: body},
})

// 步骤 2:打开合并结果并添加页码
doc, _ := gpdf.Open(merged)
count, _ := doc.PageCount()

doc.EachPage(func(i int, p *template.PageBuilder) {
    p.Absolute(document.Mm(170), document.Mm(285), func(c *template.ColBuilder) {
        c.Text(fmt.Sprintf("%d / %d", i+1, count),
            template.FontSize(10),
            template.AlignRight(),
        )
    }, template.AbsoluteWidth(document.Mm(20)))
})

result, _ := doc.Save()
os.WriteFile("final.pdf", result, 0644)

API 参考

函数 / 类型说明
gpdf.Merge(sources, opts...)将多个 PDF 合并为一个
gpdf.Source输入 PDF:Data []byte + Pages PageRange
gpdf.PageRange基于 1 的包含范围:FromTo(0 = 默认)
gpdf.WithMergeMetadata(title, author, producer)设置输出的文档元数据

后续步骤