ActiveReportsをWebMatrix 2で使う
空のWebサイトができたら、ActiveReportsを使って環境変数の一覧をPDF出力するサンプルを作ってみましょう。
帳票定義体の作成
ActiveReportsのProfessional版にはランタイムデザイナーというサンプルが付属しています。このサンプルを使うとActiveReportsの帳票定義体ファイルを作成することができます。
「CZ1210ActiveReports」フォルダに「Context」フォルダを追加し、そこに環境変数名と環境変数値をペアで出力するように設定した帳票定義を作成して、CustomersReport.rpxという名前で保存しましょう。
Binフォルダへの追加
ActiveReportsはWindowsやWebMatrix 2に付属しているコンポーネントではないので、初期状態ではActiveReportsのDLLはWebMatrix 2に組み込まれていません。
WebMatrix 2ではDLLはBinフォルダに格納することになるので、最初に必要なのはActiveReportsのDLLをBinフォルダに格納することです。
![図5 ActiveReportsのDLLをBinフォルダに追加](http://cz-cdn.shoeisha.jp/static/images/article/6845/6845_DISP-05.gif)
DLLファイルの追加は、Binフォルダを右クリックして[既存のファイルの追加]メニューを選択し、開いたダイアログでActiveReportsのインストールフォルダにある「Bin\v6.5.4530.1」フォルダの中から必要なDLLを指定して行います。
今回のサンプルで必要なのは次のファイルです。
- ActiveReports.Document.dll
- ActiveReports.Document.xml
- ActiveReports.PdfExport.dll
- ActiveReports.PdfExport.xml
- ActiveReports.Viewer6.dll
- ActiveReports.Viewer6.xml
- ActiveReports6.dll
- ActiveReports6.xml
- Ja\ActiveReports.Document.resources
- Ja\ActiveReports.PdfExport.resources
- Ja\ActiveReports.Viewer6.resources
- Ja\ActiveReports6.resources
ASP.NET Webページの追加
ActiveReportsを使う準備ができたので、PDF出力するASP.NET Webページを作成します。
WebMatrix 2でサイト名を右クリックして「新しいファイルの追加」メニューを選択し、ダイアログを表示します。
左側のメニューの「すべて」をクリックし「VBHTML」アイコンを選択して「index.vbhtml」と名前を付けて[OK]ボタンをクリックします。
ActiveReports操作用コードを記述
Index.vbhtmlに、CustomersReport.rpxに情報を埋め込んでPDF出力するコードを記述します。Index.vbhtmlはRazor形式という書式でASP.NET Webページを記述します。
@Imports DataDynamics.ActiveReports @Imports DataDynamics.ActiveReports.Export.Pdf @Imports System.Data @Code Dim pdfStream() As Byte pdfStream = GetPdfDatas() ' ブラウザに対してPDFドキュメントの適切なビューワを使用するように指定します。 Response.ContentType = "application/pdf" Response.AddHeader("content-disposition", "inline; filename=ActiveReports.PDF") ' 出力ストリームにPDFのストリームを出力します。 Response.BinaryWrite(pdfStream) ' バッファリングされているすべての内容をクライアントへ送信します。 Response.End() End Code @Functions Private block As Object = Nothing ''' <summary> ''' PDFデータを取得する ''' </summary> Public Function GetPdfDatas() As Byte() Dim memStream As System.IO.MemoryStream Dim ds As DataSet = GetRecords() Using rpt As New ActiveReport Dim report As New DataDynamics.ActiveReports.ActiveReport() Using xtr As New System.Xml.XmlTextReader(Server.MapPath("~/Content/CustomersReport.rpx")) rpt.LoadLayout(xtr) xtr.Close() End Using rpt.Document.Printer.PrinterName = "" rpt.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.A4 rpt.PageSettings.Orientation = Document.PageOrientation.Portrait rpt.PageSettings.Margins.Top = ActiveReport.CmToInch(0.5F) rpt.PageSettings.Margins.Bottom = ActiveReport.CmToInch(0.5F) 'データを割り当てる rpt.DataSource = ds.Tables("Enviroment") ' レポートを作成します。 rpt.Run(False) ' PDFの出力用のメモリストリームを作成します。 memStream = New System.IO.MemoryStream ' PDFエクスポートオブジェクトを生成します。 Using _pdf = New PdfExport ' メモリストリームにPDFエクスポートを行います。 _pdf.Security.Use128Bit = True _pdf.Security.OwnerPassword = "hatsune" _pdf.Security.Permissions = PdfPermissions.AllowPrint _pdf.Security.Encrypt = True _pdf.Export(rpt.Document, memStream) End Using End Using Return memStream.ToArray() End Function Private Function GetRecords() As DataSet Dim ds As New DataSet With block ds.Tables.Add("Enviroment") ds.Tables("Enviroment").Columns.Add("Name", GetType(String)) ds.Tables("Enviroment").Columns.Add("Value", GetType(String)) End With For Each env In Environment.GetEnvironmentVariables Dim row As DataRow = ds.Tables("Enviroment").NewRow row("name") = env.key row("value") = env.value ds.Tables("Enviroment").Rows.Add(row) Next Return ds End Function End Functions
RazorなASP.NET Webページでは、@code~End Codeの間に記述したコードがVisual Basicのコードとして認識されJITコンパイルされて実行されます。その中で使っているプロシージャは@Functions~End Functionsの間に記述します。
大まかな処理の流れは、GetRecordsで作成したデータセットをGetPdfDatasで帳票定義体と合成してメモリ上のバイナリーデータとしてPDF化し、それをindex.vbhtmlがリクエストされたときのレスポンスデータとして返却します。
WebMatrix 2での実行
Index.vbhtmlにコードが記述できたのでさっそく実行してみましょう。
WebMatrix 2のリボンの一番左にある[実行]アイコンをクリックします。
ブラウザにはDefault.cshtmlの内容である空白ページが表示されるのでURL欄に「index」と『後ろに追記』して[Enter]キーを押してページを移動します。
残念ながら「ライセンスがない状態でビルドされたため実行できません」とエラーが表示されて正常に動作しませんでした。