Go言語でケアラベル発行の自動化

f:id:vasilyjp:20190122145929j:plain

こんにちは!ZOZOテクノロジーズ開発部の池田(@yuji_ikepon)です。

本記事では、 ケアラベルデザイン発行を自動化した際に使用したパッケージの紹介と、プロトタイプ開発までのプロセスを紹介したいと思います。

ケアラベルとは

f:id:vasilyjp:20190122150106p:plain ケアラベルとは上記の様な、繊維製品になくてはならない品質表示のことを指します。ケアラベルは、品質表示法の下に適切で明確な表示が義務づけられています。

プロトタイプ製作までの経緯

ケアラベルのデザインを行なっていた担当者から、「ケアラベルを自動的に発行できないだろうか」という相談が来ました。 担当者から聞いた仕様は以下の通りです。

  • エクセルのデータを元にアウトプット出来る事。
  • 指定したフォントが使用できる事。
  • プログラミング未経験でも使える事。
  • Macだけでなく、Windowsでも動く事。
  • 開発環境によらず実行できる事。

これらの条件を踏まえ、PDFでのデザイン出力を軸にプロトタイプを作成することにしました。 また、実行環境の事を考え、言語はGo言語を使用します。

使ったパッケージ、ライブラリ

プロトタイプを実装した中で使った、Go言語のライブラリとソースコードの一例を以下に示します。

xlsxhttps://github.com/tealeg/xlsx

  • エクセルの任意のシートを読み込む
// xlsx読み込み
excel, err1 := xlsx.OpenFile(file)

// xlsxが読み込めなかった場合
if err1 != nil {
    log.Printf("error: not open xlsx file.")
    return false
} else {
    log.Printf("debug: success open xlsx file.")
}
var sheet *xlsx.Sheet = nil

// シート名で該当のシートを検索
for k, _ := range excel.Sheet {
    searchSheet := excel.Sheet[k]

    if searchSheet.Name == "検索したいシート名" {

        log.Printf("debug: success open xlsx sheet.")
        sheet = searchSheet
        break
    } else {
        // 何もしない
    }
}

// 該当シートが見つからない場合
if sheet == nil {
    log.Printf("error: failur open sheet.")
    return false
}

// エクセルの値を参照
for rowKey, rowValue := range sheet.Rows {
    // このループではエクセルの1行ごとに処理ができる
    // 左から0番目のセルを参照できる
    cell := rowValue.Cells[0].Value
}

gopdfhttps://github.com/signintech/gopdf

  • pdfの作成
pdf := gopdf.GoPdf{}

// rect作成
rect := gopdf.Rect{}
rect.W = "pdfの幅"
rect.H = "pdfの長さ"

// gopdf作成
config := gopdf.Config{}
config.PageSize = rect

pdf.Start(config)
fontPath := string("data/Font/" + data.FontPath + ".ttf")
pdf.AddTTFFont(data.FontPath, fontPath)
pdf.SetFont(data.FontPath, "", 2*13)
pdf.AddPage()

// 画像書き込み
// 画像の場所
inputPath = "画像のパス"

// 出力
size := gopdf.Rect{
    H:"画像の高さ",
    W:"画像の幅",
}
pdf.Image(inputPath, "pdfのX座標", "pdfのY座標", &size)

// テキスト書き出し
// 座標を設定
pdf.SetX("pdfのX座標")
pdf.SetY("pdfのY座標")
// 出力
pdf.Cell(nil, "テキスト")

出来たデザイン

下記の様なデザインで出力する事ができました。 ※ 表示されている情報はあくまでテストの為の仮の表記です。

海外向けケアラベル

f:id:vasilyjp:20190122150305p:plain

日本向けケアラベル(表面)

f:id:vasilyjp:20190122150347p:plain

日本向けケアラベル(裏面)

f:id:vasilyjp:20190122150409p:plain

プロトタイプのデザイン自体はそれっぽく実装する事ができました。 しかし、使うフォントの種類によっては、表示される位置がずれてしまったり、改行の位置が揃わないといった問題がありました。 次回プロトタイプ改修の際にはこれらの問題点と合わせて、デザイン的な観点からも実装を考えられたらなと思います。

Go言語で書く上でつまずいた点

今回Go言語でプロトタイプを作成していく中で、以下の様な点で苦労しました。

パッケージ間の共有データをどう持つか

エクセルからデータをインプット→PDF or PNGでアウトプットを行う際に、パッケージ間でデータの受け渡しが必要でした。 その為、データ共有のパッケージを作成し、そこに構造体を保持する事でデータを参照していました。 しかし、保持したいデータの中に構造体の配列を入れた際に、初期化のタイミングの違いにより、参照が上手くいかない場合があり苦労しました。

ライブラリの情報不足

Go言語のライブラリの中には、基本的な使い方しか表記されていないものが多く、自分でライブラリ内のコードを見ながら探っていくことが多かったです。 アウトプットするまで実装が正解か分からないこともあり、デバックに苦戦を強いられました。

最後に

今回はプロトタイプの作成のフローを紹介させて頂きましたが、この他にも色々な業務を行なっています。 制御系エンジニアに関しての詳しい情報は以下のリンクからご覧になれます。

https://tech.zozo.com/recruit/mid-career/detail29/

ZOZOテクノロジーズでは、一緒にサービスを作り上げてくれる方を募集中です。 ご興味のある方は、以下のリンクからぜひご応募ください。

www.wantedly.com

カテゴリー