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