logo

Go

Go 言語の標準テンプレートエンジンを使用して HTML 文字列を生成し、それを pdfg の API に送信して PDF に変換する方法を説明します。

技術的な概要

  1. Go テンプレートを作成
  2. テンプレートにデータを渡して HTML 文字列を生成
  3. 生成された HTML 文字列を pdfg の API に送信して PDF 化

サンプル

テンプレートの定義

<!-- templates/invoice.html -->
<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <div class="invoice">
      <h1>請求書</h1>
      <table>
        <thead>
          <tr>
            <th>品目</th>
            <th>金額</th>
          </tr>
        </thead>
        <tbody>
          {{range .Items}}
          <tr>
            <td>{{.Name}}</td>
            <td>{{.Price}}円</td>
          </tr>
          {{end}}
        </tbody>
      </table>
      <p class="total">合計: {{.Total}}円</p>
    </div>
  </body>
</html>

テンプレートの使用と PDF 生成

// main.go
package main

import (
	"bytes"
	"encoding/json"
	"html/template"
	"io"
	"net/http"
	"os"
)

type Item struct {
	Name  string
	Price int
}

type Invoice struct {
	Items []Item
	Total int
}

type PdfgRequest struct {
	HTML        string                 `json:"html"`
	PdfOptions  map[string]interface{} `json:"pdfOptions"`
}

func main() {
	// テンプレートの読み込み
	tmpl, err := template.ParseFiles("templates/invoice.html")
	if err != nil {
		panic(err)
	}

	// データの準備
	invoice := Invoice{
		Items: []Item{
			{Name: "商品A", Price: 1000},
			{Name: "商品B", Price: 2000},
		},
		Total: 3000,
	}

	// HTML文字列の生成
	var buf bytes.Buffer
	if err := tmpl.Execute(&buf, invoice); err != nil {
		panic(err)
	}

	// リクエストボディの作成
	reqBody := PdfgRequest{
		HTML: buf.String(),
		PdfOptions: map[string]interface{}{
			"format": "A4",
		},
	}

	jsonData, err := json.Marshal(reqBody)
	if err != nil {
		panic(err)
	}

	// pdfgのAPIにリクエスト
	req, err := http.NewRequest("POST", "https://api.pdfg.net/v1", bytes.NewBuffer(jsonData))
	if err != nil {
		panic(err)
	}

	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer YOUR_API_KEY")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	// PDFの保存
	if resp.StatusCode == 200 {
		out, err := os.Create("invoice.pdf")
		if err != nil {
			panic(err)
		}
		defer out.Close()

		_, err = io.Copy(out, resp.Body)
		if err != nil {
			panic(err)
		}
	}
}