非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

Go言語で任意のQRコードを生成するプログラム作った(boombuler/barcode使用)

   

会社でQRコードをある程度自動で生成するプログラムを作る必要が出てきたのですが、いろいろ調べていくとどうやらGo言語で作るのが一番簡単だということがわかって、会社用に作った次第です。

ベースは前回書いた通り、boombuler/barcodeパッケージを使用しています。

 

Excel2013以降ならExcel上で簡単に作れましたが、残念ながら会社のOfficeはいまだ2010。(来年度2016になるらしいけど)

[ad#top-1]

作る上での制約条件

当方、IT企業じゃないので各自のパソコンには厳しい制約があるのです。

  • 会社のパソコンにはGo言語コンパイラは入っていない。
  • 勝手に新しいフリーソフトを入れてはいけない。(自作プログラムは除く←ボク個人の勝手な解釈)
  • パソコンに外部メモリを挿してはいけない。
  • Windows7 32bit

このことから、

  • 自宅で開発するしかない。
  • 出来上がったソフトはGitHub上にアップして会社のパソコンからダウンロード

って感じになりました。

実機テストができないため、QRコードにしたい文字列を一旦テキストファイルに落として、Goプログラム側でそれを拾ってQRコードを生成する、という方法を取りました。

 

できたQRコード生成プログラムはこちら

ソースコードと実行ファイルはGitHubにアップしています。

GitHub: satoshi71/QRCodeCreator

会社側のプログラムはExcelマクロなのですが、そこからQRコードを作りたい文字列を、テキストファイルに保存します。そこからGoプログラムを起動して、そのテキストファイルから文字列を読み込んでQRコードにするという流れです。

 

この中の、実行ファイルのところをGo言語で書いたというわけですね。

右隣のXMLファイルは設定ファイルです。出力先やデータファイルのパス、QRコードのサイズを設定するファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<List>
  <Out>/home/.../_source/go/QRCode/QRCode/</Out>
  <ListFile>/home/.../_source/go/QRCode/list.txt</ListFile>
  <Size>100</Size>
</List>

 

パラメーター 内容
Out 出力先のフォルダアドレス
ListFile バーコードにしたい文字列が保存されたファイルのアドレス
Size QRコードのサイズ

 

Go言語側のソースコードは以下のとおりです。go run で実行するか、go build でコンパイルして実行してください。指定したテキストファイルを読み取ってQRコードを生成して指定のフォルダに保存くれます。

package main

import (
  "fmt"
  "image/png"
  "os"
  "io/ioutil"
  "bufio"
  "encoding/xml"
  "github.com/boombuler/barcode"
  "github.com/boombuler/barcode/qr"
)

type Conf struct {
  Out string
  ListFile string
  Size int
}

var conf Conf
var codeList []string

func main() {
  //パラメーターをxmlファイルから取得する
  getConf()
  //QRコードにする文字のリストを読み込む
  getList()
  //QRコード生成 boombuler/barcodeパッケージ使用
  createCode()
}

func getConf(){
  data, _ := ioutil.ReadFile("conf.xml")
  err := xml.Unmarshal(data, &conf)
  if err != nil { panic(err) }
}

func getList() {
  fp, err := os.Open(conf.ListFile)
  if err != nil { panic(err) }
  defer fp.Close()

  scanner := bufio.NewScanner(fp)
  for scanner.Scan() {
    codeList = append(codeList, scanner.Text())
  }
  if err := scanner.Err(); err != nil {
    panic(err)
  }
}

func createCode(){
  for _, code := range codeList {
    if code=="" { continue }
      qrCode, _ := qr.Encode(code, qr.M, qr.Auto)
      qrCode, _ = barcode.Scale(qrCode, conf.Size, conf.Size)
      file, _ := os.Create(conf.Out + code + ".png")
      defer file.Close()
      png.Encode(file, qrCode)
  }
}
 

 

その他:Windows 32bitへクロスコンパイル

会社のパソコンはWondows7 32bit版でした。なのでgo buildする際に以下のようなオプションをつけてコンパイルしました。

GOOS=windows GOARCH=386 go build -o QRCodei386.exe QRCode.go
 

 

ちなみに、これをWindows上でやるとトラブルの元らしいですね。なのでLinux上でコンパイルした次第です。

[ad#ad-1]

スポンサーリンク

 - Go言語