2017-12-01 4 views
0

Ich versuche, einen generierten Barcode in einem Bericht mit RDLC zu drucken, aber alles, was ich bekomme, ist stattdessen ein kleines rotes X.Generiertes Bild wird nicht im Ausdruck des Berichts angezeigt

Hier ist mein Objekt.

[XmlType] 
[XmlRoot(IsNullable = false)] 
[Serializable] 
public class Voucher 
{ 
    [XmlIgnore] 
    public Bitmap BarcodeImg { get; set; } 

    [XmlElement("BarcodeImg")] 
    public byte[] BarcodeImgSerialized 
    { 
     get 
     { 
      if (BarcodeImg == null) return new byte[] { }; 
      using (var Stream = new MemoryStream()) 
      { 
       BarcodeImg.Save(Stream, ImageFormat.Bmp); 
       return Stream.ToArray(); 
      } 
     } 
     set 
     { 
      if (value == null) { BarcodeImg = new Bitmap(50, 50); } 
      else 
      { 
       using (var Stream = new MemoryStream(value)) 
       { 
        BarcodeImg = new Bitmap(Stream); 
       } 
      } 
     } 
    } 

    public string BarcodeStr { get; set; } = string.Empty; 

    public Voucher() { } 
} 

In meinem Bericht, genannt „Report_Voucher“, habe ich das Gutschein-Objekt als Datensatz aufgeführt. Mein Bild ist der Name „Barcode“, die Mimetype sein Bild/BMP, eine externe Bildquelle, und der Ausdruck

=First(Fields!BarcodeImg.Value, "Voucher") 

Ich habe versucht, auch BarcodeImgSerialized zu sein.

Hier ist meine Form Code ...

public partial class Form_Main : Form 
{ 
    LocalReport Report; 
    List<Stream> Streams = new List<Stream>(); 

    public Form_Main() 
    { 
     InitializeComponent(); 
    } 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     Voucher V = CreateVoucher(); 
     DataSet Set = CreateDataSet(V); 

     this.RV_Main.ProcessingMode = ProcessingMode.Local; 
     this.Report = RV_Main.LocalReport; 
     Report.ReportPath = @"..\..\Report_Voucher.rdlc"; 
     Report.DataSources.Add(new ReportDataSource("Voucher", Set.Tables[0])); 
     var DeviceInfo = 
      @"<DeviceInfo> 
       <OutputFormat>EMF</OutputFormat> 
       <PageWidth>8.5in</PageWidth> 
       <PageHeight>11in</PageHeight> 
       <MarginTop>0.25in</MarginTop> 
       <MarginLeft>0.25in</MarginLeft> 
       <MarginRight>0.25in</MarginRight> 
       <MarginBottom>0.25in</MarginBottom> 
      </DeviceInfo>"; 
     var Warnings = new Warning[] { }; 
     Report.EnableExternalImages = true; 
     Report.Render("Image", DeviceInfo, CreateStream, out Warnings); 
     Streams.ForEach(x => x.Position = 0); 
     this.RV_Main.Refresh(); 
    } 
    private DataSet CreateDataSet(Voucher Voucher) 
    { 
     var Set = new DataSet(); 
     var Serializer = new XmlSerializer(typeof(Voucher)); 

     using (var MStream = new MemoryStream()) 
     { 
      Serializer.Serialize(MStream, Voucher); 
      MStream.Seek(0, SeekOrigin.Begin); 
      Set.ReadXml(MStream); 
     } 

     return Set; 
    } 
    private Voucher CreateVoucher() 
    { 
     var BarcodeStr = "123456789"; 
     var Writer = new BarcodeWriter 
     { 
      Format = BarcodeFormat.ITF, 
      Options = new EncodingOptions 
      { 
       Height = 80, 
       Width = 400, 
       Margin = 0, 
       PureBarcode = true, 
      } 
     }; 
     var Barcode = Writer.Write(BarcodeStr); 

     var Voucher = new Voucher() 
     { 
      BarcodeStr = BarcodeStr, 
      BarcodeImg = Barcode, 
     }; 

     return Voucher; 
    } 
    private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) 
    { 
     var stream = new MemoryStream(); 
     Streams.Add(stream); 
     return stream; 
    } 
    private void Btn_PrintReport_Click(object sender, EventArgs e) 
    { 
     if (this.Streams == null || this.Streams.Count == 0) { return; } 
     var Document = new PrintDocument(); 
     Document.DefaultPageSettings.Landscape = true; 
     if (!Document.PrinterSettings.IsValid) { return; } 
     else 
     { 
      Document.PrintPage += Document_PrintPage; 
      Document.Print(); 
     } 
    } 
    private void Document_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     var Stream = this.Streams.First(); 
     var Page = new Metafile(Stream);   

     var AdjustedRect = new Rectangle(
      e.PageBounds.Left - (int)e.PageSettings.HardMarginX, 
      e.PageBounds.Top - (int)e.PageSettings.HardMarginY, 
      e.PageBounds.Width, 
      e.PageBounds.Height); 

     e.Graphics.FillRectangle(Brushes.White, AdjustedRect); 
     e.Graphics.DrawImage(Page, AdjustedRect); 
     Stream.Dispose(); 
     Page.Dispose(); 
    } 
} 

ich eine abscheuliche Zahl von Tweaks versucht haben, um zu versuchen, diesen Barcode zu bekommen zu zeigen, aus, wie die Serialisierung durchgeführt wurde, was der Bericht als die einfängt Variable für das Bild (Byte-Arrays, Objekt, Bitmap), usw., und nichts, was ich gelesen habe, scheint eine Lösung zu sein. Kennt jemand eine Lösung dafür?

Antwort

0

Die Lösung war, die Expression im FromBase64String Aufruf zu wickeln:

=System.Convert.FromBase64String(First(Fields!BarcodeImg.Value, "Voucher")); 
Verwandte Themen