SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ActiveReports)

ActiveReports+WebMatrix 2を使ってWindows Azureで簡単PDF出力

「ActiveReports for .NET 6.0J(SP5)」の利用

  • このエントリーをはてなブックマークに追加

 Windows Azureの2012年6月アップデートで追加された機能の一つに「Webサイト」があります。Windows Azure Webサイトは、Webロール(クラウドサービスに名前が変わっています)よりも簡単にWebアプリがAzure上に構築できる機能です。また、ASP.NET以外にもPHPなどOSS系のミドルウェアが動き、無償枠もあるという魅力があります。今回はこのWindows Azure Webサイトで「ActiveReports for .NET 6.0J」を使ってPDF出力アプリを構築してみたいと思います。使用するアプリはWindows Azure Webサイトと親和性がいいWebMatrix 2を使用します。

  • このエントリーをはてなブックマークに追加

ActiveReportsとは

 ActiveReportsはグレープシティから発売されている帳票コンポーネントです。単なるレポーティングツールではなく、日本発祥の帳票という工夫がいろいろ詰まった凝ったレイアウトの印刷物が思い通りに作成できるという特徴があります。

 本記事では、執筆時点で最新(2012年8月29日リリース)の「ActiveReports for .NET 6.0J(SP5)」を使っています。

図1 執筆時点で最新のActiveReports
図1 執筆時点で最新のActiveReports

WebMatrix 2とは

 WebMatrix 2はMicrosoftが無償提供しているWebアプリの開発環境です。ローカル実行は自マシンのIIS ExpressやIISで行い、リモート実行はASP.NETホスティングサービスやWindows Azure Webサイトにデプロイして行います。WebMatrix 2を利用するにはマイクロソフトのWebサイトにある[Free Download]ボタンをクリックしてダウンロードします。

図2 Microsoft WebMatrix 2
図2 Microsoft WebMatrix 2

 ダウンロード時にMicrosoftアカウントとの紐付けや個人情報の登録なども不要なので、気軽にダウンロードしてみてください。

WebMatrix 2のよる空のWebサイト作成

 WebMatrix 2にはさまざまなテンプレートやギャラリーがあり、目的にあったWebアプリを手軽に作ることができます。この辺りはOffice製品のテンプレートやOfficeギャラリーに近いものがあります。

 今回は残念ながらフィットするものがありませんでしたし、ActiveReportsとの合わせ技と考えたときに必要最小限のコードで見通しよくしたいというのもあり、「空のWebサイト」のテンプレートを使い、そこにコードや設定を追加していくことにしました。

空のWebサイト構築手順

図3 空のWebサイト作成手順
図3 空のWebサイト作成手順

 空のWebサイトを作成するには、WebMatrix 2を起動して起動画面から「テンプレート」アイコンをクリックし、「空のサイト」を選択してサイト名に「CZ1210ActiveReports」と入力してから[次に進む]ボタンをクリックします。

 この操作により[ドキュメント]‐[My Web Sites]フォルダの下に空のサイトに必要なファイルやフォルダが設定された[CZ1210ActiveReports]フォルダが作成されます。

 もし、WebMatrix 2を一度終了してからWebサイトを再度編集するときには、WebMatrix 2の起動画面で「サイトを開く」アイコンをクリックして「サイトとしてのフォルダー」メニューを選択して[ドキュメント]‐[My Web Sites]‐[CZ1210ActiveReports]フォルダを開いてください。

空のWebサイトのローカル実行確認

 空のWebサイトが作成できたら、まずは実行してみましょう。

 WebMatrix 2のリボンの一番左にある[実行]アイコンをクリックします。

図4 空のWebサイト実行例
図4 空のWebサイト実行例

 ブラウザが起動されて「マイサイトのタイトル」とタイトルがついた空白のページが表示されれば正常です。

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フォルダに追加
図5 ActiveReportsのDLLをBinフォルダに追加

 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でサイト名を右クリックして「新しいファイルの追加」メニューを選択し、ダイアログを表示します。

図6 ASP.NET Webページの追加
図6 ASP.NET Webページの追加

 左側のメニューの「すべて」をクリックし「VBHTML」アイコンを選択して「index.vbhtml」と名前を付けて[OK]ボタンをクリックします。

ActiveReports操作用コードを記述

 Index.vbhtmlに、CustomersReport.rpxに情報を埋め込んでPDF出力するコードを記述します。Index.vbhtmlはRazor形式という書式でASP.NET Webページを記述します。

リスト1 index.vbhtmlの定義例
@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]キーを押してページを移動します。

図7 WebMatrix 2での実行
図7 WebMatrix 2での実行

 残念ながら「ライセンスがない状態でビルドされたため実行できません」とエラーが表示されて正常に動作しませんでした。

ライセンスエラー対策

 ActiveReportsは開発環境のライセンス認証が必要です。その他にビルド時にlicenses.licxファイルに使用しているコンポーネントを記述してビルドする必要があります。

licenses.licxファイルの作成

 WebMatrix 2でWebサイトにlicenses.licxファイルを次のように記述します。

リスト2 licenses.licxファイルの定義例
DataDynamics.ActiveReports.ActiveReport, ActiveReports6
DataDynamics.ActiveReports.Viewer.Viewer, ActiveReports.Viewer6
DataDynamics.ActiveReports.Export.Pdf.PdfExport, ActiveReports.PdfExport

WebMatrix 2での実行

 Licenses.licxファイルの準備ができたら実行してみましょう。

 結果は残念ながら「ライセンスがない状態でビルドされたため実行できません」という状態から変わりませんでした。

 冷静に考えてみれば実行が始まってJITコンパイルされて動作するためWebMatrix 2には「ビルド」という概念が存在しません。

 それではどのように対応すればよいでしょうか。

 残念ながらWebMatrix 2単体では解決ができずVisual Studio 2010(Express版でも可)の力を借りなければなりません。

Visual Studioでビルド

 WebMatrix 2のリボンから[起動]‐[Visual Studio]アイコンをクリックしてVisual Studio 2010を起動します。

図8 Visual Studioで実行
図8 Visual Studioで実行

 このままVisual Studioで実行すればlicenses.licxファイルからApp_Licenses.dllファイルがビルドされます。あとは、Visual Studioを終了してWebMatrix 2に戻ってきてください。

App_Licenses.dll生成後のWebMatrix 2での実行

 Visual Studioでのビルドが終わってWebMatrix 2に戻ってきたら、WebMatrix 2でも実行してみましょう。今までと同じ手順でリボンから実行すると、今度は正しく動作しPDFファイルのダウンロードダイアログが表示されます。

図9 WebMatrix 2で実行
図9 WebMatrix 2で実行

Windows Azure Webサイトでの動作

 ローカル環境での実行が確認できたら、いよいよWindows Azure Webサイトにデプロイしてクラウドでの実行を確認してみましょう。

 そのためにはWindows Azure管理ポータルで「Web Sites」の設定から始めます。

空のWindows Azure Webサイトの作成

 Windows Azure Webサイトは日本語では「Webサイト」と区別なく説明することが多いですが、Windows Azure管理ポータルの表記では「Web Sites」の中に「Web Site」を設定するようになっています。つまり、Windows Azure Webサイト機能は複数のWebサイトが格納できます。例えば、Free版であっても10個のWebサイトを作成できます。

 WebMatrix 2からWebサイトを発行するには事前にWindows Azure上にWebサイトを定義します。もし、まだWebサイトを作成していないようであれば、Windows Azure管理ポータルを使って空のWebサイトをつくりましょう。

図10 空のWindows Azure Webサイトの作成
図10 空のWindows Azure Webサイトの作成

 [Web Sites]‐[WEB SITE]‐[QUICK CREATE]メニューを選択して、URLを指定したら[CREATE WEB SITE]ボタンをクリックします。これで数十秒もしないで指定したURLでWebサイトが公開できます。

接続情報のローカル保存

 作成したWebサイトにデプロイするための接続情報をWindows Azure管理ポータルから保存できます。

図11 接続情報のローカル保存
図11 接続情報のローカル保存

 [Web Sites]メニューを選択してからWebサイト名をクリックすると該当Webサイトの詳細が表示されます。少し下にスクロールすると「quick guide」があるので[Download publish profile]ボタンをクリックして設定情報ファイルをダウンロードしてください。

WebMatrix 2での発行設定

 Webサイトの設定情報ファイルがダウンロードできたら、WebMatrix 2に設定情報ファイルの内容を反映します。

 「CZ1210ActiveReports」をWebMatrix 2で開いた状態でリボンの[リモート]‐[設定]アイコンをクリックします。するとサイトの発行ダイアログが開くので[発行プロファイルのインポート]ボタンをクリックします。

図12 WebMatrix 2での発行設定
図12 WebMatrix 2での発行設定

 ファイル選択ダイアログで先ほどダウンロードしたファイル(既定の設定ではダウンロードフォルダに保存されている)を指定し、[開く]ボタンをクリックします。

 サイトの発行ダイアログに設定ファイルの内容が反映されるので、[保存]ボタンをクリックして保存します。

WebMatrix 2からの発行

 発行用設定が完了したら[発行]アイコンをクリックしてWindows Azureへの発行を開始しします。

図13 WebMatrix 2からの発行
図13 WebMatrix 2からの発行

 変更されたファイルの一覧が表示されたら[続行]ボタンをクリックします。

 あとは大体1分間くらい「発行しています - 発行しました」と表示されるのを待つだけです。

 Windows AzureのWebロールなどにデプロイして十数分待たされたことがある人にとっては驚愕の速さだと思います。

WebMatrix 2からの発行を確認

 Windows Azureで動作確認する前にWebMatrix 2の発行がどのようなファイルをWindows Azureに転送しているのか「ログファイルを開く」をクリックして確認してみましょう。

図14 Windows Azureに発行されたファイル(抜粋)
図14 Windows Azureに発行されたファイル(抜粋)

 嬉しいことにActiveReports関連のDLLもWindows Azureに転送されています。Windows Azure WebサイトでActiveReportsが動作する期待が俄然高まります。

Windows Azureでの動作

 それではWindows Azure WebサイトのURLにアクセスし、空白ページが表示されたらブラウザのURL欄に「index」と追加して[Enter]キーを入力しましょう。

図15 Windows Azureでの動作
図15 Windows Azureでの動作

 ローカル実行の時と同じようにWindows Azure上でもPDFのダウンロードができました。

まとめ

 残念ながらグレープシティの市販コンポーネントでWebMatrix 2を開発環境とした時やWindows Azureを運用環境とした時の動作保証はありません。そのためライセンス問題の回避方法も含めて今回の方式もグレープシティからの正式サポートはありません。使用する際には十分に検証していただき自己責任での使用になってしまいます。

 しかしWebMatrix 2とWindows Azure Webサイトの親和性の高さは、ActiveReportsが相乗りしたとしても失われることはありません。ライセンス周りで多少の手間は必要ですがそれ以上に手間も費用も削減できるでしょう。特にWindows Azure Webサイトで小規模サイトを開発するときに利便性は特筆すべきものがあります。

 つまり、自己責任での使用に尻込みすることなく、「手軽に」「日本の帳票品質」の「PDF」を「クラウド」で得られるActiveReports+WebMatrix 2+Windows Azure Webサイトをぜひ試していただきたいと思います。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6845 2012/10/26 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング