<?php
/*
 * 生成した PDF に電子署名を付与:
 * PDFlib を用いてメモリ内に生成した動的な文書に対して、PLOP DS を使って電子署名を付与します。
 * このサンプルには、PLOP  DS の他、PDF の生成を行う PDFlib が必要です。
 *
 * 必要な製品 : PDFlib PLOP DS 5 及び PDFlib
 * 必要なデータ : demo_signer_rsa_2048.p12
 *                demo_signer_rsa_2048.p12 は data ディレクトリにあります。
 *                demo_signer_rsa_2048.p12 のパスワードは demo です。 
 */

/* 本サンプルに必要なデータが保存されているディレクトリを指定する */
$searchpath = "{../data} {../../data}";

$out_filename = "hellosign.pdf";

/* 基本的な署名オプション */
$sign_opts =

    /* ltv オプション:長期検証(LTV)をするかどうかを指定する。
       LTV を行う場合は full を指定する(デフォルト:try) */
    "ltv=try " . 

    /* engine オプション:電子署名を作成するための暗号化エンジンを指定(デフォルト:builtin)
       digitalid オプション:使用するデジタル ID を指定する
       password オプション:デジタル ID に対するパスワード等を指定する */
    "engine=builtin digitalid={filename=demo_signer_rsa_2048.p12} password={demo} ";


/* ----------- ステップ1: PDFlib を用いてメモリ内に動的に文書を生成する ---------- */
try {
    /* PDFlib オブジェクトを作成する */
    $p = new PDFlib();
    
    # create a new PDF document in memory
    
    /* ①メモリ内に新規PDF文書を生成 */
    $p->begin_document("", "");
    
    /* 文書の作成者やタイトル等、文書情報フィールドを設定する */
    $p->set_info("Creator", "hellosign.php");
    $p->set_info("Author", "Rainer Plockl");
    $p->set_info("Title", "Hello, world/signed (PHP)!");
    
    /* ②フォントをロードする */
    $font = $p->load_font("Helvetica-Bold", "host", "");
    
    /* ③PDF 文書ページを開く */
    $p->begin_page_ext(595, 842, "");
    
    /* ④位置決めをして文字列を出力する */
    $p->setfont($font, 24);
    $p->set_text_pos(50, 700);
    $p->show("Hello, world/signed!");
    $p->continue_text("(says PHP)");

    /* ⑤PDF ページを閉じる ⑥PDF 文書を閉じる */
    $p->end_page_ext("");
    $p->end_document("");
    
    /* ⑦メモリ内にある PDF 文書データを取得 */
    $contents = $p->get_buffer();
    
    /* ----------- ステップ2 : PLOP DS を用いて文書に署名する ---------- */
    /* PLOP オブジェクトを作成する */
    $plop = new PLOP();
    
    /* 読み込みたいファイルの入ったディレクトリを指定する */
    $plop->set_option("searchpath={{$searchpath}}");
    
    
    /* ⑧PVF(PDFlib Virtual File System)ファイルを生成する */
    $plop->create_pvf("/pvf/hello.pdf", $contents, "");
    
    /* ⑨PVF ファイルから PDFlib で作った文書を開く */
    if (($doc = $plop->open_document("/pvf/hello.pdf", "")) == 0) {
        die("Error: " . $plop->get_apiname() . ": " . $plop->get_errmsg() . "\n");
    }
    
    /* ⑩電子署名を作成する */
    if ($plop->prepare_signature( $sign_opts) == 0) {
        die("Error: " . $plop->get_apiname() . ": " . $plop->get_errmsg() . "\n");
    }
    
    /* ⑪電子署名を PDF に付与して出力する */
    if ($plop->create_document($out_filename, "input=" . $doc) == 0) {
        die("Error: " . $plop->get_apiname() . ": " . $plop->get_errmsg() . "\n");
    }
    
    /* ⑫PDF文書を閉じる */
    $plop->close_document($doc, "");
    
    /* ⑬PVFファイルを削除する */
    if ($plop->delete_pvf("/pvf/hello.pdf") == 0) {
        die("Error: %s\n" .  $plop->get_errmsg());
    }
    
}
catch (PLOPException $e) {
    die("PLOP exception occurred in hellosign sample:\n" . "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
    $e->get_errmsg() . "\n");
}
catch (Exception $e) {
    die($e);
}

$p = 0;
header("text/html");
print "<a href=\"$out_filename\">click here</a> to open the signed PDF file";
?>