2011年02月22日

webアプリで某ツールを使わずにPDF出力したい

【VB2005 + ASP.net】

とある案件にて、
”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に入れてデモするだけだしねぇ
こんなんでいいでしょ。
posted by Tia at 15:41| Comment(0) | ASP.NET | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。