Go语言生成PDF文件详解

文章目录

    • [1. 安装`gofpdf`包](#1. 安装gofpdf包)
    • [2. 基本用法](#2. 基本用法)
      • [2.1 创建PDF实例](#2.1 创建PDF实例)
      • [2.2 添加页面](#2.2 添加页面)
      • [2.3 设置字体](#2.3 设置字体)
      • [2.4 添加文本](#2.4 添加文本)
      • [2.5 添加图像](#2.5 添加图像)
    • [3. 生成PDF文件](#3. 生成PDF文件)
    • [4. 示例代码详解](#4. 示例代码详解)
    • [5. 代码解析](#5. 代码解析)
      • [5.1 主函数`generatePdf`](#5.1 主函数generatePdf)
      • [5.2 辅助函数`addPdfContent`](#5.2 辅助函数addPdfContent)
      • [5.3 辅助函数`setPdfLogo`](#5.3 辅助函数setPdfLogo)
    • [6. 总结](#6. 总结)

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

1. 安装gofpdf

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

sh 复制代码
go get -u github.com/jung-kurt/gofpdf

2. 基本用法

2.1 创建PDF实例

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

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

2.2 添加页面

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

go 复制代码
pdf.AddPage()

2.3 设置字体

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

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

2.4 添加文本

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

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

2.5 添加图像

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

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

3. 生成PDF文件

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

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

4. 示例代码详解

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

go 复制代码
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 方法添加内容。
  • 添加logo :使用 ImageOptions 方法添加logo图像。

6. 总结

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

参考资料:
gofpdf

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

相关推荐
流星白龙10 分钟前
【C++习题】10.反转字符串中的单词 lll
开发语言·c++
尘浮生17 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
MessiGo17 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Tech Synapse23 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴24 分钟前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
乌啼霜满天24931 分钟前
JDBC编程---Java
java·开发语言·sql
微信-since8119239 分钟前
[ruby on rails] 安装docker
后端·docker·ruby on rails
色空大师44 分钟前
23种设计模式
java·开发语言·设计模式
Bruce小鬼1 小时前
QT文件基本操作
开发语言·qt
2202_754421541 小时前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言