Esempio n. 1
0
        /// <summary>
        /// Fixes invalid dom elements
        /// </summary>
        /// <param name="parentElement"></param>
        private void FixElements(DomElement parentElement)
        {
            // combin text element , decrease number of RTFDomText instance
            var result = new ArrayList();
            foreach (DomElement element in parentElement.Elements)
            {
                if (element is DomParagraph)
                {
                    var p = (DomParagraph) element;
                    if (p.Format.PageBreak)
                    {
                        p.Format.PageBreak = false;
                        result.Add(new DomPageBreak());
                    }
                }

                if (element is DomText)
                {
                    if (result.Count > 0 && result[result.Count - 1] is DomText)
                    {
                        var lastText = (DomText) result[result.Count - 1];
                        var txt = (DomText) element;
                        if (lastText.Text.Length == 0 || txt.Text.Length == 0)
                        {
                            if (lastText.Text.Length == 0)
                            {
                                // close text format
                                lastText.Format = txt.Format.Clone();
                            }
                            lastText.Text = lastText.Text + txt.Text;
                        }
                        else
                        {
                            if (lastText.Format.EqualsSettings(txt.Format))
                            {
                                lastText.Text = lastText.Text + txt.Text;
                            }
                            else
                            {
                                result.Add(txt);
                            }
                        }
                    }
                    else
                        result.Add(element);
                }
                else
                    result.Add(element);
            }

            parentElement.Elements.Clear();
            parentElement.Locked = false;

            foreach (DomElement element in result)
                parentElement.AppendChild(element);

            foreach (var element in parentElement.Elements.ToArray())
            {
                if (element is DomTable)
                    UpdateTableCells((DomTable) element, true);
            }

            // Recursive
            foreach (DomElement element in parentElement.Elements)
                FixElements(element);
        }
Esempio n. 2
0
        /// <summary>
        /// Combine tables
        /// </summary>
        /// <param name="parentElement">The parent element</param>
        private void CombineTable(DomElement parentElement)
        {
            var result = new ArrayList();
            var rows = new ArrayList();
            var lastRowWidth = -1;
            DomTableRow lastRow = null;

            foreach (DomElement element in parentElement.Elements)
            {
                if (element is DomTableRow)
                {
                    var tableRow = (DomTableRow) element;
                    tableRow.Locked = false;
                    var cellSettings = tableRow.CellSettings;

                    if (cellSettings.Count == 0)
                    {
                        if (lastRow != null && lastRow.CellSettings.Count == tableRow.Elements.Count)
                        {
                            cellSettings = lastRow.CellSettings;
                        }
                    }

                    if (cellSettings.Count == tableRow.Elements.Count)
                    {
                        for (var count = 0; count < tableRow.Elements.Count; count++)
                            tableRow.Elements[count].Attributes = (AttributeList) cellSettings[count];
                    }

                    var isLastRow = tableRow.HasAttribute(Consts.Lastrow);

                    if (isLastRow == false)
                    {
                        var index = parentElement.Elements.IndexOf(element);
                        if (index == parentElement.Elements.Count - 1)
                        {
                            // If this element is the last element
                            // then this row is the last row
                            isLastRow = true;
                        }
                        else
                        {
                            var element2 = parentElement.Elements[index + 1];
                            if (!(element2 is DomTableRow))
                                // Next element is not row
                                isLastRow = true;
                        }
                    }

                    // Split to table
                    if (isLastRow)
                    {
                        // If current row mark the last row , then generate a new table
                        rows.Add(tableRow);
                        result.Add(CreateTable(rows));
                        lastRowWidth = -1;
                    }
                    else
                    {
                        var width = 0;
                        if (tableRow.HasAttribute(Consts.TrwWidth))
                        {
                            width = tableRow.Attributes[Consts.TrwWidth];
                            if (tableRow.HasAttribute(Consts.TrwWidthA))
                                width = width - tableRow.Attributes[Consts.TrwWidthA];
                        }
                        else
                        {
                            foreach (DomTableCell tableCell in tableRow.Elements)
                            {
                                if (tableCell.HasAttribute(Consts.Cellx))
                                    width = Math.Max(width, tableCell.Attributes[Consts.Cellx]);
                            }
                        }
                        if (lastRowWidth > 0 && lastRowWidth != width)
                        {
                            // If row's width is change , then can consider multi-table combin
                            // then split and generate new table
                            if (rows.Count > 0)
                                result.Add(CreateTable(rows));
                        }
                        lastRowWidth = width;
                        rows.Add(tableRow);
                    }
                    lastRow = tableRow;
                }
                else if (element is DomTableCell)
                {
                    lastRow = null;
                    CombineTable(element);
                    if (rows.Count > 0)
                    {
                        result.Add(CreateTable(rows));
                    }
                    result.Add(element);
                    lastRowWidth = -1;
                }
                else
                {
                    lastRow = null;
                    CombineTable(element);
                    if (rows.Count > 0)
                        result.Add(CreateTable(rows));
                    result.Add(element);
                    lastRowWidth = -1;
                }
            }

            if (rows.Count > 0)
                result.Add(CreateTable(rows));

            parentElement.Locked = false;
            parentElement.Elements.Clear();

            foreach (DomElement element in result)
                parentElement.AppendChild(element);
        }