Javaと情熱のあいだ

カステラとドーナツと珈琲

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;
}

引用元

相談天国: CrystalReportsで動的イメージ印刷