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:
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:
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!