/// <summary> /// Ajusta los colores del documento a insertar. /// </summary> /// <param name="parentNode">Nodo grupo que se est?procesando.</param> /// <param name="colorDestTbl">Tabla de colores resultante.</param> /// <param name="colorToCopyTbl">Tabla de colores del documento a insertar.</param> private void adjustColorRecursive(RtfTreeNode parentNode, RtfColorTable colorDestTbl, RtfColorTable colorToCopyTbl) { if (parentNode != null && parentNode.HasChildNodes()) { for (int iNdIndex = 0; iNdIndex < parentNode.ChildNodes.Count; iNdIndex++) { if (parentNode.ChildNodes[iNdIndex].NodeType == RtfNodeType.Keyword && (parentNode.ChildNodes[iNdIndex].NodeKey == "cf" || parentNode.ChildNodes[iNdIndex].NodeKey == "cb" || parentNode.ChildNodes[iNdIndex].NodeKey == "pncf" || parentNode.ChildNodes[iNdIndex].NodeKey == "brdrcf" || parentNode.ChildNodes[iNdIndex].NodeKey == "cfpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "cbpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "clcfpatraw" || parentNode.ChildNodes[iNdIndex].NodeKey == "clcbpatraw" || parentNode.ChildNodes[iNdIndex].NodeKey == "ulc" || parentNode.ChildNodes[iNdIndex].NodeKey == "chcfpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "chcbpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "highlight" || parentNode.ChildNodes[iNdIndex].NodeKey == "clcbpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "clcfpat") && parentNode.ChildNodes[iNdIndex].HasParameter) { parentNode.ChildNodes[iNdIndex].Parameter = getColorID(colorDestTbl, colorToCopyTbl[parentNode.ChildNodes[iNdIndex].Parameter]); } adjustColorRecursive(parentNode.ChildNodes[iNdIndex], colorDestTbl, colorToCopyTbl); } } }
/// <summary> /// Analiza el texto del documento en busca de parámetros de reemplazo y combina los documentos. /// </summary> /// <param name="parentNode">Nodo del árbol a procesar.</param> private void analizeTextContent(RtfTreeNode parentNode) { RtfTree docToInsert = null; int indPH; //Si el nodo es de tipo grupo y contiene nodos hijos if (parentNode != null && parentNode.HasChildNodes()) { //Se recorren todos los nodos hijos for (int iNdIndex = 0; iNdIndex < parentNode.ChildNodes.Count; iNdIndex++) { //Nodo actual RtfTreeNode currNode = parentNode.ChildNodes[iNdIndex]; //Si el nodo actual es de tipo Texto se buscan etiquetas a reemplazar if (currNode.NodeType == RtfNodeType.Text) { docToInsert = null; //Se recorren todas las etiquetas configuradas foreach (string ph in placeHolder.Keys) { //Se busca la siguiente ocurrencia de la etiqueta actual indPH = currNode.NodeKey.IndexOf(ph); //Si se ha encontrado una etiqueta if (indPH != -1) { //Se recupera el árbol a insertar en la etiqueta actual docToInsert = placeHolder[ph].CloneTree(); //Se inserta el nuevo árbol en el árbol base mergeCore(parentNode, iNdIndex, docToInsert, ph, indPH); //Como puede que el nodo actual haya cambiado decrementamos el índice //y salimos del bucle para analizarlo de nuevo iNdIndex--; break; } } } else { //Si el nodo actual tiene hijos se analizan los nodos hijos if (currNode.HasChildNodes()) { analizeTextContent(currNode); } } } } }
/// <summary> /// Ajusta las fuentes del documento a insertar. /// </summary> /// <param name="parentNode">Nodo grupo que se está procesando.</param> /// <param name="fontDestTbl">Tabla de fuentes resultante.</param> /// <param name="fontToCopyTbl">Tabla de fuentes del documento a insertar.</param> private void adjustFontRecursive(RtfTreeNode parentNode, RtfFontTable fontDestTbl, RtfFontTable fontToCopyTbl) { if (parentNode != null && parentNode.HasChildNodes()) { for (int iNdIndex = 0; iNdIndex < parentNode.ChildNodes.Count; iNdIndex++) { if (parentNode.ChildNodes[iNdIndex].NodeType == RtfNodeType.Keyword && (parentNode.ChildNodes[iNdIndex].NodeKey == "f" || parentNode.ChildNodes[iNdIndex].NodeKey == "stshfdbch" || parentNode.ChildNodes[iNdIndex].NodeKey == "stshfloch" || parentNode.ChildNodes[iNdIndex].NodeKey == "stshfhich" || parentNode.ChildNodes[iNdIndex].NodeKey == "stshfbi" || parentNode.ChildNodes[iNdIndex].NodeKey == "deff" || parentNode.ChildNodes[iNdIndex].NodeKey == "af") && parentNode.ChildNodes[iNdIndex].HasParameter) { parentNode.ChildNodes[iNdIndex].Parameter = getFontID(ref fontDestTbl, fontToCopyTbl[parentNode.ChildNodes[iNdIndex].Parameter]); } adjustFontRecursive(parentNode.ChildNodes[iNdIndex], fontDestTbl, fontToCopyTbl); } } }
/// <summary> /// Función encargada de procesar los nodos hijo de un nodo padre RTF un nodo del documento RTF /// y generar las etiquetas HTML necesarias /// </summary> private void ProcessChildNodes(RtfNodeCollection nodos, int inicio) { for (int i = inicio; i < nodos.Count; i++) { RtfTreeNode nodo = nodos[i]; switch (nodo.NodeType) { case RtfNodeType.Control: if (nodo.NodeKey == "'") //Símbolos especiales, como tildes y "ñ" { WriteText(_currentEncoding.GetString(new[] { (byte)nodo.Parameter })); } break; case RtfNodeType.Keyword: switch (nodo.NodeKey) { case "pard": //Reinicio de formato _currentFormat.Reset(); break; case "f": //Tipo de fuente if (nodo.Parameter < _fontTable.Count) { _currentFormat.FontName = _fontTable[nodo.Parameter].Name; _currentEncoding = Encoding.GetEncoding(_fontTable[nodo.Parameter].CodePage); } break; case "cf": //Color de fuente if (nodo.Parameter < _colorTable.Count) { _currentFormat.ForeColor = _colorTable[nodo.Parameter]; } break; case "highlight": //Color de fondo if (nodo.Parameter < _colorTable.Count) { _currentFormat.BackColor = _colorTable[nodo.Parameter]; } break; case "fs": //Tamaño de fuente _currentFormat.FontSize = nodo.Parameter; break; case "b": //Negrita _currentFormat.Bold = !nodo.HasParameter || nodo.Parameter == 1; break; case "i": //Cursiva _currentFormat.Italic = !nodo.HasParameter || nodo.Parameter == 1; break; case "ul": //Subrayado ON _currentFormat.Underline = true; break; case "ulnone": //Subrayado OFF _currentFormat.Underline = false; break; case "super": //Superscript _currentFormat.Superscript = true; _currentFormat.Subscript = false; break; case "sub": //Subindice _currentFormat.Subscript = true; _currentFormat.Superscript = false; break; case "nosupersub": _currentFormat.Superscript = _currentFormat.Subscript = false; break; case "qc": //Alineacion centrada _currentFormat.Alignment = HorizontalAlignment.Center; break; case "qr": //Alineacion derecha _currentFormat.Alignment = HorizontalAlignment.Right; break; case "li": //tabulacion _currentFormat.Margin = nodo.Parameter; break; case "line": case "par": //Nueva línea _builder.Append("<br />"); break; } break; case RtfNodeType.Group: //Procesar nodos hijo, si los tiene if (nodo.HasChildNodes()) { if (nodo["pict"] != null) //El grupo es una imagen { ImageNode imageNode = new ImageNode(nodo); WriteImage(imageNode); } else { ProcessChildNodes(nodo.ChildNodes, 0); } } break; case RtfNodeType.Text: WriteText(nodo.NodeKey); break; default: throw new ArgumentOutOfRangeException(); } } }
/// <summary> /// Ajusta los colores del documento a insertar. /// </summary> /// <param name="parentNode">Nodo grupo que se está procesando.</param> /// <param name="colorDestTbl">Tabla de colores resultante.</param> /// <param name="colorToCopyTbl">Tabla de colores del documento a insertar.</param> private void adjustColorRecursive(RtfTreeNode parentNode, RtfColorTable colorDestTbl, RtfColorTable colorToCopyTbl) { if (parentNode != null && parentNode.HasChildNodes()) { for (int iNdIndex = 0; iNdIndex < parentNode.ChildNodes.Count; iNdIndex++) { if (parentNode.ChildNodes[iNdIndex].NodeType == RtfNodeType.Keyword && (parentNode.ChildNodes[iNdIndex].NodeKey == "cf" || parentNode.ChildNodes[iNdIndex].NodeKey == "cb" || parentNode.ChildNodes[iNdIndex].NodeKey == "pncf" || parentNode.ChildNodes[iNdIndex].NodeKey == "brdrcf" || parentNode.ChildNodes[iNdIndex].NodeKey == "cfpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "cbpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "clcfpatraw" || parentNode.ChildNodes[iNdIndex].NodeKey == "clcbpatraw" || parentNode.ChildNodes[iNdIndex].NodeKey == "ulc" || parentNode.ChildNodes[iNdIndex].NodeKey == "chcfpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "chcbpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "highlight" || parentNode.ChildNodes[iNdIndex].NodeKey == "clcbpat" || parentNode.ChildNodes[iNdIndex].NodeKey == "clcfpat") && parentNode.ChildNodes[iNdIndex].HasParameter == true) { parentNode.ChildNodes[iNdIndex].Parameter = getColorID(colorDestTbl, colorToCopyTbl[parentNode.ChildNodes[iNdIndex].Parameter]); } adjustColorRecursive(parentNode.ChildNodes[iNdIndex], colorDestTbl, colorToCopyTbl); } } }
/// <summary> /// Ajusta las fuentes del documento a insertar. /// </summary> /// <param name="parentNode">Nodo grupo que se está procesando.</param> /// <param name="fontDestTbl">Tabla de fuentes resultante.</param> /// <param name="fontToCopyTbl">Tabla de fuentes del documento a insertar.</param> private void adjustFontRecursive(RtfTreeNode parentNode, RtfFontTable fontDestTbl, RtfFontTable fontToCopyTbl) { if (parentNode != null && parentNode.HasChildNodes()) { for (int iNdIndex = 0; iNdIndex < parentNode.ChildNodes.Count; iNdIndex++) { if (parentNode.ChildNodes[iNdIndex].NodeType == RtfNodeType.Keyword && (parentNode.ChildNodes[iNdIndex].NodeKey == "f" || parentNode.ChildNodes[iNdIndex].NodeKey == "stshfdbch" || parentNode.ChildNodes[iNdIndex].NodeKey == "stshfloch" || parentNode.ChildNodes[iNdIndex].NodeKey == "stshfhich" || parentNode.ChildNodes[iNdIndex].NodeKey == "stshfbi" || parentNode.ChildNodes[iNdIndex].NodeKey == "deff" || parentNode.ChildNodes[iNdIndex].NodeKey == "af") && parentNode.ChildNodes[iNdIndex].HasParameter == true) { parentNode.ChildNodes[iNdIndex].Parameter = getFontID(ref fontDestTbl, fontToCopyTbl[parentNode.ChildNodes[iNdIndex].Parameter]); } adjustFontRecursive(parentNode.ChildNodes[iNdIndex], fontDestTbl, fontToCopyTbl); } } }