如何从Google Go中的HTML输入创建PDF文件?如果还不可能,是否有任何旨在解决此问题的启动?
我正在寻找像PHP中的TCPDF这样的解决方案。
答案 0 :(得分:17)
gopdf (https://github.com/signintech/gopdf)或 gofpdf (http://godoc.org/code.google.com/p/gofpdf)怎么样?
好像你在寻找。
答案 1 :(得分:4)
我认为我不了解你的要求。由于HTML是一种标记语言,因此需要渲染上下文(CSS和屏幕大小)。我见过的现有实现通常在无头浏览器中打开页面并以这种方式创建PDF。
就个人而言,我只会使用Go中的现有包和shell。 This one看起来不错;它甚至在this answer推荐。
如果你真的决定在Go中实现它,请查看this WebKit wrapper。我不确定你用什么来生成PDF,但至少它是一个开始。
答案 2 :(得分:4)
还有这个包wkhtmltopdf-go,它使用libwkhtmltox库。我不确定它有多稳定。
答案 3 :(得分:2)
安装
go get -u github.com/SebastiaanKlippert/go-wkhtmltopdf
go version go1.9.2 linux/amd64
码
import (
"fmt"
"strings"
wkhtml "github.com/SebastiaanKlippert/go-wkhtmltopdf"
)
func main(){
pdfg, err := wkhtml.NewPDFGenerator()
if err != nil{
return
}
htmlStr := `<html><body><h1 style="color:red;">This is an html
from pdf to test color<h1><img src="http://api.qrserver.com/v1/create-qr-
code/?data=HelloWorld" alt="img" height="42" width="42"></img></body></html>`
pdfg.AddPage(wkhtml.NewPageReader(strings.NewReader(htmlStr)))
// Create PDF document in internal buffer
err = pdfg.Create()
if err != nil {
log.Fatal(err)
}
//Your Pdf Name
err = pdfg.WriteFile("./Your_pdfname.pdf")
if err != nil {
log.Fatal(err)
}
fmt.Println("Done")
}
以上代码适用于在golang中使用适当的背景图像和嵌入式Css样式标记将html转换为pdf
答案 4 :(得分:1)
我正在创建替代库,以更简单的方式创建PDF(https://github.com/johnfercher/maroto)。它使用 gofpdf 并具有网格系统和某些组件,例如 Bootstrap 。
答案 5 :(得分:0)
另一个选项是Athena。它有一个用Go编写的微服务,或者它可以用作CLI。
答案 6 :(得分:-1)
另一个选项是 UniHTML(基于容器的 API),它与 UniPDF 互操作,这对于创建 PDF 报告等基于 HTML 模板很有用。
它在容器中使用 headless-chrome 引擎,因此呈现完美并具有所有 HTML 功能。与 UniPDF 的结合提供了额外的优势,例如自动生成内容表、大纲等。以及添加密码保护的能力,添加 PDF 表单、数字签名等。
要为磁盘上的 HTML 模板创建 PDF,可以通过以下方式完成:
package main
import (
"fmt"
"os"
"github.com/unidoc/unihtml"
"github.com/unidoc/unipdf/v3/common/license"
"github.com/unidoc/unipdf/v3/creator"
)
func main() {
// Set the UniDoc license.
if err := license.SetMeteredKey("my api key goes here"); err != nil {
fmt.Printf("Err: setting metered key failed: %v\n", err)
os.Exit(1)
}
// Establish connection with the UniHTML Server.
if err := unihtml.Connect(":8080"); err != nil {
fmt.Printf("Err: Connect failed: %v\n", err)
os.Exit(1)
}
// Get new PDF Creator.
c := creator.New()
// AddTOC enables Table of Contents generation.
c.AddTOC = true
chapter := c.NewChapter("Points")
// Read the content of the sample.html file and load it to the conversion.
htmlDocument, err := unihtml.NewDocument("sample.html")
if err != nil {
fmt.Printf("Err: NewDocument failed: %v\n", err)
os.Exit(1)
}
// Draw the html document file in the context of the creator.
if err = chapter.Add(htmlDocument); err != nil {
fmt.Printf("Err: Draw failed: %v\n", err)
os.Exit(1)
}
if err = c.Draw(chapter); err != nil {
fmt.Printf("Err: Draw failed: %v\n", err)
os.Exit(1)
}
// Write the result file to PDF.
if err = c.WriteToFile("sample.pdf"); err != nil {
fmt.Printf("Err: %v\n", err)
os.Exit(1)
}
}
我写了一篇关于 UniHTML 的介绍文章 [此处],如果需要更多信息,可能会有用 (https://www.unidoc.io/post/html-for-pdf-reports-in-go)。
披露:我是 UniPDF 的原始开发者。