SHOEISHA iD

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

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

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ActiveReports)

業務要件を満たすWebアプリの作り方
SPREAD + InputMan + ActiveReports = Web業務アプリケーション

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

ダウンロード サンプルソース (2.0 MB)

PDFを作成する

 今回のサンプル帳票の定義は、前回の帳票定義を流用する予定でした。しかし、WindowsアプリプロジェクトでActiveReportsの帳票定義を追加すると、コードビハインドにより定義部分とコード部分が分離されたファイルになります。しかし、Webアプリプロジェクトではすべてが1ファイルになります。

図6 ActiveReports定義ファイルのプロジェクトへの追加
図6 ActiveReports定義ファイルのプロジェクトへの追加

 そこで、コードビハインドされていた内容を1ファイルの中の適切な部分にコピーすることで流用しました。

図7 帳票定義のコード流用部分
図7 帳票定義のコード流用部分

PDFを生成するXML Webサービスを作成する

リスト9 PDFを生成するXML Webサービス(CZ1001Pdf.vbより抜粋)
<WebMethod(EnableSession:=False, Description:="請求書のPDFデータを取得する")> _
Public Function GetRecords(ByVal userID As String, _
                           ByVal password As String, _
                           ByVal billNo As String) As Byte()
    Dim memStream As System.IO.MemoryStream
    Dim pdf As PdfExport
    Dim ds As DataSet = Nothing
    Dim rpt As New Seikyu_Report()

    Using _prco As New BillBound
        rpt.DataSource = _prco.GetPrintRecords(userID, password, billNo).Tables(0)
        ' 仮想プリンタを設定します。
        rpt.Document.Printer.PrinterName = ""
        rpt.PageSettings.PaperKind = 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.Run(False)
        ' PDFエクスポートオブジェクトを生成します。
        pdf = New PdfExport
        ' PDFの出力用のメモリストリームを作成します。
        memStream = New System.IO.MemoryStream
        ' メモリストリームにPDFエクスポートを行います。
        pdf.Security.Use128Bit = True
        pdf.Security.OwnerPassword = "123"
        pdf.Security.Permissions = PdfPermissions.AllowPrint
        pdf.Security.Encrypt = True
        pdf.Export(rpt.Document, memStream)
    End Using
    Return memStream.ToArray()
End Function
  1. XML Webサービスの戻り値はバイト配列として定義
  2. PDFの生成先をMemoryStreamとして定義
  3. XML Webサービスが稼働するサーバーに想定したプリンタが定義されていない可能性があるので、仮想プリンタを定義
  4. Runメソッドで帳票をメモリ上で作成
  5. PDFの属性を指定し、ExportメソッドでMemoryStreamに出力
  6. MemoryStreamの内容をToArrayメソッドでバイト配列に変換して返却

 XML Webサービス側でPDFを作成しているので、ActiveReportsの配布モジュールもXML Webサービスが稼働している内部セグメントにあるサーバーにだけに配置します。PDFに設定するOwnerPasswordなどの設定値や、今回は使っていませんがUserPasswordの設定値などを、DMZよりもさらに安全な内部セグメントにおけるのは安心感も増す配置だと思います。

XML Webサービスで作成したPDFを表示する

 リスト9で生成したPDFを表示するWebページは、図8にあるようにブラウザがPDFと分かるようにContext-Typeを指定しなければなりません。

図8 PDFをブラウザで表示するときの流れ
図8 PDFをブラウザで表示するときの流れ

 そこで、ResponseにContentTypeとして"application/pdf"を指定し、AddHeaderを使ってPDFのバイナリデータである旨を指定します。

リスト10 PDFを表示するWebページ (CZ1001Pdf.aspx.vbより抜粋)
Private Sub GetRecords(ByVal billNo As String)
    Dim userID As String = My.User.Name
    Dim password As String = CType(Session("password"), String)
    Dim pdfStream() As Byte
    Dim memStream As System.IO.MemoryStream = New System.IO.MemoryStream
    Dim pdfFilename As String = IIf(billNo.Trim.Length = 0, "CZ1001", _
                                                            billNo.Trim).ToString

    Using _webs As New CZ1001PdfService.CZ1001Pdf
        'Webサービスからデータを受信
        pdfStream = _webs.GetRecords(userID, password, billNo)
        ' ブラウザに対してPDFドキュメントの適切なビューワを使用するように指定
        Response.ContentType = "application/pdf"
        Response.AddHeader("content-disposition", _
                           "inline; filename=" & pdfFilename & ".PDF")
        ' 出力ストリームにPDFのストリームを出力します。
        Response.BinaryWrite(pdfStream)
        ' バッファリングされているすべての内容をクライアントへ送信します。
        Response.End()
    End Using
End Sub
図9 PDF表示
図9 PDF表示

まとめ

 業務アプリをWebアプリとして作成するときの注意点を踏まえて、SPREAD、InputMan、ActiveReportsを使ってサンプルを作成して基本的な技法を説明してきました。

 Windowsアプリの使い勝手と若干違いはありますが、これら市販コンポーネントの使い方の基本には大きな違いはありませんでした。また、できあがったサンプルアプリの操作性もコードの記述量からは考えられないくらい良いと思います。これは、クライアント側のスクリプトがコンポーネントにより自動生成されているという事が大きいでしょう。

 もし、SPREADとInputManを使わなかったならば、クライアント側スクリプトのコーディングやデバッグなど多くの手間が必要です。Webアプリ開発にも市販コンポーネントを導入するのが費用対効果という面でも有利でしょう。

製品情報

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ActiveReports)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4892 2010/02/05 18:30

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング