はじめに
独自のアプリケーションに印刷やプレビュー機能を組み込むのはとても大変です。.NET Frameworkクラスライブラリにも、これらの機能を持った専用のクラスが用意されていますが、ツールバーの組み込みや付帯機能の実装など、書かなければならないコードは盛りだくさんです。
ComponentOne Studio for Windows Formsに収録されているReports for Windows Formsは、ドキュメントの印刷に必要なさまざまな階層ドキュメントオブジェクトモデルを提供するコンポーネントです。細かなドキュメントレイアウトの計算や改ページの挿入、段落設定などを行うことなく、印刷とプレビュー機能をアプリケーションに実装できます。
そこで、今回はこのReports for Windows Formsコンポーネントを使って、2つのテキストファイルの内容から文書ドキュメントを作成するアプリケーションを作成していきます。
対象読者
Visual Basic/Visual C# 2005/2008/2010を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005/2008/2010、Visual C# 2005/2008/2010、Visual Studio 2005/2008/2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2008を使用して作成し、動作確認を行っています。
プログラム実行時の注意事項
Reports for Windows Formsを使って作成したアプリケーションを配布する場合、Reports for Windows Formsのアセンブリファイルを添付する必要があります。これは、Common Language RuntimeのDLLをアプリケーションと一緒に配布するのと同じです。アプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。
ファイル名 | 説明 |
---|---|
C1.C1Report.2.dll | 本体アセンブリ |
C1.Win.C1Report.2.dll | 本体アセンブリ |
これらのファイルを、プログラムを実行するフォルダに格納します。.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
サンプルプログラムを実行する際は、次のデータファイルも一緒に実行プログラムと同じフォルダに入れてください。
- sample.txt
- sample2.txt
- sample3.txt
- sample.jpg
コンポーネントのインストール
Reports for Windows Formsを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2010Jまたは、ComponentOne Studio for Windows Forms 2010Jをインストールする必要があります。
インストーラは、グレープシティのWebページからダウンロードできます。製品ページの[申込フォーム]をクリックし、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られるので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
Reports for Windows FormsはComponentOne Studio Enterprise/for Windows Formsでのみ開発に利用できます。その他の製品では、Reports for Windows Formsを開発に利用することはできないので注意してください。
コントロールの追加
ComponentOne Studio Enterprise 2010J/ComponentOne Studio for Windows Forms 2010Jをインストールしたら、ツールボックスに専用のタブを作成し、使用するコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコントロール」のアセンブリ名が「C1.Win.C1Report.2」で始まるコンポーネント「C1PrintPreviewControl」と「C1.C1Report.2」で始まるコンポーネント「C1PrintDocument」です。
C1PrintDocument/C1PrintPreviewControlコントロールについて
C1PrintDocumentコントロール
C1PrintDocumentは、印刷、プレビュー、およびディスクファイルへの保存ができる複雑なドキュメントを作成するコンポーネントです。ドキュメントをPDF、RTFなどのさまざまな外部形式にエクスポートすることもできます。
ドキュメントは、完全にコードで作成するか、または強力かつ柔軟なデータバインディングモデルを使用し、データベースから取得して作成します。元データをファイルから読み込み、コードで加工することもできます。さらに、次のような機能も持っています。
- 作成したドキュメントを、PDF・Excel(XLSとXLSX)・Word(RTFとDOCX)・HTMLおよび複数の画像形式にエクスポート
- エクスポートしたPDFファイルをAdobe Acrobatで表示する方法を制御
- VBScript式を組み込み、コントロールのオブジェクトモデルにアクセスする
- 複数のフォント、テキストの色と背景色、テキストの位置合わせ(下付き、上付き)、インライン画像、各種テキスト配置(テキストの両端揃えを含む)などを含むテキストの段落のサポート
- ハイパーリンク、リンク先などを追加してドキュメントをインタラクティブにする
- さまざまなページサイズ、ページ設定、列数、ページヘッダーなどに対応する複数のページレイアウトを事前定義し、単一のプロパティを設定して実行時に選択可能
- テーブル要素をグループ化し、グループにスタイルの適用、行と列のヘッダー変更などが可能。テーブルのExcelスタイルのオブジェクトモデルをサポート
- 水平方向のページレイアウトのサポート
- ドキュメントへのバーコードの追加
C1PrintDocumentコントロールは、主に次の部分で構成されます。
- Body
ドキュメントの実際のコンテンツ(テキスト、画像など)の論理構造を表します。 - Pages
コンテンツ(本体)と特定のページ設定に基づいて生成されたページのコレクション。 - Style
ドキュメントのルートスタイル。スタイルは、ドキュメント要素(フォント、色、線スタイルなど)のほとんどのビジュアルプロパティを制御します。 - Dictionary
ドキュメント内の複数の場所で使用される画像は、辞書に格納して再利用できます。 - EmbeddedFonts
ドキュメントで使用される埋め込みTrue Typeフォントのコレクション - Tags
ドキュメント内に挿入できるユーザー定義タグのコレクション
このように、C1PrintDocumentコントロールは大変豊富なドキュメント作成機能を持っており、アプリケーションの目的に合わせたドキュメント作成が可能になっています。
C1PrintPreviewControlコントロール
C1PrintPreviewControlコントロールは、C1PrintDocumentコントロールと連動して、作成したドキュメントのプレビューや印刷機能を提供するコントロールです。プロパティでC1PrintDocumentコントロールへの関連付けを行うだけで、プレビューやサムネイルを自動的に作成し、コードを書くことなくそのまま印刷機能を使うことができます。また、専用のツールバーを持ち、ページめくりやファイルへの保存、ズーム表示などの機能をあらかじめ実装しています。
C1PrintPreviewControlコントロールには、次のような機能が組み込まれています。
- 柔軟なモジュール形式の設計により、内蔵された専用コントロール(プレビューペイン、サムネイルとアウトラインビュー、およびテキスト検索パネル)を使用して、ドキュメントビューをカスタマイズ
- ハイパーリンクやアウトラインなどのC1PrintDocument機能をサポート
- 標準.NET PrintDocumentコンポーネントをロードおよび表示し、外部形式(PDFなど)にエクスポート
- エンドユーザーは、実行時にページの余白または向きの変更などドキュメントをインタラクティブに変更可能。ドキュメントは変更に応じて自動的に再フローされる
- 異なるカルチャのすべてのエンドユーザーの視覚的文字列のローカライズ可能なバージョンを簡単に作成し、実行時に言語を切り替えることが可能
このように、C1PrintPreviewControlコントロールはフォームに配置するだけで、C1PrintDocumentコントロールで作成したドキュメントのプレビュー・印刷機能を実装できます。
アプリケーションの作成
では、さっそくアプリケーションを作成していきましょう。今回はとてもシンプルなWindowsフォームになっています。使用するのは、C1PrintDocument/C1PrintPreviewControlコントロールだけです。
フォームのデザイン
新しいプロジェクトを用意したら、フォームにC1PrintDocument/C1PrintPreviewControlコントロールを配置します。
- ツールボックスにある、C1PrintDocumentコントロールのアイコンをダブルクリックします。フォームデザイナの下部にC1PrintDocumentコントロールが配置されます。
- ツールボックスにある、C1PrintPreviewControlコントロールのアイコンをダブルクリックします。フォームの上にC1PrintPreviewControlコントロールが配置されますが、フォームが小さいためフォームからはみ出ているので、フォームのサイズを大きくします。
- C1PrintPreviewControlコントロールのスマートタグから「親コンテナにドッキングする」を選び、フォームとドッキングさせます。
- プロパティウィンドウの[Document]プロパティをクリックし、リストから「C1PrintDocument1」を選びます。これで、C1PrintPreviewControlコントロールとC1PrintDocumentコントロールが連動するようになります。
- プロパティウィンドウのオブジェクトリストから「PreviewPane」を選び、「ZoomFactor」プロパティを「0.75」に変更します。このプロパティは、プレビューの表示サイズを設定するプロパティで、「0.75」は75%表示になります。
以上でフォームのデザインは完成です。この時点でプログラムを実行すると、中身のないプレビューウィンドウが表示されます。左側のペインにはドキュメントのページごとのサムネイルが、右のペインには選択したページのプレビューが表示されます。
ドキュメント作成コードの作成
では、実際にドキュメントを作成していきます。今回は、2つのテキストファイルを読み出し、整形した文書に仕上げます。テキストファイルは、簡単な文章が数行入っているだけのものです。
コードから直接文字列を記述する
最初に、C1PrintDocumentコントロールのBodyオブジェクトを使用して、コードから直接文字列を記述してドキュメントを作成してみましょう。フォームのLoadイベントハンドラに、次のコードを記述します。
Imports C1.C1Preview Imports System.IO Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '直接文字を描画 C1PrintDocument1.Body.Children.Add(New C1.C1Preview.RenderText("初めてのドキュメント作成")) C1PrintDocument1.Generate() End Sub End Class
using C1.C1Preview; using System.IO; namespace makedoc_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.c1PrintDocument1.Body.Children.Add(new RenderText("初めてのドキュメント作成")); this.c1PrintDocument1.Generate(); } } }
最初の式は、BodyプロパティでDocumentBodyオブジェクトを取得して、Childrenプロパティでドキュメント本体に含まれる描画オブジェクトのコレクションを取得し、Addメソッドでテキストを追加しています。テキストの記述は、RenderTextメソッドを使用し、引数に記述する文字列を指定します。そして、Generateメソッドでドキュメントを生成します。
ブロックフローで文章を記述する
今度は、ドキュメント内にブロックを設定し、その中に流し込む方法で文章を記述します。
ブロックは、「StartDoc()
」「EndDoc()
」で囲み、その中にRenderInlineTextメソッドを使って記述します。このメソッドはオーバーロードメソッドで、いくつかの引数を指定できます。ここでは引数が文字列だけのものと、文字列・フォント・スタイル・サイズ・描画色、を引数とするメソッドを使っています。ブロックを設定する場所は、Generateメソッドの前にします。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '直接文字を描画 C1PrintDocument1.Body.Children.Add(New C1.C1Preview.RenderText("初めてのドキュメント作成")) ' ---- 最初のブロック ------------------------------------ C1PrintDocument1.StartDoc() C1PrintDocument1.RenderInlineText(" カラーピッカーで色を選択できる ") C1PrintDocument1.RenderInlineText("Silverlight", _ New Font("Times New Roman", 30, FontStyle.Bold), Color.Navy) C1PrintDocument1.RenderInlineText(" アプリケーションの作成") C1PrintDocument1.EndDoc() C1PrintDocument1.Generate()
private void Form1_Load(object sender, EventArgs e) { // 直接文字を描画 this.c1PrintDocument1.Body.Children.Add(new RenderText("初めてのドキュメント作成")); // ---- 最初のブロック ------------------------------------ c1PrintDocument1.StartDoc(); c1PrintDocument1.RenderInlineText(" カラーピッカーで色を選択できる "); c1PrintDocument1.RenderInlineText("Silverlight", new Font("Times New Roman", 30, FontStyle.Bold), Color.Navy); c1PrintDocument1.RenderInlineText(" アプリケーションの作成"); c1PrintDocument1.EndDoc(); this.c1PrintDocument1.Generate();
ボーダーを設定する
今度は、今挿入したブロックの下にもう1つブロックを設定し、ボーダー線を描画してみましょう。
直線の描画は、RenderBlockHorzLineメソッドを使用します。引数は2つで、線の長さと線の属性です。長さはUnitで指定します。また、線の属性は「LineDef」オブジェクトを作成します。コンストラクタの引数は2つで、線の幅と描画色です。
' ------ ボーダーの設定 ---------------------------------------- C1PrintDocument1.StartDoc() Dim ud As Unit = 6 C1PrintDocument1.RenderInlineText(" ") Dim ldef As New C1.C1Preview.LineDef("2mm", Color.SteelBlue) C1PrintDocument1.RenderBlockHorzLine(ud, ldef) C1PrintDocument1.RenderInlineText(" ") C1PrintDocument1.EndDoc()
// ------ ボーダーの設定 ---------------------------------------- c1PrintDocument1.StartDoc(); Unit ud = 6; LineDef ldef = new LineDef("2mm", Color.SteelBlue); c1PrintDocument1.RenderBlockHorzLine(ud, ldef); c1PrintDocument1.RenderInlineText(" "); c1PrintDocument1.EndDoc();
次に、もう1つブロックを設定して見出しを記述します。
' ---- 2番目のブロック ------------------------------------ '見出しの設定 C1PrintDocument1.StartDoc() C1PrintDocument1.RenderInlineText("■はじめに", _ New Font("MSゴシック", 14, FontStyle.Bold), Color.DarkCyan) C1PrintDocument1.EndDoc()
// ---- 2番目のブロック ------------------------------------ // 見出しの設定 c1PrintDocument1.StartDoc(); c1PrintDocument1.RenderInlineText("■はじめに", new Font("MSゴシック", 14, FontStyle.Bold), Color.DarkCyan); c1PrintDocument1.EndDoc();
段落の作成とファイルの読み出し処理
今度は段落を設定し、そこにファイルから読み込んだ文字列を流し込むようにします。
段落を設定する
段落の作成は、RenderParagraphクラスを使用して作成します。段落の中には複数のスタイル、インライン画像、およびハイパーリンクを使って描画される複数のテキストフラグメントを組み込むことができます。
まず、RenderParagraphクラスのコンストラクタでオブジェクトを作成し、StreamReaderクラスを使ってテキストファイルから文字列を読み込み、変数に格納します。
次に、その文字列をAddTextメソッドで記述していきます。これは、RenderParagraphオブジェクト内のコンテンツを表すParagraphObjectCollectionオブジェクトを取得し、そこにテキストを追加するという形をとります。そして、最後に作成した段落をドキュメントに追加します。
' ----- 段落 para を作成 ----------------------------------- Dim para As New RenderParagraph() 'ファイルから文字列を読み込む Dim fname As String = Application.StartupPath & "\sample.txt" Dim data As String Try Dim sr As StreamReader = New StreamReader(fname, System.Text.Encoding.Default) Do data = sr.ReadLine() para.Content.AddText(data) Loop Until data Is Nothing sr.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try ' 段落をドキュメントに追加 C1PrintDocument1.Body.Children.Add(para)
// ----- 段落 para を作成 ----------------------------------- RenderParagraph para = new RenderParagraph(); //ファイルから文字列を読み込む String fname = Application.StartupPath + "/sample.txt"; String data=""; try { StreamReader sr = new StreamReader(fname, System.Text.Encoding.Default); while(data != null) { data = sr.ReadLine(); para.Content.AddText(data); } sr.Close(); }catch(Exception ex) { MessageBox.Show(ex.Message); } // 段落をドキュメントに追加 c1PrintDocument1.Body.Children.Add(para);
もう1つブロックと段落を追加する
もう1つブロックと段落を追加します。今度は、「sample2.txt」の中身を取り出して整形文書にします。作成方法は今までのものとまったく同じで、一部ファイル名と変数名が違うだけです。
'---- 3番目の段落ブロック ------------------------------------ '見出しの設定 C1PrintDocument1.StartDoc() C1PrintDocument1.RenderInlineText(" ") C1PrintDocument1.RenderInlineText(" ") C1PrintDocument1.RenderInlineText("■コンポーネントのインストール", _ New Font("MSゴシック", 14, FontStyle.Bold), Color.DarkCyan) C1PrintDocument1.EndDoc() ' 段落 para2を作成 Dim para2 As New RenderParagraph() fname = Application.StartupPath & "\sample2.txt" data = "" 'ファイルから文字列を読み込む Try Dim sr As StreamReader = New StreamReader(fname, System.Text.Encoding.Default) Do data = sr.ReadLine() para2.Content.AddText(data) Loop Until data Is Nothing sr.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try ' 段落をドキュメントに追加 C1PrintDocument1.Body.Children.Add(para2) 'ドキュメントを作成 C1PrintDocument1.Generate()
//--- 3番目の段落ブロック ------------------------------------ // 見出しの設定 c1PrintDocument1.StartDoc(); c1PrintDocument1.RenderInlineText(" "); c1PrintDocument1.RenderInlineText(" "); c1PrintDocument1.RenderInlineText("■コンポーネントのインストール", new Font("MSゴシック", 14, FontStyle.Bold), Color.DarkCyan); c1PrintDocument1.EndDoc(); // ----- 段落 para2 を作成 ----------------------------------- RenderParagraph para2 = new RenderParagraph(); //ファイルから文字列を読み込む fname = Application.StartupPath + "/sample2.txt"; data = ""; try { StreamReader sr = new StreamReader(fname, System.Text.Encoding.Default); while (data != null) { data = sr.ReadLine(); para2.Content.AddText(data); } sr.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } // 段落をドキュメントに追加 c1PrintDocument1.Body.Children.Add(para2); // ドキュメントを作成 this.c1PrintDocument1.Generate();
まとめ
今回は、ファイルからテキストデータを読み込んで整形したドキュメントを作成する方法を紹介しましたが、C1PrintDocumentコントロールはとても多機能で、少ないページ数ではすべてを紹介しきれないほど、ドキュメント作成にあらゆる加工が施せるコンポーネントです。
また、C1PrintPreviewControlはほとんど設定をする必要がなく、作成したドキュメントをそのままプレビューし印刷できるという機能を持った使いやすいコンポーネントであるため、この2つだけでもさまざまなニーズに対応できると思います。