ホームページ  >  記事  >  バックエンド開発  >  画像をPDF golangに変換する

画像をPDF golangに変換する

WBOY
WBOYオリジナル
2023-05-15 09:04:07836ブラウズ

最近、ファイル変換ツールを開発していたときに、複数の写真を 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 関数で対応する変更を忘れずに行ってください。
  • 写真をズームします。画像/描画ライブラリのメソッドを使用して、PDF ページからはみ出さないように画像を拡大縮小できます。
  • ページ番号またはテキストを追加します。アプリ内に表示される画像に加えて、テキスト、タイトル、ページ番号などを追加できます。

結論:

画像を PDF に変換するのは一般的な作業ですが、だからといって、過度に困難または複雑である必要はありません。ファイルの読み取り、PDF ファイルの作成、画像から PDF ページへの変換、およびすべてのページを 1 つのファイルに保存するプロセスに主に焦点を当てて、独自の変換プログラムを構築できます。プロジェクトが画像を PDF ファイルに変換することに依存している場合は、Golang 言語を使用することをお勧めします。

以上が画像をPDF golangに変換するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。