y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

スクリプトからバーコード付きのPDF帳票を生成してみる

FDFを使って、WebスクリプトからPDF帳票を生成する・・・を以前、PHPのインターネットアプリでやったことがあるが、今回は、イントラネットASPアプリでやってみる。そう、いつぞやの文書・図面管理システムの追加機能として。情報をDBとファイルシステムで管理するっていう仕組みなら、帳票なんて”単なる綺麗な紙を出力したい担当者”の趣味の問題なんだけど、実際にはDBレコードとして登録はするものの、紙ファイルやキャビネット、保管庫なんかに原本管理することもある。つまり、原本とレコードを結びつける方法として、バーコードが記された帳票が必要ってわけなんですな。原本といっしょに、バーコード印刷された帳票を保管しておく。廃棄や移動の場合には、バーコードでピッピとレコード番号を読み取り、ちょっとしたアプリで、DB内のレコードを更新するみたいな。うぅむ、カンバンシステム!←1人満足

■簡単な実現方法
Export_FDF.aspというプログラムがデータベースから属性を拾い上げ、FDFを出力。サーバが公開しているWebパスに置いたPDFをバインドして表示する。せっかくのイントラネットアプリなので、レコード番号のバーコードをくっつけちゃう。
とはいっても、バーコードイメージを生成するようなツールは使わず、バーコードフォントをクライアントにインストールする”安易な”方法。無償で使えるバーコードフォントはココから拾ってきた。(注意書きを記しておけば、再配布できるようだ)
スクリプトからは、”*文書番号*”のようにFDFに書いて、表示に使用するPDFテンプレートの方で、バーコードフォントを指定しておけばOK。めでたく、スクリプトからバーコード付きPDF帳票が生成される。
ちなみに、スクリプト内で書いたFDFはこんな↓感じ

'HTTPヘッダを偽装
     Response.AddHeader "Content-Disposition","attachment;filename=" & expname
     Response.ContentType = "application/vnd.fdf"
'FDFフォーマット
     Dim header_string
     header_string = "%FDF-1.2%矣腕" & vbcrlf &_
     "1 0 obj" & vbcrlf &_
     "<<" & vbcrlf &_
     "/FDF <<" & vbcrlf &_
     " /Fields [" & vbcrlf &_
     "<< /V (*" & 文書番号 & "*)/T (code39)>>"& vbcrlf ←バーコード部分
     response.write header_string
     Response.Flush 'ヘッダ書き出し

'レコードを取りにいって次々に書き出していく
     while i < iCol-1
      tmp = NULL_FUNCTION(RS2.Fields(Cstr(aryCol(i))))
      response.write "<< /V (*" & フィールド値 & "*)/T (" & フィールド名 & ")>>"& vbcrlf
      i=i+1
     Wend

'フッタの書き出し
     Dim footer_str 'FDFフッタ文字列
     footer_str= "]"&vbcr & vblf&_
     "/Encoding /Shift-JIS /F (" & Application("テンプレートPDFのURL") & ")"& vbcrlf &_
     ">>"& vbcr & vblf &_
     ">>"& vbcr & vblf &_
     "endobj trailer"& vbcr & vblf &_
     "<<" & vbcrlf &_
     "/Root 1 0 R"& vbcrlf &_
     ">>" & vbcrlf &_
     "%%EOF" & vbcrlf &_
     "FDF" & vbcrlf
     Response.Write(footer_str)
     Response.Flush 'フッタ書き出し
     Response.Clear


PDFテンプレートはワープロ表計算ソフトなどで作ったPDFファイルに、Acrobatで読み取り専用のテキストフィールドを配置することで作成する。フィールド名は、DB内で使っているフィールド名をそのまま記述する。バーコードフィールドだけは、名称をcode39で固定、表示に使用するフォントとしてCODE39を当てる。
結局、スクリプトからは、テキストしか書き出してないってのが面白い。
サーバサイドでPDFのオブジェクトやフォントオブジェクト、イメージなんかを生成しないので、動作が軽い!(HTMLを出す代わりにFDFを出してるだけ)
後は、クライアントで整形して表示してね!っていう無責任システム。いいなぁ。我ながら

その他バーコード関連の有益なサイトURL
フリーバーコード作成及びバーコードプリントソフト資源