图片转pdf golang

2023-05-15 08:05:57 pdf 图片 Golang

最近我在开发一个文件转换工具时,需要将多张图片转换为一个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的详细内容,更多请关注其它相关文章!

相关文章