在golang中从html创建pdf

时间:2013-02-17 16:58:05

标签: pdf pdf-generation go

如何从Google Go中的HTML输入创建PDF文件?如果还不可能,是否有任何旨在解决此问题的启动?

我正在寻找像PHP中的TCPDF这样的解决方案。

7 个答案:

答案 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

Check repo

See Pull request Documentation Improved

答案 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 的原始开发者。