/******************************************************************************* * You may amend and distribute as you like, but don't remove this header! * * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets. * See http://www.codeplex.com/EPPlus for details. * * Copyright (C) 2011 Jan Källman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html * * All code and executables are provided "as is" with no warranty either express or implied. * The author accepts no liability for any damage or loss of business that this product may cause. * * Code change notes: * * Author Change Date * ****************************************************************************** * Jan Källman Initial Release 2010-06-01 * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.Globalization; using System.Drawing; namespace OfficeOpenXml.Drawing.Vml { /// /// Drawing object used for header and footer pictures /// public class ExcelVmlDrawingPicture : ExcelVmlDrawingBase { ExcelWorksheet _worksheet; internal ExcelVmlDrawingPicture(XmlNode topNode, XmlNamespaceManager ns, ExcelWorksheet ws) : base(topNode, ns) { _worksheet = ws; } /// /// Position ID /// public string Position { get { return GetXmlNodeString("@id"); } } /// /// The width in points /// public double Width { get { return GetStyleProp("width"); } set { SetStyleProp("width",value.ToString(CultureInfo.InvariantCulture) + "pt"); } } /// /// The height in points /// public double Height { get { return GetStyleProp("height"); } set { SetStyleProp("height", value.ToString(CultureInfo.InvariantCulture) + "pt"); } } /// /// Margin Left in points /// public double Left { get { return GetStyleProp("left"); } set { SetStyleProp("left", value.ToString(CultureInfo.InvariantCulture)); } } /// /// Margin top in points /// public double Top { get { return GetStyleProp("top"); } set { SetStyleProp("top", value.ToString(CultureInfo.InvariantCulture)); } } /// /// The Title of the image /// public string Title { get { return GetXmlNodeString("v:imagedata/@o:title"); } set { SetXmlNodeString("v:imagedata/@o:title",value); } } /// /// The image /// public Image Image { get { var pck = _worksheet._package.Package; if (pck.PartExists(ImageUri)) { var part = pck.GetPart(ImageUri); return Image.FromStream(part.GetStream()); } else { return null; } } } internal Uri ImageUri { get; set; } internal string RelId { get { return GetXmlNodeString("v:imagedata/@o:relid"); } set { SetXmlNodeString("v:imagedata/@o:relid",value); } } /// /// Determines whether an image will be displayed in black and white /// public bool BiLevel { get { return GetXmlNodeString("v:imagedata/@bilevel")=="t"; } set { if (value) { SetXmlNodeString("v:imagedata/@bilevel", "t"); } else { DeleteNode("v:imagedata/@bilevel"); } } } /// /// Determines whether a picture will be displayed in grayscale mode /// public bool GrayScale { get { return GetXmlNodeString("v:imagedata/@grayscale")=="t"; } set { if (value) { SetXmlNodeString("v:imagedata/@grayscale", "t"); } else { DeleteNode("v:imagedata/@grayscale"); } } } /// /// Defines the intensity of all colors in an image /// Default value is 1 /// public double Gain { get { string v = GetXmlNodeString("v:imagedata/@gain"); return GetFracDT(v,1); } set { if (value < 0) { throw (new ArgumentOutOfRangeException("Value must be positive")); } if (value == 1) { DeleteNode("v:imagedata/@gamma"); } else { SetXmlNodeString("v:imagedata/@gain", value.ToString("#.0#", CultureInfo.InvariantCulture)); } } } /// /// Defines the amount of contrast for an image /// Default value is 0; /// public double Gamma { get { string v = GetXmlNodeString("v:imagedata/@gamma"); return GetFracDT(v,0); } set { if (value == 0) //Default { DeleteNode("v:imagedata/@gamma"); } else { SetXmlNodeString("v:imagedata/@gamma", value.ToString("#.0#", CultureInfo.InvariantCulture)); } } } /// /// Defines the intensity of black in an image /// Default value is 0 /// public double BlackLevel { get { string v = GetXmlNodeString("v:imagedata/@blacklevel"); return GetFracDT(v, 0); } set { if (value == 0) { DeleteNode("v:imagedata/@blacklevel"); } else { SetXmlNodeString("v:imagedata/@blacklevel", value.ToString("#.0#", CultureInfo.InvariantCulture)); } } } #region Private Methods private double GetFracDT(string v, double def) { double d; if (v.EndsWith("f")) { v = v.Substring(0, v.Length - 1); if (double.TryParse(v, out d)) { d /= 65535; } else { d = def; } } else { if (!double.TryParse(v, out d)) { d = def; } } return d; } private void SetStyleProp(string propertyName, string value) { string style = GetXmlNodeString("@style"); string newStyle = ""; bool found = false; foreach (string prop in style.Split(';')) { string[] split = prop.Split(':'); if (split[0] == propertyName) { newStyle += propertyName + ":" + value + ";"; found = true; } else { newStyle += prop + ";"; } } if (!found) { newStyle += propertyName + ":" + value + ";"; } SetXmlNodeString("@style", newStyle.Substring(0, newStyle.Length - 1)); } private double GetStyleProp(string propertyName) { string style = GetXmlNodeString("@style"); foreach (string prop in style.Split(';')) { string[] split = prop.Split(':'); if (split[0] == propertyName && split.Length > 1) { string value = split[1].EndsWith("pt") ? split[1].Substring(0, split[1].Length - 2) : split[1]; double ret; if (double.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out ret)) { return ret; } else { return 0; } } } return 0; } #endregion } }