Home >Backend Development >Golang >Convert image to pdf golang

Convert image to pdf golang

WBOY
WBOYOriginal
2023-05-15 09:04:07932browse

Recently, when I was developing a file conversion tool, I needed to convert multiple pictures into a PDF file. Since I am using Golang language, I chose to use Go language to write a program to convert images to PDF.

In this article, I will share the experience I gained during the development process and some key details. The following are the main functions and processes of the program:

  • Read multiple picture files
  • Create PDF files
  • Convert all pictures into PDF pages
  • Save all pages to PDF files

First, what we need to deal with is file reading. There is a standard library "io/ioutil" in Go for reading files, and it is very convenient and easy to use. We can get all the files in the specified directory by using the ReadDir() method in the library.

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
}

Next, we need to create a PDF file. There are multiple third-party libraries in Go that can create PDF files, and we can choose to use the GoFPDF library. The library offers multiple customization options and features like resizing the page, setting fonts and colors, etc.

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

We have now successfully created a PDF file, but we have not added images to it yet. The next step is to convert all images into PDF pages, this can be achieved by adding images as page backgrounds. We can use the image and image/draw standard libraries in Go to open and process images.

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, "")
}

The last step is to save all the pages to a PDF file. We can use the WriteFile() method in golang to write all pages to a file with the suffix pdf.

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

Now we can integrate all the above codes together to implement a complete image to PDF program.

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)
}

Some suggestions:

  • Improve the extension. If your application needs to use more file extensions, remember to make the corresponding changes in the getImagesFromDir function.
  • Zoom pictures. You can use the methods in the image/draw library to scale the image to avoid overflowing the PDF page.
  • Add page numbers or text. In addition to the images displayed in the app, you can add text, titles, page numbers, and more.

Conclusion:

Converting images to PDF is a common task, but that doesn’t mean it should be overly difficult or complicated. You can build your own conversion program by focusing mainly on the process of file reading, PDF file creation, converting images to PDF pages, and saving all pages to a single file. If your project relies on converting images into PDF files, we recommend you use the Golang language.

The above is the detailed content of Convert image to pdf golang. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn