using log4net; using iTextSharp.text; using Spring.Objects; using System; using System.Collections.Generic; using iTextSharp.text.pdf; namespace Sleis.Pdf { public enum ElementWriterParagraphType { Default, H1, H2 } public class ElementWriter : Sleis.Pdf.IElementWriter { public readonly ILog LOG; public static readonly iTextSharp.text.Font.FontFamily DEFAULT_FONT_FAMILY = iTextSharp.text.Font.FontFamily.HELVETICA; public iTextSharp.text.Font Font { get; set; } public iTextSharp.text.Font LabelFont { get; set; } public iTextSharp.text.Font H1Font { get; set; } public iTextSharp.text.Font H2Font { get; set; } public ElementWriterParagraphType ParagraphType { get; set; } public float? SpaceBefore { get; set; } public float? SpaceAfter { get; set; } public string Select { get; set; } public string Label { get; set; } public List SubElements { get; set; } public ElementWriter() { LOG = LogManager.GetLogger(this.GetType()); Font = new iTextSharp.text.Font(DEFAULT_FONT_FAMILY, 9); LabelFont = new iTextSharp.text.Font(DEFAULT_FONT_FAMILY, 9, iTextSharp.text.Font.BOLD); H1Font = new iTextSharp.text.Font(DEFAULT_FONT_FAMILY, 24, iTextSharp.text.Font.BOLD); H2Font = new iTextSharp.text.Font(DEFAULT_FONT_FAMILY, 9, iTextSharp.text.Font.BOLD); } public virtual void Init() { if (!SpaceBefore.HasValue) { SpaceBefore = 1; } if (!SpaceAfter.HasValue) { SpaceAfter = 1; } } public virtual void BeforeWrite(Document pdf, ObjectWrapper context) { if (pdf == null) { throw new ArgumentNullException("pdf"); } if (context == null) { throw new ArgumentNullException("context"); } } /* public virtual IElement GetElement(IElement parent, ObjectWrapper data) { string value = data.GetPropertyValue(Select).ToString(); if (SubElements.Count == 0) { Paragraph p = null; switch (ParagraphType) { case ElementWriterParagraphType.H1: p = new Paragraph(value, H1Font); break; case ElementWriterParagraphType.H2: p = new Paragraph(value, H2Font); break; default: p = new Paragraph(value, Font); break; } if (SpaceBefore.HasValue) { p.SpacingBefore = SpaceBefore.Value; } if (SpaceAfter.HasValue) { p.SpacingAfter = SpaceAfter.Value; } //parent.Chunks.Add(p); return parent; } else { foreach (ElementWriter ele in SubElements) { return GetElement(parent, data); } return GetElement(parent, data); } } * */ public virtual void Write(Document pdf, ObjectWrapper context) { LOG.Debug("Called un-implemented Write method"); } public virtual void Write(Document pdf, string value, string label) { Paragraph labelParagraph = new Paragraph(label, LabelFont); if (SpaceBefore.HasValue) { labelParagraph.SpacingBefore = SpaceBefore.Value; } pdf.Add(labelParagraph); Paragraph valueParagraph = new Paragraph(value, Font); if (SpaceAfter.HasValue) { labelParagraph.SpacingAfter = SpaceAfter.Value; } pdf.Add(valueParagraph); } public virtual void Write(Document pdf, string value) { if (SubElements==null || SubElements.Count == 0) { Paragraph p = null; switch (ParagraphType) { case ElementWriterParagraphType.H1: p = new Paragraph(value, H1Font); break; case ElementWriterParagraphType.H2: p = new Paragraph(value, H2Font); break; default: p = new Paragraph(value, Font); break; } if (SpaceBefore.HasValue) { p.SpacingBefore = SpaceBefore.Value; } if (SpaceAfter.HasValue) { p.SpacingAfter = SpaceAfter.Value; } pdf.Add(p); } else { foreach (ElementWriter ele in SubElements) { Write(pdf, value); } } } public virtual IElement GetElement(IElement element, ObjectWrapper context) { Chunk chunk = new Chunk(); object selectedValue = null; try { selectedValue = context.GetPropertyValue(Select); } catch(Exception err) { LOG.Debug(String.Format("Error getting accessing {0} : {1}", Select, err.Message)); }//swallowed string value = selectedValue !=null ? selectedValue.ToString() : ""; if (SubElements == null || SubElements.Count == 0) { //write the data Paragraph p = null; switch (ParagraphType) { case ElementWriterParagraphType.H1: p = new Paragraph(value, H1Font); break; case ElementWriterParagraphType.H2: p = new Paragraph(value, H2Font); break; default: p = new Paragraph(value, Font); break; } if (SpaceBefore.HasValue) { p.SpacingBefore = SpaceBefore.Value; } if (SpaceAfter.HasValue) { p.SpacingAfter = SpaceAfter.Value; } return p; } //recurse else { // IElement ele = new Element(); //PdfPTable foreach (IElementWriter wr in SubElements) { return wr.GetElement(element, context); } return new Paragraph(); } } } }