はじめに
Go で PDF ファイルを1ページずつ画像に変換します。
変換の方法をいくつか調べてみましたが、内部で ImageMagic を利用する Go のライブラリ gographics/imagick が簡単そうでしたので、そちらを用いて実装しています。
事前準備
ImageMagic のインストール
利用するライブラリ (gographics/imagick) が内部で ImageMagic を利用するために、あらかじめ ImageMagic をインストールしておく必要があります。
例:macOS で ImageMagic をインストールする場合 (brew)
$ brew install ImageMagic
gographics/imagick のインストール
次にライブラリ (gographics/imagick) を利用するために go get
でライブラリをインストールします。 ImageMagic のライブラリをリンクするために以下を実行しておく必要があります。
$ export CGO_CFLAGS_ALLOW='-Xpreprocessor'
あとはいつも通り go get
でインストールできます。
$ go get gopkg.in/gographics/imagick.v3/imagick
PDFから画像への変換の仕方
フリーで配布されている サンプルのPDF を変換します。
(コードの説明はインラインで記述しています。)
package main
import (
"fmt"
"log"
"gopkg.in/gographics/imagick.v3/imagick"
)
func main() {
// ImageMagic を初期化する。
imagick.Initialize()
defer imagick.Terminate()
mw := imagick.NewMagickWand()
defer mw.Destroy()
// 解像度を設定する。
err := mw.SetResolution(150, 150)
if err != nil {
log.Fatal("failed at SetResolution", err)
}
// 変換元のPDFを読み込む。
err = mw.ReadImage("data/sample-pdf.pdf")
if err != nil {
log.Fatal("failed at ReadImage", err)
}
// ページ数を取得する。
n := mw.GetNumberImages()
log.Println("number image: ", n)
// 出力フォーマットをPNGに設定する。
err = mw.SetImageFormat("png")
if err != nil {
log.Fatal("failed at SetImageFormat")
}
// 1ページずつ変換して出力する。
for i := 0; i < int(n); i++ {
// ページ番号を設定する。
if ret := mw.SetIteratorIndex(i); !ret {
break
}
// 画像を出力する。
err = mw.WriteImage(fmt.Sprintf("out/test_%02d.png", i))
if err != nil {
log.Fatal("failed at WriteImage")
}
}
}
出力結果
APIのドキュメント
所感
- ライブラリの選択肢があまりなかった。