Пример #1
0
 /// <summary>
 /// Construye una nueva instancia de la clase PdfCompareInfo.
 /// </summary>
 /// <param name="pdf">Instacia de la clase PdfUnstructuredDoc
 /// que se utilizó para la comparación a la que pertenence
 /// el info.</param>
 /// <param name="pdfPage">Instancia de la clase PdfUnstructuredPage
 /// de la colección PdfUnstructuredPages del pdf, sobre
 /// la que se obtuvo el resultado contenido en el
 /// info a crear.</param>
 /// <param name="pdfTextRectangle">PdfTextRectangle sobre el que
 /// se ha obetnido el resultado contenido en el info.</param>
 /// <param name="textParserMatch">ITextParserMatch orígen del info.</param>
 /// <param name="propertyInfo">PropetyInfo de la propiedad
 /// de los metadatos de la cual se a comparado el valor y se
 /// ha obtenido la coincidencia que ha generado el info.</param>
 public PdfCompareInfo(PdfUnstructuredDoc pdf,
                       PdfUnstructuredPage pdfPage,
                       PdfTextRectangle pdfTextRectangle,
                       ITextMatch textParserMatch,
                       PropertyInfo propertyInfo)
 {
     _Pdf              = pdf;
     _PdfPage          = pdfPage;
     _PdfTextRectangle = pdfTextRectangle;
     _TextMatch        = textParserMatch;
     _PropertyInfo     = propertyInfo;
 }
        /// <summary>
        /// Ejecuata la extracción basada en limites
        /// textuales.
        /// </summary>
        /// <param name="metadataType">Tipo de la clase que implementa IMetadata.</param>
        /// <param name="result">Resultado de extracción.</param>
        /// <param name="page">PdfUnstructuredPage del doc. pdf.</param>
        /// <param name="hierarchySet">Catálogo de jerarquías.</param>
        private void ExtractFromText(Type metadataType,
                                     PdfTagExtractionResult result, PdfUnstructuredPage page,
                                     IHierarchySet hierarchySet)
        {
            foreach (var pattern in PdfPatterns)
            {
                if (pattern.PdfPageN == page.PdfPageN || pattern.IsLastPage) // Comprobamos que los patrones realicen la extracción sobre la página que les corresponde.
                                                                             // Se comprueba la última página porque en algunos documentos viene primero los albaranes y al final la factura.
                {
                    if (pattern.SourceTypeName == "PdfTextInfos")
                    {
                        foreach (Match match in Regex.Matches(page.PdfText, pattern.RegexPattern))
                        {
                            PropertyInfo pInf = metadataType.GetProperty(pattern.MetadataItemName);

                            if (pInf.PropertyType == typeof(string))
                            {
                                result.AddResult(pattern, match.Value);
                            }
                            else
                            {
                                dynamic converter = null;

                                if (_Converters.ContainsKey(pInf.PropertyType))
                                {
                                    converter = _Converters[pInf.PropertyType];
                                }
                                else
                                {
                                    ITextParserHierarchy parserHierarchy = hierarchySet.GetParserHierarchy(pInf);
                                    converter = parserHierarchy.GetConverter(pInf.PropertyType);

                                    if (converter == null)
                                    {
                                        Type converterGenType = typeof(Converter <>).MakeGenericType(pInf.PropertyType);
                                        converter = Activator.CreateInstance(converterGenType);
                                    }
                                }

                                object pValue = converter.Convert(match.Value);
                                result.AddResult(pattern, pValue);
                            }
                        }
                    }
                }
            }
        }
Пример #3
0
        /// <summary>
        /// Devuelve true si la expresión regular sólo
        /// devuelve resultados válidos.
        /// </summary>
        /// <param name="textBound">TextBound</param>
        /// <param name="page">Página.</param>
        /// <param name="value">Valor.</param>
        /// <param name="converter">Converter.</param>
        /// <returns></returns>
        private static bool IsAllMatchesOK(ITextMatch textBound,
                                           PdfUnstructuredPage page, object value, dynamic converter)
        {
            // Debo evaluar tanto los aciertos como los errores, por ejemplo un
            // regex [\d\.\,]+(?=\s*€) devolverá aciertos en importes, pero también
            // muchos falsos positivos. Sólo queremos generar las regex que sean
            // significativas (es decir, que sólo devuelvan resultados buenos)

            MatchCollection matches = Regex.Matches(page.PdfText, textBound.Pattern);

            foreach (Match match in Regex.Matches(page.PdfText, textBound.Pattern))
            {
                if (!converter.Convert(match.Value).Equals(value))
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #4
0
        /// <summary>
        /// Ejecuata la extracción basada en limites
        /// textuales.
        /// </summary>
        /// <param name="metadataType">Tipo de la clase que implementa IMetadata.</param>
        /// <param name="result">Resultado de extracción.</param>
        /// <param name="page">PdfUnstructuredPage del doc. pdf.</param>
        private void ExtractFromText(Type metadataType,
                                     PdfTagExtractionResult result, PdfUnstructuredPage page,
                                     IHierarchySet hierarchySet)
        {
            foreach (var pattern in PdfPatterns)
            {
                if (pattern.SourceTypeName == "PdfTextInfos")
                {
                    foreach (Match match in Regex.Matches(page.PdfText, pattern.RegexPattern))
                    {
                        PropertyInfo pInf = metadataType.GetProperty(pattern.MetadataItemName);

                        if (pInf.PropertyType == typeof(string))
                        {
                            result.AddResult(pattern, match.Value);
                        }
                        else
                        {
                            dynamic converter = null;

                            if (_Converters.ContainsKey(pInf.PropertyType))
                            {
                                converter = _Converters[pInf.PropertyType];
                            }
                            else
                            {
                                ITextParserHierarchy parserHierarchy = hierarchySet.GetParserHierarchy(pInf);
                                converter = parserHierarchy.GetConverter(pInf.PropertyType);
                                if (converter == null)
                                {
                                    Type converterGenType = typeof(Converter <>).MakeGenericType(pInf.PropertyType);
                                    converter = Activator.CreateInstance(converterGenType);
                                }
                            }
                            object pValue = converter.Convert(match.Value);
                            result.AddResult(pattern, pValue);
                        }
                    }
                }
            }
        }