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]
スポンサーリンク
