PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!
(FDF Toolkit未使用)

(2005.1初版-2005.6.18改版)
INDEX;

 1.サンプルアプリケーションの構成 
 2.システム構成 
 3.アプリケーション作成の事前作業 
  PDFフォームの作成等 >>詳細
 4.FDFファイル作成方法
  FDFフォーマット仕様、コード変換、改行コード等 
 5.サンプルアプリケーションのデモ 
 6.サンプルアプリケーションのダウンロード

▼ここ「PerlでPDF文書を作成する〜超簡単、PDF文書を作成する!」
  より、めちゃ簡単!なFDF Toolkitを使用する方法(項7,8,9,10)

 7.ASPでPDF文書を作成する(FDF Toolkit使用)
   〜超簡単、PDF文書を作成する(パート2)! 05.5.15
 8.PerでPDF文書を作成する2(FDF Toolkit使用)
   〜超簡単、PDF文書を作成する(パート3)! 05.5.21
 9.PerでPDF文書を作成する2続画像編(FDF Toolkit使用)
   〜超簡単、PDF文書を作成する(パート4)! 05.6.6
      ・・・PDFフォーム入力&画像送信対応!!
 10.ASPでPDF文書を作成する2続画像編(FDF Toolkit使用)
   〜超簡単、PDF文書を作成する(パート5)! 05.6.18
      ・・・PDFフォーム入力&画像送信対応!!
       
TARGET;PerlでFDF(Format Data Format)ファイルを作成し、
  PDF文書を表示・印刷する。
・Adobe FDF ToolKitをインストールしないでPDFをPerlで
 作成・表示する。
 -ASPやPHP等でFDF関数やメソッドを使用する場合は
  インストールが必要です。
  ただし、Adobe Acrobat(4.0以上)が必要です。
・PDFフォームを入力しデータをPerlで処理する。
 -PDFフォームの良い点は次のとおりです。
 ・フォームが自由に配置できる
 ・多彩でグラフィックなフォームが可能 等
・Webで文書(伝票)を作成する。
 -社内OAで利用ができます。現在利用しているWORD文書をPDF
  に変換しAdobe AcrobatでPDFフォーム(デフォルトPDF)を
  作成すれば、Webで文書(伝票)の管理、発行が可能です。

>サイト内PDF関連リンク集
        

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

図1 サンプルアプリケーションhowtomakepdf.cgiの構成
(説明)
 (1) *1,*2:起動方法(ローカルサーバの例)
    ・http://127.0.0.1/ringi/howtomakepdf.cgi?p=form1  :HTMLフォーム入力の場合*1
    ・http://127.0.0.1/ringi/howtomakepdf.cgi?p=form2  :PDFフォーム入力の場合*2
 (2) *3,*4:FDF作成処理へPOST
    それぞれのフォームより、必要項目を入力後「作成」ボタンをクリックします。
   (HTMLフォームの例) 
  
 (3) *5:FDFファイルの作成
    作成するFDFファイルのファイル名の形式は次のとおりです。
    SAMPLE-yyyymmdd時分秒-乱数3桁.pfd
       ファイル名の重複を避けるため、乱数を付けています。FDFファイルは起動ごとに1つ作られ、
    \tmpフォルダに保存されます。   
 (4) *6:PDF(稟議書)の表示
    処理結果画面上の「FDFファイル」のハイパーリンクをクリックすると、画面上にPDF(稟議書)が表示出来ます。
    (注)サーバー上でFDFデータを作成し、配信する場合のライセンス上の問題について
       (Adobeサービスデータベース 文書番号:2565 )
     このサンプルアプリケーションの場合、FDFデータのPDFへの埋め込みはクライアント側で行なわれます。
     従い、PDFはサーバで新規に作成されることもなく、またFDFデータがサーバ側のPDFに保持されることもありません。
     このサーバにはAdobe Acrobat、Adobe Reader及びAdobe FDF ToolKitはインストールされていません。
 (5)ファイル構成(このファイル全体をダウンロードできます)
    
 [ringi] (テスト環境パス C:\Inetpub\wwwroot\ringi)
      +--[doc]    ←ドキュメント類(PDF、WORD等)。右参照。
      +--[img]             ←画像類	
      +--[tmp]             ←作成FDF保存フォルダ
      +--howtomake-pdf.htm ←本ページ
      +--pdfform.html      ←PDFフォーム
      +--howtomakepdf.cgi  ←PDF作成サンプルAP
      +--jcode.pl          ←日本語変換ルーチン
      +--sjisesc.pl   ←SJISコード変換ルーチン(PDF表示用)
       
 [doc] 
      +--ringisyo-form.pdf      ←表示用デフォルトPDF
      +--ringisyo-inform.pdf    ←PDF入力ファーム	
      +--wordringi-form.doc    ←表示用デフォルトPDFのワード文書	
      +--wordringi-inform.doc  ←PDF入力ファームのワード文書	
        

2.システム構成

  動作環境は下表のとおりです。
表1 システム構成
走行確認
OS/サーバー
・Windows2000 Server
・Windows2000Pro+IIS5(TEST環境)
・Windows98SE+PWS(TEST環境)
Windows XP+IIS5では、未確認です。
必要ソフト
(サーバ)
・Active Perl(5.6.1)
・jcode.pl(日本語変換ルーチン)
・sjisesc.pl(SJISコード変換ルーチン)
()内の数字は使用バージョン
クライアント・InternetExplorler5.0以上
・Adobe Acrobat4.0以上(PDFフォーム作成用)
・Acrobat Reader4.0以上
ユーザクアリアントでは、Adobe Acrobatは不要
(注)サーバにはAdobe Acrobat、Adobe Reader及びAdobe FDF ToolKitは不要です。

3.アプリケーション作成の事前作業〜PDFフォーム作成等

 (1)必要様式を作成します...

    WORD,EXECL等で様式を作成します。
    もし、入力フォームにPDFフォームを使用する場合は同じ様式のものを
    2つ(作成帳票用とPDF入力フォーム用)作成します。
    ただし、様式がA4で無い場合(B5等)は1つでよいと思います。
    後のPDF変換時に2つにします。
    様式がA4の場合は、PDF入力フォーム用として、画面に表示可能な大きさに、
    作成帳票用をコピーし小さめに作成します。
    PDFフォームは、出力帳票と同じイメージの入力フォームになるということです。
    もちろん、まったく別イメージ(入力フォーム)でも構いません。
    ここのサンプル例は、作成帳票の大きさは、A4です。PDF入力フォーム用には、
    一部の項目を縮小して別に作成しています。
   (作成事例)
    ・wordringi-form.doc (PFD文書用)
    ・wordringi-inform.doc(PDF入力フォーム用。PFD文書用と内容は同じで、大きさが違います。)

 (2)作成様式をPDFに変換します...

   (作成事例)
    ・ringisyo-form.pdf (PFD文書用=表示用デフォルトPDF。)
    ・ringisyo-inform.pdf(PDF入力フォーム用)

 (3)PDFフォームを作成します...

    Adobe Acrobat(4.0以上)を使用して、「表示用デフォルトPDF」及び「PDF入力フォーム用」
    のPDFフォームの作成を行ないます。
    Web 上で情報を送信したり収集したりするのためのフォームをPDFファイル内に作成します。
    このフォーム(PDFフォーム 形式)からのデータの収集はCGIアプリケーションで可能です。

  (作成事例)
    @ 表示用デフォルトPDF用
      Web 上でフォームデータを収集するための項目名とその属性を作成します。
        >ringisyo-form.pdf

    A PDF入力フォーム用
      Web 上でフォームデータを送信するための項目名とその属性及び送信ボタン等を
      作成します。この定義された項目名でCGI等で受け取ることが出来ます。
      また、Acrobat JavaScript を書くことも出来ます。(注)
        >ringisyo-inform.pdf

    B A項作成PDF入力フォームをHTMLで表示する方法は、<object>タグと<embed>タグを使用しつぎのように書きます。
      これは、PDFをHTMLで表示する一般的な方法です。
        (注.<object>、</object>タグは、無くとも動きます。)

<embed>タグの使用方法-PDFをHTMLで表示する方法
<html>
<head>
<title>PDFフォーム</title>
</head>
<body>
<center>
<b>稟議書作成</b><br>

<object>
<embed src="./doc/ringisyo-inform.pdf" width=90% height=98%>
</object>

</cener>
</body>
</html>
      (注)Acrobat JavaScript         JavaScript には、プラグイン、文書、およびフィールドの各レベルがあります。         ・文書レベルのスクリプトは、文書を開くと実行され、開いた文書だけに適用されます。         ・フィールドレベルのスクリプトは、特定のフォームフィールド(複数も可)          に関連付けます。このスクリプトは、たとえば、マウスボタンを放したとき          などに実行されます。          Acrobat JavaScriptのドキュメントは、ヘルプ/ Acrobat JavaScript ガイドを選択して          「Acrobat JavaScript ObjectSpecification」を開いてください。       
>PDFフォーム作成方法        PDFフォームの作成方法については、Adobe Acrobatのヘルプ(Acrohelp.pdf)も合わせて参照して下さい。         (目次-PDF フォーム (148ページ当りから)を参照)

4.FDFファイル作成方法


 4.1 FDFファイル作成方法

  アプリケーションでPDFを作成(正しくは表示)する一つの方法として、Adobe AcrobatのFDF
  (フォームデータフォーマット)ファイルを作成し、出来上がったFDFファイルをクリック
  すると、PDFが表示されます。
  FDFファイルには、項目名とその値及び表するPDFファイル(表示用デフォルトPDF)のパス(URL)
  が書かれています。
  表示したいPDFファイルは、前記3-(3)-@で述べたPDFフォームを予め作成しておきます。
  出来上がったFDFファイルをクリックすると、FDFファイル内に書かれているPDFファイルが
  読み込まれて、FDFファイル内の項目名に対応した値を取り込み、PFDがWeb上に表示されます。
  以下に、CGIでFDFファイルを作成する方法を述べます。
  
  サンプルAP(howtomakepdf.cgi)の一部を例にして説明します。
図2 FDFファイル作成方法
(ソースコード)

#変換後入力データ配列を戻す
$kenmei=$encode_data[0];    #件名
$kianbi=$encode_data[1];    #起案日
$kiansya=$encode_data[2];   #起案者
$naiyo=$encode_data[3];     #内容
#===FDF定義================================
$fdfdata=<<"FDF";
(説明)

(1)FDFファイル形式
  グレイの部分がFDFファイの形式です。
  青字(フィールド定義)部分以外は、そのままコピーして使用します。

(2)FDFファイルのフィールド(項目)定義方法
  青字(フィールド定義)部分がフィールド定義です。
  フィールド定義部分は、作成するアプリケーションにより
  カスタマイズして下さい。 
  << /V ($kenmei)/T (p_kenmei)>>
    一つのフィールドは、<<と>>で括られ上のような形式です。
  ・/V ($kenmei)の部分:/Vキーは項目の値を指定します。
   ()内に値や変数を書きます。
  ・/T (p_kenmei)の部分:/Tキーは項目名を指定します。
   この項目名は、「表示したいPDFのデフォルトPFDフォーム」
   の項目名に合わせます。()内に項目名を書きます。
   フィールド(項目)定義は、1行に複数並べても構わない。
   例.(1行に2フィールド)
 << /V ($kenmei)/T (p_kenmei)>> << /V ($kianbi)/T (p_kianbi)>>

(3)FDFの文字エンコード名の指定
   /Encoding /Shift-JIS のように
   FDFに埋め込む値(文字)のエンコード名がシフトJISコード(Shift-JIS)
   であることを指定します。
   フィールドに埋め込む値はコード変換(エンコード)が必要です。
   >4.2コード変換 参照。
   エンコード名には、他に "UHC", "GBK","BigFive"を指定できますが、
   あまり馴染みがありません。

(4)デフォルトPDFファイルの指定
   /F ($pdf_url) のように
   /Fキーは、「表示したいPDFファイル」のある場所をURLをフルパス
   で指定します。
   (ローカルサーバの例)
   $pdf_url="http://127.0.0.1/ringi/doc/ringisyo-form.pdf"; 
     
   (注)
    FDFファイルの詳細な仕様については、入手できなかったのでここ
    では、経験で得た知識に基づき書かれています。もし、誤りがあれ
    ばご指摘ください。
%FDF-1.2%矣腕
1 0 obj
<<
/FDF <<
   /Fields [
       << /V ($kenmei)/T (p_kenmei)>>
       << /V ($kianbi)/T (p_kianbi)>>
       << /V ($kiansya)/T (p_kiansya)>>
       << /V ($naiyo)/T (p_naiyo)>>
           ]
   /Encoding /Shift-JIS /F ($pdf_url)
     >>
>>
endobj trailer
<<
/Root 1 0 R
>>
%%EOF
FDF
#===FDF定義終わり==========================
# FDFファイル出力
  # FDFファイル名 "SAMPLE-yyyymmdd時分秒-3桁の乱数.fdf"
$fdfname = $fdf_path . "/SAMPLE-" . "$fdfday-$ran" . '.fdf'; 
&lock();                 #ファイルロック
open(FDFOUT, "> $fdfname");
print FDFOUT $fdfdata;   #FDF出力
close(FDFOUT);
&unlock();               #ファイルロック解除
 4.2 PDF表示データのコード変換(エンコード)
   PDF表示データのコードについては、FDFファイル内で /Encoding /Shift-JIS
   とShift-JISであることを指定します(前記4-4.1-(説明)-(3)参照)。
   WebアプリケーションからPDF(FDF)に日本語データを埋め込み、PDFを正しく表示するためには、
   フォームから受け取ったデータを次のようにコード変換を行なう必要があります。
   なお、FDFを処理するCGIソースのコード及びCGIが受け取るデータShift-JISを前提にしています。
   コード変換ルーチン(sjisesc.pl)は、ダウンロードファイルに同梱されています。

   @データ(Shift-JIS)をURIエスケープ(URLエンコード)します(提供ルーチン名:url_enc)
    
####### $str に対しURLエンコードの文字処理部分を行なうPerlメモより流用
sub url_enc{
 local($str)=$_[0];
 $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg;
 $str =~ tr/ /+/;
 return($str);
}
    (使用例)$str1=&url_enc("冬のソ\ナタ"); (注)         冬のソナタ→%93%7e%82%cc%83%5c%83i%83%5e
   AさらにURIエスケープの結果を(\)+3桁の8進数に変換します(提供ルーチン名:str_decode)
###### %16進数(URLエンコード:url_encの結果を)→(\)+3桁の8進数に変換
sub str_decode{
        local($esc) ="\\";		#-----エスケープ文字の定義(\)
        local($str)=$_[0];
#       $str=~ /=/;
#       $str=  $';
        $str=~ s/\+/ /g; 		# + を space へ
    	$str=~ s/%([a-fA-F0-9]{2})/$esc.sprintf("%03o",hex($1))/ge;
            # 16進数から(\)+3桁の8進数に 
        return($str);
}
    (使用例)$str2=&url_enc($str1); (変数名$str2はFDFファイルの/Vの変数名と合わせます) (冬のソナタ)→%93%7e%82%cc%83%5c%83i%83%5e→\223\176\202\314\203\134\203i\203\136     (@,Aを一度に行なう例)$str2=&url_enc(&url_enc("冬のソ\ナタ"));          (注)ソ は、SJISコードの場合 2バイト目が \ である文字のため \ を添えます。      PDF表示データをコード変換をせずに、FDFファイルに書き込むとSJISコードの「2バイト目が \ である文字」は文字化けします。      「2バイト目が \ である文字」が入力フォームから来た場合、コード変換をしないと文字が化けます。      CGIソース上で明示的に"冬のソ\ナタ"と文字列を定義した場合は、化けないで正しく表示されます。      また、半角括弧 )は、値が終了と見なされ括弧 )後の文字列の欠落が生じます。例 → << /V (・・・)・・・)/T (p_kenmei)>>      したがい、必ずコード変換(@、A項)を行ないます。      (参考:SJISコードで、2バイト目が \ である文字)       「―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭」
 4.3 改行コードについて
     PDFの改行コードは \r (復帰記号)です。
     明示的にデータを改行したい場合は、\r を挿入します。
     また、入力フォームのテキストボックスエリアの改行を含むデータをそのままPDF文書で表示したい場合は、
     テキストボックスエリアの改行コードを \r に変換します。
     (変換例)
       サンプルアプリケーションでの使用例(青字の部分)。@item_inlistには、入力フォームの受け取り
       データが入っています。ここの例では、改行コードの変換と4.2節で述べたコード変換を同時に行なっています。
     
図3 改行コード例

foreach (@item_inlist){
   $_ =~ s/\r\n/\r/g;    #改行コード変換CR/LF ⇒LF(入力ボックスエリアの改行を変換)
   $_ =~ s/&lt;/</g;     #&lt;→<に戻す
   $_ =~ s/&gt;/>/g;     #&gt;→>に戻す
   $str = &url_enc($_);     #URLエンコード(SJISコード→%+16進数)
   print "$_=$str<br>";
   $str = &str_decode($str);      #URLエンコード→8進数へ変換(\+8進数)
   #print "$_=$str<br>"; #デバック行
   push (@encode_data,$str);    #結果を配列に格納
 }

5.サンプルアプリケーションのデモ

(都合によりデモは中止します -2014.3.17)

6.サンプルアプリケーションのダウンロード

     ダウンロード

     別途、Acrobat Reader4.0以上(ユーザクライアント)が必要です。
     サンプルアプリケーションを走行する場合は、走行環境により、howtomakepdf.cgi を修正して下さい。
     赤字の部分を環境に合わせて修正します。	    

図4 howtomakepdf.cgi ソースコードの一部
23 #環境設定
24 #chdir ("C:\\Inetpub\\wwwroot\\ringi");                     #修正必須(IISの場合コメントを外す)本CGIの場所(物理パス)
25 $pdf_url = "http://urbanqee.com/webutil/pdf/ringi/doc/ringisyo-form.pdf"; #修正必須デフォルトPDFのフルパス(URL)
26 #ライブラリー
27 require 'sjisesc.pl';            #1.URLエンコード-(\)+3桁の8進数に変換(url_enc)
28                                  #2.URLエンコードを更に(\)+3桁の8進数に変換(str_decode)
29 require 'jcode.pl';              #日本語変換ルーチン
30 #use jcode;
31 $fdf_path = $csv_path = "./tmp"; #FDF格納パス(FDFファイル新規作成用)
32 $fdf_path2 = $csv_path = "http://urbanqee.com/webutil/pdf/ringi/tmp"; #FDF格納パス修正必須(注)
33 $lockfile="LOCKFILE.lock";       #ロックファイル名

   (注)FDFファイルダウンロード用パス。必ず上位パス(http://)から指定して下さい。 
    (フルパスにしないと、PDFフォームからの場合、PDF文書が表示されないケースがあります。) 
  (起動方法)ローカルサーバの例     ・http://127.0.0.1/ringi/howtomakepdf.cgi?p=form1 :HTMLフォーム入力の場合     ・http://127.0.0.1/ringi/howtomakepdf.cgi?p=form2 :PDFフォーム入力の場合
>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

最終更新日:2009.12.1