logo

Blade (PHP)

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

技術的な概要

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

サンプル

テンプレートの定義

{{-- templates/invoice.blade.php --}}
<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <div class="invoice">
      <h1>請求書</h1>
      <table>
        <thead>
          <tr>
            <th>品目</th>
            <th>金額</th>
          </tr>
        </thead>
        <tbody>
          @foreach ($items as $item)
            <tr>
              <td>{{ $item['name'] }}</td>
              <td>{{ $item['price'] }}円</td>
            </tr>
          @endforeach
        </tbody>
      </table>
      <p class="total">合計: {{ $total }}円</p>
    </div>
  </body>
</html>

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

<?php
// generate_pdf.php
require 'vendor/autoload.php';
use Illuminate\View\Factory;
use Illuminate\View\FileViewFinder;
use Illuminate\View\Engines\CompilerEngine;
use Illuminate\View\Engines\EngineResolver;
use Illuminate\View\Compilers\BladeCompiler;
use Illuminate\Filesystem\Filesystem;

// Bladeエンジンの設定
$files = new Filesystem;
$compiler = new BladeCompiler($files, 'cache');
$resolver = new EngineResolver;
$resolver->register('blade', function () use ($compiler) {
    return new CompilerEngine($compiler);
});
$finder = new FileViewFinder($files, ['templates']);
$factory = new Factory($resolver, $finder, new Illuminate\Events\Dispatcher);

// データの準備
$items = [
    ['name' => '商品A', 'price' => 1000],
    ['name' => '商品B', 'price' => 2000],
];
$total = 3000;

// HTML文字列の生成
$html = $factory->make('invoice', [
    'items' => $items,
    'total' => $total,
])->render();

// pdfgのAPIにリクエスト
$ch = curl_init('https://api.pdfg.net/v1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Bearer YOUR_API_KEY'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'html' => $html,
    'pdfOptions' => [
        'format' => 'A4'
    ]
]));

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// PDFの保存
if ($httpCode === 200) {
    file_put_contents('invoice.pdf', $response);
}