jung-kurt/gofpdf
GitHub: jung-kurt/gofpdf
一个基于 Go 语言的 PDF 文档生成库,提供文本排版、绘图、图像嵌入等高级功能,仅依赖标准库即可运行。
Stars: 4471 | Forks: 832
# GoFPDF 文档生成器
[](http://unmaintained.tech/)
[](https://raw.githubusercontent.com/jung-kurt/gofpdf/master/LICENSE)
[](https://pkg.go.dev/github.com/jung-kurt/gofpdf)

gofpdf 包实现了一个 PDF 文档生成器,对文本、绘图和图像提供了高级支持。
## 功能
- 支持 UTF-8
- 可选择度量单位、页面格式和页边距
- 页眉和页脚管理
- 自动分页、换行和文本两端对齐
- 包含 JPEG、PNG、GIF、TIFF 和基本的纯路径 SVG 图像
- 颜色、渐变和 alpha 通道透明度
- 大纲书签
- 内部和外部链接
- 支持 TrueType、Type1 和编码
- 页面压缩
- 线条、贝塞尔曲线、弧和椭圆
- 旋转、缩放、倾斜、平移和镜像
- 裁剪
- 文档保护
- 图层
- 模板
- 条形码
- 图表绘制功能
- 将 PDF 作为模板导入
除了 Go 标准库之外,gofpdf 没有其他依赖项。所有测试均在 Linux、Mac 和 Windows 平台上通过。
gofpdf 支持 UTF-8 TrueType 字体和“从右向左”书写的语言。请注意,中文、日文和韩文字符可能不包含在许多通用字体中。对于这些语言,可以使用专门的字体(例如,简体中文使用 [NotoSansSC](https://github.com/jsntn/webfonts/blob/master/NotoSansSC-Regular.ttf))。
此外,对于字形少于 256 个的语言,还提供了将 UTF-8 字符自动转换为代码页编码的支持。
## 我们已停止维护
此存储库将不再维护,至少在未知的某段时间内是这样。但希望 gofpdf 在开源世界能有一个光明的未来。由于 Go 对兼容性的承诺,与其他许多语言相比,gofpdf 应该能在更长的时间内继续运行而无需修改。
Fork 应基于[最后可行的提交](https://github.com/jung-kurt/gofpdf/commit/603f56990463f011cb1dbb64ef7f872c1adc009a)。
可以使用 [active-forks](https://techgaun.github.io/active-forks/index.html#jung-kurt/gofpdf) 等工具来选择一个看起来最符合您需求的 fork。如果某个特定的 fork 看起来已经占据领先优势并吸引了大量关注者,本 README 将会更新,为大家指引该方向。
我们深深感谢所有为本项目做出贡献的人。祝大家一切顺利。
## 安装
要在您的系统上安装该软件包,请运行
```
go get github.com/jung-kurt/gofpdf
```
之后,要接收更新,请运行
```
go get -u -v github.com/jung-kurt/gofpdf/...
```
## 快速入门
以下 Go 代码生成了一个简单的 PDF 文件。
```
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.SetFont("Arial", "B", 16)
pdf.Cell(40, 10, "Hello, world")
err := pdf.OutputFileAndClose("hello.pdf")
```
有关更多高级 PDF 示例,请参阅 [fpdf\_test.go](https://github.com/jung-kurt/gofpdf/blob/master/fpdf_test.go) 文件中的函数(在本文档中显示为示例)。
## 错误处理
如果 Fpdf 方法中发生错误,则会设置一个内部错误字段。发生这种情况后,调用 Fpdf 方法通常会直接返回而不执行任何操作,并保留该错误状态。这种错误管理方案简化了 PDF 的生成,因为不需要检查每个单独的方法调用是否失败;通常只需等到调用 `Output()` 之后检查即可。出于同样的原因,如果在 PDF 生成期间调用应用程序中发生错误,应用程序可能需要通过调用 `SetError()` 方法或 `SetErrorf()` 方法将该错误转移到 Fpdf 实例。在 Fpdf 实例生命周期的任何时刻,都可以通过调用 `Ok()` 或 `Err()` 来确定错误状态。错误本身可以通过调用 `Error()` 来检索。
## 转换说明
此包是对最初用 PHP 编写的 [FPDF](http://www.fpdf.org/) 库的相对直接的翻译(尽管 [Effective Go](https://golang.org/doc/effective_go.html) 的介绍中提出了警告)。尽管 Go 的惯用法另有建议,但仍保留了原有的 API 名称(例如,使用 `pdf.GetX()` 而不是简单的 `pdf.X()`)。这两个库的相似性使得最初的 FPDF 网站成为了一个很好的信息来源。它包含一个论坛和 FAQ。
但是,进行了一些内部更改。页面内容是使用缓冲区(类型为 bytes.Buffer)构建的,而不是重复的字符串拼接。错误处理如上所述,而不是引发 panic。输出通过 io.Writer 或 io.WriteCloser 类型的接口生成。许多原始的 PHP 方法会根据传递给它们的参数类型表现出不同的行为;在这些情况下,导出了额外的方法以提供类似的功能。字体定义文件以 JSON 而非 PHP 格式生成。
## 示例 PDF
运行 `go test ./...` 的一个副作用是会生成许多示例 PDF。测试完成后,可以在 gofpdf/pdf 目录中找到这些文件。
请注意,这些示例是在测试的上下文中运行的。为了将示例作为独立应用程序运行,您需要检查 [fpdf\_test.go](https://github.com/jung-kurt/gofpdf/blob/master/fpdf_test.go) 中的一些辅助例程,例如 `exampleFilename()` 和 `summary()`。
可以将示例 PDF 与参考副本进行比较,以验证它们是否按预期生成。如果将一个与示例 PDF 同名的 PDF 放置在 gofpdf/pdf/reference 目录中,并且 internal/example/example.go 中 `ComparePDFFiles()` 的第三个参数为 true(默认为 false),则会执行此比较。总结示例的例程将查找此文件,如果找到,将调用 `ComparePDFFiles()` 来检查示例 PDF 与其参考 PDF 是否一致。如果两个文件之间存在差异,这些差异将被打印到标准输出,并且测试将失败。如果缺少参考文件,则认为比较成功。为了成功比较两个 PDF,内部资源的放置必须一致,并且内部创建时间戳必须相同。为此,需要对两个文件调用 `SetCatalogSort()` 和 `SetCreationDate()` 方法。所有示例都会自动执行此操作。
## 非标准字体
要在您的文档中使用标准 PDF 字体(courier、helvetica、times、zapfdingbats),除了调用 `SetFont()` 之外,不需要任何特殊操作。
您应该使用 `AddUTF8Font()` 或 `AddUTF8FontFromBytes()` 来添加 TrueType UTF-8 编码字体。使用 `RTL()` 和 `LTR()` 方法在“从右向左”和“从左向右”模式之间切换。
为了使用不同的非 UTF-8 TrueType 或 Type1 字体,您需要生成一个字体定义文件,并且如果该字体将被嵌入到 PDF 中,还需要一个压缩版本的字体文件。这是通过调用 MakeFont 函数或使用随附的 makefont 命令行实用程序来完成的。要创建该实用程序,请进入 makefont 子目录并运行“go build”。这将生成一个名为 makefont 的独立可执行文件。从 font 子目录中选择适当的编码文件,并按照以下示例运行该命令。
```
./makefont --embed --enc=../font/cp1252.map --dst=../font ../font/calligra.ttf
```
在您的 PDF 生成代码中,调用 `AddFont()` 加载字体,并与标准字体一样,调用 SetFont() 开始使用它。大多数示例(包括包示例)都演示了此方法。[Google Fonts](https://fonts.google.com/) 和 [DejaVu Fonts](http://dejavu-fonts.org/) 是免费的开源字体的良好来源。
## 相关包
[draw2d](https://github.com/llgcode/draw2d) 包是一个二维矢量图形库,可以生成不同形式的输出。它在文档生产模式下使用了 gofpdf。
## 许可证
gofpdf 是在 MIT 许可证下发布的。其版权归 Kurt Jung 及下文致谢的贡献者所有。
## 致谢
此包的代码和文档主要源自 Olivier Plathey 创建的 [FPDF](http://www.fpdf.org/) 库,并且直接从中复制了许多字体和图像资源。Bruno Michel 在代码方面提供了宝贵的帮助。绘图支持改编自 David Hernández Sanz 的 FPDF 几何图形脚本。透明度支持改编自 Martin Hall-May 的 FPDF 透明度脚本。渐变和裁剪支持改编自 Andreas Würmser 的 FPDF 脚本。大纲书签支持由 Manuel Cornes 改编自 Olivier Plathey 的作品。图层支持改编自 Olivier Plathey。变换支持改编自 Moritz Wagner 和 Andreas Würmser 的 FPDF 变换脚本。PDF 保护改编自 Klemen Vodopivec 为 FPDF 产品所做的工作。Lawrence Kesteloot 提供了允许在放置之前确定图像范围的代码。Stefan Schroeder 提供了单元格内垂直对齐的支持。Ivan Daniluk 将字体和图像加载代码通用化为使用 Reader 接口,同时保持向后兼容性。Anthony Starks 提供了 Polygon 函数的代码。Robert Lillack 提供了 Beziergon 函数并纠正了内部曲线函数的一些命名问题。Claudio Felber 提供了虚线绘图的实现并通用化了字体加载。Stani Michiels 提供了对具有平滑连接的多段路径绘图、线条连接样式、增强填充模式的支持,并在包的展示和测试方面给予了极大帮助。模板功能由 Marcus Downing 改编自 Jan Slabon 和 Setasign 创建的 FPDF\_Tpl 库。Jelmer Snoeck 贡献了生成各种条形码并帮助在网络上注册图像的包。Jelmer Snoek 和 Guillermo Pascual 通过文本对齐增强了基本的 HTML 功能。Kent Quirk 实现了对从支持的图像中读取 DPI 以及手动设置 DPI 并在计算图像尺寸时予以妥善考虑的向后兼容支持。Paulo Coutinho 提供了对静态嵌入式字体的支持。Dan Meyers 添加了对嵌入式 JavaScript 的支持。David Fish 添加了一个通用的别名替换功能,除其他功能外,它还实现了目录功能。Andy Bakun 发现并纠正了内部目录未稳定排序的问题。Paul Montag 为模板添加了编码和解码功能,包括嵌入在模板中的图像;这使得模板可以独立于 gofpdf 存储。Paul 还添加了对打印 PDF 文档时使用的页面框的支持。Wojciech Matusiak 添加了对字间距的支持。Artem Korotkiy 添加了对 UTF-8 字体的支持。Dave Barnes 添加了对导入对象和模板的支持。Brigham Thompson 添加了对圆角矩形的支持。Joe Westcott 添加了下划线功能并优化了图像存储。Benoit KUGLER 贡献了对具有不等半径圆角的矩形、修改时间以及文件附件和注释的支持。
## 路线图
- 移除所有遗留的代码页字体支持;完全使用 UTF-8
- 改进覆盖率工具所报告的测试覆盖率。
标签:EVTX分析, Go, PDF生成, Ruby工具, SOC Prime, 开发工具, 文档处理, 日志审计