Пример #1
0
        public virtual void EndElement(String tag)
        {
            if (!tagsSupported.ContainsKey(tag))
            {
                return;
            }
            String follow = (String)FactoryProperties.followTags[tag];

            if (follow != null)
            {
                cprops.RemoveChain(follow);
                return;
            }
            if (tag.Equals("font") || tag.Equals("span"))
            {
                cprops.RemoveChain(tag);
                return;
            }
            if (tag.Equals("a"))
            {
                if (currentParagraph == null)
                {
                    currentParagraph = new Paragraph();
                }
                IALink i    = null;
                bool   skip = false;
                if (interfaceProps != null)
                {
                    i = (IALink)interfaceProps["alink_interface"];
                    if (i != null)
                    {
                        skip = i.Process(currentParagraph, cprops);
                    }
                }
                if (!skip)
                {
                    String href = cprops["href"];
                    if (href != null)
                    {
                        ArrayList chunks = currentParagraph.Chunks;
                        for (int k = 0; k < chunks.Count; ++k)
                        {
                            Chunk ck = (Chunk)chunks[k];
                            ck.SetAnchor(href);
                        }
                    }
                }
                Paragraph tmp  = (Paragraph)stack.Pop();
                Phrase    tmp2 = new Phrase();
                tmp2.Add(currentParagraph);
                tmp.Add(tmp2);
                currentParagraph = tmp;
                cprops.RemoveChain("a");
                return;
            }
            if (tag.Equals("br"))
            {
                return;
            }
            if (currentParagraph != null)
            {
                if (stack.Count == 0)
                {
                    document.Add(currentParagraph);
                }
                else
                {
                    Object obj = stack.Pop();
                    if (obj is ITextElementArray)
                    {
                        ITextElementArray current = (ITextElementArray)obj;
                        current.Add(currentParagraph);
                    }
                    stack.Push(obj);
                }
            }
            currentParagraph = null;
            if (tag.Equals(HtmlTags.UNORDEREDLIST) || tag.Equals(HtmlTags.ORDEREDLIST))
            {
                if (pendingLI)
                {
                    EndElement(HtmlTags.LISTITEM);
                }
                skipText = false;
                cprops.RemoveChain(tag);
                if (stack.Count == 0)
                {
                    return;
                }
                Object obj = stack.Pop();
                if (!(obj is List))
                {
                    stack.Push(obj);
                    return;
                }
                if (stack.Count == 0)
                {
                    document.Add((IElement)obj);
                }
                else
                {
                    ((ITextElementArray)stack.Peek()).Add(obj);
                }
                return;
            }
            if (tag.Equals(HtmlTags.LISTITEM))
            {
                pendingLI = false;
                skipText  = true;
                cprops.RemoveChain(tag);
                if (stack.Count == 0)
                {
                    return;
                }
                Object obj = stack.Pop();
                if (!(obj is ListItem))
                {
                    stack.Push(obj);
                    return;
                }
                if (stack.Count == 0)
                {
                    document.Add((IElement)obj);
                    return;
                }
                Object list = stack.Pop();
                if (!(list is List))
                {
                    stack.Push(list);
                    return;
                }
                ListItem item = (ListItem)obj;
                ((List)list).Add(item);
                ArrayList cks = item.Chunks;
                if (cks.Count > 0)
                {
                    item.ListSymbol.Font = ((Chunk)cks[0]).Font;
                }
                stack.Push(list);
                return;
            }
            if (tag.Equals("div") || tag.Equals("body"))
            {
                cprops.RemoveChain(tag);
                return;
            }
            if (tag.Equals(HtmlTags.PRE))
            {
                cprops.RemoveChain(tag);
                isPRE = false;
                return;
            }
            if (tag.Equals("p"))
            {
                cprops.RemoveChain(tag);
                return;
            }
            if (tag.Equals("h1") || tag.Equals("h2") || tag.Equals("h3") || tag.Equals("h4") || tag.Equals("h5") || tag.Equals("h6"))
            {
                cprops.RemoveChain(tag);
                return;
            }
            if (tag.Equals("table"))
            {
                if (pendingTR)
                {
                    EndElement("tr");
                }
                cprops.RemoveChain("table");
                IncTable  table = (IncTable)stack.Pop();
                PdfPTable tb    = table.BuildTable();
                tb.SplitRows = true;
                if (stack.Count == 0)
                {
                    document.Add(tb);
                }
                else
                {
                    ((ITextElementArray)stack.Peek()).Add(tb);
                }
                bool[] state = (bool[])tableState.Pop();
                pendingTR = state[0];
                pendingTD = state[1];
                skipText  = false;
                return;
            }
            if (tag.Equals("tr"))
            {
                if (pendingTD)
                {
                    EndElement("td");
                }
                pendingTR = false;
                cprops.RemoveChain("tr");
                ArrayList cells = new ArrayList();
                IncTable  table = null;
                while (true)
                {
                    Object obj = stack.Pop();
                    if (obj is IncCell)
                    {
                        cells.Add(((IncCell)obj).Cell);
                    }
                    if (obj is IncTable)
                    {
                        table = (IncTable)obj;
                        break;
                    }
                }
                table.AddCols(cells);
                table.EndRow();
                stack.Push(table);
                skipText = true;
                return;
            }
            if (tag.Equals("td") || tag.Equals("th"))
            {
                pendingTD = false;
                cprops.RemoveChain("td");
                skipText = true;
                return;
            }
        }
Пример #2
0
        public virtual void StartElement(String tag, Hashtable h)
        {
            if (!tagsSupported.ContainsKey(tag))
            {
                return;
            }
            style.ApplyStyle(tag, h);
            String follow = (String)FactoryProperties.followTags[tag];

            if (follow != null)
            {
                Hashtable prop = new Hashtable();
                prop[follow] = null;
                cprops.AddToChain(follow, prop);
                return;
            }
            FactoryProperties.InsertStyle(h, cprops);
            if (tag.Equals(HtmlTags.ANCHOR))
            {
                cprops.AddToChain(tag, h);
                if (currentParagraph == null)
                {
                    currentParagraph = new Paragraph();
                }
                stack.Push(currentParagraph);
                currentParagraph = new Paragraph();
                return;
            }
            if (tag.Equals(HtmlTags.NEWLINE))
            {
                if (currentParagraph == null)
                {
                    currentParagraph = new Paragraph();
                }
                currentParagraph.Add(factoryProperties.CreateChunk("\n", cprops));
                return;
            }
            if (tag.Equals(HtmlTags.HORIZONTALRULE))
            {
                // Attempting to duplicate the behavior seen on Firefox with
                // http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_hr_test
                // where an initial break is only inserted when the preceding element doesn't
                // end with a break, but a trailing break is always inserted.
                bool addLeadingBreak = true;
                if (currentParagraph == null)
                {
                    currentParagraph = new Paragraph();
                    addLeadingBreak  = false;
                }
                if (addLeadingBreak)   // Not a new paragraph
                {
                    int numChunks = currentParagraph.Chunks.Count;
                    if (numChunks == 0 ||
                        ((Chunk)currentParagraph.Chunks[numChunks - 1]).Content.EndsWith("\n"))
                    {
                        addLeadingBreak = false;
                    }
                }
                String align   = (String)h["align"];
                int    hrAlign = Element.ALIGN_CENTER;
                if (align != null)
                {
                    if (Util.EqualsIgnoreCase(align, "left"))
                    {
                        hrAlign = Element.ALIGN_LEFT;
                    }
                    if (Util.EqualsIgnoreCase(align, "right"))
                    {
                        hrAlign = Element.ALIGN_RIGHT;
                    }
                }
                String width   = (String)h["width"];
                float  hrWidth = 1;
                if (width != null)
                {
                    float tmpWidth = Markup.ParseLength(width, Markup.DEFAULT_FONT_SIZE);
                    if (tmpWidth > 0)
                    {
                        hrWidth = tmpWidth;
                    }
                    if (!width.EndsWith("%"))
                    {
                        hrWidth = 100; // Treat a pixel width as 100% for now.
                    }
                }
                String size   = (String)h["size"];
                float  hrSize = 1;
                if (size != null)
                {
                    float tmpSize = Markup.ParseLength(size, Markup.DEFAULT_FONT_SIZE);
                    if (tmpSize > 0)
                    {
                        hrSize = tmpSize;
                    }
                }
                if (addLeadingBreak)
                {
                    currentParagraph.Add(Chunk.NEWLINE);
                }
                currentParagraph.Add(new LineSeparator(hrSize, hrWidth, null, hrAlign, currentParagraph.Leading / 2));
                currentParagraph.Add(Chunk.NEWLINE);
                return;
            }
            if (tag.Equals(HtmlTags.CHUNK) || tag.Equals(HtmlTags.SPAN))
            {
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals(HtmlTags.IMAGE))
            {
                String src = (String)h[ElementTags.SRC];
                if (src == null)
                {
                    return;
                }
                cprops.AddToChain(tag, h);
                Image img = null;
                if (interfaceProps != null)
                {
                    IImageProvider ip = (IImageProvider)interfaceProps["img_provider"];
                    if (ip != null)
                    {
                        img = ip.GetImage(src, h, cprops, document);
                    }
                    if (img == null)
                    {
                        Hashtable images = (Hashtable)interfaceProps["img_static"];
                        if (images != null)
                        {
                            Image tim = (Image)images[src];
                            if (tim != null)
                            {
                                img = Image.GetInstance(tim);
                            }
                        }
                        else
                        {
                            if (!src.StartsWith("http"))   // relative src references only
                            {
                                String baseurl = (String)interfaceProps["img_baseurl"];
                                if (baseurl != null)
                                {
                                    src = baseurl + src;
                                    img = Image.GetInstance(src);
                                }
                            }
                        }
                    }
                }
                if (img == null)
                {
                    if (!src.StartsWith("http"))
                    {
                        String path = cprops["image_path"];
                        if (path == null)
                        {
                            path = "";
                        }
                        src = Path.Combine(path, src);
                    }
                    img = Image.GetInstance(src);
                }
                String align  = (String)h["align"];
                String width  = (String)h["width"];
                String height = (String)h["height"];
                String before = cprops["before"];
                String after  = cprops["after"];
                if (before != null)
                {
                    img.SpacingBefore = float.Parse(before, System.Globalization.NumberFormatInfo.InvariantInfo);
                }
                if (after != null)
                {
                    img.SpacingAfter = float.Parse(after, System.Globalization.NumberFormatInfo.InvariantInfo);
                }
                float actualFontSize = Markup.ParseLength(cprops[ElementTags.SIZE], Markup.DEFAULT_FONT_SIZE);
                if (actualFontSize <= 0f)
                {
                    actualFontSize = Markup.DEFAULT_FONT_SIZE;
                }
                float widthInPoints  = Markup.ParseLength(width, actualFontSize);
                float heightInPoints = Markup.ParseLength(height, actualFontSize);
                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);
                }
                img.WidthPercentage = 0;
                if (align != null)
                {
                    EndElement("p");
                    int ralign = Image.MIDDLE_ALIGN;
                    if (Util.EqualsIgnoreCase(align, "left"))
                    {
                        ralign = Image.LEFT_ALIGN;
                    }
                    else if (Util.EqualsIgnoreCase(align, "right"))
                    {
                        ralign = Image.RIGHT_ALIGN;
                    }
                    img.Alignment = ralign;
                    IImg i    = null;
                    bool skip = false;
                    if (interfaceProps != null)
                    {
                        i = (IImg)interfaceProps["img_interface"];
                        if (i != null)
                        {
                            skip = i.Process(img, h, cprops, document);
                        }
                    }
                    if (!skip)
                    {
                        document.Add(img);
                    }
                    cprops.RemoveChain(tag);
                }
                else
                {
                    cprops.RemoveChain(tag);
                    if (currentParagraph == null)
                    {
                        currentParagraph = FactoryProperties.CreateParagraph(cprops);
                    }
                    currentParagraph.Add(new Chunk(img, 0, 0));
                }
                return;
            }

            EndElement("p");
            if (tag.Equals("h1") || tag.Equals("h2") || tag.Equals("h3") || tag.Equals("h4") || tag.Equals("h5") || tag.Equals("h6"))
            {
                if (!h.ContainsKey(ElementTags.SIZE))
                {
                    int v = 7 - int.Parse(tag.Substring(1));
                    h[ElementTags.SIZE] = v.ToString();
                }
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals(HtmlTags.UNORDEREDLIST))
            {
                if (pendingLI)
                {
                    EndElement(HtmlTags.LISTITEM);
                }
                skipText = true;
                cprops.AddToChain(tag, h);
                List list = new List(false);
                try{
                    list.IndentationLeft = float.Parse(cprops["indent"], System.Globalization.NumberFormatInfo.InvariantInfo);
                }catch {
                    list.Autoindent = true;
                }
                list.SetListSymbol("\u2022");
                stack.Push(list);
                return;
            }
            if (tag.Equals(HtmlTags.ORDEREDLIST))
            {
                if (pendingLI)
                {
                    EndElement(HtmlTags.LISTITEM);
                }
                skipText = true;
                cprops.AddToChain(tag, h);
                List list = new List(true);
                try{
                    list.IndentationLeft = float.Parse(cprops["indent"], System.Globalization.NumberFormatInfo.InvariantInfo);
                }catch {
                    list.Autoindent = true;
                }
                stack.Push(list);
                return;
            }
            if (tag.Equals(HtmlTags.LISTITEM))
            {
                if (pendingLI)
                {
                    EndElement(HtmlTags.LISTITEM);
                }
                skipText  = false;
                pendingLI = true;
                cprops.AddToChain(tag, h);
                stack.Push(FactoryProperties.CreateListItem(cprops));
                return;
            }
            if (tag.Equals(HtmlTags.DIV) || tag.Equals(HtmlTags.BODY) || tag.Equals("p"))
            {
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals(HtmlTags.PRE))
            {
                if (!h.ContainsKey(ElementTags.FACE))
                {
                    h[ElementTags.FACE] = "Courier";
                }
                cprops.AddToChain(tag, h);
                isPRE = true;
                return;
            }
            if (tag.Equals("tr"))
            {
                if (pendingTR)
                {
                    EndElement("tr");
                }
                skipText  = true;
                pendingTR = true;
                cprops.AddToChain("tr", h);
                return;
            }
            if (tag.Equals("td") || tag.Equals("th"))
            {
                if (pendingTD)
                {
                    EndElement(tag);
                }
                skipText  = false;
                pendingTD = true;
                cprops.AddToChain("td", h);
                stack.Push(new IncCell(tag, cprops));
                return;
            }
            if (tag.Equals("table"))
            {
                cprops.AddToChain("table", h);
                IncTable table = new IncTable(h);
                stack.Push(table);
                tableState.Push(new bool[] { pendingTR, pendingTD });
                pendingTR = pendingTD = false;
                skipText  = true;
                return;
            }
        }
Пример #3
0
        public void StartElement(String tag, Hashtable h)
        {
            if (!tagsSupported.ContainsKey(tag))
                return;
            style.ApplyStyle(tag, h);
            String follow = (String)FactoryProperties.followTags[tag];
            if (follow != null) {
                Hashtable prop = new Hashtable();
                prop[follow] = null;
                cprops.AddToChain(follow, prop);
                return;
            }
            FactoryProperties.InsertStyle(h);
            if (tag.Equals("a")) {
                cprops.AddToChain(tag, h);
                if (currentParagraph == null)
                    currentParagraph = new Paragraph();
                stack.Push(currentParagraph);
                currentParagraph = new Paragraph();
                return;
            }
            if (tag.Equals("br")) {
                if (currentParagraph == null)
                    currentParagraph = new Paragraph();
                currentParagraph.Add(factoryProperties.CreateChunk("\n", cprops));
                return;
            }
            if (tag.Equals("font") || tag.Equals("span")) {
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals("img")) {
                String src = (String)h["src"];
                if (src == null)
                    return;
                cprops.AddToChain(tag, h);
                Image img = null;
                if (interfaceProps != null) {
                    Hashtable images = (Hashtable)interfaceProps["img_static"];
                    if (images != null) {
                        Image tim = (Image)images[src];
                        if (tim != null)
                            img = Image.GetInstance(tim);
                    } else {
                        if (!src.StartsWith("http")) { // relative src references only
                            String baseurl = (String)interfaceProps["img_baseurl"];
                            if (baseurl != null) {
                                src = baseurl + src;
                                img = Image.GetInstance(src);
                            }
                        }
                    }
                }
                if (img == null) {
                    if (!src.StartsWith("http")) {
                        String path = cprops["image_path"];
                        if (path == null)
                            path = "";
                        src = Path.Combine(path, src);
                    }
                    img = Image.GetInstance(src);
                }
                String align = (String)h["align"];
                String width = (String)h["width"];
                String height = (String)h["height"];
                String before = cprops["before"];
                String after = cprops["after"];
                if (before != null)
                    img.SpacingBefore = float.Parse(before, System.Globalization.NumberFormatInfo.InvariantInfo);
                if (after != null)
                    img.SpacingAfter = float.Parse(after, System.Globalization.NumberFormatInfo.InvariantInfo);
                float wp = LengthParse(width, (int)img.Width);
                float lp = LengthParse(height, (int)img.Height);
                if (wp > 0 && lp > 0)
                    img.ScalePercent(wp > lp ? lp : wp);
                else if (wp > 0)
                    img.ScalePercent(wp);
                else if (lp > 0)
                    img.ScalePercent(lp);
                img.WidthPercentage = 0;
                if (align != null) {
                    EndElement("p");
                    int ralign = Image.MIDDLE_ALIGN;
                    if (Util.EqualsIgnoreCase(align, "left"))
                        ralign = Image.LEFT_ALIGN;
                    else if (Util.EqualsIgnoreCase(align, "right"))
                        ralign = Image.RIGHT_ALIGN;
                    img.Alignment = ralign;
                    IImg i = null;
                    bool skip = false;
                    if (interfaceProps != null) {
                        i = (IImg)interfaceProps["img_interface"];
                        if (i != null)
                            skip = i.Process(img, h, cprops, document);
                    }
                    if (!skip)
                        document.Add(img);
                    cprops.RemoveChain(tag);
                }
                else {
                    cprops.RemoveChain(tag);
                    if (currentParagraph == null)
                        currentParagraph = FactoryProperties.CreateParagraph(cprops);
                    currentParagraph.Add(new Chunk(img, 0, 0));
                }
                return;
            }

            EndElement("p");
            if (tag.Equals("h1") || tag.Equals("h2") || tag.Equals("h3") || tag.Equals("h4") || tag.Equals("h5") || tag.Equals("h6")) {
                if (!h.ContainsKey("size")) {
                    int v = 7 - int.Parse(tag.Substring(1));
                    h["size"] = v.ToString();
                }
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals("ul")) {
                if (pendingLI)
                    EndElement("li");
                skipText = true;
                cprops.AddToChain(tag, h);
                List list = new List(false, 10);
                list.SetListSymbol("\u2022");
                stack.Push(list);
                return;
            }
            if (tag.Equals("ol")) {
                if (pendingLI)
                    EndElement("li");
                skipText = true;
                cprops.AddToChain(tag, h);
                List list = new List(true, 10);
                stack.Push(list);
                return;
            }
            if (tag.Equals("li")) {
                if (pendingLI)
                    EndElement("li");
                skipText = false;
                pendingLI = true;
                cprops.AddToChain(tag, h);
                stack.Push(FactoryProperties.CreateListItem(cprops));
                return;
            }
            if (tag.Equals("div") || tag.Equals("body")) {
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals("pre")) {
                if (!h.ContainsKey("face")) {
                    h["face"] = "Courier";
                }
                cprops.AddToChain(tag, h);
                isPRE = true;
                return;
            }
            if (tag.Equals("p")) {
                cprops.AddToChain(tag, h);
                currentParagraph = FactoryProperties.CreateParagraph(h);
                return;
            }
            if (tag.Equals("tr")) {
                if (pendingTR)
                    EndElement("tr");
                skipText = true;
                pendingTR = true;
                cprops.AddToChain("tr", h);
                return;
            }
            if (tag.Equals("td") || tag.Equals("th")) {
                if (pendingTD)
                    EndElement(tag);
                skipText = false;
                pendingTD = true;
                cprops.AddToChain("td", h);
                stack.Push(new IncCell(tag, cprops));
                return;
            }
            if (tag.Equals("table")) {
                cprops.AddToChain("table", h);
                IncTable table = new IncTable(h);
                stack.Push(table);
                tableState.Push(new bool[]{pendingTR, pendingTD});
                pendingTR = pendingTD = false;
                skipText = true;
                return;
            }
        }
Пример #4
0
        public virtual void StartElement(String tag, Hashtable h) {
            if (!tagsSupported.ContainsKey(tag))
                return;
            style.ApplyStyle(tag, h);
            String follow = (String)FactoryProperties.followTags[tag];
            if (follow != null) {
                Hashtable prop = new Hashtable();
                prop[follow] = null;
                cprops.AddToChain(follow, prop);
                return;
            }
            FactoryProperties.InsertStyle(h, cprops);
            if (tag.Equals(HtmlTags.ANCHOR)) {
                cprops.AddToChain(tag, h);
                if (currentParagraph == null)
                    currentParagraph = new Paragraph();
                stack.Push(currentParagraph);
                currentParagraph = new Paragraph();
                return;
            }
            if (tag.Equals(HtmlTags.NEWLINE)) {
                if (currentParagraph == null)
                    currentParagraph = new Paragraph();
                currentParagraph.Add(factoryProperties.CreateChunk("\n", cprops));
                return;
            }
            if (tag.Equals(HtmlTags.HORIZONTALRULE)) {
                // Attempting to duplicate the behavior seen on Firefox with
                // http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_hr_test
                // where an initial break is only inserted when the preceding element doesn't
                // end with a break, but a trailing break is always inserted.
                bool addLeadingBreak = true;
                if (currentParagraph == null) {
                    currentParagraph = new Paragraph();
                    addLeadingBreak = false;
                }
                if (addLeadingBreak) { // Not a new paragraph
                    int numChunks = currentParagraph.Chunks.Count;
                    if (numChunks == 0 ||
                        ((Chunk)currentParagraph.Chunks[numChunks - 1]).Content.EndsWith("\n"))
                        addLeadingBreak = false;
                }
                String align = (String)h["align"];
                int hrAlign = Element.ALIGN_CENTER;
                if (align != null) {
                    if (Util.EqualsIgnoreCase(align, "left"))
                        hrAlign = Element.ALIGN_LEFT; 
                    if (Util.EqualsIgnoreCase(align, "right"))
                        hrAlign = Element.ALIGN_RIGHT;
                }
                String width = (String)h["width"];
                float hrWidth = 1;
                if (width != null) {
                    float tmpWidth = Markup.ParseLength(width, Markup.DEFAULT_FONT_SIZE);
                    if (tmpWidth > 0) hrWidth = tmpWidth;
                    if (!width.EndsWith("%"))
                        hrWidth = 100; // Treat a pixel width as 100% for now.
                }
                String size = (String)h["size"];
                float hrSize = 1;
                if (size != null) {
                    float tmpSize = Markup.ParseLength(size, Markup.DEFAULT_FONT_SIZE);
                    if (tmpSize > 0)
                        hrSize = tmpSize;
                }
                if (addLeadingBreak)
                    currentParagraph.Add(Chunk.NEWLINE);
                currentParagraph.Add(new LineSeparator(hrSize, hrWidth, null, hrAlign, currentParagraph.Leading/2));
                currentParagraph.Add(Chunk.NEWLINE);
                return;
            }
            if (tag.Equals(HtmlTags.CHUNK) || tag.Equals(HtmlTags.SPAN)) {
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals(HtmlTags.IMAGE)) {
                String src = (String)h[ElementTags.SRC];
                if (src == null)
                    return;
                cprops.AddToChain(tag, h);
                Image img = null;
                if (interfaceProps != null) {
                    IImageProvider ip = (IImageProvider)interfaceProps["img_provider"];
                    if (ip != null)
                        img = ip.GetImage(src, h, cprops, document);
                    if (img == null) {
                        Hashtable images = (Hashtable)interfaceProps["img_static"];
                        if (images != null) {
                            Image tim = (Image)images[src];
                            if (tim != null)
                                img = Image.GetInstance(tim);
                        } else {
                            if (!src.StartsWith("http")) { // relative src references only
                                String baseurl = (String)interfaceProps["img_baseurl"];
                                if (baseurl != null) {
                                    src = baseurl + src;
                                    img = Image.GetInstance(src);
                                }
                            }
                        }
                    }
                }
                if (img == null) {
                    if (!src.StartsWith("http")) {
                        String path = cprops["image_path"];
                        if (path == null)
                            path = "";
                        src = Path.Combine(path, src);
                    }
                    img = Image.GetInstance(src);
                }
                String align = (String)h["align"];
                String width = (String)h["width"];
                String height = (String)h["height"];
                String before = cprops["before"];
                String after = cprops["after"];
                if (before != null)
                    img.SpacingBefore = float.Parse(before, System.Globalization.NumberFormatInfo.InvariantInfo);
                if (after != null)
                    img.SpacingAfter = float.Parse(after, System.Globalization.NumberFormatInfo.InvariantInfo);
                float actualFontSize = Markup.ParseLength(cprops[ElementTags.SIZE], Markup.DEFAULT_FONT_SIZE);
                if (actualFontSize <= 0f)
                    actualFontSize = Markup.DEFAULT_FONT_SIZE;
                float widthInPoints = Markup.ParseLength(width, actualFontSize);
                float heightInPoints = Markup.ParseLength(height, actualFontSize);
                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);
                }
                img.WidthPercentage = 0;
                if (align != null) {
                    EndElement("p");
                    int ralign = Image.MIDDLE_ALIGN;
                    if (Util.EqualsIgnoreCase(align, "left"))
                        ralign = Image.LEFT_ALIGN;
                    else if (Util.EqualsIgnoreCase(align, "right"))
                        ralign = Image.RIGHT_ALIGN;
                    img.Alignment = ralign;
                    IImg i = null;
                    bool skip = false;
                    if (interfaceProps != null) {
                        i = (IImg)interfaceProps["img_interface"];
                        if (i != null)
                            skip = i.Process(img, h, cprops, document);
                    }
                    if (!skip)
                        document.Add(img);
                    cprops.RemoveChain(tag);
                }
                else {
                    cprops.RemoveChain(tag);
                    if (currentParagraph == null)
                        currentParagraph = FactoryProperties.CreateParagraph(cprops);
                    currentParagraph.Add(new Chunk(img, 0, 0));
                }
                return;
            }

            EndElement("p");
            if (tag.Equals("h1") || tag.Equals("h2") || tag.Equals("h3") || tag.Equals("h4") || tag.Equals("h5") || tag.Equals("h6")) {
                if (!h.ContainsKey(ElementTags.SIZE)) {
                    int v = 7 - int.Parse(tag.Substring(1));
                    h[ElementTags.SIZE] = v.ToString();
                }
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals(HtmlTags.UNORDEREDLIST)) {
                if (pendingLI)
                    EndElement(HtmlTags.LISTITEM);
                skipText = true;
                cprops.AddToChain(tag, h);
                List list = new List(false);
                try{
                    list.IndentationLeft = float.Parse(cprops["indent"], System.Globalization.NumberFormatInfo.InvariantInfo);
                }catch {
                    list.Autoindent = true;
                }
                list.SetListSymbol("\u2022");
                stack.Push(list);
                return;
            }
            if (tag.Equals(HtmlTags.ORDEREDLIST)) {
                if (pendingLI)
                    EndElement(HtmlTags.LISTITEM);
                skipText = true;
                cprops.AddToChain(tag, h);
                List list = new List(true);
                try{
                    list.IndentationLeft = float.Parse(cprops["indent"], System.Globalization.NumberFormatInfo.InvariantInfo);
                }catch {
                    list.Autoindent = true;
                }
                stack.Push(list);
                return;
            }
            if (tag.Equals(HtmlTags.LISTITEM)) {
                if (pendingLI)
                    EndElement(HtmlTags.LISTITEM);
                skipText = false;
                pendingLI = true;
                cprops.AddToChain(tag, h);
                stack.Push(FactoryProperties.CreateListItem(cprops));
                return;
            }
            if (tag.Equals(HtmlTags.DIV) || tag.Equals(HtmlTags.BODY) || tag.Equals("p")) {
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals(HtmlTags.PRE)) {
                if (!h.ContainsKey(ElementTags.FACE)) {
                    h[ElementTags.FACE] = "Courier";
                }
                cprops.AddToChain(tag, h);
                isPRE = true;
                return;
            }
            if (tag.Equals("tr")) {
                if (pendingTR)
                    EndElement("tr");
                skipText = true;
                pendingTR = true;
                cprops.AddToChain("tr", h);
                return;
            }
            if (tag.Equals("td") || tag.Equals("th")) {
                if (pendingTD)
                    EndElement(tag);
                skipText = false;
                pendingTD = true;
                cprops.AddToChain("td", h);
                stack.Push(new IncCell(tag, cprops));
                return;
            }
            if (tag.Equals("table")) {
                cprops.AddToChain("table", h);
                IncTable table = new IncTable(h);
                stack.Push(table);
                tableState.Push(new bool[]{pendingTR, pendingTD});
                pendingTR = pendingTD = false;
                skipText = true;
                return;
            }
        }
Пример #5
0
        public void StartElement(String tag, Hashtable h)
        {
            if (!tagsSupported.ContainsKey(tag))
            {
                return;
            }
            style.ApplyStyle(tag, h);
            String follow = (String)FactoryProperties.followTags[tag];

            if (follow != null)
            {
                Hashtable prop = new Hashtable();
                prop[follow] = null;
                cprops.AddToChain(follow, prop);
                return;
            }
            FactoryProperties.InsertStyle(h);
            if (tag.Equals("a"))
            {
                cprops.AddToChain(tag, h);
                if (currentParagraph == null)
                {
                    currentParagraph = new Paragraph();
                }
                stack.Push(currentParagraph);
                currentParagraph = new Paragraph();
                return;
            }
            if (tag.Equals("br"))
            {
                if (currentParagraph == null)
                {
                    currentParagraph = new Paragraph();
                }
                currentParagraph.Add(factoryProperties.CreateChunk("\n", cprops));
                return;
            }
            if (tag.Equals("font") || tag.Equals("span"))
            {
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals("img"))
            {
                String src = (String)h["src"];
                if (src == null)
                {
                    return;
                }
                cprops.AddToChain(tag, h);
                Image img = null;
                if (interfaceProps != null)
                {
                    Hashtable images = (Hashtable)interfaceProps["img_static"];
                    if (images != null)
                    {
                        Image tim = (Image)images[src];
                        if (tim != null)
                        {
                            img = Image.GetInstance(tim);
                        }
                    }
                    else
                    {
                        if (!src.StartsWith("http"))   // relative src references only
                        {
                            String baseurl = (String)interfaceProps["img_baseurl"];
                            if (baseurl != null)
                            {
                                src = baseurl + src;
                                img = Image.GetInstance(src);
                            }
                        }
                    }
                }
                if (img == null)
                {
                    if (!src.StartsWith("http"))
                    {
                        String path = cprops["image_path"];
                        if (path == null)
                        {
                            path = "";
                        }
                        src = Path.Combine(path, src);
                    }
                    img = Image.GetInstance(src);
                }
                String align  = (String)h["align"];
                String width  = (String)h["width"];
                String height = (String)h["height"];
                String before = cprops["before"];
                String after  = cprops["after"];
                if (before != null)
                {
                    img.SpacingBefore = float.Parse(before, System.Globalization.NumberFormatInfo.InvariantInfo);
                }
                if (after != null)
                {
                    img.SpacingAfter = float.Parse(after, System.Globalization.NumberFormatInfo.InvariantInfo);
                }
                float wp = LengthParse(width, (int)img.Width);
                float lp = LengthParse(height, (int)img.Height);
                if (wp > 0 && lp > 0)
                {
                    img.ScalePercent(wp > lp ? lp : wp);
                }
                else if (wp > 0)
                {
                    img.ScalePercent(wp);
                }
                else if (lp > 0)
                {
                    img.ScalePercent(lp);
                }
                img.WidthPercentage = 0;
                if (align != null)
                {
                    EndElement("p");
                    int ralign = Image.MIDDLE_ALIGN;
                    if (Util.EqualsIgnoreCase(align, "left"))
                    {
                        ralign = Image.LEFT_ALIGN;
                    }
                    else if (Util.EqualsIgnoreCase(align, "right"))
                    {
                        ralign = Image.RIGHT_ALIGN;
                    }
                    img.Alignment = ralign;
                    IImg i    = null;
                    bool skip = false;
                    if (interfaceProps != null)
                    {
                        i = (IImg)interfaceProps["img_interface"];
                        if (i != null)
                        {
                            skip = i.Process(img, h, cprops, document);
                        }
                    }
                    if (!skip)
                    {
                        document.Add(img);
                    }
                    cprops.RemoveChain(tag);
                }
                else
                {
                    cprops.RemoveChain(tag);
                    if (currentParagraph == null)
                    {
                        currentParagraph = FactoryProperties.CreateParagraph(cprops);
                    }
                    currentParagraph.Add(new Chunk(img, 0, 0));
                }
                return;
            }

            EndElement("p");
            if (tag.Equals("h1") || tag.Equals("h2") || tag.Equals("h3") || tag.Equals("h4") || tag.Equals("h5") || tag.Equals("h6"))
            {
                if (!h.ContainsKey("size"))
                {
                    int v = 7 - int.Parse(tag.Substring(1));
                    h["size"] = v.ToString();
                }
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals("ul"))
            {
                if (pendingLI)
                {
                    EndElement("li");
                }
                skipText = true;
                cprops.AddToChain(tag, h);
                List list = new List(false, 10);
                list.SetListSymbol("\u2022");
                stack.Push(list);
                return;
            }
            if (tag.Equals("ol"))
            {
                if (pendingLI)
                {
                    EndElement("li");
                }
                skipText = true;
                cprops.AddToChain(tag, h);
                List list = new List(true, 10);
                stack.Push(list);
                return;
            }
            if (tag.Equals("li"))
            {
                if (pendingLI)
                {
                    EndElement("li");
                }
                skipText  = false;
                pendingLI = true;
                cprops.AddToChain(tag, h);
                stack.Push(FactoryProperties.CreateListItem(cprops));
                return;
            }
            if (tag.Equals("div") || tag.Equals("body"))
            {
                cprops.AddToChain(tag, h);
                return;
            }
            if (tag.Equals("pre"))
            {
                if (!h.ContainsKey("face"))
                {
                    h["face"] = "Courier";
                }
                cprops.AddToChain(tag, h);
                isPRE = true;
                return;
            }
            if (tag.Equals("p"))
            {
                cprops.AddToChain(tag, h);
                currentParagraph = FactoryProperties.CreateParagraph(h);
                return;
            }
            if (tag.Equals("tr"))
            {
                if (pendingTR)
                {
                    EndElement("tr");
                }
                skipText  = true;
                pendingTR = true;
                cprops.AddToChain("tr", h);
                return;
            }
            if (tag.Equals("td") || tag.Equals("th"))
            {
                if (pendingTD)
                {
                    EndElement(tag);
                }
                skipText  = false;
                pendingTD = true;
                cprops.AddToChain("td", h);
                stack.Push(new IncCell(tag, cprops));
                return;
            }
            if (tag.Equals("table"))
            {
                cprops.AddToChain("table", h);
                IncTable table = new IncTable(h);
                stack.Push(table);
                tableState.Push(new bool[] { pendingTR, pendingTD });
                pendingTR = pendingTD = false;
                skipText  = true;
                return;
            }
        }