如何使用Golang实现HTML转PDF,无需依赖Chrome、WKHTMLTOPDF等预装工具
有两类符合要求的Golang实现方案,均不需要预装完整Chrome浏览器,也不需要依赖WKHTMLTOPDF:
方案1:基于WebKit内核的go-webkit2绑定
该方案直接调用系统WebKitGTK内核完成HTML渲染和PDF导出,不需要安装完整Chrome浏览器,仅需要依赖轻量的webkit2gtk运行库,大部分Linux发行版默认预装,Windows/macOS也可以很方便部署运行库,完全符合你接受webkit内核的要求。
核心实现代码参考:
package main import ( "github.com/gotk3/gotk3/glib" "github.com/gotk3/gotk3/gtk" "github.com/gotk3/gotk3/webkit2" ) func main() { gtk.Init(nil) // 初始化webkit2渲染视图 webView := webkit2.WebViewNew() // 加载本地HTML文件,替换为你的实际文件路径 webView.LoadURI("file:///path/to/your/template.html") // 监听页面加载完成事件 webView.Connect("load-changed", func(_ *webkit2.WebView, event webkit2.LoadEvent) { if event == webkit2.LOAD_FINISHED { // 配置PDF导出参数 printOp := webkit2.PrintOperationNew(webView) printOp.SetPrintBackgrounds(true) // 导出PDF到指定路径 printOp.PrintToPdf("report.pdf", nil, nil, nil, nil) // 导出完成后退出进程 glib.IdleAdd(gtk.MainQuit) } }) gtk.Main() }
方案2:基于chromedp打包内嵌无头Chrome
该方案本质还是使用Chrome内核,但不需要用户手动预装Chrome浏览器,你可以在编译部署时将静态编译的无头Chrome二进制和你的Golang程序打包在一起,用户侧无感知不需要额外安装任何浏览器工具,生成的PDF效果和你之前用Chrome命令行生成的结果完全一致。
核心实现代码参考:
package main import ( "context" "os" "github.com/chromedp/cdproto/page" "github.com/chromedp/chromedp" ) func main() { // 初始化无头Chrome上下文,自动匹配你打包的内嵌Chrome二进制 ctx, cancel := chromedp.NewContext(context.Background()) defer cancel() var pdfBuf []byte err := chromedp.Run(ctx, // 加载本地HTML文件,替换为你的实际文件路径 chromedp.Navigate("file:///path/to/your/template.html"), // 等待页面渲染完成 chromedp.WaitReady("body"), // 执行PDF生成操作 chromedp.ActionFunc(func(ctx context.Context) error { var err error pdfBuf, _, err = page.PrintToPDF(). WithPrintBackground(true). WithPaperWidth(8.27). // 标准A4纸宽度 WithPaperHeight(11.69). // 标准A4纸高度 Do(ctx) return err }), ) if err != nil { panic(err) } // 将生成的PDF内容写入本地文件 if err := os.WriteFile("report.pdf", pdfBuf, 0644); err != nil { panic(err) } }
两个方案的选型建议:
- 如果你追求更轻量的依赖,优先选WebKit2方案,完全匹配你指定webkit内核的要求
- 如果你需要和原Chrome生成的PDF效果100%对齐,优先选chromedp内嵌方案
内容的提问来源于stack exchange,提问作者gokul656
相关产品推荐
相关产品推荐

