LoginSignup
8
3

More than 3 years have passed since last update.

Go言語で日本語フォーマットをpdf出力

Last updated at Posted at 2019-07-20

自分が過去に書いたテックブログの中で記載している内容なのですが、当時はシステム全体の話だったので、今回はpdf出力の部分にフォーカスして記事にしてみました。

過去のテックブログは以下から飛べます。

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

当時まだGo書き始めたばかりで、変な記述もあるかと思いますがご了承ください...

gopdfについて

同じようにGo言語でpdf出力ができるライブラリとして、gofpdfがあります。
しかし、日本語出力することが難しいため、gopdfを使っています。

基本的な使い方

pdfページ作成

A4サイズで出力したい場合

pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{ PageSize: gopdf.PageSizeA4 })
pdf.AddPage()

サイズを自分で定義したい場合

pdf := gopdf.GoPdf{}

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

// サイズを代入
config := gopdf.Config{}
config.PageSize = rect

pdf.Start(config)

自分でサイズを定義する場合は、gopdf内で定義されているA4のサイズから逆算したり、フォントサイズと比較しながら定義したりしていました。

自分が作ったシステムの中では、pdfを動的に出力する必要があったため、エクセルから抽出した文字配列の数を数え、1行分の高さでかけることをしていました。力業というかアナログというか....

フォントをインプット

フォントファイルは、商用利用可能なGoogle Fontsのフォントを使いました。

// フォントのファイルを読み込む
fontPath := string("フォントファイルのパス")
// フォントを設定
pdf.AddTTFFont("フォントの名前", fontPath)
// フォントサイズを設定(例:10)
pdf.SetFont("フォントの名前", 10)

最近otfファイルの対応もし始めたみたいですが、自分が使いたかったotfファイルのフォントを読み込んだところエラーになりました。
フォントの種類にもよるかもしれないです。

文字出力

SetXSetYを出力する前に必ずおこなってください

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

画像出力

// 画像の場所
inputPath = "画像のパス"

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

改行

改行といってもただ座標を下にずらしているだけです

// 改行
pdf.SetX("前回ののX座標" + "下にずらしたい分のサイズ")

苦労した点

実際にデザインとして完璧に出力しようとすると、以下の様な所で躓きました。

  • 長い説明書きだと文書的に変なところで改行されてしまうことがある
  • 事前にどんな文章が入るか分からないため、改行した文の始めに空白が入ってしまい端がそろわないケースが出てくる
  • 上記に対応しようとすると右端が揃わないケースが出てくる
  • 洋フォントでは各文字、記号のサイズが違い、右端を揃えるのが困難(揃っているように見えてちょっとずれていることも...)

機械的にデザインを出力するってことは難しいですね...

最後に

基本的な記述は以上で説明した内容でできると思います。
次回はエクセルの読込み部分を解説していきたいと思います。

8
3
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
3