PDFを作成する
今回のサンプル帳票の定義は、前回の帳票定義を流用する予定でした。しかし、WindowsアプリプロジェクトでActiveReportsの帳票定義を追加すると、コードビハインドにより定義部分とコード部分が分離されたファイルになります。しかし、Webアプリプロジェクトではすべてが1ファイルになります。
そこで、コードビハインドされていた内容を1ファイルの中の適切な部分にコピーすることで流用しました。
PDFを生成するXML Webサービスを作成する
<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
- XML Webサービスの戻り値はバイト配列として定義
- PDFの生成先をMemoryStreamとして定義
- XML Webサービスが稼働するサーバーに想定したプリンタが定義されていない可能性があるので、仮想プリンタを定義
- Runメソッドで帳票をメモリ上で作成
- PDFの属性を指定し、ExportメソッドでMemoryStreamに出力
- MemoryStreamの内容をToArrayメソッドでバイト配列に変換して返却
XML Webサービス側でPDFを作成しているので、ActiveReportsの配布モジュールもXML Webサービスが稼働している内部セグメントにあるサーバーにだけに配置します。PDFに設定するOwnerPasswordなどの設定値や、今回は使っていませんがUserPasswordの設定値などを、DMZよりもさらに安全な内部セグメントにおけるのは安心感も増す配置だと思います。
XML Webサービスで作成したPDFを表示する
リスト9で生成したPDFを表示するWebページは、図8にあるようにブラウザがPDFと分かるようにContext-Typeを指定しなければなりません。
そこで、ResponseにContentTypeとして"application/pdf"
を指定し、AddHeaderを使ってPDFのバイナリデータである旨を指定します。
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
まとめ
業務アプリをWebアプリとして作成するときの注意点を踏まえて、SPREAD、InputMan、ActiveReportsを使ってサンプルを作成して基本的な技法を説明してきました。
Windowsアプリの使い勝手と若干違いはありますが、これら市販コンポーネントの使い方の基本には大きな違いはありませんでした。また、できあがったサンプルアプリの操作性もコードの記述量からは考えられないくらい良いと思います。これは、クライアント側のスクリプトがコンポーネントにより自動生成されているという事が大きいでしょう。
もし、SPREADとInputManを使わなかったならば、クライアント側スクリプトのコーディングやデバッグなど多くの手間が必要です。Webアプリ開発にも市販コンポーネントを導入するのが費用対効果という面でも有利でしょう。