Beispiel #1
0
            /// <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);
                    }
                }
            }
Beispiel #2
0
            /// <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);
                            }
                        }
                    }
                }
            }
Beispiel #3
0
            /// <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);
                    }
                }
            }
Beispiel #4
0
            /// <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();
                    }
                }
            }
Beispiel #5
0
            /// <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);
                    }
                }
            }
Beispiel #6
0
            /// <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);
                    }
                }
            }
Beispiel #7
0
            /// <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);
                            }
                        }
                    }
                }
            }