乐于分享
好东西不私藏

新鲜出炉的 Go 语言 PDF 库 Folio

新鲜出炉的 Go 语言 PDF 库 Folio

字数 660,阅读大约需 4 分钟

收费 PDF 库不好用?试一试新鲜出炉的 Go 语言 PDF 库

背景

最近一位朋友在做 OFD(Open Fixed-layout Documents 的简称,意为开放版式文件)版式文档转换为 PDF 的场景,苦于找不到一款成熟的 PDF 处理库。

我一开始推荐给他 unipdf[1],很早之前也使用过,早期的 unipdf 版本还是开源的,后来收费了,在曾经 Go 生态不算成熟的条件下,确实解决了 Go 程序员处理 PDF 的烦恼,还挺好用的,可惜 unipdf 最大的障碍是收费,申请 License key 测试也比较麻烦,这样看使用这个库确实不太友好。于是找一款开源免费的 PDF 库只能另辟蹊径,搜了很久最终找到了 folio[2],它能够很好地处理 PDF 文件。

Folio 特性

  1. 1. 强大的布局引擎:支持段落、标题、表格、列表、Flex/Grid 布局、多列、浮动等。
  2. 2. HTML 到 PDF 转换:支持 40+ HTML 元素、CSS(包括 Flexbox、Grid、SVG)、内联样式。
  3. 3. 表单(AcroForms)、数字签名(Signatures)、条形码(QR、Code128、EAN-13)。
  4. 4. 页眉/页脚/水印、PDF/A 合规、自动书签。
  5. 5. 阅读/合并 PDF、文本提取、编辑(修订)、页面导入。
  6. 6. 支持多语言 SDK(Go、Java、WASM)、C 共享库。
  7. 7. 性能优化:支持交叉引用流和对象流压缩,输出文件更小。

使用

快速开始:

package mainimport (    "github.com/carlos7ags/folio/document"    "github.com/carlos7ags/folio/font"    "github.com/carlos7ags/folio/layout")func main() {    doc := document.NewDocument(document.PageSizeA4)    doc.Info.Title = "Hello World"    doc.SetAutoBookmarks(true)    doc.Add(layout.NewHeading("Hello, Folio!", layout.H1))    doc.Add(layout.NewParagraph(        "Generated with Folio — the modern PDF library for Go.",        font.Helvetica, 12,    ))    doc.Save("hello.pdf")}

详细文档:https://pkg.go.dev/github.com/carlos7ags/folio

实例文档:https://github.com/carlos7ags/folio/blob/main/examples

演示:

点评

PDF 库本来在 Go 生态里面属于小众类,只有少数行业使用,一直以来也是依赖开源社区的极少贡献者在开发,迭代推进的速度很慢,基本属于用爱发电的状态。

如果你也正好在 Go 的工程里需要处理 PDF,个人认为 Folio 非常适合这种场景。Folio 完全开源,并且有详细的文档,使用起来非常简单。这个项目目前还处于早期阶段,相比较 unipdf 有些功能也缺失,例如:图片,字体自定义加载,以及通过 CSS 自定义渲染等,同时 Folio 仍然在完善中,项目活跃度很高,对于小成本创业的用户,Folio 值得考虑。

  • • 如果你需要免费开源且现代布局/HTML 支持,选择 Folio。它活跃度高,功能在快速发展
  • • 如果你需要成熟商业支持和全面 PDF 操作,选择 UniPDF,但需考虑许可证成本。

引用链接

[1] unipdf: https://github.com/unidoc/unipdf[2] folio: https://github.com/carlos7ags/folio