Supponendo di essere in ambito .Net e di produrre il report come rdlc, di seguito un piccolo esempio che risolve questo problema comune. L’esempio sottostante è estratto da un’applicazione nella quale la sorgente dati del report, era un dataset. Nulla vieta di fare la stessa
cosa con un diverso tipo di data source.
Per produrre l’immagine del barcode è stato fatto uso della libreria NBarcodes.
- Scaricare NBarcodes (http://code.google.com/p/nbarcodes/)
- Includere la dll nel proprio progetto
- Generare l’Image del barcode a partire dal codice:
Ex.
public static Image BarCodeImage(String code)
{
NBarCodes.BarCodeGenerator barGen = new NBarCodes.BarCodeGenerator(new BarCodeSettings()
{
Data = code,
Type = BarCodeType.Ean13,
ModuleWidth = 1,
BarHeight = 30
});
return barGen.GenerateImage();
}
… - Inserire nel DataSet che viene dato in pasto al report il byte[] dell’image
Ex.
…
ReportBag reportBag = new ReportBag(); // contenitore custom di ciò che viene passato al report
DataSet ds = GetMyDataSet();
ds.DataSetName = // è lo stesso che deve essere usato nella definizione del report
DataTable dt = ds.Tables[0];
dt.Columns.Add(“BarCode”, typeof(byte[]));
foreach (DataRow row in ds.Tables[0].Rows)
{
String code = row[“Code”].ToString();
MemoryStream ms = new MemoryStream();
BarCodeImage(code).Save(ms,System.Drawing.Imaging.ImageFormat.Bmp);
row[“BarCode”] = ms.ToArray();
}
reportBag.DatasetList.Add(ds);
… - Passare il DataSet al report
Ex.
…
public static void RenderReportPDF(HttpResponse response, ReportBag reportBag)
{
LocalReport localReport = new LocalReport();
localReport.ReportPath = reportBag.ReportDefinitionFileName;
localReport.EnableExternalImages = true
// Imposta le DataSources
foreach (DataSet ds in reportBag.DatasetList)
{
ReportDataSource reportDataSource = new ReportDataSource(ds.DataSetName, ds.Tables[0]);
localReport.DataSources.Add(reportDataSource);
}
// Imposta i parametri
List parms = new List();
foreach (Pair<string, string> pair in reportBag.ReportParameters)
{
parms.Add(new ReportParameter(pair.First, pair.Second));
}
if (parms.Count > 0)
{
localReport.SetParameters(parms);
}
string reportType = “PDF”;
string mimeType;
string encoding;
string fileNameExtension;// The DeviceInfo settings should be changed based on the reportType
// http://msdn2.microsoft.com/en-us/library/ms155397.aspxstring deviceInfo =
“” +
” PDF” +
” 21.0cm” +
” 29.7cm” +
” 0.1cm” +
” 1.0cm” +
” 1.0cm” +
” 0.1cm” +
“”;
Warning[] warnings;
string[] streams;
byte[] renderedBytes;
//Render the report
renderedBytes = localReport.Render(
reportType,
deviceInfo,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
response.Clear();
response.ContentType = mimeType;
response.AddHeader(“content-disposition”, “attachment; filename=” + reportBag.OutputFileName + “.” + fileNameExtension);
response.BinaryWrite(renderedBytes);
response.End();
}
… -
Predisporre nel report la presenza del del DataSet (Il nome e la struttura devono essere uguali, compreso il campo BarCode)
-
Inserire sul report l’immagine impostando il riferimento al campo BarCode del datasource.Per quanto rigurda le proprietà dell’immagine impostare:
MIMEType: image/bmp
Source: Database
Value: =Fields!BarCode.Value
Leave a comment