In una applicazione gestionale è piuttosto frequente l’esigenza di stampare dei report che al loro interno contengano un barcode.
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.
  1. Scaricare NBarcodes (http://code.google.com/p/nbarcodes/)
  2. Includere la dll nel proprio progetto
  3. 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();
    }

  4. 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);
    … 

  5. 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.aspx

    string 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();
    }

  6. Predisporre nel report la presenza del del DataSet (Il nome e la struttura devono essere uguali, compreso il campo BarCode)
  7. 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