Go语言生成PDF文件详解

发布于:2024-10-16 ⋅ 阅读:(15) ⋅ 点赞:(0)


在现代Web开发中,生成PDF文件是一个常见的需求,无论是生成报告、发票还是其他类型的文档,PDF因其跨平台的特性和丰富的格式支持而成为首选格式。本文将详细介绍如何使用Go语言中的 gofpdf包来生成PDF文件,并通过具体的代码示例来展示其功能和用法。

1. 安装gofpdf

首先,我们需要安装gofpdf包。可以通过以下命令来安装:

go get -u github.com/jung-kurt/gofpdf

2. 基本用法

2.1 创建PDF实例

创建一个新的PDF实例是使用gofpdf的第一步。我们可以指定页面的方向(纵向或横向)、单位(毫米或英寸)和纸张大小(A4、Letter等)。

pdf := gofpdf.New("P", "mm", "A4", "")
  • "P" 表示页面方向为纵向(Portrait),也可以使用 "L" 表示横向(Landscape)。
  • "mm" 表示单位为毫米,也可以使用 "pt"(点)、"in"(英寸)等。
  • "A4" 表示纸张大小为A4,也可以使用 "Letter" 等其他标准纸张大小。

2.2 添加页面

创建PDF实例后,可以使用 AddPage 方法添加新的页面。

pdf.AddPage()

2.3 设置字体

gofpdf 支持多种字体,包括标准的PDF字体和自定义的TrueType字体。为了支持中文,我们需要加载自定义的字体文件。

pdf.AddUTF8Font("NotoSansSC", "", fontPathLight)
pdf.SetFont("NotoSansSC", "", 10)
  • AddUTF8Font 方法用于添加自定义的UTF-8字体。
  • SetFont 方法用于设置当前使用的字体。

2.4 添加文本

使用 MultiCell 方法可以添加多行文本。MultiCell 方法允许指定文本的宽度、高度、内容、边框、对齐方式等。

pdf.SetXY(22, 207)
pdf.SetTextColor(255, 255, 255)
pdf.MultiCell(0, 6, baseInfo, "", "", false)
  • SetXY 方法用于设置文本的起始位置。
  • SetTextColor 方法用于设置文本的颜色。
  • MultiCell 方法用于添加多行文本。

2.5 添加图像

使用 ImageOptions 方法可以添加图像。ImageOptions 方法允许指定图像的路径、位置、大小、是否旋转等。

pdf.ImageOptions(
    "./static/base.png",
    0, 0,
    210, 0,
    false,
    gofpdf.ImageOptions{ImageType: "png", ReadDpi: true},
    0,
    "",
)
  • ImageOptions 方法用于添加图像。
  • 第一个参数是图像文件的路径。
  • 后面的参数分别表示图像的X坐标、Y坐标、宽度、高度、是否旋转、图像选项、链接等。

3. 生成PDF文件

最后,使用 OutputFileAndClose 方法将PDF文件输出到指定的路径。

pdfPath := "./temp-files/" + name + ".pdf"
err = pdf.OutputFileAndClose(pdfPath)
if err != nil {
    return
}

4. 示例代码详解

以下是一个完整的示例代码,展示了如何使用gofpdf生成包含文本和图像的PDF文件。

package pdf

import (
	"github.com/jung-kurt/gofpdf"
	"os"
)

const (
	fontPathBold    = "./font/PingFang-SC-Bold.ttf"
	fontPathLight   = "./font/PingFang-SC-Light.ttf"
)

// generatePdf 生成PDF文件
func generatePdf(name, baseInfo, content string, images []string) (pdfPath string, err error) {
	// 删除图片
	defer func() {
		for _, image := range images {
			os.Remove(image)
		}
	}()

	// 创建PDF实例
	pdf := gofpdf.New("P", "mm", "A4", "")

	// 生成封面
	pdf.AddPage()

	// 读取图像文件
	pdf.ImageOptions(
		"./static/base.png",
		0, 0,
		210, 0,
		false,
		gofpdf.ImageOptions{ImageType: "png", ReadDpi: true},
		0,
		"",
	)

	// 添加字体
	pdf.AddUTF8Font("NotoSansSC", "", fontPathLight)
	pdf.SetFont("NotoSansSC", "", 10)

	// 添加基础信息
	pdf.SetXY(22, 207)
	pdf.SetTextColor(255, 255, 255)
	pdf.MultiCell(0, 6, baseInfo, "", "", false)

	// 添加内容
	addPdfContent(pdf, "内容1", content)

	// 添加图片
	for _, image := range images {
		pdf.AddPage()
		setPdfLogo(pdf)
		pdf.ImageOptions(
			image,
			12, 23,
			180, 0,
			false,
			gofpdf.ImageOptions{ImageType: "png", ReadDpi: true},
			0,
			"",
		)
	}

	// 输出PDF文件
	pdfPath = "./temp-files/" + name + ".pdf"
	err = pdf.OutputFileAndClose(pdfPath)
	if err != nil {
		return
	}
	return
}

// addPdfContent 添加PDF内容
func addPdfContent(pdf *gofpdf.Fpdf, title, content string) {
	// 添加字体
	pdf.AddUTF8Font("NotoSansSC", "", fontPathBold)
	pdf.SetFont("NotoSansSC", "", 10)

	// 添加新页面
	pdf.AddPage()
	setPdfLogo(pdf)

	// 设置文本颜色和大小
	pdf.SetTextColor(0, 0, 0)
	pdf.SetFontSize(20)

	// 添加标题
	pdf.SetXY(10, 10)
	pdf.MultiCell(0, 5, title, "", "", false)

	// 添加内容
	pdf.AddUTF8Font("NotoSansSC", "", fontPathLight)
	pdf.SetFont("NotoSansSC", "", 12)
	pdf.SetFontSize(12)
	pdf.SetXY(10, 23)
	pdf.MultiCell(0, 5, content, "", "", false)
}

// setPdfLogo 设置PDF的logo
func setPdfLogo(pdf *gofpdf.Fpdf) {
	// 读取图像文件
	pdf.ImageOptions(
		"./static/logo.png",
		180, 9,
		22, 0,
		false,
		gofpdf.ImageOptions{ImageType: "png", ReadDpi: true},
		0,
		"",
	)
}

5. 代码解析

5.1 主函数generatePdf

  • 创建PDF实例:使用 gofpdf.New 方法创建一个新的PDF实例。
  • 生成封面:添加一个新页面,并使用 ImageOptions 方法添加背景图像。
  • 添加基础信息:设置字体和文本颜色,使用 MultiCell 方法添加基础信息。
  • 添加内容:调用 addPdfContent 方法添加内容。
  • 添加图片:遍历 images 列表,为每张图片添加一个新页面,并使用 ImageOptions 方法添加图像。
  • 输出PDF文件:使用 OutputFileAndClose 方法将PDF文件输出到指定路径。

5.2 辅助函数addPdfContent

  • 添加字体:使用 AddUTF8Font 方法添加自定义字体。
  • 添加新页面:使用 AddPage 方法添加一个新页面。
  • 设置文本颜色和大小:使用 SetTextColorSetFontSize 方法设置文本颜色和大小。
  • 添加标题:使用 MultiCell 方法添加标题。
  • 添加内容:使用 MultiCell 方法添加内容。

5.3 辅助函数setPdfLogo

  • 添加logo:使用 ImageOptions 方法添加logo图像。

6. 总结

通过本文的介绍,我们详细了解了如何使用gofpdf包生成PDF文件。gofpdf提供了丰富的API,可以方便地添加文本、图像、表格等内容,支持多种字体和格式。希望本文能帮助你在实际项目中更好地使用gofpdf生成高质量的PDF文件。

参考资料:
gofpdf

如果你有任何问题或建议,欢迎留言交流!
关注我