/// <summary>
        /// Actualiza los patrones acumulando el número de falsos positivos encontrados para cada uno.
        /// </summary>
        /// <param name="checkResult">Objeto que contiene los patrones con falsos positivos.</param>
        /// <param name="path">Ruta del fichero XML donde para almacenar los patrones.</param>
        private static void UpdateCheck(PdfCheckResult checkResult, string path)
        {
            PdfTagPatternStore store = GetStore(path);

            List <PdfTagPattern> newPdfPatterns = new List <PdfTagPattern>();

            foreach (var tagPattern in checkResult.ErrorPatterns)
            {
                int indexOriginal = store.PdfPatterns.IndexOf(tagPattern);

                store.PdfPatterns[indexOriginal].ErrorsCount++;
            }

            store.PdfPatterns.Sort();
            XmlParser.SaveAsXml(store, path);
        }
        /// <summary>
        /// Actualiza un almacén de patrones.
        /// </summary>
        /// <param name="compareResult">Resultado de una comparación.</param>
        /// <param name="path">Ruta del store.</param>
        private static void Update(PdfCompareResult compareResult, string path)
        {
            // Si el archivo de patrones existe, lo actualizo con los nuevos
            // resultados (inserto nuevos, elimina sobrantes poco efectivos, y
            // actualizo matchCount.


            PdfTagPatternStore originalStore = GetStore(path);
            PdfTagPatternStore currentStore  = GetStore(compareResult);

            List <PdfTagPattern> newPdfPatterns = new List <PdfTagPattern>();

            foreach (var tagPattern in currentStore.PdfPatterns)
            {
                int indexOriginal = originalStore.PdfPatterns.IndexOf(tagPattern);

                if (indexOriginal == -1)
                {
                    newPdfPatterns.Add(tagPattern);
                }
                else
                {
                    originalStore.PdfPatterns[indexOriginal].MatchesCount++;
                }
            }

            int originalCount = originalStore.PdfPatterns.Count;
            int available     = Settings.Current.MaxPatternCount -
                                originalCount - newPdfPatterns.Count;

            if (available < 0)
            {
                for (int i = originalCount - 1;
                     (i >= (originalCount + available)) && i >= 0; i--)
                {
                    originalStore.PdfPatterns.RemoveAt(i);
                }
            }

            originalStore.PdfPatterns.AddRange(newPdfPatterns);
            originalStore.CompareCount++;

            originalStore.PdfPatterns.Sort();
            XmlParser.SaveAsXml(originalStore, path);
        }
        /// <summary>
        /// Obtiene un almacén de patrones a partir de unos
        /// resultados de comparación.
        /// </summary>
        /// <param name="compareResult">Resultados de comparación.</param>
        /// <returns>Almacén de patrones.</returns>
        private static PdfTagPatternStore GetStore(PdfCompareResult compareResult)
        {
            PdfTagPatternStore store = new PdfTagPatternStore
            {
                DocCategory      = compareResult.DocCategory,
                DocID            = compareResult.DocID,
                HierarchySetName = compareResult.HierarchySetName,
                MetadataName     = compareResult.MetadataName,
                CompareCount     = 1
            };

            foreach (var info in compareResult.WordGroupsInfos)
            {
                PdfTagPattern pattern = info.GetPdfTagPattern();
                pattern.SourceTypeName = "WordGroupsInfos";

                if (store.PdfPatterns.IndexOf(pattern) == -1)
                {
                    store.PdfPatterns.Add(pattern);
                }
            }

            foreach (var info in compareResult.LinesInfos)
            {
                PdfTagPattern pattern = info.GetPdfTagPattern();
                pattern.SourceTypeName = "LinesInfos";

                if (store.PdfPatterns.IndexOf(pattern) == -1)
                {
                    store.PdfPatterns.Add(pattern);
                }
            }

            foreach (var info in compareResult.PdfTextInfos)
            {
                PdfTagPattern pattern = info.GetPdfTagPattern();
                pattern.SourceTypeName = "PdfTextInfos";

                if (store.PdfPatterns.IndexOf(pattern) == -1)
                {
                    store.PdfPatterns.Add(pattern);
                }
            }

            List <PdfTagPattern> usedPatterns = new List <PdfTagPattern>();

            foreach (var info in compareResult.ColorFontWordGroupsInfos)
            {
                PdfTagPattern pattern = info.GetPdfTagPattern();
                pattern.SourceTypeName = "ColorFontWordGroupsInfos";

                if (store.PdfPatterns.IndexOf(pattern) == -1)
                {
                    store.PdfPatterns.Add(pattern);
                }
                else
                {   // Intentamos quitar los falsos positivos.
                    if (!usedPatterns.Contains(pattern))
                    {
                        usedPatterns.Add(pattern);
                    }
                }
            }

            // Rutina de eliminación de patrones que tengan más de una aparición. (Quita los falsos positivos).
            foreach (PdfTagPattern usedPattern in usedPatterns)
            {
                store.PdfPatterns.Remove(usedPattern);
            }

            return(store);
        }
        /// <summary>
        /// Crea un nuevo almacén de patrones.
        /// </summary>
        /// <param name="compareResult">Resultado de una comparación.</param>
        /// <param name="path">Ruta del store.</param>
        private static void Create(PdfCompareResult compareResult, string path)
        {
            PdfTagPatternStore store = GetStore(compareResult);

            XmlParser.SaveAsXml(store, path);
        }