/// <summary> /// helping function for parsing text(and fill)Items. /// calculates left position of text (set with indent or Alignment) /// </summary> /// <param name="leftStart">offset from left margin</param> /// <param name="txt">containing text</param> /// <returns>absolute position (in dots) from left margin</returns> private int LeftPosText(int leftStart, TextItem txt) { int leftPos = 0; Alignment align = Alignment.Left; int indent = 0; if (txt.IndentSpecified) { indent = txt.Indent; } if (txt.AlignmentSpecified) { align = txt.Alignment; } if (indent > 0) { switch (align) { case Alignment.Right: leftPos = (int)((double)indent / printer.MaxTab * printer.DotsPerLine - txt.TextWidth); break; case Alignment.Center: leftPos = (int)((double)indent / printer.MaxTab * printer.DotsPerLine - txt.TextWidth / 2.0); break; default: leftPos = (int)((double)indent / printer.MaxTab * printer.DotsPerLine); break; } } else { //no indent switch (align) { case Alignment.Right: leftPos = (int)printer.DotsPerLine - txt.TextWidth; break; case Alignment.Center: leftPos = (int)((double)leftStart + (printer.DotsPerLine - leftStart) / 2.0 - txt.TextWidth / 2.0); break; default: leftPos = (int)leftStart; break; } } return((leftPos >= 0) ? leftPos : 0); }
/// <summary> /// parses TextItem and sets fields(added to xml-schema fields) of TextItem object: /// /// </summary> /// <param name="txt"></param> /// <returns></returns> private StringBuilder ParseTextItem(TextItem txt) { Font txtFont = printer.DefaultFont; int leftPos = 0; StringBuilder txtData = new StringBuilder(); StringBuilder txtEndData = new StringBuilder(); txtFont = ParseTextFontStyle(txt, ref txtData, ref txtEndData); txt.LeftPos = LeftPosText(0, txt); txt.PositionPrinterData = printer.AbsoluteHorizontalPosition(leftPos); //default //Console.WriteLine("txt_value="+txt.Value); txtData.Append(Convert(txt.Value)); txtData.Append(txtEndData); txt.TextPrinterData = txtData.ToString(); return(txtData); }
private TextBlock ParseLine(Line line, double width, double margin) { double newWidth = width - (margin); TextBlock tb = new TextBlock() { Width = newWidth }; tb.Margin = new Thickness(0, 0, 0, 0); if (line.Items == null || line.Items.Length <= 0) { return(null); } int numItems = 0; foreach (Object item in line.Items) { numItems++; } foreach (Object item in line.Items) { string text = ""; numItems--; TextBlock tbItem = new TextBlock(); if (item.GetType() == typeof(ImageItem)) { try { string fileName = ConfigurationManager.AppSettings["logoFile"]; //"Images/bs-logo.jpg" //if (File.Exists("PrintLogo.jpg")) { if (File.Exists(fileName)) { BitmapImage btm; using (MemoryStream ms = new MemoryStream(System.IO.File.ReadAllBytes(fileName))) { btm = new BitmapImage(); btm.BeginInit(); btm.StreamSource = ms; // Below code for caching is crucial. btm.CacheOption = BitmapCacheOption.OnLoad; btm.EndInit(); btm.Freeze(); } Image i = new Image(); i.Margin = new Thickness(0, 0, 4, 0); //BitmapImage imageSource = new BitmapImage(new Uri(Path.GetFullPath(fileName))); i.Source = btm; i.Stretch = Stretch.Fill; tbItem.Inlines.Add(i); } } catch (Exception ex) { Image i = new Image(); i.Stretch = Stretch.Fill; tbItem.Inlines.Add(i); } } else if (item.GetType() == typeof(BarCodeItem)) { BarCodeItem bci = item as BarCodeItem; BarCodeCreator bcc = new BarCodeCreator(); Canvas c = bcc.BarCode128(bci.Value); tbItem.HorizontalAlignment = HorizontalAlignment.Center; tbItem.TextAlignment = TextAlignment.Center; tbItem.Inlines.Add(c); } else if (item.GetType() == typeof(TextItem)) { TextItem txt = item as TextItem; ParseTextFontStyle(txt, ref tbItem); tbItem.Margin = new Thickness(0, 0, 0, 0); Run run = new Run() { Text = txt.Value }; if (line.UnderlineSpecified && line.Underline == true) { tbItem.Inlines.Add(new Underline(run)); } else { tbItem.Inlines.Add(run); } text = txt.Value; } else if (item.GetType() == typeof(FillItem)) { string filltext = ""; for (int i = 0; i < 100; i++) { filltext += ((FillItem)item).Value; } tbItem.Inlines.Add(new Run() { FontSize = 10, FontFamily = new FontFamily("Arial"), Text = filltext }); } System.Drawing.FontStyle style = System.Drawing.FontStyle.Regular; if (tbItem.FontWeight == FontWeights.Bold) { style = System.Drawing.FontStyle.Bold; } IEnumerator <string> enumerator = tbItem.FontFamily.FamilyNames.Values.GetEnumerator(); enumerator.Reset(); enumerator.MoveNext(); int fontsize = (int)tbItem.FontSize - 3; string val = enumerator.Current; System.Drawing.Size textSize = System.Windows.Forms.TextRenderer.MeasureText(text, new System.Drawing.Font( new System.Drawing.FontFamily(val), fontsize, style)); if (numItems > 0) { newWidth -= textSize.Width; tbItem.Width = textSize.Width; } else { if (newWidth < textSize.Width) { newWidth = width - margin; tb.Inlines.Add(new Run() { Text = "\n" }); } tbItem.Width = newWidth; } tb.Inlines.Add(tbItem); } return(tb); }
/// <summary> /// parses a Line, Lien can consist of (one or more) TextItem, FillItem, BarcodeItem or ImageItem /// </summary> /// <param name="line"></param> /// <returns>printer command for Line-part of SPF-object</returns> private StringBuilder ParseLine(Line line) { if (line.Items == null || line.Items.Length <= 0) { return(null); } StringBuilder lineData = new StringBuilder(); List <object> textAndFillItem = new List <object>(); List <int> textWidth = new List <int>(); int txtWidthSum = 0; int numFillItems = 0; int recurrence = 0; bool underline = false; if (line.RecurrenceSpecified) { recurrence = line.Recurrence; } if (line.UnderlineSpecified) { underline = line.Underline; } lineData.Append(printer.LineFeed()); if (line.LineSpacingSpecified) { lineData.Append(printer.LineSpacing(line.LineSpacing)); } else { lineData.Append(printer.LineSpacingDefault()); } if (underline) { lineData.Append(printer.UnderlineOn()); } foreach (Object item in line.Items) { if (item.GetType() == typeof(ImageItem)) { ImageItem image = item as ImageItem; lineData.Append(ParseImageItem(image)); } if (item.GetType() == typeof(BarCodeItem)) { BarCodeItem bc = item as BarCodeItem; lineData.Append(ParseBarCodeItem(bc)); lineData.Append(printer.AbsoluteHorizontalPosition(0)); } if (item.GetType() == typeof(TextItem)) { TextItem txt = item as TextItem; ParseTextItem(txt); //set some properties oft txt TextItem textAndFillItem.Add(txt); //textWidth.Add(txt.TextWidth); txtWidthSum += txt.TextWidth; //lineData.Append(ParseTextItem(txt)); } if (item.GetType() == typeof(FillItem)) { FillItem fill = item as FillItem; textAndFillItem.Add(fill); numFillItems++; //lineData.Append(ParseFillItem(fill)); } } #region Append printer command for text and fill items (stored in textAndFillItem List). // quite simple when there are no fill items (else condition). Mixed lists will be parsed until the first // textItem with special position (indent, align center|right), appended and this is repeated with the remaining list items. if (numFillItems > 0) { Font fillFont = printer.DefaultFont; //fill font will be font of previous text item or defaultfont int i = 0, old_i = 0, remain = textAndFillItem.Count; int leftPosAfter = 0; //!? double fullSpace = 0.0; int specialTextPosInd; int fillWidth = 0; int unusedWidth = 0; //should always be 0 except when mixing fonts or fontB with Indent do { //try to arragne mixture fo text and fill items specialTextPosInd = textAndFillItem.GetRange(old_i, remain).FindIndex(IsSpecialPosTextItem) + old_i; if (specialTextPosInd < 0) { //no special positioned text in line specialTextPosInd = textAndFillItem.Count; //parse all fullSpace = printer.DotsPerLine - leftPosAfter; } else { int leftPosTmp = ((TextItem)textAndFillItem[specialTextPosInd]).LeftPos; fullSpace = leftPosTmp - leftPosAfter; leftPosAfter = leftPosTmp + ((TextItem)textAndFillItem[specialTextPosInd]).TextWidth; txtWidthSum = 0; foreach (object item in textAndFillItem.GetRange(old_i, specialTextPosInd - old_i).FindAll(IsTextItem)) { txtWidthSum += ((TextItem)item).TextWidth; } numFillItems = textAndFillItem.GetRange(old_i, specialTextPosInd - old_i).FindAll(delegate(object o) { return(o.GetType() == typeof(FillItem)); }).Count; } float fillSpace = ((float)fullSpace - txtWidthSum) / numFillItems + unusedWidth;//standard fill //foreach (object item in textAndFillItem) { for (i = old_i; i <= specialTextPosInd && i < textAndFillItem.Count; i++) { if (textAndFillItem[i].GetType() == typeof(TextItem)) { TextItem txtItem = textAndFillItem[i] as TextItem; lineData.Append(txtItem.TextPrinterData); if (txtItem.FontSpecified) { fillFont = txtItem.Font; } } else if (textAndFillItem[i].GetType() == typeof(FillItem)) { lineData.Append(ParseFillItem((FillItem)textAndFillItem[i], (int)fillSpace, fillFont, out fillWidth)); unusedWidth = (int)fillSpace - fillWidth; } } //if fillWidth < fillSpace (due to FontB in special cases) filling is not 100% excat old_i = specialTextPosInd + 1; //first not printed item remain = textAndFillItem.Count - i; } while (specialTextPosInd < textAndFillItem.Count && remain > 0); } else { //no fillitems if (textAndFillItem != null) { int leftPos = 0; foreach (Object item in textAndFillItem) { if (item.GetType() == typeof(TextItem)) { //must be TextItem txtItem = item as TextItem; if (txtItem.LeftPos > 0) { txtItem.LeftPos = LeftPosText(leftPos, txtItem); lineData.Append(printer.AbsoluteHorizontalPosition(txtItem.LeftPos)); } lineData.Append(txtItem.TextPrinterData); leftPos += txtItem.LeftPos + txtItem.TextWidth; } } } if (underline) { //only fillitem free lines have to be underlined 'manually' lineData.Append(printer.AbsoluteHorizontalPosition(0)); lineData.Append(printer.CharacterFont(printer.DefaultFont)); for (int i = 0; i < printer.MaxTab - 1; i++) { lineData.Append(" "); } } } #endregion if (underline) { lineData.Append(printer.UnderlineOff()); } if (recurrence > 0) { StringBuilder manyLines = new StringBuilder(lineData.Length * recurrence); for (int j = 0; j < recurrence; j++) { manyLines.Append(lineData); } lineData.Append(manyLines); } return(lineData); }