Crystal Reportsでの動的イメージ印刷
Crystal Reportsでの動的イメージ印刷をメモ
VisualStudio付属のCrystalReportsで印刷時に任意のイメージファイルを印刷する方法。
1. プロジェクトの新規作成でCrystalReportアプリケーションを作成
2. プロジェクトにデータセットを追加
(プロジェクト - 新しい項目の追加 - データ - データセット)
3. データセットにDataTableを追加
(2で作成したデータセットを開いて、右クリック - 追加 - DataTable)
4. DataTableにイメージ格納用のカラムを追加
(3のDataTableで、右クリック - 追加 - 列)
5. 追加した列のDataTypeプロパティを、System.Byte[]に変更
6. フィールドエクスプローラを開いてデータベースフィールドで右クリック
データベースエキスパートを開く
7. プロジェクトデータ - ADO.NETデータセットを展開し、3で追加したDataTableを選択したテーブルに追加
8. データベースフィールドに追加したDataTableが表示されるので、4で追加したカラムをレポートに貼り付け
9. 以下のコードを実装。パラメータには印刷するイメージファイルパスを指定private void PrintReport(string fn)
{
// レポートのインスタンス生成
CrystalReport1 cr = new CrystalReport1();
// イメージファイル読み込み
FileStream fs = new FileStream(fn, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
// データセット生成・イメージのセット
DataSet1 data = new DataSet1();
DataRow dr = data.Tables[0].NewRow();
dr["DataColumn1"] = br.ReadBytes((int)br.BaseStream.Length);
data.Tables[0].Rows.Add(dr);
cr.SetDataSource(data);
Image img = Image.FromStream(fs);
// イメージサイズをPixcelからTwipに変換 (1インチ = 1440TWIPS)
float imgw = (img.Width / img.HorizontalResolution) * 1440;
float imgh = (img.Height / img.VerticalResolution) * 1440;
// 幅と高さの各拡大縮小率を算出
float perx = cr.ReportDefinition.ReportObjects["DataColumn11"].Width / imgw;
float pery = cr.ReportDefinition.ReportObjects["DataColumn11"].Height / imgh;
// 拡大縮小率の大きい方にあわせてBLOBフィールドのサイズを調整
if (perx > pery) {
cr.ReportDefinition.ReportObjects["DataColumn11"].Width = (int)(imgw * pery);
cr.ReportDefinition.ReportObjects["DataColumn11"].Height = (int)(imgh * pery);
}else{
cr.ReportDefinition.ReportObjects["DataColumn11"].Width = (int)(imgw * perx);
cr.ReportDefinition.ReportObjects["DataColumn11"].Height = (int)(imgh * perx);
}
br.Close();
fs.Close();
this.crystalReportViewer1.ReportSource = cr;
}
引用元