ASP の最近のブログ記事
会社のイントラネットに簡単な送付状システムをASPで構築していますが、
印刷用にレイアウトしてあるHTMLで内容を表示して印刷しています。
ところが、HTMLのレイアウトだと会社のロゴや広告などの画像が72dpi程度でしが出力されないため、ガタガタに印刷されます。
そこで、PDFであれば画像もキレイに出力できるはず!?
ということで、PDFで出力できるようにしてみました。
必要なもの
- IISが稼働するWindows Webサーバー
- FDF Toolkit for Windows (Adobeのサイトからダウンロード)
http://www.adobe.com/devnet/acrobat/fdftoolkit.html - テンプレートとなるフォームの埋めこまれたPDF
必要な作業
- FdfAcx.dllとFdfTk.dllをサーバーのsystem32フォルダにコピー
- コマンドプロンプトでレジストリにFdfAcx.dllを登録
C:\winnt\> cd \winnt\system32 ←コピー先に移動 C:\winnt\system32> regsvr32 FdfAcx.dll ←レジストリーに登録
ASPのソースサンプル
Dim FdfAcx,resFDF
'FDF ActiveX オブジェクトの定義
Set FdfAcx = Server.CreateObject("FdfApp.FdfApp")
'新しいFDF生成
Set resFDF = FdfAcX.FDFCreate
'PDFフォーム欄と値
resFDF.FDFSetValue "atena","株式会社◯◯御中",False
resFDF.FDFSetValue "naiyo","お世話になります。",False
'テンプレートPDFのURL(フルパスが望ましい)
resFDF.FDFSetFile "http://192.168.XX.X/soufujyou/print.pdf"
'設定結果のFDFをファイル名を付けてクライアントでダウンロード
Response.ContentType = "application/vnd.fdf" 'MIMEタイプ FDF
Response.BinaryWrite resFDF.FDFSaveToBuf 'FDFデータをバッファーに出力
'クローズ
resFDF.FDFClose
set resFDF = nothing
set FdfAcx = nothing
テンプレートとなるPDFに宛名を表示する「atena」と、送付状の内容を表示する「naiyo」と名前を付けたフォームを埋め込み、上記のソースにアクセスすれば値が入力されたPDFが表示されます。
ここまでできれば、あとはデータベースや入力フォームからの値を表示したりと便利に改造できます。
動的に画像を表示したりするには、また少し違うやり方をしないといけないようです。
参考サイト
トラックバック(0)
トラックバックURL:
イントラネットで表示されているページを印刷しようとすると、
A4・縦で印刷したいのに、デフォルトはA4・横になっているため、
印刷設定を毎回「縦」に変更しなくてはならない事にガマンの限界が...。
Windowsサーバーなので、
イントラネットはIIS上のASPで作っており
一部PHPを使っています。
印刷設定(用紙設定)はASPやJavascriptの関数があるんかな?
といろいろ検索しましたが見つかりませんでした...。
しかし、替わりに見つけたのはActtiveXコントロール「ScriptX」を使った方法!
まず以下のページで「Dowload smsx.cab」ボタンを押してダウンロード
任意のディレクトリにアップロード
印刷設定を使うページに以下のコードを挿入し、
<object>タグでActiveXコントロール読み込む。
<!-- ScriptX 読み込み --> <object id=factory style="display:none" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" codebase="http://**smsx.cabを設置した場所のパス**/smsx.cab#Version=6,5,439,72(←バージョンによって書き換える)"> </object> <!-- ScriptX 読み込み -->
次にJavascriptファンクションで印刷設定を行う。
<script type="text/javascript">
function printWindow() {
factory.printing.header = "ヘッダ名";
factory.printing.footer = "フッタ名";
factory.printing.portrait = false; // 用紙方向 true: 縦 false: 横
factory.printing.leftMargin = 1.0;
factory.printing.topMargin = 1.0;
factory.printing.rightMargin = 1.0;
factory.printing.bottomMargin = 1.0;
factory.printing.Print(false); // 印刷実行 ture: 印刷ダイアログなし false: 印刷ダイアログあり
}
</script>
あとはファンクションを呼び出すだけでOK!
<input type="button" value="ScriptXで印刷" onclick="printWindow();" />自分の場合は印刷ページ表示と同時に印刷するので、
<body onload="printWindow();" />
としました。
※初回使用時は「ActiveXをインストールしますか?」見たいな警告が出ますが、インストールしてしてください。
その他
ヘッダ・フッタに、現在日・ページ数出力
factory.printing.header = "ヘッダ名 &b 日付: &d"; // 現在日出力 factory.printing.footer = "フッタ名 &b &p/&P ページ"; // ページ数出力
これでイントラネットとインターネットでヘッダー・フッター印刷を切り分けられそうなのがいいです。
ヘッダーとフッターで使える記号
- &w : 印刷するホームページのタイトル
- &u : 印刷するページのアドレス
- &d : 現在の日付(xxxx/xx/xx 形式)
- &D : 現在の日付(xxxx年xx月xx日 形式)
- &t : 現在の時刻(コントロールパネルの「地域」で設定されている形式)
- &T : 現在の時刻(xx:xx:xx 形式)
- &p : 現在のページ番号
- &P : 総ページ数
- &b : 右揃えの文字列(「&b」に続けて文字列を入力)
- &b&b : 中央揃えの文字列(最初の「&b」に続けて文字列を入力)と右揃えの文字列(2 番目の「&b」に続けて文字列を入力)
- && : アンパサンド(&)
直接印刷(印刷ダイアログ表示なし)だけを直接使う
factory.printing.Print(true);
プレビュー画面を表示
factory.printing.Preview();
ActiveXコントロールだけにWindowsサーバー上じゃないと動かないとは思うのですが、
WindowsサーバーであればIISじゃなくてもApatchでも動き、
<object>タグで「smsx.cab」さえ読み込めばPHPでも使えるようなことが書かれたページがありました。
有償版もあるようですが、用紙サイズの指定とかもできるみたいです。
トラックバック(0)
トラックバックURL:




