/** * Sets the top and bottom margin of the given table. * * @param table PdfPTable on which the margins need to be set. * @param t Tag containing the margin styles and font size if needed. * @param values {@link TableStyleValues} containing border widths and border spacing values. * @throws NoCustomContextException */ private void SetVerticalMargin(PdfPTable table, Tag t, TableStyleValues values, IWorkerContext ctx) { float spacingBefore = values.BorderWidthTop; IDictionary <String, Object> memory = GetHtmlPipelineContext(ctx).GetMemory(); Object mb; memory.TryGetValue(HtmlPipelineContext.LAST_MARGIN_BOTTOM, out mb); if (mb != null) { spacingBefore += (float)mb; } float spacingAfter = values.VerBorderSpacing + values.BorderWidthBottom; foreach (KeyValuePair <String, String> css in t.CSS) { String key = css.Key; String value = css.Value; if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_TOP, key)) { spacingBefore += utils.ParseValueToPt(value, fst.GetFontSize(t)); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_BOTTOM, key)) { float marginBottom = utils.ParseValueToPt(value, fst.GetFontSize(t)); spacingAfter += marginBottom; GetHtmlPipelineContext(ctx).GetMemory()[HtmlPipelineContext.LAST_MARGIN_BOTTOM] = marginBottom; } } table.SpacingBefore = spacingBefore; table.SpacingAfter = spacingAfter; }
/** * Sets the top and bottom margin of the given table. * * @param table PdfPTable on which the margins need to be set. * @param t Tag containing the margin styles and font size if needed. * @param values {@link TableStyleValues} containing border widths and border spacing values. * @throws NoCustomContextException */ private void SetVerticalMargin(PdfPTable table, Tag t, TableStyleValues values, IWorkerContext ctx) { float spacingBefore = values.BorderWidthTop; float spacingAfter = values.VerBorderSpacing + values.BorderWidthBottom; foreach (KeyValuePair <String, String> css in t.CSS) { String key = css.Key; String value = css.Value; if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_TOP, key)) { CssUtils utils = CssUtils.GetInstance(); spacingBefore += utils.CalculateMarginTop(value, fst.GetFontSize(t), GetHtmlPipelineContext(ctx)); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_BOTTOM, key)) { float marginBottom = utils.ParseValueToPt(value, fst.GetFontSize(t)); spacingAfter += marginBottom; GetHtmlPipelineContext(ctx).GetMemory()[HtmlPipelineContext.LAST_MARGIN_BOTTOM] = marginBottom; } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_TOP, key)) { table.PaddingTop = utils.ParseValueToPt(value, fst.GetFontSize(t)); } } table.SpacingBefore = spacingBefore; table.SpacingAfter = spacingAfter; }
public override Image Apply(Image img, Tag tag, IMarginMemory mm, IPageSizeContainable psc, HtmlPipelineContext ctx) { IDictionary <String, String> cssMap = tag.CSS; String widthValue = null; cssMap.TryGetValue(HTML.Attribute.WIDTH, out widthValue); if (widthValue == null) { tag.Attributes.TryGetValue(HTML.Attribute.WIDTH, out widthValue); } String heightValue = null; cssMap.TryGetValue(HTML.Attribute.HEIGHT, out heightValue); if (heightValue == null) { tag.Attributes.TryGetValue(HTML.Attribute.HEIGHT, out heightValue); } if (widthValue == null) { img.ScaleToFitLineWhenOverflow = true; } else { img.ScaleToFitLineWhenOverflow = false; } img.ScaleToFitHeight = false; CssUtils utils = CssUtils.GetInstance(); float widthInPoints = utils.ParsePxInCmMmPcToPt(widthValue); float heightInPoints = utils.ParsePxInCmMmPcToPt(heightValue); if (widthInPoints > 0 && heightInPoints > 0) { img.ScaleAbsolute(widthInPoints, heightInPoints); } else if (widthInPoints > 0) { heightInPoints = img.Height * widthInPoints / img.Width; img.ScaleAbsolute(widthInPoints, heightInPoints); } else if (heightInPoints > 0) { widthInPoints = img.Width * heightInPoints / img.Height; img.ScaleAbsolute(widthInPoints, heightInPoints); } // apply border CSS String borderTopColor = null; cssMap.TryGetValue(CSS.Property.BORDER_TOP_COLOR, out borderTopColor); if (borderTopColor != null) { img.BorderColorTop = HtmlUtilities.DecodeColor(borderTopColor); } String borderTopWidth = null; cssMap.TryGetValue(CSS.Property.BORDER_TOP_WIDTH, out borderTopWidth); if (borderTopWidth != null) { img.BorderWidthTop = utils.ParseValueToPt(borderTopWidth, 1f); } String borderRightColor = null; cssMap.TryGetValue(CSS.Property.BORDER_RIGHT_COLOR, out borderRightColor); if (borderRightColor != null) { img.BorderColorRight = HtmlUtilities.DecodeColor(borderRightColor); } String borderRightWidth = null; cssMap.TryGetValue(CSS.Property.BORDER_RIGHT_WIDTH, out borderRightWidth); if (borderRightWidth != null) { img.BorderWidthRight = utils.ParseValueToPt(borderRightWidth, 1f); } String borderBottomColor = null; cssMap.TryGetValue(CSS.Property.BORDER_BOTTOM_COLOR, out borderBottomColor); if (borderBottomColor != null) { img.BorderColorBottom = HtmlUtilities.DecodeColor(borderBottomColor); } String borderBottomWidth = null; cssMap.TryGetValue(CSS.Property.BORDER_BOTTOM_WIDTH, out borderBottomWidth); if (borderBottomWidth != null) { img.BorderWidthBottom = utils.ParseValueToPt(borderBottomWidth, 1f); } String borderLeftColor = null; cssMap.TryGetValue(CSS.Property.BORDER_LEFT_COLOR, out borderLeftColor); if (borderLeftColor != null) { img.BorderColorLeft = HtmlUtilities.DecodeColor(borderLeftColor); } String borderLeftWidth = null; cssMap.TryGetValue(CSS.Property.BORDER_LEFT_WIDTH, out borderLeftWidth); if (borderLeftWidth != null) { img.BorderWidthLeft = utils.ParseValueToPt(borderLeftWidth, 1f); } // end of border CSS String before = null; cssMap.TryGetValue(CSS.Property.BEFORE, out before); if (before != null) { img.SpacingBefore = float.Parse(before, CultureInfo.InvariantCulture); } String after = null; cssMap.TryGetValue(CSS.Property.AFTER, out after); if (after != null) { img.SpacingAfter = float.Parse(after, CultureInfo.InvariantCulture); } img.WidthPercentage = 0; return(img); }
/** * Styles a paragraph * * @param p the paragraph * @param t the tag * @param configuration the MarginMemory * @return a styled {@link Paragraph} */ virtual public Paragraph Apply(Paragraph p, Tag t, IMarginMemory configuration) { /*MaxLeadingAndSize m = new MaxLeadingAndSize(); * if (configuration.GetRootTags().Contains(t.GetName())) { * m.SetLeading(t); * } else { * m.SetVariablesBasedOnChildren(t); * }*/ CssUtils utils = CssUtils.GetInstance(); float fontSize = FontSizeTranslator.GetInstance().GetFontSize(t); if (fontSize < 0) { fontSize = 0; } float lmb = 0; bool hasLMB = false; IDictionary <String, String> css = t.CSS; foreach (KeyValuePair <String, String> entry in css) { String key = entry.Key; String value = entry.Value; if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_TOP, key)) { p.SpacingBefore = p.SpacingBefore + utils.CalculateMarginTop(value, fontSize, configuration); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_TOP, key)) { p.SpacingBefore = p.SpacingBefore + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_BOTTOM, key)) { float after = utils.ParseValueToPt(value, fontSize); p.SpacingAfter = p.SpacingAfter + after; lmb = after; hasLMB = true; } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_BOTTOM, key)) { p.SpacingAfter = p.SpacingAfter + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_LEFT, key)) { p.IndentationLeft = p.IndentationLeft + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_RIGHT, key)) { p.IndentationRight = p.IndentationRight + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_LEFT, key)) { p.IndentationLeft = p.IndentationLeft + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_RIGHT, key)) { p.IndentationRight = p.IndentationRight + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.TEXT_ALIGN, key)) { if (Util.EqualsIgnoreCase(CSS.Value.RIGHT, value)) { p.Alignment = Element.ALIGN_RIGHT; } else if (Util.EqualsIgnoreCase(CSS.Value.CENTER, value)) { p.Alignment = Element.ALIGN_CENTER; } else if (Util.EqualsIgnoreCase(CSS.Value.LEFT, value)) { p.Alignment = Element.ALIGN_LEFT; } else if (Util.EqualsIgnoreCase(CSS.Value.JUSTIFY, value)) { p.Alignment = Element.ALIGN_JUSTIFIED; } } else if (Util.EqualsIgnoreCase(CSS.Property.TEXT_INDENT, key)) { p.FirstLineIndent = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.LINE_HEIGHT, key)) { if (utils.IsNumericValue(value)) { p.Leading = float.Parse(value) * fontSize; } else if (utils.IsRelativeValue(value)) { p.Leading = utils.ParseRelativeValue(value, fontSize); } else if (utils.IsMetricValue(value)) { p.Leading = utils.ParsePxInCmMmPcToPt(value); } } } // setDefaultMargin to largestFont if no margin-bottom is set and p-tag is child of the root tag. /*if (null != t.GetParent()) { * String parent = t.GetParent().GetName(); * if (css[CSS.Property.MARGIN_TOP] == null && configuration.GetRootTags().Contains(parent)) { * p.SetSpacingBefore(p.GetSpacingBefore() + utils.CalculateMarginTop(fontSize + "pt", 0, configuration)); * } * if (css[CSS.Property.MARGIN_BOTTOM] == null && configuration.GetRootTags().Contains(parent)) { * p.SetSpacingAfter(p.GetSpacingAfter() + fontSize); * css.Put(CSS.Property.MARGIN_BOTTOM, fontSize + "pt"); * lmb = fontSize; * hasLMB = true; * } * //p.SetLeading(m.GetLargestLeading()); We need possibility to detect that line-height undefined; * if (p.GetAlignment() == -1) { * p.SetAlignment(Element.ALIGN_LEFT); * } * }*/ if (hasLMB) { configuration.LastMarginBottom = lmb; } Font font = appliers.ChunkCssAplier.ApplyFontStyles(t); p.Font = font; // TODO reactive for positioning and implement more return(p); }
/** * The ListCssApplier has the capabilities to change the type of the given {@link List} dependable on the css. * This means: <strong>Always replace your list with the returned one and add content to the list after applying!</strong> */ // not implemented: list-style-type:armenian, georgian, decimal-leading-zero. virtual public List Apply(List list, Tag t, IImageProvider htmlPipelineContext) { float fontSize = FontSizeTranslator.GetInstance().GetFontSize(t); List lst = list; IDictionary <String, String> css = t.CSS; String styleType; css.TryGetValue(CSS.Property.LIST_STYLE_TYPE, out styleType); BaseColor color = HtmlUtilities.DecodeColor(css.ContainsKey(CSS.Property.COLOR) ? css[CSS.Property.COLOR] : null); if (null == color) { color = BaseColor.BLACK; } if (null != styleType) { if (Util.EqualsIgnoreCase(styleType, CSS.Value.NONE)) { lst.Lettered = false; lst.Numbered = false; lst.SetListSymbol(""); } else if (Util.EqualsIgnoreCase(CSS.Value.DECIMAL, styleType)) { lst = new List(List.ORDERED); SynchronizeSymbol(fontSize, lst, color); } else if (Util.EqualsIgnoreCase(CSS.Value.DISC, styleType)) { lst = new ZapfDingbatsList(108); lst.Autoindent = false; lst.SymbolIndent = 7.75f; Chunk symbol = lst.Symbol; symbol.SetTextRise(1.5f); Font font = symbol.Font; font.Size = 4.5f; font.Color = color; } else if (Util.EqualsIgnoreCase(CSS.Value.SQUARE, styleType)) { lst = new ZapfDingbatsList(110); ShrinkSymbol(lst, fontSize, color); } else if (Util.EqualsIgnoreCase(CSS.Value.CIRCLE, styleType)) { lst = new ZapfDingbatsList(109); lst.Autoindent = false; lst.SymbolIndent = 7.75f; Chunk symbol = lst.Symbol; symbol.SetTextRise(1.5f); Font font = symbol.Font; font.Size = 4.5f; font.Color = color; } else if (CSS.Value.LOWER_ROMAN.Equals(styleType)) { lst = new RomanList(true, 0); lst.Autoindent = true; SynchronizeSymbol(fontSize, lst, color); } else if (CSS.Value.UPPER_ROMAN.Equals(styleType)) { lst = new RomanList(false, 0); SynchronizeSymbol(fontSize, lst, color); lst.Autoindent = true; } else if (CSS.Value.LOWER_GREEK.Equals(styleType)) { lst = new GreekList(true, 0); SynchronizeSymbol(fontSize, lst, color); lst.Autoindent = true; } else if (CSS.Value.UPPER_GREEK.Equals(styleType)) { lst = new GreekList(false, 0); SynchronizeSymbol(fontSize, lst, color); lst.Autoindent = true; } else if (CSS.Value.LOWER_ALPHA.Equals(styleType) || CSS.Value.LOWER_LATIN.Equals(styleType)) { lst = new List(List.ORDERED, List.ALPHABETICAL); SynchronizeSymbol(fontSize, lst, color); lst.Lowercase = true; lst.Autoindent = true; } else if (CSS.Value.UPPER_ALPHA.Equals(styleType) || CSS.Value.UPPER_LATIN.Equals(styleType)) { lst = new List(List.ORDERED, List.ALPHABETICAL); SynchronizeSymbol(fontSize, lst, color); lst.Lowercase = false; lst.Autoindent = true; } } else if (Util.EqualsIgnoreCase(t.Name, HTML.Tag.OL)) { lst = new List(List.ORDERED); SynchronizeSymbol(fontSize, lst, color); lst.Autoindent = true; } else if (Util.EqualsIgnoreCase(t.Name, HTML.Tag.UL)) { lst = new List(List.UNORDERED); ShrinkSymbol(lst, fontSize, color); } if (css.ContainsKey(CSS.Property.LIST_STYLE_IMAGE) && !Util.EqualsIgnoreCase(css[CSS.Property.LIST_STYLE_IMAGE], CSS.Value.NONE)) { lst = new List(); String url = utils.ExtractUrl(css[CSS.Property.LIST_STYLE_IMAGE]); iTextSharp.text.Image img = null; try { if (htmlPipelineContext == null) { img = new ImageRetrieve().RetrieveImage(url); } else { try { img = new ImageRetrieve(htmlPipelineContext).RetrieveImage(url); } catch (NoImageException) { if (LOG.IsLogging(Level.TRACE)) { LOG.Trace(String.Format(LocaleMessages.GetInstance().GetMessage("css.applier.list.noimage"))); } img = new ImageRetrieve().RetrieveImage(url); } } lst.ListSymbol = new Chunk(img, 0, 0, false); lst.SymbolIndent = img.Width; if (LOG.IsLogging(Level.TRACE)) { LOG.Trace(String.Format(LocaleMessages.GetInstance().GetMessage("html.tag.list"), url)); } } catch (IOException e) { if (LOG.IsLogging(Level.ERROR)) { LOG.Error(String.Format(LocaleMessages.GetInstance().GetMessage("html.tag.list.failed"), url), e); } lst = new List(List.UNORDERED); } catch (NoImageException e) { if (LOG.IsLogging(Level.ERROR)) { LOG.Error(e.Message, e); } lst = new List(List.UNORDERED); } lst.Autoindent = false; } lst.Alignindent = false; float leftIndent = 0; if (css.ContainsKey(CSS.Property.LIST_STYLE_POSITION) && Util.EqualsIgnoreCase(css[CSS.Property.LIST_STYLE_POSITION], CSS.Value.INSIDE)) { leftIndent += 30; } else { leftIndent += 15; } leftIndent += css.ContainsKey(CSS.Property.MARGIN_LEFT)?utils.ParseValueToPt(css[CSS.Property.MARGIN_LEFT], fontSize):0; leftIndent += css.ContainsKey(CSS.Property.PADDING_LEFT)?utils.ParseValueToPt(css[CSS.Property.PADDING_LEFT], fontSize):0; lst.IndentationLeft = leftIndent; String startAtr = null; t.Attributes.TryGetValue(HTML.Attribute.START, out startAtr); if (startAtr != null) { try { int start = int.Parse(startAtr); lst.First = start; } catch (FormatException exc) { } } return(lst); }
/** * Calculates top or bottom spacing of the list. In HTML following possibilities exist: * <ul> * <li><b>padding-top of the ul/ol tag == 0.</b><br /> * The margin-top values of the ul/ol tag and its <b>first</b> li tag are <b>compared</b>. The total spacing before is the largest margin value and the first li's padding-top.</li> * <li><b>padding-top of the ul/ol tag != 0.</b><br /> * The margin-top or bottom values of the ul/ol tag and its first li tag are <b>accumulated</b>, along with padding-top values of both tags.</li> * <li><b>padding-bottom of the ul/ol tag == 0.</b><br /> * The margin-bottom values of the ul/ol tag and its <b>last</b> li tag are <b>compared</b>. The total spacing after is the largest margin value and the first li's padding-bottom.</li> * <li><b>padding-bottom of the ul/ol tag != 0.</b><br /> * The margin-bottom or bottom values of the ul/ol tag and its last li tag are <b>accumulated</b>, along with padding-bottom values of both tags.</li> * </ul> * @param isTop bool, if true the top spacing is calculated, if false the bottom spacing is calculated. * @param storeMarginBottom if true the calculated margin bottom value is stored for later comparison with the top margin value of the next tag. * @param tag the ul/ol tag. * @param child first or last li tag of this list. * @return float containing the spacing before or after. */ private float CalculateTopOrBottomSpacing(bool isTop, bool storeMarginBottom, Tag tag, Tag child, IWorkerContext ctx) { float totalSpacing = 0; try { HtmlPipelineContext context = GetHtmlPipelineContext(ctx); String end = isTop?"-top":"-bottom"; float ownFontSize = fst.GetFontSize(tag); float ownMargin = 0; String marginValue; tag.CSS.TryGetValue(CSS.Property.MARGIN + end, out marginValue); if (marginValue == null) { if (null != tag.Parent && GetHtmlPipelineContext(ctx).GetRootTags().Contains(tag.Parent.Name)) { ownMargin = ownFontSize; } } else { ownMargin = utils.ParseValueToPt(marginValue, ownFontSize); } float ownPadding = 0; if (tag.CSS.ContainsKey(CSS.Property.PADDING + end)) { ownPadding = utils.ParseValueToPt(tag.CSS[CSS.Property.PADDING + end], ownFontSize); } float childFontSize = fst.GetFontSize(child); float childMargin = 0; if (child.CSS.ContainsKey(CSS.Property.MARGIN + end)) { childMargin = utils.ParseValueToPt(child.CSS[CSS.Property.MARGIN + end], childFontSize); } //Margin values of this tag and its first child need to be compared if paddingTop or bottom = 0. if (ownPadding == 0) { float margin = 0; if (ownMargin != 0 && childMargin != 0) { margin = ownMargin >= childMargin?ownMargin:childMargin; } else if (ownMargin != 0) { margin = ownMargin; } else if (childMargin != 0) { margin = childMargin; } if (!isTop && storeMarginBottom) { context.GetMemory()[HtmlPipelineContext.LAST_MARGIN_BOTTOM] = margin; } totalSpacing = margin; } else // ownpadding != 0 and all margins and paddings need to be accumulated. { totalSpacing = ownMargin + ownPadding + childMargin; if (!isTop && storeMarginBottom) { context.GetMemory()[HtmlPipelineContext.LAST_MARGIN_BOTTOM] = ownMargin; } } } catch (NoCustomContextException e) { throw new RuntimeWorkerException(LocaleMessages.GetInstance().GetMessage(LocaleMessages.NO_CUSTOM_CONTEXT), e); } return(totalSpacing); }
/* (non-Javadoc) * @see com.itextpdf.tool.xml.css.CssApplier#apply(com.itextpdf.text.Element, com.itextpdf.tool.xml.Tag) */ virtual public NoNewLineParagraph Apply(NoNewLineParagraph p, Tag t, IMarginMemory configuration) { /*if (this.configuration.GetRootTags().Contains(t.Name)) { * m.SetLeading(t); * } else { * m.SetVariablesBasedOnChildren(t); * }*/ float fontSize = FontSizeTranslator.GetInstance().GetFontSize(t); float lmb = 0; bool hasLMB = false; IDictionary <String, String> css = t.CSS; foreach (KeyValuePair <String, String> entry in css) { String key = entry.Key; String value = entry.Value; if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_TOP, key)) { p.SpacingBefore = p.SpacingBefore + utils.CalculateMarginTop(value, fontSize, configuration); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_TOP, key)) { p.SpacingBefore = p.SpacingBefore + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_BOTTOM, key)) { float after = utils.ParseValueToPt(value, fontSize); p.SpacingAfter = p.SpacingAfter + after; lmb = after; hasLMB = true; } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_BOTTOM, key)) { p.SpacingAfter = p.SpacingAfter + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_LEFT, key)) { p.IndentationLeft = p.IndentationLeft + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_RIGHT, key)) { p.IndentationRight = p.IndentationRight + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_LEFT, key)) { p.IndentationLeft = p.IndentationLeft + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_RIGHT, key)) { p.IndentationRight = p.IndentationRight + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.TEXT_ALIGN, key)) { if (Util.EqualsIgnoreCase(CSS.Value.RIGHT, value)) { p.Alignment = Element.ALIGN_RIGHT; } else if (Util.EqualsIgnoreCase(CSS.Value.CENTER, value)) { p.Alignment = Element.ALIGN_CENTER; } else if (Util.EqualsIgnoreCase(CSS.Value.LEFT, value)) { p.Alignment = Element.ALIGN_LEFT; } else if (Util.EqualsIgnoreCase(CSS.Value.JUSTIFY, value)) { p.Alignment = Element.ALIGN_JUSTIFIED; } } else if (Util.EqualsIgnoreCase(CSS.Property.TEXT_INDENT, key)) { p.FirstLineIndent = utils.ParseValueToPt(value, fontSize); } } // setDefaultMargin to largestFont if no margin-top is set and p-tag is child of the root tag. if (null != t.Parent) { String parent = t.Parent.Name; if (!css.ContainsKey(CSS.Property.MARGIN_TOP) && configuration.GetRootTags().Contains(parent)) { p.SpacingBefore = p.SpacingBefore + utils.CalculateMarginTop(fontSize.ToString(CultureInfo.InvariantCulture) + "pt", 0, configuration); } if (!css.ContainsKey(CSS.Property.MARGIN_BOTTOM) && configuration.GetRootTags().Contains(parent)) { p.SpacingAfter = p.SpacingAfter + fontSize; css[CSS.Property.MARGIN_BOTTOM] = fontSize.ToString(CultureInfo.InvariantCulture) + "pt"; lmb = fontSize; hasLMB = true; } //p.Leading = m.GetLargestLeading(); if (p.Alignment == -1) { p.Alignment = Element.ALIGN_LEFT; } } if (hasLMB) { configuration.LastMarginBottom = lmb; } return(p); }
public override PdfDiv Apply(PdfDiv div, Tag t, IMarginMemory memory, IPageSizeContainable psc, HtmlPipelineContext context) { IDictionary<String, String> css = t.CSS; float fontSize = FontSizeTranslator.GetInstance().TranslateFontSize(t); if (fontSize == Font.UNDEFINED) { fontSize = FontSizeTranslator.DEFAULT_FONT_SIZE; } String align = null; if (t.Attributes.ContainsKey(HTML.Attribute.ALIGN)) { align = t.Attributes[HTML.Attribute.ALIGN]; } else if (css.ContainsKey(CSS.Property.TEXT_ALIGN)) { align = css[CSS.Property.TEXT_ALIGN]; } if (align != null) { div.TextAlignment = CSS.GetElementAlignment(align); } String widthValue; if (!css.TryGetValue(HTML.Attribute.WIDTH, out widthValue)) { t.Attributes.TryGetValue(HTML.Attribute.WIDTH, out widthValue); } if (widthValue != null) { float pageWidth = psc.PageSize.Width; if (utils.IsNumericValue(widthValue) || utils.IsMetricValue(widthValue)) { div.Width = Math.Min(pageWidth, utils.ParsePxInCmMmPcToPt(widthValue)); } else if (utils.IsRelativeValue(widthValue)) { if (widthValue.Contains(CSS.Value.PERCENTAGE)) { div.PercentageWidth = utils.ParseRelativeValue(widthValue, 1f); } else { div.Width = Math.Min(pageWidth, utils.ParseRelativeValue(widthValue, fontSize)); } } } String heightValue; if (!css.TryGetValue(HTML.Attribute.HEIGHT, out heightValue)) { t.Attributes.TryGetValue(HTML.Attribute.HEIGHT, out heightValue); } if (heightValue != null) { if (utils.IsNumericValue(heightValue) || utils.IsMetricValue(heightValue)) { div.Height = utils.ParsePxInCmMmPcToPt(heightValue); } else if (utils.IsRelativeValue(heightValue)) { if (heightValue.Contains(CSS.Value.PERCENTAGE)) { div.PercentageHeight = utils.ParseRelativeValue(heightValue, 1f); } else { div.Height = utils.ParseRelativeValue(heightValue, fontSize); } } } float? marginTop = null; float? marginBottom = null; foreach (KeyValuePair<String, String> entry in css) { String key = entry.Key; String value = entry.Value; if (Util.EqualsIgnoreCase(key, CSS.Property.LEFT)) { div.Left = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.RIGHT)) { if (div.Width == null || div.Left == null) { div.Right = utils.ParseValueToPt(value, fontSize); } } else if (Util.EqualsIgnoreCase(key, CSS.Property.TOP)) { div.Top = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.BOTTOM)) { if (div.Height == null || div.Top == null) { div.Bottom = utils.ParseValueToPt(value, fontSize); } } else if (Util.EqualsIgnoreCase(key, CSS.Property.BACKGROUND_COLOR)) { div.BackgroundColor = HtmlUtilities.DecodeColor(value); } else if (Util.EqualsIgnoreCase(key, CSS.Property.BACKGROUND_IMAGE)) { string url = utils.ExtractUrl(value); try { Image img = new ImageRetrieve(context.ResourcePath, context.GetImageProvider()).RetrieveImage(url); div.BackgroundImage = img; } catch (NoImageException e) { if (LOG.IsLogging(Level.ERROR)) { LOG.Error(string.Format(LocaleMessages.GetInstance().GetMessage("html.tag.img.failed"), url), e); } } } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_LEFT)) { div.PaddingLeft = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_RIGHT)) { div.PaddingRight = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_TOP)) { div.PaddingTop = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_BOTTOM)) { div.PaddingBottom = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_TOP)) { marginTop = utils.CalculateMarginTop(value, fontSize, memory); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_BOTTOM)) { marginBottom = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.FLOAT)) { if (Util.EqualsIgnoreCase(value, CSS.Value.LEFT)) { div.Float = PdfDiv.FloatType.LEFT; } else if (Util.EqualsIgnoreCase(value, CSS.Value.RIGHT)) { div.Float = PdfDiv.FloatType.RIGHT; } } else if (Util.EqualsIgnoreCase(key, CSS.Property.POSITION)) { if (Util.EqualsIgnoreCase(value, CSS.Value.ABSOLUTE)) { div.Position = PdfDiv.PositionType.ABSOLUTE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.FIXED)) { div.Position = PdfDiv.PositionType.FIXED; } else if (Util.EqualsIgnoreCase(value, CSS.Value.RELATIVE)) { div.Position = PdfDiv.PositionType.RELATIVE; } } else if (Util.EqualsIgnoreCase(key, CSS.Property.DISPLAY)) { if (Util.EqualsIgnoreCase(value, CSS.Value.BLOCK)) { div.Display = PdfDiv.DisplayType.BLOCK; } else if (Util.EqualsIgnoreCase(value, CSS.Value.INLINE)) { div.Display = PdfDiv.DisplayType.INLINE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.INLINE_BLOCK)) { div.Display = PdfDiv.DisplayType.INLINE_BLOCK; } else if (Util.EqualsIgnoreCase(value, CSS.Value.INLINE_TABLE)) { div.Display = PdfDiv.DisplayType.INLINE_TABLE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.LIST_ITEM)) { div.Display = PdfDiv.DisplayType.LIST_ITEM; } else if (Util.EqualsIgnoreCase(value, CSS.Value.NONE)) { div.Display = PdfDiv.DisplayType.NONE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.RUN_IN)) { div.Display = PdfDiv.DisplayType.RUN_IN; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE)) { div.Display = PdfDiv.DisplayType.TABLE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_CAPTION)) { div.Display = PdfDiv.DisplayType.TABLE_CAPTION; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_CELL)) { div.Display = PdfDiv.DisplayType.TABLE_CELL; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_COLUMN_GROUP)) { div.Display = PdfDiv.DisplayType.TABLE_COLUMN_GROUP; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_COLUMN)) { div.Display = PdfDiv.DisplayType.TABLE_COLUMN; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_FOOTER_GROUP)) { div.Display = PdfDiv.DisplayType.TABLE_FOOTER_GROUP; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_HEADER_GROUP)) { div.Display = PdfDiv.DisplayType.TABLE_HEADER_GROUP; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_ROW)) { div.Display = PdfDiv.DisplayType.TABLE_ROW; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_ROW_GROUP)) { div.Display = PdfDiv.DisplayType.TABLE_ROW_GROUP; } } else if (Util.EqualsIgnoreCase(CSS.Property.BORDER_TOP_STYLE, key)) { if (Util.EqualsIgnoreCase(CSS.Value.DOTTED, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.DOTTED; } else if (Util.EqualsIgnoreCase(CSS.Value.DASHED, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.DASHED; } else if (Util.EqualsIgnoreCase(CSS.Value.SOLID, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.SOLID; } else if (Util.EqualsIgnoreCase(CSS.Value.DOUBLE, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.DOUBLE; } else if (Util.EqualsIgnoreCase(CSS.Value.GROOVE, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.GROOVE; } else if (Util.EqualsIgnoreCase(CSS.Value.RIDGE, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.RIDGE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.INSET)) { div.BorderStyle = PdfDiv.BorderTopStyle.INSET; } else if (Util.EqualsIgnoreCase(value, CSS.Value.OUTSET)) { div.BorderStyle = PdfDiv.BorderTopStyle.OUTSET; } } else if (Util.EqualsIgnoreCase(key, CSS.Property.PAGE_BREAK_INSIDE)) { if (Util.EqualsIgnoreCase(value, CSS.Value.AVOID)) { div.KeepTogether = true; } } //TODO: border, background properties. } return div; }
/* (non-Javadoc) * @see com.itextpdf.tool.xml.css.CssApplier#apply(com.itextpdf.text.Element, com.itextpdf.tool.xml.Tag) */ public Paragraph Apply(Paragraph p, Tag t, IMarginMemory configuration) { /*if (this.configuration.GetRootTags().Contains(t.Name)) { * m.SetLeading(t); * } else { * m.SetVariablesBasedOnChildren(t); * }*/ float fontSize = FontSizeTranslator.GetInstance().GetFontSize(t); float lmb = 0; bool hasLMB = false; IDictionary <String, String> css = t.CSS; foreach (KeyValuePair <String, String> entry in css) { String key = entry.Key; String value = entry.Value; if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_TOP, key)) { p.SpacingBefore = p.SpacingBefore + utils.CalculateMarginTop(value, fontSize, configuration); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_TOP, key)) { p.SpacingBefore = p.SpacingBefore + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_BOTTOM, key)) { float after = utils.ParseValueToPt(value, fontSize); p.SpacingAfter = p.SpacingAfter + after; lmb = after; hasLMB = true; } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_BOTTOM, key)) { p.SpacingAfter = p.SpacingAfter + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_LEFT, key)) { p.IndentationLeft = p.IndentationLeft + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.MARGIN_RIGHT, key)) { p.IndentationRight = p.IndentationRight + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_LEFT, key)) { p.IndentationLeft = p.IndentationLeft + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.PADDING_RIGHT, key)) { p.IndentationRight = p.IndentationRight + utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.TEXT_ALIGN, key)) { if (Util.EqualsIgnoreCase(CSS.Value.RIGHT, value)) { p.Alignment = Element.ALIGN_RIGHT; } else if (Util.EqualsIgnoreCase(CSS.Value.CENTER, value)) { p.Alignment = Element.ALIGN_CENTER; } else if (Util.EqualsIgnoreCase(CSS.Value.LEFT, value)) { p.Alignment = Element.ALIGN_LEFT; } else if (Util.EqualsIgnoreCase(CSS.Value.JUSTIFY, value)) { p.Alignment = Element.ALIGN_JUSTIFIED; } } else if (Util.EqualsIgnoreCase(CSS.Property.TEXT_INDENT, key)) { p.FirstLineIndent = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(CSS.Property.LINE_HEIGHT, key)) { if (utils.IsNumericValue(value)) { p.Leading = float.Parse(value, CultureInfo.InvariantCulture) * fontSize; } else if (utils.IsRelativeValue(value)) { p.Leading = utils.ParseRelativeValue(value, fontSize); } else if (utils.IsMetricValue(value)) { p.Leading = utils.ParsePxInCmMmPcToPt(value); } } } // setDefaultMargin to largestFont if no margin-bottom is set and p-tag is child of the root tag. /*if (null != t.Parent) { * String parent = t.Parent.Name; * if (!css.ContainsKey(CSS.Property.MARGIN_TOP) && configuration.GetRootTags().Contains(parent)) { * p.SpacingBefore = p.SpacingBefore+utils.CalculateMarginTop(fontSize.ToString(CultureInfo.InvariantCulture)+"pt", 0, configuration); * } * if (!css.ContainsKey(CSS.Property.MARGIN_BOTTOM) && configuration.GetRootTags().Contains(parent)) { * p.SpacingAfter = p.SpacingAfter+fontSize; * css[CSS.Property.MARGIN_BOTTOM] = fontSize.ToString(CultureInfo.InvariantCulture)+"pt"; * lmb = fontSize; * hasLMB = true; * } * p.Leading = m.GetLargestLeading(); * if (p.Alignment == -1) { * p.Alignment = Element.ALIGN_LEFT; * } * }*/ if (hasLMB) { configuration.LastMarginBottom = lmb; } //TODO this only work around for applaying of font properties to paragraph Chunk dummy = new ChunkCssApplier().Apply(new Chunk("dummy"), t); p.Font = dummy.Font; return(p); }
/* * (non-Javadoc) * * @see * com.itextpdf.tool.xml.pipeline.AbstractPipeline#open(com.itextpdf.tool * .xml.Tag, com.itextpdf.tool.xml.pipeline.ProcessObject) */ public override IPipeline Open(IWorkerContext context, Tag t, ProcessObject po) { try { String tagName = t.Name; if (tag.Equals(tagName)) { MapContext cc; cc = (MapContext)context.Get(typeof(PdfWriterPipeline).FullName); Document d = new Document(pagesize); try { Stream os = fm.GetStream(); cc[PdfWriterPipeline.DOCUMENT] = d; cc[PdfWriterPipeline.WRITER] = PdfWriter.GetInstance(d, os); } catch (IOException e) { throw new PipelineException(e); } catch (DocumentException e) { throw new PipelineException(e); } } if (Util.EqualsIgnoreCase(t.Name, opentag)) { MapContext cc; cc = (MapContext)context.Get(typeof(PdfWriterPipeline).FullName); Document d = (Document)cc[PdfWriterPipeline.DOCUMENT]; CssUtils cssUtils = CssUtils.GetInstance(); float pageWidth = d.PageSize.Width; float marginLeft = 0; float marginRight = 0; float marginTop = 0; float marginBottom = 0; IDictionary <String, String> css = t.CSS; foreach (KeyValuePair <String, String> entry in css) { String key = entry.Key; String value = entry.Value; if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_LEFT)) { marginLeft = cssUtils.ParseValueToPt(value, pageWidth); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_RIGHT)) { marginRight = cssUtils.ParseValueToPt(value, pageWidth); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_TOP)) { marginTop = cssUtils.ParseValueToPt(value, pageWidth); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_BOTTOM)) { marginBottom = cssUtils.ParseValueToPt(value, pageWidth); } } d.SetMargins(marginLeft, marginRight, marginTop, marginBottom); d.Open(); } } catch (NoCustomContextException e) { throw new PipelineException(LocaleMessages.GetInstance().GetMessage(LocaleMessages.PIPELINE_AUTODOC), e); } return(GetNext()); }
public PdfDiv apply(PdfDiv div, Tag t, IMarginMemory memory, IPageSizeContainable psc) { IDictionary <String, String> css = t.CSS; float fontSize = FontSizeTranslator.GetInstance().TranslateFontSize(t); if (fontSize == Font.UNDEFINED) { fontSize = FontSizeTranslator.DEFAULT_FONT_SIZE; } String align = null; if (t.Attributes.ContainsKey(HTML.Attribute.ALIGN)) { align = t.Attributes[HTML.Attribute.ALIGN]; } else if (css.ContainsKey(CSS.Property.TEXT_ALIGN)) { align = css[CSS.Property.TEXT_ALIGN]; } if (align != null) { if (Util.EqualsIgnoreCase(align, CSS.Value.CENTER)) { div.TextAlignment = Element.ALIGN_CENTER; } else if (Util.EqualsIgnoreCase(align, CSS.Value.RIGHT)) { div.TextAlignment = Element.ALIGN_RIGHT; } else if (Util.EqualsIgnoreCase(align, CSS.Value.JUSTIFY)) { div.TextAlignment = Element.ALIGN_JUSTIFIED; } } String widthValue; if (!t.CSS.TryGetValue(HTML.Attribute.WIDTH, out widthValue)) { t.Attributes.TryGetValue(HTML.Attribute.WIDTH, out widthValue); } if (widthValue != null) { if (utils.IsNumericValue(widthValue) || utils.IsMetricValue(widthValue)) { div.Width = utils.ParsePxInCmMmPcToPt(widthValue); } else if (utils.IsRelativeValue(widthValue)) { if (widthValue.Contains(CSS.Value.PERCENTAGE)) { div.PercentageWidth = utils.ParseRelativeValue(widthValue, 1f); } else { div.Width = utils.ParseRelativeValue(widthValue, fontSize); } } } String heightValue; if (!t.CSS.TryGetValue(HTML.Attribute.HEIGHT, out heightValue)) { t.Attributes.TryGetValue(HTML.Attribute.HEIGHT, out heightValue); } if (heightValue != null) { if (utils.IsNumericValue(heightValue) || utils.IsMetricValue(heightValue)) { div.Height = utils.ParsePxInCmMmPcToPt(heightValue); } else if (utils.IsRelativeValue(heightValue)) { if (heightValue.Contains(CSS.Value.PERCENTAGE)) { div.PercentageHeight = utils.ParseRelativeValue(heightValue, 1f); } else { div.Height = utils.ParseRelativeValue(heightValue, fontSize); } } } float?marginTop = null; float?marginBottom = null; foreach (KeyValuePair <String, String> entry in css) { String key = entry.Key; String value = entry.Value; if (Util.EqualsIgnoreCase(key, CSS.Property.LEFT)) { div.Left = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.RIGHT)) { if (div.Width == null || div.Left == null) { div.Right = utils.ParseValueToPt(value, fontSize); } } else if (Util.EqualsIgnoreCase(key, CSS.Property.TOP)) { div.Top = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.BOTTOM)) { if (div.Height == null || div.Top == null) { div.Bottom = utils.ParseValueToPt(value, fontSize); } } else if (Util.EqualsIgnoreCase(key, CSS.Property.BACKGROUND_COLOR)) { div.BackgroundColor = HtmlUtilities.DecodeColor(value); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_LEFT)) { div.PaddingLeft = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_RIGHT)) { div.PaddingRight = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_TOP)) { div.PaddingTop = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_BOTTOM)) { div.PaddingBottom = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_TOP)) { marginTop = utils.CalculateMarginTop(value, fontSize, memory); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_BOTTOM)) { marginBottom = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.FLOAT)) { if (Util.EqualsIgnoreCase(value, CSS.Value.LEFT)) { div.Float = PdfDiv.FloatType.LEFT; } else if (Util.EqualsIgnoreCase(value, CSS.Value.RIGHT)) { div.Float = PdfDiv.FloatType.RIGHT; } } else if (Util.EqualsIgnoreCase(key, CSS.Property.POSITION)) { if (Util.EqualsIgnoreCase(value, CSS.Value.ABSOLUTE)) { div.Position = PdfDiv.PositionType.ABSOLUTE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.FIXED)) { div.Position = PdfDiv.PositionType.FIXED; } else if (Util.EqualsIgnoreCase(value, CSS.Value.RELATIVE)) { div.Position = PdfDiv.PositionType.RELATIVE; } } //TODO: border, background properties. } return(div); }
virtual public PdfDiv apply(PdfDiv div, Tag t, IMarginMemory memory, IPageSizeContainable psc) { IDictionary <String, String> css = t.CSS; float fontSize = FontSizeTranslator.GetInstance().TranslateFontSize(t); if (fontSize == Font.UNDEFINED) { fontSize = FontSizeTranslator.DEFAULT_FONT_SIZE; } String align = null; if (t.Attributes.ContainsKey(HTML.Attribute.ALIGN)) { align = t.Attributes[HTML.Attribute.ALIGN]; } else if (css.ContainsKey(CSS.Property.TEXT_ALIGN)) { align = css[CSS.Property.TEXT_ALIGN]; } if (align != null) { if (Util.EqualsIgnoreCase(align, CSS.Value.CENTER)) { div.TextAlignment = Element.ALIGN_CENTER; } else if (Util.EqualsIgnoreCase(align, CSS.Value.LEFT)) { div.TextAlignment = Element.ALIGN_LEFT; } else if (Util.EqualsIgnoreCase(align, CSS.Value.RIGHT)) { div.TextAlignment = Element.ALIGN_RIGHT; } else if (Util.EqualsIgnoreCase(align, CSS.Value.JUSTIFY)) { div.TextAlignment = Element.ALIGN_JUSTIFIED; } } String widthValue; if (!t.CSS.TryGetValue(HTML.Attribute.WIDTH, out widthValue)) { t.Attributes.TryGetValue(HTML.Attribute.WIDTH, out widthValue); } if (widthValue != null) { float pageWidth = psc.PageSize.Width; if (utils.IsNumericValue(widthValue) || utils.IsMetricValue(widthValue)) { div.Width = Math.Min(pageWidth, utils.ParsePxInCmMmPcToPt(widthValue)); } else if (utils.IsRelativeValue(widthValue)) { if (widthValue.Contains(CSS.Value.PERCENTAGE)) { div.PercentageWidth = utils.ParseRelativeValue(widthValue, 1f); } else { div.Width = Math.Min(pageWidth, utils.ParseRelativeValue(widthValue, fontSize)); } } } String heightValue; if (!t.CSS.TryGetValue(HTML.Attribute.HEIGHT, out heightValue)) { t.Attributes.TryGetValue(HTML.Attribute.HEIGHT, out heightValue); } if (heightValue != null) { if (utils.IsNumericValue(heightValue) || utils.IsMetricValue(heightValue)) { div.Height = utils.ParsePxInCmMmPcToPt(heightValue); } else if (utils.IsRelativeValue(heightValue)) { if (heightValue.Contains(CSS.Value.PERCENTAGE)) { div.PercentageHeight = utils.ParseRelativeValue(heightValue, 1f); } else { div.Height = utils.ParseRelativeValue(heightValue, fontSize); } } } float?marginTop = null; float?marginBottom = null; foreach (KeyValuePair <String, String> entry in css) { String key = entry.Key; String value = entry.Value; if (Util.EqualsIgnoreCase(key, CSS.Property.LEFT)) { div.Left = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.RIGHT)) { if (div.Width == null || div.Left == null) { div.Right = utils.ParseValueToPt(value, fontSize); } } else if (Util.EqualsIgnoreCase(key, CSS.Property.TOP)) { div.Top = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.BOTTOM)) { if (div.Height == null || div.Top == null) { div.Bottom = utils.ParseValueToPt(value, fontSize); } } else if (Util.EqualsIgnoreCase(key, CSS.Property.BACKGROUND_COLOR)) { div.BackgroundColor = HtmlUtilities.DecodeColor(value); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_LEFT)) { div.PaddingLeft = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_RIGHT)) { div.PaddingRight = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_TOP)) { div.PaddingTop = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.PADDING_BOTTOM)) { div.PaddingBottom = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_TOP)) { marginTop = utils.CalculateMarginTop(value, fontSize, memory); } else if (Util.EqualsIgnoreCase(key, CSS.Property.MARGIN_BOTTOM)) { marginBottom = utils.ParseValueToPt(value, fontSize); } else if (Util.EqualsIgnoreCase(key, CSS.Property.FLOAT)) { if (Util.EqualsIgnoreCase(value, CSS.Value.LEFT)) { div.Float = PdfDiv.FloatType.LEFT; } else if (Util.EqualsIgnoreCase(value, CSS.Value.RIGHT)) { div.Float = PdfDiv.FloatType.RIGHT; } } else if (Util.EqualsIgnoreCase(key, CSS.Property.POSITION)) { if (Util.EqualsIgnoreCase(value, CSS.Value.ABSOLUTE)) { div.Position = PdfDiv.PositionType.ABSOLUTE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.FIXED)) { div.Position = PdfDiv.PositionType.FIXED; } else if (Util.EqualsIgnoreCase(value, CSS.Value.RELATIVE)) { div.Position = PdfDiv.PositionType.RELATIVE; } } else if (Util.EqualsIgnoreCase(key, CSS.Property.DISPLAY)) { if (Util.EqualsIgnoreCase(value, CSS.Value.BLOCK)) { div.Display = PdfDiv.DisplayType.BLOCK; } else if (Util.EqualsIgnoreCase(value, CSS.Value.INLINE)) { div.Display = PdfDiv.DisplayType.INLINE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.INLINE_BLOCK)) { div.Display = PdfDiv.DisplayType.INLINE_BLOCK; } else if (Util.EqualsIgnoreCase(value, CSS.Value.INLINE_TABLE)) { div.Display = PdfDiv.DisplayType.INLINE_TABLE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.LIST_ITEM)) { div.Display = PdfDiv.DisplayType.LIST_ITEM; } else if (Util.EqualsIgnoreCase(value, CSS.Value.NONE)) { div.Display = PdfDiv.DisplayType.NONE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.RUN_IN)) { div.Display = PdfDiv.DisplayType.RUN_IN; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE)) { div.Display = PdfDiv.DisplayType.TABLE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_CAPTION)) { div.Display = PdfDiv.DisplayType.TABLE_CAPTION; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_CELL)) { div.Display = PdfDiv.DisplayType.TABLE_CELL; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_COLUMN_GROUP)) { div.Display = PdfDiv.DisplayType.TABLE_COLUMN_GROUP; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_COLUMN)) { div.Display = PdfDiv.DisplayType.TABLE_COLUMN; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_FOOTER_GROUP)) { div.Display = PdfDiv.DisplayType.TABLE_FOOTER_GROUP; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_HEADER_GROUP)) { div.Display = PdfDiv.DisplayType.TABLE_HEADER_GROUP; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_ROW)) { div.Display = PdfDiv.DisplayType.TABLE_ROW; } else if (Util.EqualsIgnoreCase(value, CSS.Value.TABLE_ROW_GROUP)) { div.Display = PdfDiv.DisplayType.TABLE_ROW_GROUP; } } else if (Util.EqualsIgnoreCase(CSS.Property.BORDER_TOP_STYLE, key)) { if (Util.EqualsIgnoreCase(CSS.Value.DOTTED, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.DOTTED; } else if (Util.EqualsIgnoreCase(CSS.Value.DASHED, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.DASHED; } else if (Util.EqualsIgnoreCase(CSS.Value.SOLID, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.SOLID; } else if (Util.EqualsIgnoreCase(CSS.Value.DOUBLE, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.DOUBLE; } else if (Util.EqualsIgnoreCase(CSS.Value.GROOVE, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.GROOVE; } else if (Util.EqualsIgnoreCase(CSS.Value.RIDGE, value)) { div.BorderStyle = PdfDiv.BorderTopStyle.RIDGE; } else if (Util.EqualsIgnoreCase(value, CSS.Value.INSET)) { div.BorderStyle = PdfDiv.BorderTopStyle.INSET; } else if (Util.EqualsIgnoreCase(value, CSS.Value.OUTSET)) { div.BorderStyle = PdfDiv.BorderTopStyle.OUTSET; } } //TODO: border, background properties. } return(div); }