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

如何使用gofpdf合并或追加PDF文件?含Base64文件处理场景

嘿,我刚好折腾过类似的需求,gofpdf本身确实没有直接支持合并现有PDF文档的官方API,这也是你翻遍文档找不到方法的原因~

解决方案思路

因为gofpdf的定位是生成PDF,而非处理现有PDF合并,所以得换个思路来实现你的需求:

1. 推荐方案:用专门的PDF合并库(省心可靠)

先把Base64编码的PDF解码成字节流,再结合gofpdf生成的PDF字节流,用专门的PDF处理库来合并,这是最稳妥的方式。比如pdfcpu或者ledongthuc/pdf这类库都支持从字节流读取PDF并合并。

举个实操例子(用pdfcpu):

import (
    "encoding/base64"
    "github.com/pdfcpu/pdfcpu/pkg/api"
    "github.com/jung-kurt/gofpdf"
)

func mergePDFsWithImages() ([]byte, error) {
    // 第一步:用gofpdf生成包含图片的PDF
    pdf := gofpdf.New("P", "mm", "A4", "")
    pdf.AddPage()
    // 添加图片(这里用本地路径,你也可以用字节流方式加载)
    err := pdf.Image("your-image.jpg", 10, 10, 50, 0, false, "", 0, "")
    if err != nil {
        return nil, err
    }
    // 把gofpdf生成的PDF转成字节流
    gofpdfBytes, err := pdf.OutputBytes()
    if err != nil {
        return nil, err
    }

    // 第二步:解码Base64格式的待合并PDF
    base64TargetPDF := "你的Base64编码PDF字符串"
    targetPDFBytes, err := base64.StdEncoding.DecodeString(base64TargetPDF)
    if err != nil {
        return nil, err
    }

    // 第三步:合并两个PDF(gofpdf生成的 + 解码后的目标PDF)
    mergedBytes, err := api.MergeRaw([][]byte{gofpdfBytes, targetPDFBytes}, nil)
    if err != nil {
        return nil, err
    }

    return mergedBytes, nil
}

2. 不推荐的硬刚方案(基于gofpdf底层操作)

你之前尝试的RawWriteBuf/RawWriteStr之所以失败,是因为PDF是有严格结构的文档,直接写入字节流会破坏gofpdf生成的PDF的交叉引用表(XRef)和文档结构,导致最终PDF损坏。

如果一定要硬基于gofpdf实现,你需要:

  • 解析待合并PDF的每个页面的内容流、资源(字体、图片等)
  • 将这些资源逐一导入到gofpdf的文档中
  • 把页面内容流写入到gofpdf的新页面里

这个过程非常繁琐,很容易出现排版错乱、字体丢失、PDF无法打开等问题,除非你对PDF底层格式非常熟悉,否则不建议这么做。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:26:34