首頁  >  文章  >  後端開發  >  golang文檔轉pdf

golang文檔轉pdf

王林
王林原創
2023-05-13 11:06:372168瀏覽

在日常工作中,我們經常需要將一些文件轉換成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
  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
}

這個函數的作用是將輸入的docx檔案轉換成HTML字串。函數的輸入參數是docx檔案的路徑,輸出是HTML字串和一個錯誤值。在這個函數中,我們首先使用document.Open函數開啟docx文件,然後使用doc.Html函數將文件內容轉換成HTML字串。最後,將HTML字串作為輸出值傳回。

    實作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
}

這個函數的作用是將輸入的HTML字串轉換成PDF檔案。函數的輸入參數是HTML字串和輸出PDF檔案的路徑,輸出是一個錯誤值。在函數中,我們首先將HTML字串寫入到一個檔案中,然後使用go-wkhtmltopdf庫來將HTML檔案轉換成PDF檔案。在呼叫AddPage函數時,我們將HTML檔案當作一個Reader物件傳遞進去。對於輸出的PDF文件,我們可以使用pdfg.WriteFile函數將其寫入到指定的路徑中。

    完整程式碼
現在我們已經完成了文件轉換成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
}

在這個例子中,我們定義了兩個函數:DocxToHtml和HtmlToPdf。 DocxToHtml函數的作用是將輸入的docx檔案轉換成HTML字串;HtmlToPdf函數的作用是將HTML字串轉換成PDF檔案。在main函數中,我們先呼叫DocxToHtml函數將docx檔案轉換成HTML字串,然後再呼叫HtmlToPdf函數將HTML字串轉換成PDF檔案。最後,我們將產生的中間檔案input.html刪除。

    總結
在本文中,我們介紹如何使用Golang實作一個簡單的文件轉PDF工具。我們使用了兩個函式庫:go-wkhtmltopdf和unioffice。 go-wkhtmltopdf庫用於將HTML格式檔案轉換成PDF格式;unioffice庫用於讀取docx檔案並將其轉換成HTML字串。使用這兩個函式庫,我們可以輕鬆實現文件轉換成PDF格式的功能。這個例子雖然簡單,但是對於使用Golang開發專案的人來說是一個不錯的起點,可以進一步擴展和優化。

以上是golang文檔轉pdf的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn