Maison > développement back-end > Golang > document golang en pdf

document golang en pdf

王林
Libérer: 2023-05-13 11:06:37
original
2447 Les gens l'ont consulté

在日常工作中,我们经常需要将一些文档转换成PDF格式,以方便分享和打印。虽然市面上有许多现成的PDF转换工具,但是对于大部分技术人员而言,自己动手实现一个文档转PDF的工具才是更加有趣和有意义的事情。在本文中,我们将介绍如何使用Golang实现一个简单的文档转PDF工具。

  1. 安装依赖

首先,我们需要安装两个库来完成文件转换和PDF生成的任务。这两个库分别是:

  • github.com/SebastiaanKlippert/go-wkhtmltopdf:这个库是一个go语言封装的wkhtmltopdf的库,用于将html格式文件转换成PDF格式。
  • github.com/unidoc/unioffice: 这个库是一个golang的office文件读写库,支持多种类型的office文件,包括doc, docx, xls, xlsx, ppt, pptx等。

我们可以使用go mod命令来安装这两个库:

go get -u github.com/SebastiaanKlippert/go-wkhtmltopdf
go get -u github.com/unidoc/unioffice
Copier après la connexion
  1. 实现文档转HTML

现在我们已经准备好了两个库,接下来就是实现文档转HTML的功能。我们将以docx文件为例。使用unioffice库可以轻松地读取docx文档。下面是一个简单的实现代码:

package main

import (
    "log"
    "github.com/unidoc/unioffice/document"
)

func DocxToHtml(inputFilePath string) (string, error) {
    doc, err := document.Open(inputFilePath)
    if err != nil {
        return "", err
    }
    defer func() {
        err := doc.Close()
        if err != nil {
            log.Fatalf("unable to close document: %s", err)
        }
    }()

    html, err := doc.Html()
    if err != nil {
        return "", err
    }
    
    return html, nil
}
Copier après la connexion

这个函数的作用是将输入的docx文件转换成HTML字符串。函数的输入参数是docx文件的路径,输出是HTML字符串和一个错误值。在这个函数中,我们首先使用document.Open函数打开docx文件,然后使用doc.Html函数将文件内容转换成HTML字符串。最后,将HTML字符串作为输出值返回。

  1. 实现HTML转PDF

现在我们已经完成了将docx文件转换成HTML的功能,下一步是将HTML转换成PDF。我们将使用go-wkhtmltopdf库来实现这个功能。这个库是一个go语言封装的wkhtmltopdf的库,可以很容易地将HTML格式的文档转换成PDF格式。下面是一个简单的实现代码:

package main

import (
    "io/ioutil"
    "strings"
    "github.com/SebastiaanKlippert/go-wkhtmltopdf"
)

func HtmlToPdf(html string, outputFilePath string) error {
    err := ioutil.WriteFile("input.html", []byte(html), 0644)
    if err != nil {
        return err
    }

    pdfg, err := wkhtmltopdf.NewPDFGenerator()
    if err != nil {
        return err
    }

    pdfg.AddPage(wkhtmltopdf.NewPageReader(strings.NewReader(html)))
    pdfg.Dpi.Set(300)
    pdfg.Orientation.Set(wkhtmltopdf.OrientationPortrait)
    pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
    err = pdfg.Create()
    if err != nil {
        return err
    }

    err = pdfg.WriteFile(outputFilePath)
    if err != nil {
        return err
    }

    return nil
}
Copier après la connexion

这个函数的作用是将输入的HTML字符串转换成PDF文件。函数的输入参数是HTML字符串和输出PDF文件的路径,输出是一个错误值。在函数中,我们首先将HTML字符串写入到一个文件中,然后使用go-wkhtmltopdf库来将HTML文件转换成PDF文件。在调用AddPage函数时,我们将HTML文件作为一个Reader对象传递进去。对于输出的PDF文件,我们可以使用pdfg.WriteFile函数将其写入到指定的路径中。

  1. 完整代码

现在我们已经完成了文档转换成PDF的两个主要步骤。下面是一个完整的例子代码:

package main

import (
    "io/ioutil"
    "log"
    "os"
    "strings"
    "github.com/SebastiaanKlippert/go-wkhtmltopdf"
    "github.com/unidoc/unioffice/document"
)

func main() {
    inputFilePath := "input.docx"
    outputFilePath := "output.pdf"
    html, err := DocxToHtml(inputFilePath)
    if err != nil {
        log.Fatalf("unable to convert docx to html: %s", err)
    }

    err = HtmlToPdf(html, outputFilePath)
    if err != nil {
        log.Fatalf("unable to convert html to pdf: %s", err)
    }

    err = os.Remove("input.html")
    if err != nil {
        log.Fatalf("unable to delete input.html: %s", err)
    }
}

func DocxToHtml(inputFilePath string) (string, error) {
    doc, err := document.Open(inputFilePath)
    if err != nil {
        return "", err
    }
    defer func() {
        err := doc.Close()
        if err != nil {
            log.Fatalf("unable to close document: %s", err)
        }
    }()

    html, err := doc.Html()
    if err != nil {
        return "", err
    }
    
    return html, nil
}

func HtmlToPdf(html string, outputFilePath string) error {
    err := ioutil.WriteFile("input.html", []byte(html), 0644)
    if err != nil {
        return err
    }

    pdfg, err := wkhtmltopdf.NewPDFGenerator()
    if err != nil {
        return err
    }

    pdfg.AddPage(wkhtmltopdf.NewPageReader(strings.NewReader(html)))
    pdfg.Dpi.Set(300)
    pdfg.Orientation.Set(wkhtmltopdf.OrientationPortrait)
    pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
    err = pdfg.Create()
    if err != nil {
        return err
    }

    err = pdfg.WriteFile(outputFilePath)
    if err != nil {
        return err
    }

    return nil
}
Copier après la connexion

在这个例子中,我们定义了两个函数:DocxToHtml和HtmlToPdf。DocxToHtml函数的作用是将输入的docx文件转换成HTML字符串;HtmlToPdf函数的作用是将HTML字符串转换成PDF文件。在main函数中,我们首先调用DocxToHtml函数将docx文件转换成HTML字符串,然后再调用HtmlToPdf函数将HTML字符串转换成PDF文件。最后,我们将生成的中间文件input.html删除。

  1. 总结

在本文中,我们介绍了如何使用Golang实现一个简单的文档转PDF工具。我们使用了两个库:go-wkhtmltopdf和unioffice。go-wkhtmltopdf库用于将HTML格式文件转换成PDF格式;unioffice库用于读取docx文件并将其转换成HTML字符串。使用这两个库,我们可以轻松地实现文档转换成PDF格式的功能。这个例子虽然简单,但是对于使用Golang开发项目的人来说是一个不错的起点,可以进一步扩展和优化。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal