PDFlib

高度なPDFアプリケーションの開発を支援する定番プログラムライブラリー Supported by インフォテック株式会社

PDFlib デモプログラム解説

ここでは、PDFlib デモプログラムで取り上げた PDFlib のデモプログラムのソースコードと解説を公開しています。

ソースコードのダウンロードはこちらから(zip ファイル)

pdflib_demo.php

入力フォームから受け取った情報を基に名刺を作成します。

入力フォームの文字コードは UTF-8 とし、以下のソースコードも同じく UTF-8 で保存されるものとします。また、MS ゴシックと MS 明朝のフォントファイルがソースコードと同じ階層の resource/fonts ディレクトリにあるものとします。これらのフォントをお持ちでない場合、IPA フォントのような再配布可能なフォントファイルをご用意いただき、ソースコードを書き換えてお試しください。

PDF へフォントを埋め込むことはフォントファイルの再配布に近いため、利用規約等で PDF への埋め込みを禁止している場合があります。フォントファイルの利用条件をご確認の上、ご利用ください。

下記のソースコードは PHP 5.4 および PDFlib 9.1 での動作を想定しています。


<?php
// 名刺に記載する情報を $_POST から取得
$input_array =
  array(
    array(
      "text" => $_POST["org_name_text"],
      "font" => $_POST["org_name_font"],
      "size" => $_POST["org_name_size"],
      "position_x" => $_POST["org_name_position_x"],
      "position_y" => $_POST["org_name_position_y"]
    ),
    array(
      "text" => $_POST["dept_name_text"],
      "font" => $_POST["dept_name_font"],
      "size" => $_POST["dept_name_size"],
      "position_x" => $_POST["dept_name_position_x"],
      "position_y" => $_POST["dept_name_position_y"]
    ),
    array(
      "text" => $_POST["title_text"],
      "font" => $_POST["title_font"],
      "size" => $_POST["title_size"],
      "position_x" => $_POST["title_position_x"],
      "position_y" => $_POST["title_position_y"]
    ),
    array(
      "text" => $_POST["name_text"],
      "font" => $_POST["name_font"],
      "size" => $_POST["name_size"],
      "position_x" => $_POST["name_position_x"],
      "position_y" => $_POST["name_position_y"]
    ),
    array(
      "text" => $_POST["zip_code_text"],
      "font" => $_POST["zip_code_font"],
      "size" => $_POST["zip_code_size"],
      "position_x" => $_POST["zip_code_position_x"],
      "position_y" => $_POST["zip_code_position_y"]
    ),
    array(
      "text" => $_POST["address_text"],
      "font" => $_POST["address_font"],
      "size" => $_POST["address_size"],
      "position_x" => $_POST["address_position_x"],
      "position_y" => $_POST["address_position_y"]
    ),
    array(
      "text" => $_POST["phone_no_text"] . "    " . $_POST["fax_no_text"],
      "font" => $_POST["phone_no_font"],
      "size" => $_POST["phone_no_size"],
      "position_x" => $_POST["phone_no_position_x"],
      "position_y" => $_POST["phone_no_position_y"]
    )
  );

/* その他の変数を定義
 * ライセンスキーは PDFlib ライセンス規約により、公開ディレクトリに置いては
 * いけません。外部からアクセスできないディレクトリに設置してください。
 * フォントファイルについても、利用規約等により配布が禁止されている場合が
 * あります。使用するフォントの利用条件をご確認ください。
 */
$licensefile = "/var/pdflib/pdflib_license.txt";
$base_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$font_dir = $base_dir . "/resource/fonts";
$image_dir = $base_dir . "/images";
$output_pdf = "pdflib_demo.pdf";

try {
  // PDFlib オブジェクトの作成
  $pdf = new PDFlib();

  /* PDFlib のパラメータの設定
   * ライセンスキーを記入したライセンスファイルを licensefile で指定することで
   * PDFlib を製品版としてお使いいただけるようになります。(フォーマットについ
   * てはインストールディレクトリの licenses.txt をご覧ください)
   *
   * errorpolicy は、PDFlib の関数でエラーが起きた場合の動作を指定します。
   * return では戻り値としてエラーを知らせ、exception では例外を発生させます。
   * なお、デフォルトの legacy は非推奨です。
   *
   * SearchPath は、PDF で使用するファイルを読み込む際の、検索対象にする
   * ディレクトリを指定します。
   *
   * stringformat は PDFlib に渡す文字列のエンコードを指定します。
   */
  if(file_exists($licensefile)) {
    $pdf->set_option("licensefile=$licensefile");
  }
  $pdf->set_option("errorpolicy=return");
  $pdf->set_option("SearchPath=$font_dir");
  $pdf->set_option("SearchPath=$image_dir");
  $pdf->set_option("stringformat=utf8");

  /* 文書情報の設定
   *  文書のプロパティの概要に表示されるタイトルと作成者を指定します。
   *  その他サブタイトル、キーワード、作成日、更新日、アプリケーション等の規定
   *  のプロパティやカスタムプロパティを指定できます。
   */
  $pdf->set_info("Title", "PDFlib デモプログラム (名刺作成)");
  $pdf->set_info("Author", "infoTek K.K.");

  /* 文書の作成
   *  PDF 文書の作成を開始します。begin_document() の第一引数が空文字の場合、
   *  PDF はメモリ上に作成され、end_document() 後に get_buffer() で取得するこ
   *  とができます。
   */
  $pdf->begin_document("", "");

  /* フォントのロード
   *  ページ上のテキストを出力する際に使用するフォントファイルを読み込みます。
   *  FontOutline でフォントファイル内のフォント名を指定し、load_font() で該当
   *  のフォントを使えるようにします。
   *  FontOutline では任意の名前をつけることもできますが、フォントが TrueType
   *  コレクション (.ttc) の場合は、フォント名での指定をお薦めします。
   *  フォントの読み込みに失敗した場合、エラーコード (PHP では 0) が返ります。
   *  成功した場合はフォントハンドルが得られます。
   */
  $pdf->set_option("FontOutline={MS-Gothic=msgothic.ttc}");
  $ms_gothic = $pdf->load_font("MS-Gothic", "unicode", "embedding");
  if($ms_gothic == 0) {
    // フォントのロードに失敗
    throw new PDFlibException();
  }
  $pdf->set_option("FontOutline={MS-Mincho=msmincho.ttc}");
  $ms_mincho = $pdf->load_font("MS-Mincho", "unicode", "embedding");
  if($ms_mincho == 0) {
    // フォントのロードに失敗
    throw new PDFlibException();
  }

  /* ページの作成
   *  一般的な名刺サイズ (91mm * 55mm) のページを作成します。
   *  PDFlib ではポイント単位を使用します。1mm = 2.83point なので、フォームから
   *  受け取った mm 単位の位置を point 単位に変換します。
   */
  $pdf->begin_page_ext(91 * 2.83, 55 * 2.83, "");

  /* 1行テキストの配置
   *  ページ上にテキストを配置します。
   *  fit_textline() で POST されたテキストを受け取り、指定された座標に出力し
   *  ます。使用するフォントとフォントサイズはオプションで指定します。
   */
  foreach($input_array as $input) {
    $text = $input["text"];
    switch($input["font"]) {
    case 1:
      $font = $ms_mincho;
      break;
    case 2:
      $font = $ms_gothic;
      break;
    default:
      $font = $ms_gothic;
      break;
    }
    $optlist = "font=" . $font . " fontsize=" . $input["size"];
    // 座標を mm 単位からポイント単位に変換
    $position_x = $input["position_x"] * 2.83;
    $position_y = $input["position_y"] * 2.83;
    $pdf->fit_textline($text, $position_x, $position_y, $optlist);
  }

  /* ページを閉じる
   *  ページ上への出力が終わったらページを閉じます。
   *  もし複数ページに渡る PDF を作成する場合、再度 open_page_ext() でページを
   *  開きます。
   */
  $pdf->end_page_ext("");

  /* 文書を閉じる
   *  ページ全体の出力が終わったら、ドキュメントを閉じます。
   *  ドキュメントを閉じると、PDF が作成されます。
   */
  $pdf->end_document("");

  /* PDF をブラウザに出力
   *  get_buffer() で作成した PDF を受け取り、ヘッダーと共に送信します。
   */
  $buf = $pdf->get_buffer();
  $len = strlen($buf);

  header("Content-type: application/pdf");
  header("Content-Length: $len");
  header("Content-Disposition: inline; filename=$output_pdf");

  print($buf);
}
catch(PDFlibException $e) {
  /* PDFlib で発生した例外の処理
   *  PDFlib で例外が発生した場合、PDFlibException クラスが送出されます。
   *  PDFlibException クラスでは、最後に実行された PDFlib の API 名、
   *  エラーコード、エラーの詳細を取得できます。
   */
  echo($e->get_apiname() . "[" . $e->get_errnum() . "]: " . $e->get_errmsg());
}
catch(Exception $e) {
  echo($e);
}

// PDFlib オブジェクトの解放
if(isset($pdf)) {
  $pdf->delete();
}
						
PHP 5 / PDFlib 9

本サンプルプログラムのソースコードは、弊社から購入した PDFlib 関連製品を利用する目的に限り、無償で利用、改変、複写することができます。

(Jan 30, 2018 - Sep 28, 2018)