動的なファイルのパブリッシュ - Infragistics ドキュメント ライブラリを使用した PDF/XPS の作成

0 ユーザーが評価
この投稿には確認済みの回答があります。 0 返信 | 1 サポーター

トップ 10 投稿者 
女性
投稿 22
IG Employee

 

元記事 (英語): Sung Kim - http://forums.infragistics.com/blogs/sung_kim/archive/2009/02/18/publishing-dynamic-files-pdf-xps-creation-using-the-infragistics-document-library.aspx

 

この記事では、PDF へデータを公開する方法を説明します。また、PDF ドキュメントを作成、カスタマイズ、更にスタイルを設定する方法を説明します。始めに、PDF を作成するオブジェクトを紹介します。NetAdvantage ツールセットでは、レポートを作成するために Infragistics Document Engine という名前のコード ライブラリを提供します。このエンジンは Report オブジェクト を作成して設定する要素を含みます。このオブジェクトがシンプルなメソッドの呼び出しで PDF または Microsoft の XML Paper Specification の XPS ファイルへパブリッシュできます。コード ライブラリであるため、Web と Win プラットフォームの両方で使用できます。 

記事コンテンツの説明:

両方のプラットフォームで実装できますが、この記事 ASP.NET を使用して説明します。Windows Forms 環境でコードはほとんど同じです。概要はコンテンツの説明、コメント付きコード、結果のスクリーンショットです。

2 エクスポート

Infragistics コントロールは簡単で、カスタマイズ可能なオプションを提供します。Document Engine API を参照せずに、グリッドをレポートにエクスポートできます。このため、データにバインドされた UltraWebGrid  にあるフォームに UltraWebGridDocumentExporter をドラッグします。グリッドのデータのエクスポートを開始するためのボタンなどの UI 要素も追加します。デザインサーフェスでこのコンポーネントを追加したときに、ボタン クリックの処理でデータをエクスポートします。

UltraWebGridDocumentExporter1.Export(UltraWebGrid1);

生成された PDF:

エクスポーター コンポーネントにカスタマイズ オプションがあります。MarginOrientation、や AutoResizing  を変更するには、UltraWebGridDocumentExporter メンバーを参照してください。

Infragistics ドキュメント ライブラリ

簡単にドキュメントがパブリッシュされました。コード 1 行で作成しましたが、ネストされる複数要素があります。クラスの詳細については、ドキュメント エンジンの要素を参照してください。

コンテンツを配置する要素があり、コンテンツの制限もあります。基本階層は Report -> Section -> Layout -> Content です。コンテンツの制限についてのテーブル

つまり、report を作成し section を追加します。セクションにテキストや画像などのコンテンツに追加できます。複雑なレイアウトが必要な場合、グリッドやフローなどのレイアウト要素を使用します。 

グリッドテーブルは似ていますが、グリッドでは列が必要です。

グループバンドは似ていますが、グループはヘッダー、フッター、と区分線がありません。

コンテナー要素で XML を挿入できます。

フロー要素を使用すると、新聞のようにコンテンツを列スタイルで続けることができます。

サイト要素を使用すると、CSS の絶対配置のように配置を管理することができます。

その他の要素は簡単です。Chain は要素を構成します。Gap はギャップを作成します。Rotator はコンテンツを回転します。Rule はルールを作成します。Stretcher はコンテンツをページに合わせるために引き伸ばします。

コンテンツを表示するTreesListsText もあります。

また、要素に Canvas を追加して、丸や他のプリミティブを描画できます。

よく使用される変更

コード サンプルでは以下の using 宣言が必要です。

using Infragistics.Documents.Report;

using Infragistics.Documents.Report.Section;

using Infragistics.Documents.Report.Text;

using Infragistics.Documents.Graphics;

using Infragistics.Documents.Report.Table;

using Infragistics.Documents.Report.Grid;

using Infragistics.Documents.Report.Band;

using Infragistics.Documents.Report.Flow;

using System.Xml;

ヘッダーとフッターの追加

ドキュメントをカスタマイズします。上記で説明した要素を使用します。UltraWebGridDocumentExporter オブジェクトexport メソッドは複数オーバーロードがあります。1 つのオーバーロードはセクションにエクスポートすることができます。このオーバーロードを使用するために、ドキュメントを作成してセクションを追加します。セクションをカスタマイズして、グリッドを指定したセクションにエクスポートします。

ヘッダーとページ数のコード:

//レポート オブジェクトを作成します

Report r = new Report();

//コンテンツに追加するセクションを追加します

ISection s1 = r.AddSection();

//ページ数を追加するには

//セクションのプロパティを設定します

s1.PageNumbering.SkipFirst = true;

s1.PageNumbering.OffsetY = -18;

s1.PageNumbering.Template = "Page [Page #] of [TotalPages]";

//PDF にヘッダーを追加します

ISectionHeader s1header = s1.AddHeader();

s1header.Height = 20;

s1header.Repeat = false;

//ヘッダー領域にテキストを追加します

IText s1headertitle = s1header.AddText(0, 0);

s1headertitle.AddContent("Sung's Awesome PDF");

s1headertitle.Alignment = TextAlignment.Center;

IText s1headertimestamp = s1header.AddText(0, 0);

s1headertimestamp.AddContent("Produced: ");

s1headertimestamp.AddDateTime("MM/dd/yyyy hh:mm:ss");

s1headertimestamp.Alignment = TextAlignment.Right;

//グリッドをセクションにエクスポートします

this.UltraWebGridDocumentExporter1.Export(this.UltraWebGrid1, s1);

ヘッダー付きの PDF:

特定の行表示

現在の表示に基づいてエクスポートする方法を紹介します。画面印刷のように、展開されている行のみをエクスポートする場合があります。これを実装するために、 UltraWebGridDocumentExporterInitializeRow イベントを処理して、行が展開されるかどうかを確認します。展開されていない場合、子行をエクスポートしないように簡単なプロパティを設定できます。

if (!e.Row.Expanded)

{

    e.SkipDescendants = true;

}

ASPX ページで 2 番目の行のみを展開した後にエクスポートされた PDF:

行やセルの書式設定

特定の行にスタイル設定を追加します。エンド ユーザーに特定の Employee と関連する Orders を表示します。InitializeRow イベントを使用してUltraWebGrid の行を書式します。このスタイルが作成した PDF にエクスポートされます。

行のスタイルを設定するコード:

//orders テーブル

if (e.Row.Band.Index == 1)

{

    //employeeid 列のセル値が

    //1 の場合

    if ((int)(e.Row.Cells.FromKey("EmployeeID").Value)==1)

    {

        //行のスタイルを設定します

        //行やセルで設定したスタイルが PDF

        //適用されます

        e.Row.Style.BackColor = System.Drawing.Color.Pink;

    }

}

orders テーブルのピンク色の行の Employee ID は 1 です。

ドキュメントにハイパーリンク追加

PDF の要素をクリックすると、ユーザーが URL を表示する方法を紹介します。これを実装するためには、CellExporting イベントを処理して、適切なセルのカスタム コンテンツを作成します。変更するセルを検索して、IText 要素のハイパーリンク機能を使用します。クリックできることを示すために、スタイルを変更します。

 CustomerID 列のテキストをハイパーリンクと置き換えるコード:

//CustomerID 列の

//最初のレベルである場合

if (e.GridCell.Column.Key == "CustomerID" & e.GridCell.Band.Index == 0)

{

    //ハイパーリンクのスタイル設定

    Infragistics.Documents.Report.Text.Style bluelink = new Infragistics.Documents.Report.Text.Style(new Font("Aria", 8, FontStyle.Underline), Brushes.Blue);

    //ハイパーリンクとテキストを追加します

    e.ReportCell.AddText().AddContent(e.GridCell.Value.ToString(), bluelink, new Hyperlink(this.Request.Url.ToString() + @"?ID=" + e.GridCell.Value.ToString()));

    //このセルの普通の出力を

    //キャンセルします

    e.Cancel = true;

}

 

PDF のリンク:

「ANATR」ハイパーリンクをクリックすると、 ASP.NET ページが表示されます。

 

ポートフォリオ マネージャー サンプルで作成された PDF の説明

サンプル ブラウザーで Tony Lombardo が作成したポートフォリオ マネージャー サンプルは PDF のカスタマイズを紹介します。作成された PDF ファイルここから参照できます。 

ポートフォリオ マネージャー PDF のスクリーンショット:

サンプルをダウンロードしてインストールするとコードを参照できますが、ここでは作成する方法を説明します。エクスポーターを使用するときに、いくつかのイベントを使用すると便利です。このサンプルも Exported の代わりに Exporting イベントを使用します。特定の領域にカスタム コンテンツを作成するために、以下のイベントを処理します。以下のコード セグメントは UltraWebGridDocumentExporterRowExporting イベントにあります。チャートを作成して、現在のセクションとエクスポートするチャートへの参照をユーザー定義の BuildTable メソッドに渡します。

RowExporting イベントのコード:

//最初のバンド/レベルをエクスポートする場合

if (e.GridRow.Band.Index == 0)

{

    //チャートにデータを提供するテーブル

    DataTable tempTable = new DataTable();

    tempTable.Columns.Add("AccountType",typeof(System.String));

    tempTable.Columns.Add("Balance",typeof(System.Decimal));

    //チャートのデータを作成します

    for (int i = 0; i < e.GridRow.Rows.Count; i++)

    {

        tempTable.Rows.Add(new object[] { " "+e.GridRow.Rows[ i ].Cells.FromKey("AccountType").Value, e.GridRow.Rows[ i ].Cells.FromKey("Balance").Value });

    }

    //チャートのプロパティをインスタンス化して設定します

    Infragistics.WebUI.UltraWebChart.UltraChart chart = new Infragistics.WebUI.UltraWebChart.UltraChart("chart");

    chart.ChartType = Infragistics.UltraChart.Shared.Styles.ChartType.PieChart3D;

    chart.ColorModel.ModelStyle = Infragistics.UltraChart.Shared.Styles.ColorModels.CustomLinear;

    chart.DataSource = tempTable;

    chart.Height = Unit.Pixel(230);

    chart.Width = Unit.Pixel(420);

    chart.TitleBottom.Extent = 0;

    chart.TitleTop.Text = "Current Asset Allocation";

    chart.TitleTop.HorizontalAlign = StringAlignment.Center;

    chart.TitleTop.Font = new Font("Verdana", 15);

    chart.TitleTop.FontColor = Color.Blue;

    chart.TitleTop.Margins.Top = 10;

    chart.Transform3D.Scale = 100;

    chart.DataBind();

    chart.Legend.Margins.Top = 40;

    chart.Legend.Visible = true;

    chart.Legend.Location = Infragistics.UltraChart.Shared.Styles.LegendLocation.Right;

    chart.Legend.SpanPercentage = 30;

    chart.Legend.BorderThickness = 0;

    chart.Border.Thickness = 0;

    //各レコードのレイアウトを作成するメソッドを呼び出します

    //PDF のセクション/領域、グリッド行情報、作成したチャートを

    //渡します

    BuildTable(((ISection)e.ContainingTable.Parent),e.GridRow,chart);

}

//PDF の各行のデフォルト レイアウトを作成しないために

//ブール値を設定します

e.Cancel = true;

各行で Grid 要素を作成する BuildTable メソッドは以下のコードです。スタイル、最後の列で RowSpan、パッディング、余白、サイズの書式を使用します。

private void BuildTable(Infragistics.Documents.Report.Section.ISection section,Infragistics.WebUI.UltraWebGrid.UltraGridRow row, Infragistics.WebUI.UltraWebChart.UltraChart chart)

{

    //各行のコンテンツを配置するためにグリッド要素を作成します

    Infragistics.Documents.Report.Grid.IGrid grid = section.AddGrid();

    //オブジェクトのレイアウト プロパティを設定します

    grid.Borders.Corners.All= new Infragistics.Documents.Report.Corner(Infragistics.Documents.
 Graphics.
Pens.DodgerBlue, Infragistics.Documents.Utils.Converter.PixelsToPoints(10));

    grid.Borders.All = new Infragistics.Documents.Report.Border(Infragistics.Documents.
 Graphics.
Pens.DodgerBlue);

    grid.Margins.All = Infragistics.Documents.Utils.Converter.PixelsToPoints(10);

    grid.Paddings.All = Infragistics.Documents.Utils.Converter.PixelsToPoints(10);

    //グリッド レイアウトで 3 つの例を作成します

    IGridColumn labels=grid.AddColumn();

    IGridColumn data = grid.AddColumn();

    IGridColumn chartCol = grid.AddColumn();

    //各列の幅を設定します

    labels.Width = new Infragistics.Documents.Report.RelativeWidth(15);

    data.Width = new Infragistics.Documents.Report.RelativeWidth(25);

    chartCol.Width = new Infragistics.Documents.Report.RelativeWidth(60);

    //作成される行の数を設定するために

    //セル カウントを使用します

    int rows = row.Cells.Count;

    //2 つの行スタイルを使用します

    Infragistics.Documents.Report.Background background1 = new Infragistics.Documents.Report.Background(new Infragistics.Documents.Graphics.LinearGradientBrush(new Infragistics.Documents.Graphics.Color(Color.WhiteSmoke), new Infragistics.Documents.Graphics.Color(Color.Gainsboro), 2f));

    Infragistics.Documents.Report.Background background2 = new Infragistics.Documents.Report.Background(new Infragistics.Documents.Graphics.LinearGradientBrush(new Infragistics.Documents.Graphics.Color(Color.Gainsboro), new Infragistics.Documents.Graphics.Color(Color.WhiteSmoke), 2f));

    for (int i = 0; i < rows; i++)

    {

        //各セル値のためにレイアウト グリッドで新しい行を作成します

        IGridRow irow = grid.AddRow();

        //セルを追加します

        //IText を追加します

        IGridCell cell = irow.AddCell();

        cell.Paddings.All = Infragistics.Documents.Utils.Converter.PixelsToPoints(3);

        cell.AddText().AddContent(row.Cells[ i ].Column.Header.Caption);

        //スタイルを適用します

        if (i % 2 == 0)

        {

            cell.Background = background1;

        }

        //値を表示するためのセル

        //を追加します

        cell = irow.AddCell();

        cell.Paddings.All = Infragistics.Documents.Utils.Converter.PixelsToPoints(3);

        cell.AddText().AddContent(row.Cells[ i ] != null && row.Cells[ i ].Value != null ? row.Cells[ i ].Value.ToString() : "");

        //スタイルを適用します

        if (i % 2 == 0)

        {

            cell.Background = background2;

        }

        //チャートを表示するセルを追加

        cell = irow.AddCell();

        cell.Paddings.All = Infragistics.Documents.Utils.Converter.PixelsToPoints(10);

        cell.Alignment.Horizontal = Infragistics.Documents.Report.Alignment.Right;

        //チャートが画像に描画できる

        //キャンバス要素を作成します

        Infragistics.Documents.Report.ICanvas canvas = cell.AddCanvas();

        canvas.Borders.Corners.All = new Infragistics.Documents.Report.Corner(Infragistics.Documents.
 Graphics.
Pens.DimGray, Infragistics.Documents.Utils.Converter.PixelsToPoints(5));

        canvas.Borders.All=new Infragistics.Documents.Report.Border(Infragistics.Documents.
 Graphics.
Pens.DimGray);

        canvas.Height = new Infragistics.Documents.Report.FixedHeight(Infragistics.Documents.
 Utils.
Converter.PixelsToPoints(307f));

        canvas.Width=new Infragistics.Documents.Report.FixedWidth(Infragistics.Documents.
 Utils.
Converter.PixelsToPoints(560f));

        //各行で 1 つのチャートを作成します

        if(i==0)chart.RenderPdfFriendlyGraphics(canvas.CreateGraphics());

        cell.RowSpan = rows;

    }

}

ゼロから PDF 作成する

これまで PDF ファイルを作成するにはエクスポーター コンポーネントを使用しましたが、ゼロから PDF ファイルを作成する方法を説明します。Infragistics.Document アセンブリへの参照を追加します。以下のコードはボタン クリックで実行して、3 つの部分に分割されます。最初の部分はレポートとセクションを作成します。ヘッダーを追加して、スタイルを定義し、ヘッダーの最初のレベルにグリッド レイアウトを追加します。幅を定義しないために、列をスパンする機能を持つグリッドを使用します。IText 要素で配置とスタイルを使用します。

最初の部分のコード:

//レポートを作成します

Report r = new Report();

//セクションを作成します

ISection sect1 = r.AddSection();

//ヘッダーを作成します

ISectionHeader sect1Head = sect1.AddHeader();

sect1Head.Repeat = false;

sect1Head.Height = 80;

 

//ヘッダーのスタイル

Infragistics.Documents.Report.Text.Style headerstyle = new Infragistics.Documents.Report.Text.Style(new Font("Old English Text MT", 32), Brushes.Black);

Infragistics.Documents.Report.Text.Style headerSmall = new Infragistics.Documents.Report.Text.Style(new Font("Arial", 8), Brushes.Black);

Infragistics.Documents.Report.Text.Style headerTiny = new Infragistics.Documents.Report.Text.Style(new Font("Arial", 6), Brushes.Black);

 

//コンテンツを配置するためにヘッダーにグループを追加します

IGroup sect1HeadGroup = sect1Head.AddGroup(0, 0);

//要素の最初のセットを配置するためにグリッドを使用します

IGrid sect1HeadGroupGrid = sect1HeadGroup.AddGrid();

//グリッドをスタイルするために gridPattern を使用します

GridPattern gridPattern = new GridPattern();

gridPattern.Margins = new Margins(5);

gridPattern.Paddings = new Paddings(10);

sect1HeadGroupGrid.ApplyPattern(gridPattern);

//グリッド要素に 5 つの列を追加します

sect1HeadGroupGrid.AddColumn();

sect1HeadGroupGrid.AddColumn();

sect1HeadGroupGrid.AddColumn();

sect1HeadGroupGrid.AddColumn();

sect1HeadGroupGrid.AddColumn();

//ヘッダーのグリッドの最初の行を設定します

IGridRow headergridrow1 = sect1HeadGroupGrid.AddRow();

IGridCell r1c1 = headergridrow1.AddCell();

IText r1c1text = r1c1.AddText();

r1c1text.AddContent("Everything you need to know about NetAdvantage");

r1c1.Borders = new Borders(new Pen(Colors.Black, DashStyle.Solid), 2);

IGridCell r1c2 = headergridrow1.AddCell();

r1c2.ColSpan = 3;

IText sect1HeadText = r1c2.AddText();

sect1HeadText.Alignment = TextAlignment.Center;

sect1HeadText.AddContent("The Sung Kim Times", headerstyle);

IGridCell r1c5 = headergridrow1.AddCell();

IText r1c5text = r1c5.AddText();

r1c5text.AddContent("NetAdvantage 9.1 Releasing Soon!");

//グリッドの下に線を追加します

sect1HeadGroup.AddRule();

PDF をブラウザーにエクスポートするコード:

Response.AddHeader("Content-Disposition", "attachment; filename=" + "doc.pdf");

Response.AddHeader("Content-Transfer-Encoding", "binary");

r.Publish(Response.OutputStream, FileFormat.PDF);

Response.Flush();

Response.End();

作成されたカスタム ヘッダー付きの PDF

次の部分ではヘッダーにレベルを追加します。線要素でコンテンツを分割するために 2 つのグリッドを使用します。ここでもセルにテキストとスタイルを追加します。

ヘッダーにレベルを追加するコード:

//コンテンツの 2 番目の行は 2 番目のグリッドに追加します

IGrid sect1HeadGroupGrid2 = sect1HeadGroup.AddGrid();

sect1HeadGroupGrid2.AddColumn();

sect1HeadGroupGrid2.AddColumn();

sect1HeadGroupGrid2.AddColumn();

sect1HeadGroupGrid2.AddColumn();

sect1HeadGroupGrid2.AddColumn();

//セルにテキストとスタイルを追加します

IGridRow headergridrow2 = sect1HeadGroupGrid2.AddRow();

headergridrow2.AddCell().AddText().AddContent("VOL. I....No. 1", headerSmall);

headergridrow2.AddCell().AddText().AddContent("Copyright 2009 The Sung Kim Times", headerTiny);

headergridrow2.AddCell().AddText().AddContent("TUESDAY, JANUARY 27, 2009", headerSmall);

headergridrow2.AddCell();

headergridrow2.AddCell().AddText().AddContent("Printed in New Jersey, ONE DOLLAR", headerTiny);

//コンテンツを分割するために線を追加します

sect1HeadGroup.AddRule();

sect1.PageMargins = new Margins(20);

作成されたヘッダーで 2 つのグリッドを持つ PDF:

ヘッダーが完了しました。最後の部分はニュースレターのコンテンツを作成します。スタイルを作成して、セクションにフロー要素を追加します。フローはニュースレターの外観をエミュレートします。XmlDocument に RSS フィードを読み込んで、必要ないテキストを削除します。記事のデータのためにテキスト要素を作成します。テーブル要素を使用すると、コンテンツ、作成者、公開日付を同じ行で配置し、KeepSolid プロパティを使用すると、タイトル、作成者、日付を同じ列とページに配置されます。記事のタイトルにハイパーリンクを追加しました。タイトルをクリックすると、実際の記事にナビゲートできます。記事のテキストは長いため、別の IText 要素を追加します。説明要素は HTML を含むため、AddContent メソッドの代わりに AddRichContent メソッドを使用します。AddContent メソッドを使用すると、PDF ですべてのタグが描画になります。

ニュースレターのコンテンツのコード:

//レポートのスタイル

Infragistics.Documents.Report.Text.Style postTitle = new Infragistics.Documents.Report.Text.Style(new Font("Arial", 18, FontStyle.Underline), Brushes.Blue);

Infragistics.Documents.Report.Text.Style postDescrip = new Infragistics.Documents.Report.Text.Style(new Font("Arial", 10), Brushes.Black);

Infragistics.Documents.Report.Text.Style dateStyle = new Infragistics.Documents.Report.Text.Style(new Font("Aria", 8, FontStyle.Italic), Brushes.Black);

 

//コンテンツを配置するためのフロー

IFlow flow = sect1.AddFlow();       

//フローに 2 つの列を追加します

IFlowColumn flowcolumn1 = flow.AddColumn();

flowcolumn1.Width = new RelativeWidth(50);

flowcolumn1.Margins.Top = 10;

flowcolumn1.Margins.Right = 10;

IFlowColumn flowcolumn2 = flow.AddColumn();

flowcolumn2.Width = new RelativeWidth(50);

flowcolumn2.Margins.Top = 10;

flowcolumn2.Margins.Left = 10;

//RSS フィードからデータを読み込みます

XmlDocument myfeed = new XmlDocument();

//URL を含む dropdownlist がない場合、以下のフィードを使用します

//myfeed.Load(@"http://blogs.infragistics.com/blogs/MainFeed.aspx?GroupID=15&Type=AllBlogs");

myfeed.Load(this.DropDownList1.SelectedItem.Value);

//フィードから記事を選択します

XmlNodeList articles = myfeed.SelectNodes("rss/channel/item");

//各記事を表示します

foreach (XmlNode article in articles)

{

    //タイトルと作成者をテーブルに配置します

    ITable table = flow.AddTable();

    //コンテンツを分割しないようにします

    table.KeepSolid = true;

    ITableRow tabler0 = table.AddRow();

    ITableCell tabler0c0 = tabler0.AddCell();

    IText title = tabler0c0.AddText();

    title.AddContent(article["title"].InnerText, postTitle, new Hyperlink(article["link"].InnerText));

    ITableRow tabler1 = table.AddRow();

    ITableCell tabler1c1 = tabler1.AddCell();

    tabler1c1.Width = new FixedWidth(100);

    tabler1c1.AddText().AddContent("by: " + article["dc:creator"].InnerText);

    ITableCell tabler1c2 = tabler1.AddCell();

    tabler1c2.Width = new RelativeWidth(100);

    tabler1c2.AddText().AddContent("published: " + article["pubDate"].InnerText, dateStyle);           

    IText description = flow.AddText();

    description.Style = postDescrip;

    description.AddRichContent(article["description"].InnerText);

}

ヘッダー、フロー要素を使用する 2 つの列、AddRichContent メソッドで追加した HTML コンテンツを持つ完了した PDF:

 

コメント

WebDataGrid も PDF、XPS、と Excel にエクスポートできます。ASP.NET 製品マネージャー Murtaza Abdeali記事を参照してください(英語)。 

 

サンプルは以下の製品を使用します。

-Infragistics NetAdvantage 2008 Volume 3 CLR 3.5

-Visual Studio 2008

サンプルはここからダウンロードできます。 (388kb)

ニュースレター サンプルのみはここからダウンロードできます。 (7kb)

 

ページ 1 / 1 (1 項目) | RSS
Infragistics Japan
インフラジスティックス ジャパン