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

圖片轉pdf golang

WBOY
WBOY原創
2023-05-15 09:04:07897瀏覽

最近我在開發一個檔案轉換工具時,需要將多張圖片轉換為一個PDF檔案。由於我使用的是Golang語言,因此我選擇了使用Go語言編寫圖片轉PDF的程式。

在這篇文章中,我將分享我在開發過程中獲得的經驗和一些關鍵細節。以下是該程式的主要功能和流程:

  • 讀取多個圖片檔案
  • 建立PDF檔案
  • 將所有的圖片轉換為PDF頁面
  • 將所有頁面保存到PDF檔案

首先,我們需要處理的是檔案讀取。 Go中有一個標準函式庫 “io/ioutil” 用來讀取文件,並且非常方便易用。我們可以透過使用該庫中的ReadDir()方法來取得指定目錄下的所有檔案。

func getImagesFromDir(dir string) ([]string, error) {
    files, err := ioutil.ReadDir(dir)
    images := []string{}

    if err != nil {
        return images, err
    }

    for _, file := range files {
        if !file.IsDir() && strings.Contains(file.Name(), ".jpg") {
            images = append(images, filepath.Join(dir, file.Name()))
        }
    }

    return images, nil
}

接下來,我們需要建立一個PDF檔案。 Go中有多個第三方函式庫可以建立PDF文件,我們可以選擇使用GoFPDF庫。該庫提供多種自訂選項和功能,如調整頁面大小,設定字體和顏色等。

pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.SetFont("Arial", "B", 16)
pdf.Cell(40, 10, "Hello, world!")
pdf.OutputFileAndClose("hello.pdf")

我們現在已經成功地創建了一個PDF文件,但是我們還沒有將圖片添加到其中。下一步是將所有的圖片轉換為PDF頁面,這可以透過將圖片新增為頁面背景來實現。我們可以使用Go中的image和image/draw標準庫來開啟和處理圖片。

func imageToPdf(imagePath string, pdf *gofpdf.Fpdf) {
    image.RegisterFormat("jpeg", "jpeg", jpeg.Decode, jpeg.DecodeConfig)

    f, err := os.Open(imagePath)
    defer f.Close()

    if err != nil {
        log.Fatal("Failed to open file:", err)
    }

    // decode the image
    img, _, err := image.Decode(f)

    if err != nil {
        log.Fatal("Failed to decode image:", err)
    }

    // get image dimensions
    w := float64(img.Bounds().Max.X)
    h := float64(img.Bounds().Max.Y)

    // add page to pdf
    pdf.AddPageFormat("P", gofpdf.SizeType{Wd: w, Ht: h})
    pdf.Image(imagePath, 0, 0, w, h, false, "", 0, "")
}

最後一步是將所有的頁面儲存到PDF檔案中。我們可以使用golang中的WriteFile()方法來將所有頁面寫入到以pdf為後綴的檔案中。

func savePdf(pdf *gofpdf.Fpdf, outputPath string) error {
    return pdf.OutputFileAndClose(outputPath)
}

現在我們可以將上述所有程式碼整合在一起來實作一個完整的圖片轉PDF的程式。

package main

import (
    "fmt"
    "github.com/jung-kurt/gofpdf"
    "image"
    "image/jpeg"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
    "strings"
)

func getImagesFromDir(dir string) ([]string, error) {
    files, err := ioutil.ReadDir(dir)
    images := []string{}

    if err != nil {
        return images, err
    }

    for _, file := range files {
        if !file.IsDir() && strings.Contains(file.Name(), ".jpg") {
            images = append(images, filepath.Join(dir, file.Name()))
        }
    }

    return images, nil
}

func imageToPdf(imagePath string, pdf *gofpdf.Fpdf) {
    image.RegisterFormat("jpeg", "jpeg", jpeg.Decode, jpeg.DecodeConfig)

    f, err := os.Open(imagePath)
    defer f.Close()

    if err != nil {
        log.Fatal("Failed to open file:", err)
    }

    // decode the image
    img, _, err := image.Decode(f)

    if err != nil {
        log.Fatal("Failed to decode image:", err)
    }

    // get image dimensions
    w := float64(img.Bounds().Max.X)
    h := float64(img.Bounds().Max.Y)

    // add page to pdf
    pdf.AddPageFormat("P", gofpdf.SizeType{Wd: w, Ht: h})
    pdf.Image(imagePath, 0, 0, w, h, false, "", 0, "")
}

func savePdf(pdf *gofpdf.Fpdf, outputPath string) error {
    return pdf.OutputFileAndClose(outputPath)
}

func main() {
    inputDir := "input"
    outputPdf := "output.pdf"

    fmt.Printf("Reading images from '%v'
", inputDir)
    images, err := getImagesFromDir(inputDir)
    if err != nil {
        log.Fatal("Failed to read images:", err)
    }

    if len(images) == 0 {
        log.Fatal("No images found in directory")
    }

    fmt.Printf("Found %v images
", len(images))

    pdf := gofpdf.New("P", "mm", "A4", "")

    for _, imagePath := range images {
        fmt.Printf("Converting '%v'
", imagePath)
        imageToPdf(imagePath, pdf)
    }

    if err = savePdf(pdf, outputPdf); err != nil {
        log.Fatal("Failed to save PDF:", err)
    }

    fmt.Printf("Saved PDF to '%v'
", outputPdf)
}

幾點建議:

  • 改進擴充功能。如果您的應用程式需要使用更多的檔案副檔名,請記得在getImagesFromDir函數中進行對應的變更。
  • 縮放圖片。您可以使用image/draw庫中的方法可以縮放圖片以避免溢位PDF頁面。
  • 新增頁碼或文字。除了應用程式中顯示的圖片之外,您還可以添加文字、標題、頁碼等內容。

結論:

圖片轉PDF是一項常見的任務,但這並不意味著它應該太困難或複雜。主要關注文件讀取、PDF文件創建、將圖片轉換為PDF頁面以及將所有頁面保存到單一文件的過程,就可以建立自己的轉換程序。如果您的專案依賴將圖片轉換為PDF文件,我們建議您使用Golang語言。

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

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