使用gofpdf库可快速生成PDF,支持文本、图片、表格及复杂布局,通过Cell、Image等方法结合坐标控制实现;gofpdf适合简单文档,unipdf则适用于需解析、加密等高级功能的场景,选择依据具体需求而定。

Golang生成PDF文件,我们通常会借助成熟的第三方库来完成这项工作。这远比我们自己去啃PDF规范、从头构建文档结构要高效且稳定得多。选择一个像
gofpdf
unidoc/unipdf
在Golang中生成PDF,
gofpdf
首先,你需要安装它:
go get github.com/jung-kurt/gofpdf
接下来,一个简单的PDF生成流程通常是这样的:创建一个PDF对象,添加页面,设置字体,然后写入内容。
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"github.com/jung-kurt/gofpdf"
"os"
)
func main() {
pdf := gofpdf.New("P", "mm", "A4", "") // P: 纵向, mm: 毫米, A4: 纸张大小
pdf.AddPage() // 添加一个新页面
// 设置字体:Arial, Bold, 16号字
pdf.SetFont("Arial", "B", 16)
// 写入一个单元格,内容是 "Hello, Golang PDF!"
pdf.Cell(40, 10, "Hello, Golang PDF!")
// 换行,并写入更多内容
pdf.Ln(10) // 换行10mm
pdf.SetFont("Arial", "", 12) // 设置回普通字体
pdf.MultiCell(0, 6, "这是一段较长的文本,它会自动根据页面宽度进行换行。通过gofpdf,我们可以轻松地控制文本的布局和样式。比如,我们可以设置字体、大小、颜色,甚至对齐方式。", "", "L", false)
// 保存PDF文件
filePath := "simple_golang_pdf.pdf"
err := pdf.OutputFileAndClose(filePath)
if err != nil {
fmt.Printf("生成PDF失败: %v\n", err)
return
}
fmt.Printf("PDF文件已成功生成到: %s\n", filePath)
}
这段代码展示了最基础的文本写入。你可以看到,通过
New
AddPage
SetFont
Cell
MultiCell
OutputFileAndClose
在Golang的PDF生态中,确实有几个库值得一提,它们各有侧重。
首先是刚才用到的
github.com/jung-kurt/gofpdf
gofpdf
另一个是
github.com/unidoc/unipdf
unipdf
gofpdf
gofpdf
unipdf
unipdf
还有一些小众的库,比如基于HTML/CSS转PDF的方案,或者一些封装了C/C++库的Go绑定。但通常来说,
gofpdf
unipdf
要在PDF中添加图片、表格或实现复杂布局,这确实是PDF生成过程中比较有挑战性的部分。
添加图片:
gofpdf
// ... 承接上面的main函数部分
pdf.Ln(10) // 再换行
pdf.SetFont("Arial", "B", 14)
pdf.Cell(0, 10, "图片示例:")
pdf.Ln(10)
// 添加图片
// 参数:图片路径, x坐标, y坐标, 宽度, 高度, 类型 (空字符串自动识别)
// 注意:图片路径可以是相对路径或绝对路径,确保程序运行时能找到图片
imagePath := "test_image.jpg" // 假设当前目录下有test_image.jpg
// 实际使用时,你需要确保test_image.jpg存在,可以是一个简单的占位图
// 例如,你可以用画图工具随便画一个,保存为test_image.jpg
pdf.Image(imagePath, 10, pdf.GetY(), 50, 0, false, "", 0, "") // 宽度50mm,高度按比例自动调整 (0)这里
pdf.GetY()
模拟表格:
gofpdf
CreateTable
Cell
// ... 承接上面的main函数部分
pdf.Ln(20) // 再次换行
pdf.SetFont("Arial", "B", 14)
pdf.Cell(0, 10, "表格示例:")
pdf.Ln(10)
// 模拟表格数据
headers := []string{"商品", "单价", "数量", "总计"}
data := [][]string{
{"笔记本电脑", "8000.00", "1", "8000.00"},
{"显示器", "1500.00", "2", "3000.00"},
{"鼠标", "100.00", "3", "300.00"},
}
colWidths := []float64{60, 30, 20, 30} // 各列宽度
// 表头
pdf.SetFont("Arial", "B", 10)
for i, header := range headers {
pdf.Cell(colWidths[i], 8, header) // 8mm高
}
pdf.Ln(-1) // 换行,回到行首
// 表格内容
pdf.SetFont("Arial", "", 10)
for _, row := range data {
for i, cell := range row {
pdf.Cell(colWidths[i], 8, cell)
}
pdf.Ln(-1) // 换行
}通过循环和
Cell
复杂布局: 复杂布局往往是
Cell
MultiCell
Text
Image
Line
SetX
SetY
GetX
GetY
Cell
MultiCell
Rect
比如,一个带有公司Logo、地址、订单详情、产品列表和总计的订单,就需要综合运用这些方法,并仔细计算每个元素的相对位置。这通常需要一些试错和调整,因为PDF的坐标系统和网页布局的“弹性”有很大不同,它更像是在一张固定大小的纸上画图。
在Golang中生成PDF,虽然库简化了大部分工作,但仍然可能遇到一些性能和错误处理上的挑战。
性能瓶颈:
错误处理策略:
OutputFileAndClose
Output
err := pdf.OutputFileAndClose(filePath)
if err != nil {
// 记录日志,告知用户错误,例如“无法保存PDF文件,请检查目录权限或磁盘空间。”
fmt.Printf("Error saving PDF: %v\n", err)
}pdf.Image()
pdf.AddFont()
gofpdf
AddFont
Identity-H
AddFont
总的来说,处理这些问题需要耐心和细致,很多时候是在开发过程中不断调试和优化的结果。
以上就是Golang生成PDF文件 第三方库使用实例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号