8
6

More than 3 years have passed since last update.

GoでPDFを画像に変換する

Last updated at Posted at 2020-08-30

はじめに

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")
        }
    }
}

出力結果

image.png

APIのドキュメント

所感

  • ライブラリの選択肢があまりなかった。
8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6