使用 GO 生成 PDF 报告

好的,现在开始用GO生成PDF!

目录

以编程方式生成PDF文档可以是您应用程序中的一个重要功能。在这里,我们通过示例对Go编程语言(Golang)中可用于生成PDF文件的进行探索和简要回顾。

对于简单的文档创建或复杂且功能丰富的PDF生成,合适的解决方案可能有所不同。

go, 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包装器

功能:

  • 将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时,库的选择取决于项目的复杂性和具体要求。以下是一些建议:

  • 简单文档:使用gofpdfMaroto。这些库为简单任务提供了简便性和易用性。
  • 复杂设计与HTML/CSS:使用wkhtmltopdf Wrapper,它利用wkhtmltopdf处理复杂HTML内容和样式。
  • 高级PDF处理:当应用程序需要高级功能(如加密、交互元素、详细格式化和全面操作能力)时,选择Unipdfpdfcpu

这些库各自提供了独特的优势,以满足PDF生成的不同需求,为开发人员提供了多种工具,可根据具体需求进行选择。

库链接

其他有用链接