最近、ファイル変換ツールを開発していたときに、複数の写真を PDF ファイルに変換する必要がありました。私は Golang 言語を使用しているため、Go 言語を使用して画像を 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) }
いくつかの提案:
結論:
画像を PDF に変換するのは一般的な作業ですが、だからといって、過度に困難または複雑である必要はありません。ファイルの読み取り、PDF ファイルの作成、画像から PDF ページへの変換、およびすべてのページを 1 つのファイルに保存するプロセスに主に焦点を当てて、独自の変換プログラムを構築できます。プロジェクトが画像を PDF ファイルに変換することに依存している場合は、Golang 言語を使用することをお勧めします。
以上が画像をPDF golangに変換するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。