/// <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); }
/// <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); }