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

(2005.6.6 初版)
INDEX;

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

 サイト内関連リンク

 
       
TARGET;PerlでFDF(Format Data Format)ファイルを作成し、
 PDF文書を表示・印刷・保存する。
・Adobe FDF ToolKitをインストールする。
 -FDF Tollkitを使用するとテンプレートFDFが自動生成できますので
  、手作業でテンプレートFDFを作成することがなくなります。
  すなわち、FDFのフォーマット仕様を意識しないで済みます。
・入力フォームは、書き出し形式「FDF」のPDFフォームを使用する。
・PDFフォームで動的に任意の画像の選択(画像挿入)を可能とする。
  選択された画像は、PDFに出力される(画像送信)。
・作成PDFは、予めテンプレートPDFとして用意する。
 テンプレートPDFの良い点は、
 ・様式のデザインが自由に配置できる
 ・多彩でグラフィックな様式が可能 等
・出力PDFについて、「ファイル保存」ボタン及び「印刷」ボタンを設ける。
 ・表示中出力PDFについて、いわゆる「名前を付けて保存」が可能。
 ・「印刷」ボタンで印刷が可能。
 ・画像表示も出きる。
・Webで文書(伝票)を作成する等利用が広がります。
 -社内OAで利用ができます。現在利用しているWORD文書をPDF
  に変換しAdobe AcrobatでPDFフォーム(デフォルトPDF)を
  作成すれば、Webで文書(伝票)の管理、発行が可能です。
        

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

図1 サンプルPerl CGIアプリケーションの構成
(説明)
 (1) *1:PDF入力フォーム(書き出し形式「FDF」)
     ・PDF入力フォーム(入力用):ringisyo-inform3-2.pdfを参照。
      (内容)
       件名テキストフィールド  起案日テキストフィールド 起案者テキストフィールド
       内容テキストフィールド  出力方法コンポボックス  送信サブミットボタンフィールド
       リセットボタンフィールド 画像用ボタンフィールド  メモテキストフィールド等
         (注1)画像はボタンフィールドとして定義します。
         (注2)送信サブミットボタンフィールドでのプロパティで設定するURLに注意して下さい。
             例. http://.../parsefdf-sample.cgi?#FDF と書き出し形式が「FDF」の場合 #FDF を付けます。
     ・PDF入力フォーム作成方法は、「PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!」を参照
 (2) *2:画像ファイル
     PDF入力フォームの画像用ボタンをクリックすると任意の画像を取り込み、そこに表示します。
 (3) *3:出力用テンプレートPDF(\pfdフォルダに保存)
     ・テンプレートPDF(出力用):ringisyo-form3-2.pdfを参照
      (内容)
       件名テキストフィールド 起案日テキストフィールド 起案者テキストフィールド
       内容テキストフィールド 画像用ボタンフィールド  ファイル保存用ボタンフィールド
       印刷用ボタンフィールド
         (注1)画像はボタンフィールドとして定義します。
         (注2)ファイル保存用ボタンフィールド、印刷用ボタンフィールドは、
             フィールドプロパティで「表示/印刷しない」を設定しています。
     ・テンプレートPDFの作成方法は、「PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!」を参照
 (4) *4,*5,*7:処理結果
    OUT@(*2):PDFをクライアント画面に表示します。
          ・PDFファイルとして保存できます。(ファイル保存用ボタン)*7
          ・印刷用ボタンで印刷ができます。
    OUTA(*3):処理結果のFDFファイルをサーバーに保存します。クライアント画面には、ハイパーリンクを
           表示します。クリックによりPDFをクライアント画面に表示します。
           表示中は、OUT@(*2)と同様に、ファイル保存*7、印刷ができます。
           このFDFファイルは削除されずサーバに残ります。

 (5) *6:FDFファイル(\tmpフォルダに保存。サーバーに残ります。)
    例. fdfsave-200505131454206414.fdf
     fdfsave-:固定
     200505131454206414:年月日+時分秒+4桁の乱数(重複を避けるため)
     >FDFファイルの実例注.このファイルを表示するために次のこと予め行ってください)
     ※ローカルホストのURLパスhttp://localhost/perlfdf/pdf にringisyo-form3-2.pdf(前項(3))をダウンロードして下さい。
 (6) *8:画像用作業PDFファイル(\tmpフォルダに保存。処理後自動削除。)
    例. iconpdf-200505131454206414.pdf
     iconpdf-:固定
     200505131454206414:年月日+時分秒+4桁の乱数(重複を避けるため)
     送信画像は、この画像用作業PDFファイルを介して送信されます。
      @入力のPDFフォームで選択された画像は、入力バッファーから画像をGetAPSメソッドで"画像だけのPDFファイル"を作成します。
      A次に、この"画像だけのPDFファイル"から、画像をSetAPメソッドで出力バッファーに設定します。
 (7)サンプル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
       
        
 (8)起動方法
     http://.../perlfdf/pdf/ringisyo-inform3-2.pdf(ringisyo-inform3-2.pdfを直接起動します)

 (9)留意事項
   PDFフォームを送信したときに、エラーが発生し処理が中断します。
    ・エラー現象
      「ファイルが破壊されています。修復できませんでした。」や「FDFの形式が違います」
    ・エラー時の走行条件
     ・Windows2000serverで標準出力の場合(ファイル保存の場合はOK)
 
   なお、Windows2000Pro+II5及びWindows98SEでは問題ありません。
   また、スクリプトがASPの場合は、何も問題ありません。個々のケースにより現象が違うかも知れません?

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://partners.adobe.com/asn/developer/acrosdk/form.html より入手します。
    (フリーですがパートナー登録が必要です)
    AActive Perの入手方法は、本サイト内「Perl、GD、GD::Graph、Jcode.pmのインストール方法」を参照。
 (注2)Adobe Acrobat4.0以上が必要です

3.Perl CGIアプリ作成手順

   >PerでPDF文書を作成する2〜超簡単、PDF文書を作成する(パート3)!(FDF Toolkit使用)と同様です。 

 (1)作成PDF文書の作成
    WORDやEXCELで作成し、PDFに変換します。
 (2)PFDフォームの作成(テンプレートPDFまたはデフォルトPDFと言う)
      前項(1)で作成したPDFをAdobe Acrobatで次の2種類のPDFフォームを作成します。
     @PDF入力フォーム(入力用):例.ringisyo-inform3-2.pdfを参照。
     AテンプレートPDF(出力用):例.ringisyo-form3-2.pdfを参照
    PDFフォームの作成方法は、「PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!」を参照。
    
 (3)Perl CGI(アプリケーション)の作成(言語インターフェース)

   >PerでPDF文書を作成する2〜超簡単、PDF文書を作成する(パート3)!(FDF Toolkit使用)を参照。 

 (4)Perl及びFDF ToolKit for Perlのインストール(初回のみ)

   >PerでPDF文書を作成する2〜超簡単、PDF文書を作成する(パート3)!(FDF Toolkit使用)を参照。 

4.サンプルPerl CGIソース

   サンプルPerl CGI(parsefdf-sample.cgi)は、データの入力がPDFフォームからの「FDF」形式に対応しています。
parsefdf-sample.cgi
#!/usr/bin/perl

#↑perlのパスを自分の環境に合わせて書き直します。
#「#!/usr/bin/perl」か「#!/usr/local/bin/perl」です。
#分からない場合は、サーバー管理者(もしくはプロバイダー)に
#確認して下さい。

######################(注意)##################################
#本ソースは、コードがShift-JISであることを前提にしています。   #
################################################################
$ver="1.0";
################################################################
# parsefdf-sample.cgi [PDF作成サンプル] (2005/6/6)             #
#ターゲット;                                                  #
# ・PDFフォームを処理する                                      #
# ・選択画像を送信し表\示する                                  #
# Adobe FDF Toolkit 使用                                       #
#   Copyright (c) 2005 by ma3ki                                #
#   E-Mail   : ma3ki@linkclub.or.jp                            #
#   Home Page: http://urbanqee.com/               #
################################################################

# +---[利用規約]--------------------------------------------------+
#  1. このスクリプトはフリーソフトです。このスクリプトを使用した
#    いかなる損害に対して作者は一切の責任を負いません。
# +---------------------------------------------------------------+
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#起動方法 parsefdf-sample.cgi?p=inform (最初にPDFフォーム表示)>>>
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#環境設定 4箇所修正します。(#修正個所の行)
#本CGIの場所(物理パス)IISの場合
chdir ("C:\\Inetpub\\wwwroot\\perlfdf");                     #環境設定修正個所(1/5)
#ライブラリー
require 'jcode.pl';                                          #日本語変換ルーチン
#PDFフォームファイルのパス(フルパス)
$pdfin_url = "./pdf/ringisyo-inform3-2.pdf";                 #環境設定修正個所(2/5)デフォルトPDFのフルパス(URL)
#テンプレートPDFファイルのパス(フルパス)
$pdf_url = "http://localhost/perlfdf/pdf/ringisyo-form3-2.pdf"; #環境設定修正個所(2/4)デフォルトPDFのフルパス(URL)
#作業フォルダ名(最後に/を付けない)
$tmpholder = "tmp";                                  #環境設定修正個所(3/5)作業フォルダ名(最後に/を付けない)
$tmp_url = "http://localhost/perlfdf";               #環境設定修正個所(4/5)作業フォルダ名の上位URL(最後に/を付けない)
$tmp_path = "C:\\Inetpub\\wwwroot\\perlfdf";         #環境設定修正個所(5/5)作業フォルダ名の物理パス(最後に\\を付けない)
#
#画像作業用PDFファイル名の作成 pdficon-yyyymmddhhmmssrrrr.pdf
my $ran = sprintf("%04d",int(rand(9999)));      #4桁の乱数rrrr(重複を避けるため)
my $ymd = &time_get();                          #年月日時刻取得yyyymmddhhmmss
$icontmpfile = "$tmp_path\\$tmpholder\\pdficon-$ymd$ran.pdf"; #環境設定修正個所(5/5) 画像作業用PDFファイル名
#
#undef %FORM; 	       #未使用
#&formdata_conv(); #未使用
# if ($FORM{"p"} eq "inform") {&inform_disp(); exit;}         #入力フォーム(GETデータ) #未使用

#FDF Toolkitの使用宣言
use Acrobat::FDF;
#PDFのFDFデータの読み込み(バイナリーモード)
binmode STDIN;                               # binary データを含む場合(Windows)
read STDIN, $buf, $ENV{'CONTENT_LENGTH'};    #PDFフォーム書き出し形式「FDF」のデータをバイナリモードでバッファーに読み込み
$inFdf = Acrobat::FDF::newFromBuf($buf);     #バッファーを定義する $inFdh
 #フィールド値の取得
 $p_kenmei = $inFdf->GetValue("f_kenmei");   #件名(/V key)
 $p_kianbi = $inFdf->GetValue("f_kianbi");   #起案日(/V key)
 $p_kiansya = $inFdf->GetValue("f_kiansya"); #起案者(/V key)
 $p_naiyo =  $inFdf->GetValue("f_naiyo");    #内容(/V key)
 $out = $inFdf->GetValue("out");             #出力方法(画面/ファイル保存)(/V key)
 #画像の取得(作業用PDF作成)
 $inFdf->GetAP('photo', FDFNormalAP,$icontmpfile); #入力バッファーより画像を読み、新しいPDFを作成(画像用作業ファイル)
                                                   #(GetAP)(/AP Key)

#機能振り分け######################################
 if($out eq "gamen"){&gamen_fdfout();}            #画面表\示
 elsif($out eq "file"){&file_fdfout();}           #FDFファイルサーバ保存
 exit;                                            #
###################################################

###サブルーチン################################################
#FDF作成-PDFをクライアント画面に表\示します---------------------
sub gamen_fdfout{

#新しいFDFを生成する
$outFdf = new Acrobat::FDF;
#テンプレートFDF内の/V key(フィールドデータ項目)
#/Encoding key(エンコーディング)、/F key(テンプレートPDFのURL)、/AP Key(ボタンアイコン(画像))設定
 #画像読み込み
 $outFdf->SetAP('photo', FDFNormalAP,0,$icontmpfile,1); #画像用作業ファイルから出力バッファーへ画像を設定する(/AP Key)
 #フィールド項目値設定
 $outFdf->SetValue('p_naiyo',  $p_naiyo   , false); #内容(/V key)
 $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->SetEncoding('Shift-JIS');                 #エンコーディング(/Encoding key)
 #テンプレートPDF
 $outFdf->SetFile($pdf_url);                        #テンプレートPDFのURL(/F key)

#$| = 1;                                           #autoflush 

print "Content-type: application/vnd.fdf\n\n";     #FDFファイル用ヘッダー出力 
binmode STDOUT;               # binary データを含む場合(Windows)
print $outFdf->SaveToBuf();   #標準出力
#$outFdf->Save("-");          #標準出力(上の書き方でも良い)
#画像用作業PDFファイル削除
unlink $icontmpfile;
}
#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を生成する
$outFdf = new Acrobat::FDF;
#テンプレートFDF内の/V key(フィールドデータ項目)
#/Encoding key(エンコーディング)、/F key(テンプレートPDFのURL)、/AP Key(ボタンアイコン(画像))設定
 #画像読み込み
 $outFdf->SetAP('photo', FDFNormalAP,0,$icontmpfile,1); #画像用作業ファイルから出力バッファーへ画像を設定する(/AP Key)
 #フィールド項目値設定
 $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
$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=\"$tmp_url/$tmpholder/$filename\">$filename</a></p>\n";    # 保存FDFファイルのハイパーリンク
print "</body></html>\n";
#画像用作業PDFファイル削除
unlink $icontmpfile;
}

# 時刻取得
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'}; }
$buffer = $ENV{'QUERY_STRING'};               #GETデータのみ対応(フォーム表示のため)
#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 bgcolor=lightblue TOPMARGIN="0" LEFTMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0" style='font-size:10.0pt;'>
<center>
<b>稟議書作成</b><br>
<object>
<embed src="$pdfin_url" width=90% height=98%>
</object>
</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">
<meta http-equiv="Pragma" content="no-cache">
<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
__END__

PDFフォームの送信するときの書き出し形式について(Adobe Acrobat ヘルプより抜粋)
1.「FDF」を選択すると、FDF ファイルを書き出します。フォームフィールドデータ、注釈、
 PDF に加えられた変更のいずれか、またはすべてを書き出すように設定することができま
 す。「PDF の追加変更部分」オプションを使用して書き出した電子署名は、サーバ上での
 読み込みと再構築が簡単に行えるため便利です。
2.「HTML」を選択すると、HTML ファイルを書き出します。(CGIがPOSTデータで受け取り可能)
3.「XML」を選択すると、XML ファイルを書き出します。フォームフィールドデータと注釈
 のいずれか、または両方を書き出すように設定することができます。
4.「文書全体( PDF)」を選択すると、入力したフォームの入ったPDF ファイルを書き出し
 ます。「FDF」オプションを選択したときよりもファイルのサイズが大きくなりますが、電
 子署名を保存できるので便利です。

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

最終更新日:2005.6.18