using System; using System.Collections.Generic; using System.Drawing; using System.Globalization; using System.Windows.Forms; using Curtain.Framework.Barcode; using Curtain.Framework.Barcode.OneD; using Curtain.Framework.Barcode.QRCode; using ZXing; using ZXing.Common; using ZXing.QrCode.Internal; namespace Dongke.WinForm.Controls.InvoiceLayout { /// /// /// [Serializable] public class TextItem : LayoutItem, IBoundItem { #region 成员变量 private string _dataMember; // 对应数据源中的字段名 private string _displayValue; // 编辑模式显示的值 private object _formatType; // 格式类别 private string _format; // 文本格式 private Font _font; // 文本字体 private bool _isUnderline; // 下划线 private bool _isStrikeout; // 删除线 private bool _wrap; // 是否自动换行 private bool _clip; // 是否剪裁延伸到边框外侧的文本 private Color _textColor; // 文本颜色 private TextAlignment _textAlign; // 文本对齐方式 private TextAlignment _textAlignVertical; // 文本垂直对齐 private float _characterSpace; // 文字间隔 private float _lineSpace; // 文字行间隔 private int _characterCount; // 行文字数 private string _defaultValue; // 文本默认值 private string _culture; // culture private string _defaultItemName; // 默认项目名 private string _textItemName; // 文本项目名 private bool _isDataBinding; // 是否数据绑定 [NonSerialized] private string _text; // 文本 [NonSerialized] private object _dataValue; // 数据源中的值 [NonSerialized] private object _printDataValue; // 打印数据源中的值 [NonSerialized] private DataBoundField _boundField; // 数据源字段 [NonSerialized] private DataBoundField _printBoundField; // 打印数据源字段 [NonSerialized] private Font _fontDraw; // 绘制字体 [NonSerialized] private float _lineSpaceDraw; // 绘制行间隔 [NonSerialized] private float _characterSpaceDraw; // 绘制文字间隔 /// /// /// [NonSerialized] protected RectangleF _marginRectangleFDraw; // 绘制范围 private string _itemCode; // 项目ID private int _itemRefClass; // 分类 private ItemStyle _itemStyle; // 项目类别 private string _itemSample; // 项目示例 /// /// 条码打印用 /// [NonSerialized] private string _picCodeValue = null; [NonSerialized] private int _picCodeWidth = -1; [NonSerialized] private int _picCodeHeight = -1; [NonSerialized] private Image _picCode = null; //[NonSerialized] //BarcodeWriter _writer = null; //[NonSerialized] //EncodingOptions _options = null; #endregion 成员变量 #region 属性 /// /// 对应数据源中的字段名 /// public string DataMember { get { return _dataMember; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } if (!value.Equals(_dataMember)) { _dataMember = value; if (Owner != null) { if (Owner.LayoutMode == LayoutMode.Preview) { Owner.RefreshTextItemBound(this); } Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 编辑模式显示的值 /// public string DisplayValue { get { return _displayValue; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } if (!value.Equals(_displayValue)) { _displayValue = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 格式类别 /// public object FormatType { get { return _formatType; } set { _formatType = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } /// /// 文本格式 /// public string Format { get { return _format; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } if (!value.Equals(_format)) { _format = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 文本字体 /// public Font Font { get { return _font; } set { if (!_font.Equals(value)) { _font = value; _isUnderline = _font.Underline; _isStrikeout = _font.Strikeout; float zoom = base.GetZoom(); _fontDraw = new Font(_font.FontFamily, _font.Size * zoom, _font.Style & (FontStyle.Regular | FontStyle.Bold | FontStyle.Italic)); if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 是否自动文本换行 /// public bool Wrap { get { return _wrap; } set { if (_wrap != value) { _wrap = value; _clip = !_wrap; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 是否剪裁延伸到边框外侧的文本 /// internal bool Clip { get { _clip = !_wrap; return _clip; } } /// /// 文本颜色 /// public Color TextColor { get { return _textColor; } set { if (!_textColor.Equals(value)) { _textColor = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 文本对齐方式 /// public TextAlignment TextAlign { get { return _textAlign; } set { if (_textAlign != value) { _textAlign = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 文本垂直对齐方式 /// public TextAlignment TextAlignVertical { get { return _textAlignVertical; } set { if (_textAlignVertical != value) { _textAlignVertical = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 文字间隔 /// public float CharacterSpace { get { return _characterSpace; } set { if (_characterSpace != value) { _characterSpace = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 文字行间隔 /// public float LineSpace { get { return _lineSpace; } set { if (_lineSpace != value) { _lineSpace = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 行文字数 /// public int CharacterCount { get { return _characterCount; } set { if (_characterCount != value) { _characterCount = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 文本默认值 /// public string DefaultValue { get { return _defaultValue; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } if (!value.Equals(_defaultValue)) { _defaultValue = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// culture /// public string Culture { get { return _culture; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } if (!value.Equals(_culture)) { _culture = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 文本项目名 /// public string TextItemName { get { return _textItemName; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } if (!value.Equals(_textItemName)) { _textItemName = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 默认项目名 /// public string DefaultItemName { get { return _defaultItemName; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } if (!value.Equals(_defaultItemName)) { _defaultItemName = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 数据源中的值 /// internal object DataValue { get { return _dataValue; } set { if (value != _dataValue || (value != null && !value.Equals(_dataValue))) { _dataValue = value; } } } /// /// 打印数据源中的值 /// internal object PrintDataValue { get { return _printDataValue; } set { if (value != _printDataValue || (value != null && !value.Equals(_printDataValue))) { _printDataValue = value; } } } /// /// 是否数据绑定 /// internal bool IsDataBinding { get { return _isDataBinding; } set { _isDataBinding = value; } } /// /// 数据源字段 /// internal DataBoundField BoundField { get { return _boundField; } set { _boundField = value; } } /// /// 打印数据源字段 /// internal DataBoundField PrintBoundField { get { return _printBoundField; } set { _printBoundField = value; } } /// /// 绘制字体 /// internal Font FontDraw { get { return _fontDraw; } } /// /// 绘制文字间隔 /// internal float CharacterSpaceDraw { get { return _characterSpaceDraw; } } /// /// 绘制行间隔 /// internal float LineSpaceDraw { get { return _lineSpaceDraw; } } /// /// 项目编码 /// public string ItemCode { get { return this._itemCode; } set { if (this._itemCode != value) { this._itemCode = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } if (string.IsNullOrEmpty(this._itemCode)) { this._isDataBinding = false; } else { this._isDataBinding = true; } } } /// /// 分类 /// public int ItemRefClass { get { return _itemRefClass; } set { if (value != _itemRefClass) { _itemRefClass = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 项目类别 /// public ItemStyle ItemStyle { get { return _itemStyle; } set { if (value != _itemStyle) { _itemStyle = value; this._picCode = null; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// 项目示例 /// public string ItemSample { get { return _itemSample; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } if (!value.Equals(_itemSample)) { _itemSample = value; if (Owner != null) { Owner.SetItemChangedArgs(this, ItemChangeType.Modified); } } } } /// /// /// public bool PicColumn { get; set; } /// /// /// public bool PicMargin { get; set; } /// /// /// public bool FixedRatio { get; set; } #endregion 属性 #region 构造函数 /// /// 构造函数 /// internal TextItem() : this(null) { } /// /// 构造函数 /// internal TextItem(LayoutBox box) : this(box, ItemType.Text) { } /// /// 构造函数 /// internal TextItem(LayoutBox box, ItemType itemType) : base(box, itemType) { _width = LayoutCommon.DefaultTextItemSizeWidth; _height = LayoutCommon.DefaultTextItemSizeHeight; _displayValue = string.Empty; _format = string.Empty; _defaultValue = string.Empty; _font = LayoutCommon.DefaultItemFont; _fontDraw = LayoutCommon.DefaultItemFont; _textColor = Color.Black; _textAlign = TextAlignment.LeftOrTop; _characterSpace = 0f; _lineSpace = 0f; _characterCount = 0; _dataValue = null; _text = string.Empty; _itemRefClass = 0; _itemStyle = ItemStyle.Other; _isDataBinding = false; _boundField = new DataBoundField(); _boundField.IsDataBound = false; _boundField.BoundFieldIndex = -1; _printBoundField = new DataBoundField(); _printBoundField.IsDataBound = false; _printBoundField.BoundFieldIndex = -1; _defaultItemName = LayoutBox.ITEMNAME_FIX + ID; _textItemName = _defaultItemName; } #endregion 构造函数 #region 函数 /// /// 格式化数据源中的值 /// private string FormatDataValue(object value) { string result = null; if (value != null && value != DBNull.Value) { if (_itemStyle == ItemStyle.Date) { result = value.ToString(); DateTime dateTime; if (DateTime.TryParse(result, out dateTime)) { if (string.IsNullOrEmpty(_format)) { result = dateTime.ToString(LayoutConsts.DATETIME_FRORMAT); } else { if (LayoutConsts.CULTUREINFO_JP.Equals(_culture)) { result = dateTime.ToString(_format, LayoutCommon.CultureInfoJP); } else { // MMM if (_format.Contains(LayoutConsts.DATETIME_FRORMAT_MMM)) { if (string.IsNullOrEmpty(_culture)) { result = dateTime.ToString(_format).ToUpper(); } else { result = dateTime.ToString(_format, CultureInfo.CreateSpecificCulture(_culture)).ToUpper(); } } else if (string.IsNullOrEmpty(_culture)) { result = dateTime.ToString(_format); } else { result = dateTime.ToString(_format, CultureInfo.CreateSpecificCulture(_culture)); } } } } } else if (_itemStyle == ItemStyle.Sign) { if (string.IsNullOrEmpty(_format)) { result = value.ToString(); } else { result = _format; } } else { result = value.ToString(); } } return result; } /// /// 文本内容设置 /// internal object ResetTextValue(object value, bool isDataBound) { if (Owner == null) { return _displayValue; } if (Owner.LayoutMode == LayoutMode.Preview) { if (!string.IsNullOrEmpty(_dataMember)) { if (isDataBound) { object result = Owner.SetItemValueFormattingArgs(this, value, _format); if (PicColumn) { if (result != null && result is Image) { return result; } if (value != null && value is byte[]) { System.IO.MemoryStream ms = new System.IO.MemoryStream(value as byte[]); return Image.FromStream(ms); } return value; } if (result != null) { return result.ToString(); } if (value != null && value != DBNull.Value) { return FormatDataValue(value); } return _defaultValue; } //return _defaultValue; return ""; } return _displayValue; } else { //object result = Owner.SetItemValueFormattingArgs(this, value, _format); object result = Owner.SetItemValueFormattingArgs(this, _displayValue, _format); if (result != null) { return result.ToString(); } return _displayValue; } } /// /// 显示Item属性设置画面 /// /// /// DialogResult.OK:选中的Item有效,设置成功
/// DialogResult.Cancel:选中的Item有效,取消设置
/// DialogResult.None:LayoutBox不是编辑模式,或选中的Item不是一个 ///
protected override DialogResult ShowItemPropertyDialogInner() { using (TextItemSetting itemPropertySetting = new TextItemSetting()) { itemPropertySetting.IsNew = false; itemPropertySetting.IsDataBinding = IsDataBinding; itemPropertySetting.TextLocationX = Left; itemPropertySetting.TextLocationY = Top; itemPropertySetting.TextWidth = Width; itemPropertySetting.TextHeight = Height; itemPropertySetting.Culture = Culture; itemPropertySetting.LineSpace = LineSpace; itemPropertySetting.CharacterSpace = CharacterSpace; itemPropertySetting.CharacterCount = CharacterCount; itemPropertySetting.TextAlign = TextAlign; itemPropertySetting.TextAlignVertical = TextAlignVertical; itemPropertySetting.TextPreview = DisplayValue; itemPropertySetting.TextColor = TextColor; itemPropertySetting.ItemStyle = ItemStyle; itemPropertySetting.ItemName = TextItemName; itemPropertySetting.TextFormat = Format; itemPropertySetting.TextFont = Font; itemPropertySetting.Wrap = Wrap; itemPropertySetting.DefaultValue = DefaultValue; itemPropertySetting.chkFixedRatio.Checked = FixedRatio; itemPropertySetting.chkM.Checked = PicMargin; itemPropertySetting.chkPic.Checked = PicColumn; itemPropertySetting.chkFixedRatio.Enabled = PicColumn; itemPropertySetting.chkM.Enabled = PicColumn; DialogResult result = itemPropertySetting.ShowDialog(); if (result == DialogResult.OK) { Left = itemPropertySetting.TextLocationX; Top = itemPropertySetting.TextLocationY; Width = itemPropertySetting.TextWidth; Height = itemPropertySetting.TextHeight; LineSpace = itemPropertySetting.LineSpace; CharacterSpace = itemPropertySetting.CharacterSpace; CharacterCount = itemPropertySetting.CharacterCount; Font = itemPropertySetting.TextFont; Wrap = itemPropertySetting.Wrap; TextAlign = itemPropertySetting.TextAlign; TextAlignVertical = itemPropertySetting.TextAlignVertical; TextColor = itemPropertySetting.TextColor; DisplayValue = itemPropertySetting.TextPreview; ItemStyle = itemPropertySetting.ItemStyle; TextItemName = itemPropertySetting.ItemName; Format = itemPropertySetting.TextFormat; Culture = itemPropertySetting.Culture; DefaultValue = itemPropertySetting.DefaultValue; FixedRatio = itemPropertySetting.chkFixedRatio.Checked; PicMargin = itemPropertySetting.chkM.Checked; PicColumn = itemPropertySetting.chkPic.Checked; ResetItemFrame(); SetDrawProperty(); Owner.Dirty = true; } return result; } } /// /// Item初始化 /// /// LayoutBox /// 是否生成新ID /// 是否成功 internal override bool Init(LayoutBox box, bool isNewID) { if (_fontDraw == null) { if (_font == null) { _font = LayoutCommon.DefaultItemFont; _fontDraw = LayoutCommon.DefaultItemFont; } else { _fontDraw = new Font(_font.FontFamily, _font.Size, _font.Style & (FontStyle.Regular | FontStyle.Bold | FontStyle.Italic)); } } _boundField.IsDataBound = false; _boundField.BoundFieldIndex = -1; _printBoundField.IsDataBound = false; _printBoundField.BoundFieldIndex = -1; bool isInit = base.Init(box, isNewID); if (isNewID) { _defaultItemName = LayoutBox.ITEMNAME_FIX + ID; _textItemName = _defaultItemName; } return isInit; } /// /// 初始化Item绘制用属性 /// internal override float SetDrawProperty() { float zoom = base.SetDrawProperty(); _fontDraw = new Font(_font.FontFamily, _font.Size * zoom, _fontDraw.Style); _lineSpaceDraw = _lineSpace * zoom; if (_characterCount < 1) { _characterSpaceDraw = _characterSpace * zoom; } _marginRectangleFDraw = new RectangleF(); _marginRectangleFDraw.X = (Left + LayoutConsts.TEXT_MARGIN) * zoom; _marginRectangleFDraw.Y = (Top + LayoutConsts.TEXT_MARGIN) * zoom; _marginRectangleFDraw.Width = (Width - LayoutConsts.TEXT_MARGIN - LayoutConsts.TEXT_MARGIN) * zoom; _marginRectangleFDraw.Height = (Height - LayoutConsts.TEXT_MARGIN - LayoutConsts.TEXT_MARGIN) * zoom; return zoom; } /// /// 初始化Item绘制用属性 /// internal override float SetRectangleF() { float zoom = base.SetRectangleF(); if (_characterCount < 1) { _characterSpaceDraw = _characterSpace * zoom; } _marginRectangleFDraw = new RectangleF(); _marginRectangleFDraw.X = (Left + LayoutConsts.TEXT_MARGIN) * zoom; _marginRectangleFDraw.Y = (Top + LayoutConsts.TEXT_MARGIN) * zoom; _marginRectangleFDraw.Width = (Width - LayoutConsts.TEXT_MARGIN - LayoutConsts.TEXT_MARGIN) * zoom; _marginRectangleFDraw.Height = (Height - LayoutConsts.TEXT_MARGIN - LayoutConsts.TEXT_MARGIN) * zoom; return zoom; } /// /// Item图形上的OnPaint事件 /// /// 指定的对象 /// 提供的事件数据 protected override void OnPaint(object sender, PaintEventArgs e) { DrawTextItem(_dataValue, _boundField, e.Graphics, RectangleFDraw, _marginRectangleFDraw, false); } internal void DrawTextItem(object data, DataBoundField dataBoundField, Graphics graphics, RectangleF rectangleM, RectangleF rectangle, bool isPrint) { object value = ResetTextValue(data, dataBoundField.IsDataBound); if (value == null) { return; } try { if (this._itemStyle == ItemStyle.Barcode) { if (isPrint) { OneDDrawingOptions ops = new OneDDrawingOptions(); //ops.DrawGraphics = graphics; ops.ShowType = (this.Wrap ? BarcodeShowType.Zoom : BarcodeShowType.Show); //ops.ImageWidth = this.SimpleShape.Width; //ops.ImageHeight = this.SimpleShape.Height; ops.ImageWidth = LayoutCommon.MillimeterToPixelDpi(rectangleM.Width, graphics.DpiX); ops.ImageHeight = LayoutCommon.MillimeterToPixelDpi(rectangleM.Height, graphics.DpiX); ops.DpiX = graphics.DpiX; ops.DpiY = graphics.DpiY; using (Image pic1 = OneDHelper.GetOneDImage(value.ToString(), ops)) { graphics.DrawImage(pic1, rectangleM, ops.ImageRect, GraphicsUnit.Pixel); } return; } Image pic = null; if (!isPrint && this.SimpleShape.Width == this._picCodeWidth && this.SimpleShape.Height == this._picCodeHeight && value.ToString() == _picCodeValue) { pic = this._picCode; } if (pic == null) { OneDDrawingOptions ops = new OneDDrawingOptions(); //ops.DrawGraphics = graphics; ops.ShowType = (this.Wrap ? BarcodeShowType.Zoom : BarcodeShowType.Show); //ops.ImageWidth = this.SimpleShape.Width; //ops.ImageHeight = this.SimpleShape.Height; ops.ImageWidth = LayoutCommon.MillimeterToPixelDpi(rectangleM.Width, graphics.DpiX); ops.ImageHeight = LayoutCommon.MillimeterToPixelDpi(rectangleM.Height, graphics.DpiX); ops.DpiX = graphics.DpiX; ops.DpiY = graphics.DpiY; pic = OneDHelper.GetOneDImage(value.ToString(), ops); if (!isPrint) { try { this._picCode?.Dispose(); } catch { } this._picCode = pic; _picCodeValue = value.ToString(); _picCodeWidth = this.SimpleShape.Width; _picCodeHeight = this.SimpleShape.Height; } } try { if (pic != null) { //graphics.DrawImage(pic, this.SimpleShape.Bounds, new Rectangle(0, 0, pic.Width, pic.Height), GraphicsUnit.Pixel); graphics.DrawImage(pic, this.SimpleShape.Bounds); } } catch { } finally { if (pic != null && isPrint) { pic.Dispose(); } } return; } if (this._itemStyle == ItemStyle.QRCode) { if (isPrint) { QRCodeDrawingOptions ops = new QRCodeDrawingOptions(); //ops.DrawGraphics = graphics; ops.ShowType = (this.Wrap ? BarcodeShowType.Zoom : BarcodeShowType.Show); //ops.ImageWidth = this.SimpleShape.Width; //ops.ImageHeight = this.SimpleShape.Height; ops.ImageWidth = LayoutCommon.MillimeterToPixelDpi(rectangleM.Width, graphics.DpiX); ops.ImageHeight = LayoutCommon.MillimeterToPixelDpi(rectangleM.Height, graphics.DpiX); ops.DpiX = graphics.DpiX; ops.DpiY = graphics.DpiY; //QRCodeEncodingOptions qre = new QRCodeEncodingOptions(); //qre.ECLevel = QRECLevel.L; using (Image pic1 = QRCodeHelper.GetQRCodeImage(value.ToString(), ops)) { graphics.DrawImage(pic1, rectangleM, ops.ImageRect, GraphicsUnit.Pixel); } return; } Image pic = null; if (!isPrint && this.SimpleShape.Width == this._picCodeWidth && this.SimpleShape.Height == this._picCodeHeight && value.ToString() == _picCodeValue) { pic = this._picCode; } if (pic == null) { QRCodeDrawingOptions ops = new QRCodeDrawingOptions(); //ops.DrawGraphics = graphics; ops.ShowType = (this.Wrap ? BarcodeShowType.Zoom : BarcodeShowType.Show); //ops.ImageWidth = this.SimpleShape.Width; //ops.ImageHeight = this.SimpleShape.Height; ops.ImageWidth = LayoutCommon.MillimeterToPixelDpi(rectangleM.Width, graphics.DpiX); ops.ImageHeight = LayoutCommon.MillimeterToPixelDpi(rectangleM.Height, graphics.DpiX); ops.DpiX = graphics.DpiX; ops.DpiY = graphics.DpiY; //QRCodeEncodingOptions qre = new QRCodeEncodingOptions(); //qre.ECLevel = QRECLevel.H; pic = QRCodeHelper.GetQRCodeImage(value.ToString(), ops); //pic.Save("C://1.png"); if (!isPrint) { try { this._picCode?.Dispose(); } catch { } this._picCode = pic; _picCodeValue = value.ToString(); _picCodeWidth = this.SimpleShape.Width; _picCodeHeight = this.SimpleShape.Height; } } try { if (pic != null) { //graphics.DrawImage(pic, this.SimpleShape.Bounds, new Rectangle(0, 0, pic.Width, pic.Height), GraphicsUnit.Pixel); graphics.DrawImage(pic, this.SimpleShape.Bounds); } } catch { } finally { if (pic != null && isPrint) { pic.Dispose(); } } return; } } catch (Exception ex) { throw ex; } if (PicColumn && value is Image) { Image image = value as Image; if (image != null) { RectangleF rfp = PicMargin ? rectangle : rectangleM; if (FixedRatio) { // 背景图片的高宽比例 float imgWHRate = (float)image.Width / (float)image.Height; // 打印纸张的高宽比例 float paperWHRate = rfp.Width / rfp.Height; // 背景图片打印范围 RectangleF newImgRectangleF = RectangleF.Empty; // 缩放背景图片,但保持图片高宽比例 if (imgWHRate > paperWHRate) { newImgRectangleF.Width = rfp.Width; newImgRectangleF.Height = rfp.Width / imgWHRate; newImgRectangleF.X = rfp.X; newImgRectangleF.Y = (rfp.Height - newImgRectangleF.Height) / 2 + rfp.Y; } else { newImgRectangleF.Width = rfp.Height * imgWHRate; newImgRectangleF.Height = rfp.Height; newImgRectangleF.X = (rfp.Width - newImgRectangleF.Width) / 2 + rfp.X; newImgRectangleF.Y = rfp.Y; } rfp = newImgRectangleF; } // 在指定的范围绘制背景图片 LayoutUtility.DrawImage(graphics, GraphicsUnit.Millimeter, rfp, image); } return; } LayoutUtility.DrawText(graphics, GraphicsUnit.Millimeter, rectangleM, rectangle, value.ToString(), _fontDraw, _textColor, _lineSpaceDraw, _characterSpaceDraw, _characterCount, _textAlign, _textAlignVertical, _wrap, Clip, Selected); } #endregion 函数 public Image pictureProcess(Image sourceImage, int targetWidth, int targetHeight) { int width;//图片最终的宽 int height;//图片最终的高 try { System.Drawing.Imaging.ImageFormat format = sourceImage.RawFormat; Bitmap targetPicture = new Bitmap(targetWidth, targetHeight); Graphics g = Graphics.FromImage(targetPicture); g.Clear(Color.White); //计算缩放图片的大小 if (sourceImage.Width > targetWidth && sourceImage.Height <= targetHeight) { width = targetWidth; height = (width * sourceImage.Height) / sourceImage.Width; } else if (sourceImage.Width <= targetWidth && sourceImage.Height > targetHeight) { height = targetHeight; width = (height * sourceImage.Width) / sourceImage.Height; } else if (sourceImage.Width <= targetWidth && sourceImage.Height <= targetHeight) { width = sourceImage.Width; height = sourceImage.Height; } else { width = targetWidth; height = (width * sourceImage.Height) / sourceImage.Width; if (height > targetHeight) { height = targetHeight; width = (height * sourceImage.Width) / sourceImage.Height; } } g.DrawImage(sourceImage, (targetWidth - width) / 2, (targetHeight - height) / 2, width, height); sourceImage.Dispose(); return targetPicture; } catch// (Exception ex) { } return null; } } public class QRCodeWriterMy : Writer { private const int QUIET_ZONE_SIZE = 4; /// /// Encode a barcode using the default settings. /// /// The contents to encode in the barcode /// The barcode format to generate /// The preferred width in pixels /// The preferred height in pixels /// /// The generated barcode as a Matrix of unsigned bytes (0 == black, 255 == white) /// public BitMatrix encode(string contents, BarcodeFormat format, int width, int height) { return encode(contents, format, width, height, null); } /// /// /// The contents to encode in the barcode /// The barcode format to generate /// The preferred width in pixels /// The preferred height in pixels /// Additional parameters to supply to the encoder /// /// The generated barcode as a Matrix of unsigned bytes (0 == black, 255 == white) /// public BitMatrix encode(string contents, BarcodeFormat format, int width, int height, IDictionary hints) { if (String.IsNullOrEmpty(contents)) { throw new ArgumentException("Found empty contents"); } if (format != BarcodeFormat.QR_CODE) { throw new ArgumentException("Can only encode QR_CODE, but got " + format); } if (width < 0 || height < 0) { throw new ArgumentException("Requested dimensions are too small: " + width + 'x' + height); } var errorCorrectionLevel = ErrorCorrectionLevel.L; int quietZone = QUIET_ZONE_SIZE; if (hints != null) { if (hints.ContainsKey(EncodeHintType.ERROR_CORRECTION)) { var requestedECLevel = hints[EncodeHintType.ERROR_CORRECTION]; if (requestedECLevel != null) { errorCorrectionLevel = requestedECLevel as ErrorCorrectionLevel; if (errorCorrectionLevel == null) { switch (requestedECLevel.ToString().ToUpper()) { case "L": errorCorrectionLevel = ErrorCorrectionLevel.L; break; case "M": errorCorrectionLevel = ErrorCorrectionLevel.M; break; case "Q": errorCorrectionLevel = ErrorCorrectionLevel.Q; break; case "H": errorCorrectionLevel = ErrorCorrectionLevel.H; break; default: errorCorrectionLevel = ErrorCorrectionLevel.L; break; } } } } if (hints.ContainsKey(EncodeHintType.MARGIN)) { var quietZoneInt = hints[EncodeHintType.MARGIN]; if (quietZoneInt != null) { quietZone = Convert.ToInt32(quietZoneInt.ToString()); } } } var code = Encoder.encode(contents, errorCorrectionLevel, hints); BitMatrix bm = renderResult(code, width, height, quietZone); hints[EncodeHintType.WIDTH] = bm.Width; hints[EncodeHintType.HEIGHT] = bm.Height; return bm; } // Note that the input matrix uses 0 == white, 1 == black, while the output matrix uses // 0 == black, 255 == white (i.e. an 8 bit greyscale bitmap). private static BitMatrix renderResult(QRCode code, int width, int height, int quietZone) { var input = code.Matrix; if (input == null) { throw new InvalidOperationException(); } int inputWidth = input.Width; int inputHeight = input.Height; int qrWidth = inputWidth + (quietZone << 1); int qrHeight = inputHeight + (quietZone << 1); int outputWidth = Math.Max(width, qrWidth); int outputHeight = Math.Max(height, qrHeight); int multiple = Math.Min(outputWidth / qrWidth, outputHeight / qrHeight); // Padding includes both the quiet zone and the extra white pixels to accommodate the requested // dimensions. For example, if input is 25x25 the QR will be 33x33 including the quiet zone. // If the requested size is 200x160, the multiple will be 4, for a QR of 132x132. These will // handle all the padding from 100x100 (the actual QR) up to 200x160. int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; int topPadding = (outputHeight - (inputHeight * multiple)) / 2; //int leftPadding = 0;//(outputWidth - (inputWidth * multiple)) / 2; //int topPadding = 0;//(outputHeight - (inputHeight * multiple)) / 2; //outputWidth = (inputWidth * multiple); //outputHeight = (inputHeight * multiple); var output = new BitMatrix(outputWidth, outputHeight); for (int inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { // Write the contents of this row of the barcode for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { if (input[inputX, inputY] == 1) { output.setRegion(outputX, outputY, multiple, multiple); //int mX = outputWidth - outputX; //int mY = outputHeight - outputY; //mX = Math.Min(mX, multiple); //mY = Math.Min(mY, multiple); //output.setRegion(outputX, outputY, mX, mY); } } } return output; } } }