とある案件にて、
”webシステムでPDF出力する”デモ用アプリをつくることになりまして。
実際はGrapeCityのActiveReports for .NET Web Form Editを使う予定だけれど、
届くのに時間かかるよ!しかしデモ日は数日後だよ!
上司「それでも、PDFをDLするところを見せたいんだよね」
………仕方がない、頑張ってみましょう;;
とりあえずぐぐってみると、@ITの記事がhit
[ASP.NET]Webフォームから動的にPDF文書を作成するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/309aspgenpdf1/aspgenpdf1.html
[ASP.NET]あらかじめ用意したPDF文書をインポートするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/315aspgenpdf3/aspgenpdf3.html
あと、上記と同じ「iText.NET」のサイト
iText.NET
http://www.ujihara.jp/iTextdotNET/ja/index.html
から
PDF ファイルの結合※C#サンプル
http://www.ujihara.jp/iTextdotNET/examples/concat_pdf.java
※氏原さんのHPが見れないようなので、こっちも貼っておきます
⇒http://sourceforge.net/projects/itextdotnet/
──このへんを応用してみることに。
************************************************************
【機能について】
・事前にシステムで出力したっぽいPDFを作っておく(test.PDF)ので、
web画面上の「PDF出力ボタン」をクリックしたときに、
デフォルト保存名"yyyymmddHHMMSS.pdf"でDLするようなデモプログラムを作ろう!
【事前準備】
1)MSから「Microsoft Visual J# 2.0 再頒布可能パッケージ」をDL&インストールしておく
→http://www.microsoft.com/downloads/details.aspx?familyid=F72C74B3-ED0E-4AF8-AE63-2F0E42501BE1&displaylang=ja
2)iText.NETをDL&解凍しておく(今回使ったのは、iTextdotNET-dll-1.4-1.zip)
→http://sourceforge.jp/projects/sfnet_itextdotnet/releases/
3)オリジナルPDFを作っておく(test.PDF)
→エクセルとかでそれっぽい帳票デザイン(複数ページなやつ)して、PDFにしておく
【作ってみる】
1)VB2005で新規webアプリ作成
2)仮想ディレクトリ直下のbinフォルダに、
iTextdotNET-dll-1.4-1.zip解凍フォルダにあるdllのうち
iTextdotNET.dll
iTextAsian.dll
Gnu.Classpath.Core.dll
を入れる
3)参照設定に色々追加
3-1)【事前準備】でインストールしてた「Microsoft Visual J# 2.0 再頒布可能パッケージ」(vjslib.dll)
3-2)2)でbinに入れたiTextdotNET.dll ※ローカルにコピーするをTrueにしておく
3-3)2)でbinに入れたiTextAsian.dll ※ローカルにコピーするをTrueにしておく
3-4)2)でbinに入れたGnu.Classpath.Core.dlll ※ローカルにコピーするをTrueにしておく
4)【事前準備】で作成しておいたPDF(test.PDF)をDefault.aspxと同じフォルダに入れる
5)4)のPDFを右クリックして「プロジェクトに含める」
6)Default.aspxにボタン1つ追加(Button1)
7)こんな感じにコーディング
| 'iText.NET関連の名前空間 Imports com.lowagie.text Imports com.lowagie.text.pdf Partial Public Class Default Inherits System.Web.UI.Page Protected Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fn As String = "" Dim doc As Document = Nothing Dim pc As PdfCopy = Nothing Try '************************************************************ 'ファイル名 fn = CStr(Format(Now, "yyyyMMddHHmmss")) & ".pdf" '************************************************************ 'どっかで「iTextAsian.dll」がちゃんとロードしないみたいなコトが書いてあったので、記述しておく System.Reflection.Assembly.LoadFrom(Server.MapPath("~") + "\\Bin\\iTextAsian.dll") '************************************************************ 'Responseクリア Response.Clear() '************************************************************ 'コンテンツ・タイプの設定 Response.ContentType = "application/pdf" Response.AddHeader("content-disposition", "attachment; filename=" & fn) '************************************************************ 'オリジナルPDFを読み込む Dim pr As New PdfReader("test.pdf") '************************************************************ 'オリジナルPDFのプリントサイズでDocument作成 doc = New Document(pr.getPageSizeWithRotation(1)) '出力先はDLするのでResponseクラスのOutputStream指定 pc = New PdfCopy(doc, Response.OutputStream) '************************************************************ 'Documentオープン doc.open() '************************************************************ 'オリジナルPDFのページ数分、DL用にコピーしていく Dim page As PdfImportedPage = Nothing For i As Integer = 1 To pr.getNumberOfPages() page = pc.getImportedPage(pr, i) pc.addPage(page) Next '************************************************************ 'Documentクローズ doc.close() '************************************************************ Response.End() Catch ex As Exception If Not TypeOf ex Is System.Threading.ThreadAbortException Then Throw ex End If End Try End Sub End Class |
************************************************************
とりあえず、こんな感じでコーディング完了。
あとは画面のレイアウトを整えればOKなはず。
まぁ、J#いれなきゃ行けないんだけど、ノートPCに入れてデモするだけだしねぇ
こんなんでいいでしょ。