12.4 アプリケーションでデータソース を設定してPDF を生成しブラウザでダウンロードさせるサンプル(WCF)
概要
アプリケーションでデータソースを設定してPDFを生成しブラウザでダウンロードさせるサンプルプログラムです
サンプル構成
項目 | ファイルパス |
---|---|
ドキュメントレイアウトサンプル |
<bswss-client_home>/sample/xml/Sample4-doc.xml
![]() |
ページレイアウトサンプル |
<bswss-client_home>/sample/xml/Sample4-page.xml
![]() |
ソースサンプル |
<bswss-client_home>/sample/dotNET/wcf/WSS_WCF_Sample4.aspx.cs
![]() |
ソースサンプル
using System; using System.ServiceModel; using System.ServiceModel.Channels; using System.Web; using BizStreamWebApplication.BizStreamServiceReference; namespace BizStreamWebApplication { public partial class WSS_WCF_Sample4 : System.Web.UI.Page { // Webサービスサーバのホスト名 const string WSS_HOST_NAME = "wsssrv"; // Webサービスサーバ上のサンプルディレクトリの場所 const string WSS_BIZSTREAM_SAMPLE_DIR = "\\bs\\sample"; // Webサービスのエンドポイントプリフィックス const string WSS_SERVICE_LOCATION = "http://" + WSS_HOST_NAME + ":8080/axis2/services"; // BASIC認証のユーザ名 const string USER_NAME = @"bizuser1"; // BASIC認証のパスワード const string PASSWORD = @"bizuser1"; // 監査ロギング用のユーザ定義 const string USER_DEF = "AAA"; // 入力レイアウト定義ファイル名 const string LAYOUT_FILE = WSS_BIZSTREAM_SAMPLE_DIR + "\\xml\\Sample4-doc.xml"; // ダウンロードファイル名 const string DOWNLOAD_FILE_NAME = "WSS_WCF_Sample4.pdf"; const string RESOURCE_NAME = "resourceData"; const int RECORD_NUM = 10; protected void Page_Load(object sender, EventArgs e) { // データの生成 byte[] data = generate(); // HTTPヘッダを設定する Response.Clear(); Response.HeaderEncoding = System.Text.Encoding.GetEncoding("SJIS"); Response.ContentType = "application/pdf"; Response.AppendHeader("Content-length", data.Length.ToString()); Response.AppendHeader("Accept-Ranges", "bytes"); Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + DOWNLOAD_FILE_NAME + "\""); Response.Flush(); // PDFをストリームに書き出す Response.BinaryWrite(data); HttpContext.Current.ApplicationInstance.CompleteRequest(); } private byte[] generate() { // クライアントを生成 bizstreamPortTypeClient client = new bizstreamPortTypeClient("BizstreamSOAP11port", WSS_SERVICE_LOCATION + "/bizstream?UserDef=" + USER_DEF); // 認証の設定 BindingElementCollection elements = client.Endpoint.Binding.CreateBindingElements(); elements.Find<HttpTransportBindingElement>().AuthenticationScheme = System.Net.AuthenticationSchemes.Basic; client.ClientCredentials.UserName.UserName = USER_NAME; client.ClientCredentials.UserName.Password = PASSWORD; // MTOMを有効化 elements.Remove<TextMessageEncodingBindingElement>(); MtomMessageEncodingBindingElement mtom = new MtomMessageEncodingBindingElement(); mtom.ReaderQuotas.MaxStringContentLength = 100000; elements.Insert(0, mtom); elements.Find<HttpTransportBindingElement>().KeepAliveEnabled = false; client.Endpoint.Binding = new CustomBinding(elements); // リクエストメッセージの作成 generateDataRequest request = new generateDataRequest(); // 出力ファイルの種類を設定 request.dataType = new dataType(); request.dataType.Item = new pdf(); // 流し込むデータを設定 request.resource = new resourceData[1]; request.resource[0] = makeResourceData(); // レイアウト定義を設定 request.layoutData = new layoutDefinition[1]; request.layoutData[0] = new layoutDefinition(); request.layoutData[0].uri = LAYOUT_FILE; request.layoutData[0].dataReference = RESOURCE_NAME; // リクエストを送信 fileData data = client.generateData(request); return data.contentData.Value; } private resourceData makeResourceData() { resourceData resData = new resourceData(); resData.name = RESOURCE_NAME; resData.applicationData = new applicationData[3]; string[,] headerNames = new string[3, 3] { { "PROJNO", "PROJNAME", "PRSTAFF" }, { "INVOICE NO", "MODEL", "SEIHAN NO" }, { "製品コード", "製品名", "数量" } }; for (int ds_NO = 0; ds_NO < 3; ds_NO++) { resData.applicationData[ds_NO] = new applicationData(); resData.applicationData[ds_NO].masterName = "app-resource" + (ds_NO + 1); recordData recData = new recordData(); recData.header = new headerColumn[3]; for (int col_NO = 0; col_NO < 3; col_NO++) { headerColumn hCol = new headerColumn(); hCol.value = headerNames[ds_NO, col_NO]; recData.header[col_NO] = hCol; } recData.detail = new detail[RECORD_NUM]; for (int record_NO = 0; record_NO < RECORD_NUM; record_NO++) { recData.detail[record_NO] = new detail(); recData.detail[record_NO].detailColumn = new detailColumn[3]; for (int col_NO = 0; col_NO < 3; col_NO++) { recData.detail[record_NO].detailColumn[col_NO] = new detailColumn(); recData.detail[record_NO].detailColumn[col_NO].value = "AAA" + ds_NO + "_" + record_NO + "_" + col_NO; } } resData.applicationData[ds_NO].Item = recData; } return resData; } } }