使用 GO 生成 PDF 报告
好的,现在开始用GO生成PDF!
以编程方式生成PDF文档可以是您应用程序中的一个重要功能。在这里,我们通过示例对Go编程语言(Golang)中可用于生成PDF文件的库进行探索和简要回顾。
对于简单的文档创建或复杂且功能丰富的PDF生成,合适的解决方案可能有所不同。
是的,这张图片是AI生成的,模型是Flux1.Dev。
库和工具
gofpdf
GoPdf 是一个用于创建PDF的简单库。 它允许添加文本、图像、形状、表格并处理多页。 适用于简单到中等复杂度的PDF创建任务。
维护者:Jung Kurt(已停止维护但仍在使用)。
限制:缺乏更新,但现有使用仍在继续。
示例:
package main
import (
"github.com/jung-kurt/gofpdf"
)
func main() {
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.SetFont("Arial", "B", 16)
pdf.Cell(40, 10, "Hello World!")
err := pdf.OutputFileAndClose("hello.pdf")
if err != nil {
panic(err)
}
}
gopdf
维护者:signintech(积极维护)。
在Go编程语言中,一个用于此目的的突出库是gopdf,由SignInTech开发。该库提供了一种无需依赖外部库或C库即可编程生成PDF的简单方法。
gopdf是一个专为创建PDF文档而设计的纯Go库。它提供了一个专注于PDF生成的简单且高效的API,使基本任务更容易使用,同时保持复杂操作所需的灵活性。
关键功能:
- 纯Go实现:不需要外部依赖或C库。
- 简单API:用于生成PDF的易于使用的函数。
- 高效性能:优化以实现快速且高效的PDF创建。
使用示例
为了说明如何使用gopdf,让我们看一下创建简单PDF文档的基本示例:
package main
import (
"github.com/signintech/gopdf"
)
func main() {
// 创建一个新的PDF实例
pdf := gopdf.New()
// 设置页面大小和边距
pdf.SetPageSize(gopdf.PageSizeA4)
pdf.AddPage()
// 向PDF中添加一些文本
pdf.SetFont("Arial", "", 12)
pdf.Write(50, 50, "Hello, World!")
// 将PDF保存为文件
err := pdf.SaveToFile("example.pdf")
if err != nil {
panic(err)
}
}
这个示例演示了如何创建一个新的PDF文档,向其中添加文本,并将其保存为文件。
gopdf高级功能:
- 添加图像:您可以使用AddImage方法将图像插入到PDF文档中。
- 绘制形状:该库提供了绘制线条、矩形和其他形状的函数。
- PDF保护:您可以为PDF设置密码保护以限制访问。
pdfcpu
- 维护者:PDFCPU团队(https://github.com/pdfcpu/pdfcpu)。
- 使用场景:大规模PDF操作和分析。
Go中用于PDF操作的另一个强大库是pdfcpu。该库提供了通过API和命令行界面(CLI)创建、修改和检查PDF文件的全面功能集。下面,我们将深入探讨pdfcpu的描述、使用示例和关键功能。
pdfcpu是一个基于Go的PDF处理库,支持加密,并提供处理PDF文档各个方面(如内容提取、页面分割等)的健壮工具。它兼容所有PDF版本,包括对PDF 2.0(ISO-32000-2)的持续改进。该库旨在提供全面的PDF处理功能,使其适用于简单和复杂的应用场景。
关键功能
- 加密支持:pdfcpu支持加密,允许开发人员有效保护其PDF文档。
- API和CLI:它提供了一个用于程序访问的API和一个用于快速操作的命令行界面(CLI)。
- 批量处理:通过丰富的命令行支持批量处理,使其在一次处理多个文件时效率更高。
- 兼容性:兼容所有PDF版本,包括基本支持和对PDF 2.0的持续改进。
要开始使用pdfcpu,您需要使用Go的包管理系统进行安装:
go get github.com/pdfcpu/pdfcpu
基本命令行操作
pdfcpu提供了各种命令用于不同的操作。以下是一些示例:
从图像创建PDF
您可以使用以下命令将一个或多个图像文件转换为PDF文件:
pdfcpu img2pdf out.pdf image1.jpg image2.png
此命令将创建一个PDF,其中每个图像都渲染到单独的页面上。
要合并多个PDF文件为一个文档,请使用merge命令:
pdfcpu merge output.pdf file1.pdf file2.pdf
pdfcpu使用示例
对于更复杂的操作,您可以使用pdfcpu提供的API。以下是一个使用Go代码创建新PDF并添加文本的示例:
package main
import (
"github.com/pdfcpu/pdfcpu"
"log"
)
func main() {
// 创建一个新的PDF文档
doc := pdfcpu.NewPDF(0, 0)
defer doc.Close()
// 向文档中添加一个页面
page := doc.AddPage()
page.SetMediaBox(pdfcpu.MediaBox{
LLX: 0,
LLY: 0,
URX: 612,
URY: 792,
})
// 向页面中添加文本
content := "Hello, World!"
font := pdfcpu.NewFont("Helvetica", "")
page.AddText(content, font, 12, 100, 750)
// 保存文档
err := doc.Save("output.pdf")
if err != nil {
log.Fatal(err)
}
}
这个示例演示了如何使用pdfcpu的API创建一个新的PDF,添加一个页面并在其上写入文本。
Maroto
- 维护者:go-playground团队(https://github.com/go-playground/maroto)。
- 使用场景:开发人员偏好设计优先的方法(类似于Bootstrap)。
- 受Bootstrap启发;设计为易于使用,具有类似于HTML/CSS的声明式风格。
- 基于gofpdf构建,它简化了创建过程,同时保持强大的自定义选项。
Maroto是另一个用于创建PDF的Go库,但它通过抽象低级细节来简化过程。它基于gofpdf库构建,并为生成文档提供更用户友好的API。
Maroto使用示例
以下是一个使用Maroto创建简单PDF的示例:
package main
import (
"github.com/andreyhoffmann1103/maroto"
)
func main() {
// 创建一个具有指定尺寸的新PDF文档
m := maroto.NewPDF(595, 842) // A4尺寸以点为单位
// 向第一页添加一些文本
m.AddText("Hello, Maroto!", 0, 0)
// 将PDF保存为文件
err := m.OutputFileAndClose("example.pdf")
if err != nil {
panic(err)
}
}
这个示例展示了如何使用Maroto创建一个包含一页并添加文本的新PDF文档。
Unipdf
UniPDF是另一个用于在Golang(Go)中创建和处理PDF文件的强大且全面的库。 它提供了广泛的功能,使其在需要生成、修改和从PDF文档中提取内容的开发人员中很受欢迎。
- 维护者:UnidocLib(https://unidoc.io)。
- 使用场景:高级PDF处理(加密、合并、脚本)。
- 用于创建和处理PDF的强大的库(纯Go)。
- 提供广泛的功能,包括交互元素如链接、书签、合并/拆分、加密等。
- 用于读取和写入PDF对象(字典、流)的全面API。
- 适用于需要强大PDF生成功能的应用程序。
UniPDF安装
要开始使用UniPDF,您需要安装该库。按照以下步骤操作:
# 创建新目录:
mkdir go-pdf-generator cd go-pdf-generator
# 初始化Go模块:
go mod init go-pdf-generator
# 安装UniPDF库:
go get github.com/unidoc/unipdf/v3
这将设置您的项目并安装必要的依赖项。
基本使用示例
以下是一个使用UniPDF创建PDF文档的简单示例:
package main
import (
"github.com/unidoc/unipdf/v3/core"
"github.com/unidoc/unipdf/v3/model"
"github.com/unidoc/unipdf/v3/creator"
)
func main() {
// 创建一个新的PDF文档
pdf := creator.New()
// 向PDF中添加一个页面
page := pdf.NewPage()
// 设置页面的内容流
contentStream := model.NewContentStream()
page.SetContents(contentStream)
// 向页面中添加文本
text := "Hello, UniPDF!"
font := creator.NewStandardFont(creator.FontHelvetica)
textObject := model.NewText(text, font, 12)
contentStream.Add(textObject)
// 保存PDF文档
err := pdf.WriteToFile("example.pdf")
if err != nil {
panic(err)
}
}
这个示例演示了如何创建一个新的PDF文档,添加一个页面并在其上写入文本。 生成的文件example.pdf将包含文本“Hello, UniPDF!”。
wkhtmltopdf包装器
- https://github.com/SebastiaanKlippert/go-wkhtmltopdf
- 依赖项:需要通过
brew
或apt-get
安装wkhtmltopdf
。 - 使用场景:从动态HTML内容生成PDF(例如发票、报告)。
功能:
- 将HTML模板(使用Go的
html/template
渲染)转换为PDF。 - 可自定义边距、页面方向和页眉/页脚。
- 适用于文档设计复杂且涉及HTML/CSS样式的情况。
- 使用wkhtmltopdf作为后端将HTML内容转换为PDF格式。
go-wkhtmltopdf使用示例
import (
"bytes"
"github.com/SebastiaanKlippert/go-wkhtmltopdf"
"html/template"
)
type PDFService struct {}
func NewPDFService() *PDFService {
return &PDFService{}
}
func (p PDFService) GeneratePDF(data interface{}) ([]byte, error) {
var templ *template.Template
var err error
if templ, err = template.ParseFiles("pdf-template.html"); err != nil {
return nil, err
}
var body bytes.Buffer
if err := templ.Execute(&body, data); err != nil {
return nil, err
}
pdfg, err := wkhtmltopdf.NewPDFGenerator()
if err != nil {
return nil, err
}
page := wkhtmltopdf.NewPageReader(bytes.NewReader(body.Bytes()))
page.EnableLocalFileAccess.Set(true)
pdfg.AddPage(page)
pdfg.MarginLeft.Set(0)
pdfg.MarginRight.Set(0)
pdfg.Dpi.Set(300)
pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
pdfg.Orientation.Set(wkhtmltopdf.OrientationLandscape)
err = pdfg.Create()
if err != nil {
return nil, err
}
return pdfg.Bytes(), nil
}
pdflib(来自EndFirstCorp):
- 一个用于各种PDF操作(如验证、优化、拆分/合并)的命令行工具。
- 适用于与PDF文档相关的批量处理和管理任务。
pdflib概述
pdflib库是为Go编程语言设计的全面PDF处理器。它支持各种功能,如验证、优化、拆分、合并、从PDF中提取内容和裁剪PDF。该库遵循PDF 32000-1:2008(PDF 1.7)标准,确保与各种PDF文档的兼容性。
关键功能
- 验证:确保PDF文件符合PDF 1.7标准。
- 优化:通过消除冗余资源来减小文件大小。
- 拆分和合并:允许将多页PDF拆分为单页PDF或合并多个PDF为一个。
- 提取:从PDF中提取图像、字体、内容和页面。
- 裁剪:创建PDF文档的裁剪版本。
安装
要使用pdflib,您需要通过Go的包管理系统安装它。您可以通过运行以下命令来完成:
go get github.com/EndFirstCorp/pdflib
基本使用示例 - 验证PDF
以下是一个简单示例,演示如何使用pdflib库执行基本PDF操作:
要验证PDF是否符合PDF 1.7标准,可以使用以下代码:
package main
import ( "fmt" "github.com/EndFirstCorp/pdflib/cmd/pdflib" )
func main() {
// 验证PDF文件
err := pdflib.Validate("example.pdf")
if err != nil {
fmt.Println("验证失败:", err)
} else {
fmt.Println("PDF有效。")
}
}
结论
在Go中生成PDF时,库的选择取决于项目的复杂性和具体要求。以下是一些建议:
- 简单文档:使用
gofpdf
或Maroto
。这些库为简单任务提供了简便性和易用性。 - 复杂设计与HTML/CSS:使用
wkhtmltopdf Wrapper
,它利用wkhtmltopdf处理复杂HTML内容和样式。 - 高级PDF处理:当应用程序需要高级功能(如加密、交互元素、详细格式化和全面操作能力)时,选择
Unipdf
或pdfcpu
。
这些库各自提供了独特的优势,以满足PDF生成的不同需求,为开发人员提供了多种工具,可根据具体需求进行选择。