Пример #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, NumberFormatInfo.InvariantInfo);
                }
                if (after != null)
                {
                    img.SpacingAfter = float.Parse(after, 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"], 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"], 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;
            }
        }