logo

Vue.js

Vue.js のサーバーサイドレンダリング機能を使用して HTML 文字列を生成し、それを pdfg の API に送信して PDF に変換する方法を説明します。

技術的な概要

  1. Vue.js コンポーネントを作成
  2. @vue/server-renderer を使用して HTML 文字列に変換
  3. 生成された HTML 文字列を pdfg の API に送信して PDF 化

サンプル

コンポーネントの定義

<!-- Invoice.vue -->
<template>
  <html>
    <head></head>
    <body>
      <div class="invoice">
        <h1>請求書</h1>
        <table>
          <thead>
            <tr>
              <th>品目</th>
              <th>金額</th>
            </tr>
          </thead>
          <tbody>
            <tr v-for="(item, index) in items" :key="index">
              <td>{{ item.name }}</td>
              <td>{{ item.price }}円</td>
            </tr>
          </tbody>
        </table>
        <p class="total">合計: {{ total }}円</p>
      </div>
    </body>
  </html>
</template>

<script lang="ts">
import { defineComponent, PropType } from "vue";

interface Item {
  name: string;
  price: number;
}

export default defineComponent({
  props: {
    items: {
      type: Array as PropType<Item[]>,
      required: true,
    },
    total: {
      type: Number,
      required: true,
    },
  },
});
</script>

コンポーネントの使用と PDF 生成

// generatePdf.ts
import { createSSRApp } from "vue";
import { renderToString } from "@vue/server-renderer";
import Invoice from "./Invoice.vue";
import fs from "fs";

// データの準備
const items = [
  { name: "商品A", price: 1000 },
  { name: "商品B", price: 2000 },
];

// Vueアプリケーションの作成
const app = createSSRApp(Invoice, {
  items,
  total: 3000,
});

// HTML文字列に変換
const html = await renderToString(app);

// pdfgのAPIにリクエスト
const response = await fetch("https://api.pdfg.net/v1", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer YOUR_API_KEY",
  },
  body: JSON.stringify({
    html: html,
    pdfOptions: {
      format: "A4",
    },
  }),
});

// PDFの保存
if (response.ok) {
  const pdfBuffer = await response.arrayBuffer();
  fs.writeFileSync("invoice.pdf", Buffer.from(pdfBuffer));
}