Esempio n. 1
0
        /// <summary>
        /// Create Merge Template from Template Class
        /// </summary>
        /// <param name="mergeOptions">Template: DocxData
        ///                            Object to Reflect for values: ReflectedObject
        /// </param>
        /// <returns></returns>
        public static MergeTemplate Create(MergeOptions mergeOptions)
        {
            MergeTemplate mergeTemplate = new MergeTemplate();
            var           templateType  = mergeOptions.ReflectedObject.GetType();

            mergeTemplate.InputFile = new MemoryStream(mergeOptions.DocxData);
            var properties = templateType.GetProperties();

            //Iterate through all properties
            //and assign MergePair with a Place holder (defaulting to property.name) and Value (Defaulting to text value)
            foreach (var property in properties)
            {
                MergePair mergePair = new MergePair(property.Name);
                if (property.GetValue(mergeOptions.ReflectedObject) != null)
                {
                    string placeHolder = property.Name;

                    var customAttributes = property.GetCustomAttributes(typeof(SpproNavigationAttribute), true);
                    if (customAttributes.Length > 0 && ((SpproNavigationAttribute)customAttributes[0]).NavigationProperty)
                    {
                        var convertedDataItem = (TableDataItem)DataItem.ConvertFrom(property.GetValue(mergeOptions.ReflectedObject));
                        mergePair.Value = convertedDataItem;
                        mergeTemplate.MergePair.Add(mergePair);
                    }
                    else
                    {
                        switch (property.PropertyType.Name)
                        {
                        case "String":
                        case "Int":
                        case "Decimal":
                        case "Int32":
                        case "Int16":
                            mergePair.Value = property.GetValue(mergeOptions.ReflectedObject).ToString();
                            break;
                        }
                        mergeTemplate.MergePair.Add(mergePair);
                    }
                }
            }

            foreach (var imageOption in mergeOptions.ImageOptions)
            {
                MergePair mergePair = new MergePair(imageOption.PlaceHolder);
                byte[]    imageData = imageOption.Content;
                //Images must have custom attirbutes decoration
                var image    = new Bitmap(new MemoryStream(imageData));
                var dataItem = new ImageDataItem(imageData);


                if (imageOption.MaxWidth > 0)
                {
                    //Reduce Image Ratio using max width
                    if (image.Width > imageOption.MaxWidth)
                    {
                        var ratio = image.Width / imageOption.MaxWidth;
                        image = new Bitmap(image, new Size(imageOption.MaxWidth, image.Height / ratio));
                    }
                }
                else if (imageOption.MaxHeight > 0)
                {
                    //Reduce Image Ratio using max height
                    if (image.Height > imageOption.MaxHeight)
                    {
                        var ratio = image.Height / imageOption.MaxHeight;
                        image = new Bitmap(image, new Size(image.Width / ratio, imageOption.MaxHeight));
                    }
                }

                dataItem.cY   = image.Height;
                dataItem.cX   = image.Width;
                dataItem.Unit = Unit.Cm;

                mergePair.Value = dataItem;
                mergeTemplate.MergePair.Add(mergePair);
            }
            //Add System Automatic merge pairs
            mergeTemplate.MergePair.Add(new MergePair("_Today_", DateTime.Now.ToString("dd-MM-yyyy")));
            return(mergeTemplate);
        }