PerlでPDF文書を作成する2〜超簡単、PDF文書を作成する(パート3)!(FDF Toolkit使用)
(
「PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!」(FDF Toolkit未使用)より、めちゃ簡単です。)

(2005.6 改版)
INDEX;

1.サンプルアプリケーションの構成 
2.システム構成(動作環境) 
3.Perl CGIアプリ作成手順
 -FDF Toolkitインストール
 -FDF処理関連メッソド 等
4.サンプルPerl CGIソース
5.ダウンロード 

>PerでPDF文書を作成する2続画像編〜
超簡単、PDF文書を作成する(パート4)!
(FDF Toolkit使用)05.6.6
・・・簡単 PDFフォーム入力&画像送信!!

 >サイト内関連リンク
       
TARGET;PerlでFDF(Format Data Format)ファイルを作成し、
 PDF文書を表示・印刷する。
・Adobe FDF ToolKitをインストールする。
 -FDF Tollkitを使用するとテンプレートFDFが自動生成できますので
  、手作業でテンプレートFDFを作成することがなくなります。
  すなわち、FDFのフォーマット仕様を意識しないで済みます。
・入力フォームは、HTMLを使用する。
・作成PDFは、予めテンプレートPDFとして用意する。
 テンプレートPDFの良い点は、
 ・様式のデザインが自由に配置できる
 ・多彩でグラフィックな様式が可能 等
・Webで文書(伝票)を作成する等利用が広がります。
 -社内OAで利用ができます。現在利用しているWORD文書をPDF
  に変換しAdobe AcrobatでPDFフォーム(デフォルトPDF)を
  作成すれば、Webで文書(伝票)の管理、発行が可能です。
        

1.サンプルアプリケーションの構成

図1 サンプルPerl CGIアプリケーションの構成
(説明)
 (1) *1:サンプルPerl CGIの入力フォーム
     
 (2) *2,*3,*4:処理結果
    OUT@(*2):PDFをクライアント画面に表示します。
    OUTA(*3):処理結果のFDFファイルをサーバーに保存します。クライアント画面には、ハイパーリンクを
           表示します。クリックによりPDFをクライアント画面に表示します。
           このFDFファイルは削除されず残ります。
    OUTB(*4):処理結果のFDFファイルのダウンロード画面をクライアントに表示します。
 (3) *5:FDFファイル(\tmpフォルダに保存)
    例. fdfsave-200505131454206414.fdf
     fdfsave-:固定
     200505131454206414:年月日+時分秒+4桁の乱数(重複を避けるため)
 (4) *6:テンプレートPDF(\pfdフォルダに保存)
     ・様式:>ringisyo-form.pdfを参照
     ・テンプレートPDFの作成方法は、「PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!」を参照
 (5)サンプルPerl CGIのファイル構成(このファイル全体をダウンロードできます)
    
表1 サンプルPerl CGIのファイル構成
 [perlfdf] (テスト環境パス C:\Inetpub\wwwroot\perlfdf)
      +--[img]               ←画像類
      +--[pdf]               ←テンプレートPDFファイル保存フォルダ
           +--ringisyo-form.pdf       ←表示用テンプレートPDF(generatefdf-sample.cgi)
           +--ringisyo-inform3-2.pdf    ←入力用PDFフォーム(parsefdf-sample.cgi)
           +--ringisyo-form3-2.pdf      ←表示用テンプレートPDF(parsefdf-sample.cgi)
      +--[tmp]                        ←作成FDF保存フォルダ/画像用作業PDFファイル
      +--howtomake-pdf3.html          ←本ページ-PerlでPDF文書作成2用解説
      +--howtomake-pdf3-2.html        ←PerlでPDF文書作成2続編用解説
      +--generatefdf-sample.cgi       ←PerlでPDF文書作成2用サンプルCGI
      +--parsefdf-sample.cgi          ←PerlでPDF文書作成2続編用サンプルCGI
      +--jcode.pl
       
        
 (6)起動方法
     http://.../perlfdf/generatefdf-sample.cgi((1)の入力フォームを起動します)

2.システム構成

  動作環境は下表のとおりです。
表2 システム構成
走行確認OS
(サーバー)
・Windows2000 Server
・Windows2000Pro+IIS5(TEST環境)
・Windows98SE+PWS(TEST環境)
Windows XP+IIS5では、未確認です。
必要ソフト
(サーバ)
・Active Perl(Perl5.6以上)
・jcode.pl
 以下FDF Toolkit for perl
・Fdf.pm(PerlモジュールPM)
・Fdf.dll(Perl用dll)
・FdfTk.dll(Toolkit用dll)
PerlとToolkit for perlのインストールが必要
クライアント ・InternetExplorler5.0以上
・Adobe Acrobat4.0以上(PDFフォーム作成用)
・Acrobat Reader4.0以上
ユーザクアリアントでは、Adobe Acrobatは不要
 (注1)サーバにはAdobe FDF ToolKit for Perl及びActive Perl5.6以上のインストールが必要です。
    @FDF ToolKitは、http://www.adobe.com/devnet/acrobat/fdftoolkit.html より入手します。(2008.8.25)
    (フリーですがパートナー登録が必要です)
        

>FDF ToolKitインストール方法     AActive Perの入手方法は、本サイト内「Perl、GD、GD::Graph、Jcode.pmのインストール方法」を参照。  (注2)Adobe Acrobat4.0以上が必要です

3.Perl CGIアプリ作成手順

 (1)作成PDF文書の作成
    WORDやEXCELで作成し、PDFに変換します。
 (2)PFDフォームの作成(テンプレートPDFまたはデフォルトPDFと言う)
    前項(1)で作成したPDFをAdobe AcrobatでPDFフォームを作成します。
    PDFフォームの作成方法は、「PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!」を参照

 (3)Perl CGI(アプリケーション)の作成(言語インターフェース)

   ●FDF Toolkit for Perlモジュールの使用宣言

    use Acrobat::FDF;

   ●Perl FDF Toolkitメソッド(主なものみ掲載しています)
メソッド説明
1ファンクション
Acrobat::FDF::newFormBuf入力フォームデータをバッファーに読み込む。
binmode STDIN; <>br> read STDIN, $buf, $ENV{'CONTENT_LENGTH'};
$inFdf = Acrobat::FDF::newFromBuf($buf);
new Acrobat::FDF('')外部ファイルをオープンする。
$inFdf = new Acrobat::FDF('./pdf/ringisyo-templatefdf.fdf');
new Acrobat::FDF新しいFDFファイルを生成する。
$outFdf = new Acrobat::FDF;
Save("-") または、
SaveToBuf
作成したFDFを標準出力ファイル(STDOUT)に書き出す。
print "Content-type: application/vnd.fdf\n\n";
$outFdf -> Save("-"); または、
$outFdf -> SaveToBuf();
2一般メソッド
save
その他
EmbedAndClose
GetVersion
RemoveTtem
作成したFDFを一般ファイルに書き出す。
$outFdf->Save("./tmp/out.fdf");
3FDFデータをパース(parse)
するメソッド
GetAp
入力バッファーのFDFの/APキー(fieldNameボタンフィールド)の外観を取得し、
ボタンアイコン(画像)のみの新しいPDFを生成する。
$inFdf->GetAP(fieldName, whichFace, fileName);
 ・GetAP パラメータ
  fieldName:ボタンフィールドのフィールド名(入力バッファーの)
  whichFace:FDFNormalAP/FDFRolloverAP/FDFDownAPのいずれかの文字列
  fileName:新規生成PDFファイル名
 合わせて、GetValue/SetApの例参照。
GetValue
FDFの/Vキー(フィールド)の値を取得する。
binmode STDIN;            #入力PDF/FDFにバイナリデータがある場合-Windows用
read STDIN, $buf, $ENV{'CONTENT_LENGTH'}; #クライアントからのPDFフォーム(FDF形式)
                                          #をバッファーに読み込み
$inFdf = Acrobat::FDF::newFromBuf($buf);  #FDFバッファーとして定義する
$Address = $inFdf->GetValue("Address"); #テキストフィールドの値取得
$inFdf->GetAP('phoho', FDFNormalAP, "img.pdf"); #FDFバッファーからボタンフィールドの
       #情報(画像)を取得し、img.pdfと言う名で画像のみのPDFを生成する。
その他のメソッド
ExtractAppendSaves
ExtractAttachment
GetEncoding
GetFDFVersion
GetFile
GeyFlag
GetId
GetNthvalue
GetOpt
GetSatus
NextFieldName
4FDFデータを生成(generate)
するメソッド
new新しいFDFオブジェクトを生成する。
use Acrobat::FDF;
newFormBufバッファーから新しいFDFオブジェクトを生成する。
$inFdf = Acrobat::FDF::newFromBuf($buf);
1.ファンクションも参照。
SetAp
FDFの/APキー(ボタンフィールド)の外観を設定する。
fileNnameの画像を、fieldNameの名前で、出力バッファーに設定する。
$outFdf -> SetAP(fieldName,whichFace,subAP,fileName,pageNum);
 ・SetAp パラメータ
  fieldName:ボタンフィールドのフィールド名(fileNameの)
  whichFace:FDFNormalAP/FDFRolloverAP/FDFDownAPのいずれかの文字列
  subAP:無意味。Perlの場合0(数字のゼロ)を設定する。
  fileName:ボタンが存在するPDFファイル名
  pageNum:ボタンが存在するPDFファイルのページNo
 合わせて、GetValue/SetValueの例参照。
SetEncodingFDFの/Encodingの値を設定する。
$outFdf->SetEncoding('Shift-JIS'); #これを指定しないと日本語は文字化けします。
SetFileFDFの/Fキーの値を設定する。
$outFdf->SetFile("http://127.0.0.1/actxfdf/pdf/ringisyo-form.pdf");
#テンプレートPDFのURL(フルパスが望ましい)
SetValue
FDFの/Vキー(テキストフィールド)の値を設定する。
$outFdf->SetValue('Address',$Address, false); #テキストフィールドに値を設定する
$outFdf->SetAP('photo', FDFNormalAP,0,"img.pdf",1); #出力バッファーに、
         #"photo"フィールド名でボタンアイコン(画像)を設定する。
その他のメソッド
AddDocJavaScript,AddTemplate 
newFromEmbedded
SetAPRef,SetAS
SetFDFVersion,SetFileEx
SetFlags,SetGoToAction 
SetGoToRAction,SetHideAction
SetID,SetIF
SetImportDataAction,
SetJavaScriptAction,
SetNamedAction,
SetOnImportJavaScript, 
SetOpt,
SetResetByNameAction, 
SetResetFormAction, 
SetStatus Sets,
SetSubmitByNameAction,
SetSubmitFormAction, 
SetTargetFrame,
SetURIAction,
SetValues 
 (4)Perl及びFDF ToolKit for Perlのインストール(初回のみ)
ダウンロードファイルFDFToolkitForWindows.zipの解凍後のフォルダ

 
@ Perlのインストールについては、「Perl、GD、GD::Graph、Jcode.pmのインストール方法」を参照。
A FDF ToolKit for Perl(コピーのみで終了します)

4.サンプルPerl CGIソース

   サンプルPerl CGI(generatefdf-sample.cgi)は、データの入力はHTMLフォームからの
   POST/GETデータのみ対応しています。FDFデータ(PDFフォーム)の入力処理は対応していません。
      FDFデータ(PDFフォーム)対応サンプルCGIは、>超簡単、PDF文書を作成する(パート4)!
generatefdf-sample.cgi
#!/usr/bin/perl
#↑perlのパスを自分の環境に合わせて書き直します。
#「#!/usr/bin/perl」か「#!/usr/local/bin/perl」です。
#分からない場合は、サーバー管理者(もしくはプロバイダー)に
#確認して下さい。
######################(注意)##################################
#本ソースは、コードがShift-JISであることを前提にしています。   #
################################################################
$ver="1.0";
################################################################
# generatefdf-sample.cgi [PDF作成サンプル] (2005/5/18)         #
# Adobe FDF Toolkit 使用                                       #
#   Copyright (c) 2005 by ma3ki                                #
#   E-Mail   : ma3ki@linkclub.or.jp                            #
#   Home Page: http://urbanqee.com/               #
################################################################

# +---[利用規約]--------------------------------------------------+
#  1. このスクリプトはフリーソフトです。このスクリプトを使用した
#    いかなる損害に対して作者は一切の責任を負いません。
# +---------------------------------------------------------------+
#環境設定 4箇所修正します。(#修正個所の行)
#本CGIの場所(物理パス)IISの場合
chdir ("C:\\Inetpub\\wwwroot\\perlfdf");                     #環境設定修正個所(1/4)
#ライブラリー
require 'jcode.pl';                                         #日本語変換ルーチン
#テンプレートPDFファイルのパス(フルパス)
$pdf_url = "http://127.0.0.1/perlfdf/pdf/ringisyo-form.pdf"; #環境設定修正個所(2/4)デフォルトPDFのフルパス(URL)
#FDFファイル保存上位パス 最後は/を付けない
$tmpholder = "tmp";                                         #環境設定修正個所(3/4)
$fdfpath = "http://127.0.0.1/perlfdf/$tmpholder";            #環境設定修正個所(3/4)
#
#入力フォームデータコード変換
undef %FORM;
&formdata_conv(); #コード変換
 #入力デーダ
 $p_kenmei = $FORM{"f_kenmei"};                            #件名
 $p_kianbi = $FORM{"f_kianbi"};                            #起案日
 $p_kiansya = $FORM{"f_busyo"} . " " . $FORM{"f_kiansya"}; #部署+起案者
 $p_naiyo = $FORM{"f_naiyo"};                              #内容
#機能振り分け######################################
 if ($FORM{"p"} eq "") {&inform_disp();}          #入力フォーム
 elsif($FORM{"out"} eq "gamen"){&gamen_fdfout();} #画面表\示
 elsif($FORM{"out"} eq "file"){&file_fdfout();}   #FDFファイルサーバ保存
 elsif($FORM{"out"} eq "dload"){&dload_fdfout();} #FDFファイルダウンロード
 exit;                                            #
###################################################
###サブルーチン################################################
#FDF作成-PDFをクライアント画面に表\示します---------------------
sub gamen_fdfout{
#FDF Toolkitの使用宣言
use Acrobat::FDF;
#新しいFDFを生成する
$outFdf = new Acrobat::FDF;
#テンプレートFDF内の/V key(フィールドデータ項目)
#/Encoding key(エンコーディング)、/F key(テンプレートPDFのURL)に値を設定
$outFdf->SetValue('p_kenmei', $p_kenmei, false);   #件名(/V key)
$outFdf->SetValue('p_kianbi', $p_kianbi  , false); #起案日(/V key)
$outFdf->SetValue('p_kiansya',$p_kiansya , false); #部署+起案者(/V key)
$outFdf->SetValue('p_naiyo',  $p_naiyo   , false); #内容(/V key)
$outFdf->SetEncoding('Shift-JIS');                 #エンコーディング(/Encoding key)
$outFdf->SetFile($pdf_url);                        #テンプレートPDFのURL(/F key)

$| = 1; # autoflush, so that the HTTP header is emitted immediately

print "Content-type: application/vnd.fdf\n\n";
$outFdf->Save("-"); #標準出力
}

#FDF作成-FDFファイルをサーバーに保存し、クライアント画面には、
#ハイパーリンクを表\示します-----------------------------------------
sub file_fdfout{
#FDFファイル名の作成 fdfsave-yyyymmddhhmmssrrrr.fdf
my $ran = sprintf("%04d",int(rand(9999)));  #4桁の乱数rrrr
my $ymd = &time_get();                      #年月日時刻取得yyyymmddhhmmss
my $filename = "fdfsave-$ymd$ran.fdf";      #保存FDFファイル名
my $fdfsavefile = "./$tmpholder/" . $filename;     #保存FDFファイルパス
#FDF Toolkitの使用宣言
use Acrobat::FDF;
#新しいFDFを生成する
$outFdf = new Acrobat::FDF;
#テンプレートFDF内の/V key(フィールドデータ項目)
#/Encoding key(エンコーディング)、/F key(テンプレートPDFのURL)に値を設定
$outFdf->SetValue('p_kenmei', $p_kenmei  , false); #件名(/V key)
$outFdf->SetValue('p_kianbi', $p_kianbi  , false); #起案日(/V key)
$outFdf->SetValue('p_kiansya',$p_kiansya , false); #部署+起案者(/V key)
$outFdf->SetValue('p_naiyo',  $p_naiyo   , false); #内容(/V key)
$outFdf->SetEncoding('Shift-JIS');                 #エンコーディング(/Encoding key)
$outFdf->SetFile($pdf_url);                        #テンプレートPDFのURL(/F key)
$outFdf->Save($fdfsavefile);                       #ファイル保存
#ファイル名のハイパーリンク表\示
print "Content-type: text/html\n\n";
&htm_header("FDFリンク");
print "<body style=\"font-size:15px\">";
print "<p align=center style='font-size:15px'>FDFファイルを作成しました・・・ファイル名をクリックして下さい。<br><br>\n";
print "<a href=\"$fdfpath/$filename\">$filename</a></p>\n";    # 保存FDFファイルのハイパーリンク
print "</body></html>\n";
}
#FDF作成-FDFファイルダウンロードする。
#クライアントに保存出来ます--------------------------------------
sub dload_fdfout{
#FDFファイル名の作成 fdfsave-yyyymmddhhmmssrrrr.fdf
my $ran = sprintf("%04d",int(rand(9999)));     #4桁の乱数rrrr
my $ymd = &time_get();                         #年月日時刻取得yyyymmddhhmmss
my $filename = "fdfsave-$ymd$ran.fdf";         #保存FDFファイル名
#FDF Toolkitの使用宣言
use Acrobat::FDF;
#新しいFDFを生成する
$outFdf = new Acrobat::FDF;
#テンプレートFDF内の/V key(フィールドデータ項目)
#/Encoding key(エンコーディング)、/F key(テンプレートPDFのURL)に値を設定
$outFdf->SetValue('p_kenmei', $p_kenmei  , false); #件名(/V key)
$outFdf->SetValue('p_kianbi', $p_kianbi  , false); #起案日(/V key)
$outFdf->SetValue('p_kiansya',$p_kiansya , false); #部署+起案者(/V key)
$outFdf->SetValue('p_naiyo',  $p_naiyo   , false); #内容(/V key)
$outFdf->SetEncoding('Shift-JIS');                 #エンコーディング(/Encoding key)
$outFdf->SetFile($pdf_url);                        #テンプレートPDFのURL(/F key)

$| = 1; # autoflush, so that the HTTP header is emitted immediately

print "Content-type: application/vnd.fdf\n";
print "Content-Disposition: attachment; filename=$filename\n\n";

$outFdf->Save("-"); #ダウンロード画面表\示

}

# 時刻取得
sub time_get{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my $month = ($mon + 1);
my $year = $year + 1900;
my $yybiko=$year; $mmbiko= sprintf("%02d",$month); $ddbiko= sprintf("%02d",$mday);
my $date_now = "$year/$month/$mday $hour:$min:$sec";
my $fdfday = $year . sprintf("%02d",$month) . sprintf("%02d",$mday) . sprintf("%02d",$hour) . sprintf("%02d",$min) . sprintf("%02d",$sec);
 #和暦年
  my $hyy = ($year-1988);
  my($nendo)="";
 #和暦年度
  if($month >= 4 && $month <=12){
    $nendo = $hyy;
    }
  else{$nendo = $hyy - 1;}
return $fdfday;
}
# フォーム内容を取得
sub formdata_conv{
my $buffer="";
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }
#if ($buffer eq "") { print "send_error"; }
my @pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
 ($name, $value) = split(/=/, $pair);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 &jcode::convert(\$value,'sjis');
 $value =~ s/</&lt;/g;
 $value =~ s/>/&gt;/g;
 $FORM{$name} = $value;
 }

}

#入力HTMLフォーム
sub inform_disp{
print "Content-type: text/html\n\n";
&htm_header("入力フォーム");
print <<"FDF";
 <body style="font-size:15px">
 <form method=post action="generatefdf-sample.cgi" name=f>
 <input type=hidden name=p value="gamen">
 <TABLE cellpadding=0 cellspacing=0 bgcolor=navy border=0><TR><TD>
 <table style="font-size:15px" cellpadding=3 cellspacing=1><caption style='font-weight:bold;font-size:16px;color:#ffffff'>稟議書作成</caption>
 <tr bgcolor=lightcyan><td nowrap>件名</td><td><input type=text name=f_kenmei value="" size=60 maxlength=80></td></tr>
 <tr bgcolor=lightcyan><td nowrap>起案日</td><td nowrap>
 <input type=text name=f_kianbi value="" size=40 maxlength=20></td></tr>
 <tr bgcolor=lightcyan><td nowrap>起案者</td><td nowrap>
 <select name=f_busyo>
 <option>総務課
 <option>広報課
 <option>営業部
 <option>システム開発部1課
 <option>システム開発部2課
 </slect><input type=text name=f_kiansya value="" size=40 maxlength=40><small>(所属部署、氏名
 </td></tr>
 <tr bgcolor=lightcyan><td nowrap>内容<br><small>(1000文字以内)</small></td><td><textarea name=f_naiyo rows=6 cols=76 wrap=hard></textarea></td></tr>
 <tr bgcolor=lightcyan> <td colspan=2 align=center nowrap>
 <input type=radio name=out value="dload">FDFファイルダウンロード
 <input type=radio name=out value="file">FDFファイルサーバ保存
 <input type=radio name=out value="gamen" checked>PDF画面表\示
 <input type=button name=subm value="作 成" CLASS=botan1 onClick="form_check()">
 <input type=reset name=subm value="リセット" CLASS=botan1></td></tr>
 </table>
 </TD></TR></TABLE>
 </form>
</body>
</html>
FDF
}

#HTMLヘッダー
sub htm_header{
my $title=$_[0];
print <<"EOM";
<html>
<head>
<title>$title</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<SCRIPT language=javascript>
<!--
 //SUBMITフォームチェック
 function form_check(){
 if (document.f.f_naiyo.value.length >= 1000){
     alert("内容の文字数が長すぎます。文字数:" + document.f.f_naiyo.value.length);
     return false
 } 

//alert("これは" + document.f.f_naiyo.value.length + "文字です。");

document.f.submit()

}
 //文字列を1バイトづつ数える(NOT USE)
 function jstrlen(str,len,i) {
  var len = 0;
  var str = escape(str);
   for (i = 0; i < str.length; i++, len++) {
      if (str.charAt(i) == "%") {
         if (str.charAt(++i) == "u") {
            i += 3;
            len++;
         }
         i++;
      }

   }
   return len;
}
//-->
</SCRIPT>
<STYLE TYPE="text/css">
<!--
.botan1 {
 font-family: arial,Verdana,"MS ゴシック",Osaka−等幅;
 font-size: 11px; font-weight:bold; color: #FEFEFE;
 background-color: brown; //#416BBA;
 border: 3px double #4A5480;

}
-->
</STYLE>
</head>
EOM
}

##########END

5.サンプルPerl CGIダウンロード

   ・サンプルPerl CGIのダウンロード(フリー)

    ダウンロードファイル(最終更新日:2005.6.11)の内容は、
    「1.サンプルアプリケーションの構成-表1 サンプルPerl CGIのファイル構成」です。
>UP
(サイト内PDF関連リンク)
NoタイトルFDF Toolkitスクリプト備考
1 PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!(FDF Toolkit未使用例) 不要Perl CGI
2 PDFフォーム作成方法編 -HTML
3 ASPでPDF文書を作成する〜超簡単、PDF文書を作成する(パート2)!(FDF Toolkit使用) 必要ASP
4 PerでPDF文書を作成する2〜超簡単、PDF文書を作成する(パート3)!(FDF Toolkit使用) 必要Perl CGI
5 PerでPDF文書を作成する2続画像編〜超簡単、PDF文書を作成する(パート4)!(FDF Toolkit使用) 必要Perl CGI画像送信
6 ASPでPDF文書を作成する2画像続編〜超簡単、PDF文書を作成する(パート5)!(FDF Toolkit使用) 必要ASP画像送信


HOME Profile BBS Chat Game Center GD Graph PDF Make ASP Apli Make MID FONT IE Filter Mini Bonsai Web Color List E-m@il

最終更新日:2008.8.25(Toolkit Download site変更)