Go
Go 言語の標準テンプレートエンジンを使用して HTML 文字列を生成し、それを pdfg の API に送信して PDF に変換する方法を説明します。
技術的な概要
- Go テンプレートを作成
- テンプレートにデータを渡して HTML 文字列を生成
- 生成された 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)
}
}
}