using BS.Shared.DataContracts; using DevExpress.Pdf; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace BeWo.Service.Import.Perseh { public class PersehReader { public HilfeplanImportDC ReadPdfDocument(byte[] daten) { HilfeplanImportDC result = new HilfeplanImportDC(); result.Gruppen = new List(); //var gruppe1 = new HilfeplanImportItemDC { Label = "Leistungssuchende oder leistungsberechtigte Person", Items = new List() }; //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Name", Content = "Bäurle", FieldName = "LastName" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Vorname", Content = "Christian", FieldName = "FirstName" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", Content = "08.04.1972", FieldName = "Birthdate" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Nationalität", Content = "deutsch" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Beruf", Content = "Wirt" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", Content = "73.20-2100009313-01" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Erstellt von der\nleistungssuchenden oder\nleistungsberechtigten Person\nmit Behinderung unter", Content = "Max Mustermann (Bezugsbetreuer)\nMaria Musterfrau (Sozialarbeiterin)" }); //result.Gruppen.Add(gruppe1); //gruppe1 = new HilfeplanImportItemDC { Label = "Gruppe 2", Items = new List() }; //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Name", Content = "Bäurle", FieldName = "LastName" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Vorname", Content = "Christian", FieldName = "FirstName" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", Content = "08.04.1972", FieldName = "Birthdate" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Nationalität", Content = "deutsch" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Beruf", Content = "Wirt" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", Content = "73.20-2100009313-01" }); //gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Erstellt von der\nleistungssuchenden oder\nleistungsberechtigten Person\nmit Behinderung unter", Content = "Max Mustermann (Bezugsbetreuer)\nMaria Musterfrau (Sozialarbeiterin)" }); //result.Gruppen.Add(gruppe1); result.Ziele = new List(); //result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." }); //result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" }); //result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." }); //result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" }); using (var processor = new PdfDocumentProcessor()) { using (var ms = new MemoryStream(daten)) { processor.LoadDocument(ms); var pdfText = processor.Text; var customerGruppe = ErstelleKlientenStammdatenGruppe(pdfText); if (customerGruppe == null) { customerGruppe = ErstelleGruppeMitNamenUndAktenzeichen(pdfText); } if (customerGruppe != null) { result.Gruppen.Add(customerGruppe); } result.Ziele = ErstelleAlleZiele(pdfText); } } //result.Ziele = new List(); //result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." }); //result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" }); //result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." }); //result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" }); return result; } private IList ErstelleAlleZiele(string pdfText) { var ziele = new List(); //Suche Zeile "Zielplanung". So beginnt hinten im Dokument der Bereich mit der Zusammenfassung der Ziele var zeilen = pdfText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); var startIdx = -1; var endIdx = -1; var zielplanungStart = -1; StringBuilder gesamtTextMitZielen = new StringBuilder(); for (int i = zeilen.Length - 1; i >= 0; i--) { var z = zeilen[i]; if (z == "Zielplanung") { zielplanungStart = i; startIdx = i; } if (z.StartsWith("Übersicht der Leistungsplanung ")) { endIdx = i; } } if (endIdx < startIdx) { for (int i = zeilen.Length - 1; i >= 0; i--) { var z = zeilen[i]; if (z.StartsWith("Gesamtübersicht Stunden pro Woche")) { endIdx = i; } } } if (startIdx >= 0) { for (int i = startIdx; i < endIdx; i++) { gesamtTextMitZielen.AppendLine(zeilen[i]); } zeilen = gesamtTextMitZielen.ToString().Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); startIdx = 0; while (startIdx >= 0) { var ta = TextAbschnittReader.LeseBisText(zeilen, startIdx, "Lebensbereich ", true, false, false); if (ta.Success) { ziele.AddRange(ErstelleBereichMitZielen(zeilen, ta)); startIdx = ta.ZeilenIndex + 1; } else { startIdx = -1; } } } ErstelleMassnahmen(pdfText, zielplanungStart, ziele); return ziele; } private void ErstelleMassnahmen(string pdfText, int endIndex, List ziele) { var zeilen = pdfText.ToString().Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); foreach (var item in ziele) { item.Massnahmen = new List(); int zeilenIndex = 0; foreach (var zeile in zeilen) { if (zeilenIndex < endIndex && zeile.StartsWith("Ziel ")) { if (item.ZielName.StartsWith(zeile.Substring(5))) { int massnahmenStartIndex = -1; var ta = TextAbschnittReader.LeseBisText(zeilen, zeilenIndex, "Beschreibung der Maßnahme", true, false, false); if (ta.Success) { massnahmenStartIndex = ta.ZeilenIndex; } else { ta = TextAbschnittReader.LeseBisText(zeilen, ta.ZeilenIndex + 1, "Beschreibung der", true, false, false); if (ta.Success) { var ta2 = TextAbschnittReader.LeseBisText(zeilen, ta.ZeilenIndex + 1, "Maßnahme", true, false, false); if (ta2.Success && ta2.ZeilenIndex == ta.ZeilenIndex + 1) { massnahmenStartIndex = ta2.ZeilenIndex; } } } if (massnahmenStartIndex > 0) { ta = TextAbschnittReader.LeseBisText(zeilen, massnahmenStartIndex, "Wer soll das tun?", true, false, false); if (ta.Success) { var text = ta.Text; ErstelleMassnahmenFuerZiel(item, text); } } } } zeilenIndex++; } } } public virtual void ErstelleMassnahmenFuerZiel(HilfeplanImportZielDC item, string text) { var zeilen = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); var sb = new StringBuilder(); //Entferne Zeilenumbrüche und unnötige Zeilen (wie Kopf und Fußzeilen) //Letzte Zeile nicht mitnehmen, da steht drin "wer soll das tun?" for (int i = 0; i < zeilen.Length - 1; i++) { String zeile = zeilen[i]; if (i == 0) { if (zeile.StartsWith("Beschreibung der Maßnahmen")) { zeile = zeile.Substring(26); } else if (zeile.StartsWith("Beschreibung der Maßnahme")) { zeile = zeile.Substring(25); } if (zeile.StartsWith("Maßnahmen")) { zeile = zeile.Substring(9); } else if (zeile.StartsWith("Maßnahme")) { zeile = zeile.Substring(8); } zeile = zeile.Trim(); } if (!String.IsNullOrWhiteSpace(zeile) && !IgnoriereZeile(zeile)) { sb.Append(zeile); sb.Append(" "); } } item.Massnahmen = ErstelleMassnahmenDCs(sb.ToString()); } public virtual IList ErstelleMassnahmenDCs(string text) { var result = new List(); //Finde Auflistung die mit einer Zahl und einem Punkt beginnen (1. erste Zeile, 2. zweite Zeile etc.) if (!String.IsNullOrEmpty(text) && text.StartsWith("1. ")) { string pattern = @"(\d+\.\s.*?)(?=\s*\d+\.\s|$)"; MatchCollection matches = Regex.Matches(text, pattern); var sb = new StringBuilder(); foreach (var match in matches) { sb.AppendLine(match.ToString()); } var massnahme = new HilfeplanImportZielDC(); massnahme.DoImport = true; massnahme.ZielName = sb.ToString(); result.Add(massnahme); } if (result.Count == 0 && !String.IsNullOrEmpty(text)) { var massnahme = new HilfeplanImportZielDC(); massnahme.DoImport = true; massnahme.ZielName = text; result.Add(massnahme); } return result; } private IList ErstelleBereichMitZielen(string[] zeilen, TextAbschnitt ta) { var ziele = new List(); String bereich = zeilen[ta.ZeilenIndex]; int idxBereichStart = ta.ZeilenIndex + 1; int idxBereichtEnde = zeilen.Length; var taEnde = TextAbschnittReader.LeseBisText(zeilen, ta.ZeilenIndex + 1, "Lebensbereich ", true, false, false); if (taEnde.Success) { idxBereichtEnde = taEnde.ZeilenIndex; } HilfeplanImportZielDC ziel = null; for (int i = idxBereichStart; i < idxBereichtEnde; i++) { String zeile = zeilen[i]; if (zeile.StartsWith("Ziele • ") || zeile.StartsWith("• ")) { ziel = new HilfeplanImportZielDC(); ziel.DoImport = true; ziel.Bereich = bereich; ziel.ZielName = zeile.Replace("Ziele • ", "").Replace("• ", "").Trim(); ziele.Add(ziel); } else if (ziel != null) { if (!IgnoriereZeile(zeile)) { ziel.ZielName += " " + zeile.Trim(); ziel.ZielBeschreibung = "Beschreibung:\n" + zeile; } } } return ziele; } private bool IgnoriereZeile(string zeile) { if (zeile.StartsWith("(c) Landschaftsverband") || zeile.StartsWith("Gesprächsleitfaden - ")) { return true; } if (zeile.StartsWith("V1") || zeile.StartsWith("V2") || zeile.StartsWith("V3")) { return true; } //Ignoriert das Aktenzeichen if (StartetMitNZiffern(zeile, 10)) { return true; } return false; } private bool StartetMitNZiffern(string zeile, int anzahlZiffern) { string pattern = String.Format("{0:0}", anzahlZiffern); pattern = "\\d{" + pattern + "}"; MatchCollection matches = Regex.Matches(zeile, pattern); if (matches.Count > 0 && matches[0].Index == 0) { return true; } return false; } private HilfeplanImportItemDC ErstelleKlientenStammdatenGruppe(string pdfText) { if (pdfText.Contains("Individuelle Bedarfsermittlung - Element Basisdaten")) { var customerGruppe = new HilfeplanImportItemDC { Label = "Stammdaten", Items = new List() }; customerGruppe.Items = LeseKlientenStammdaten(pdfText); return customerGruppe; } return null; } private HilfeplanImportItemDC ErstelleGruppeMitNamenUndAktenzeichen(string pdfText) { String aktenzeichen = ""; String name = ""; String datum = ""; var zeilen = pdfText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); //Der Name sollte oben auf der ersten Seite stehen. Suche innerhalb der ersten 10 Zeilen danach: var ta = TextAbschnittReader.LeseBisText(zeilen, 0, "Name ", true, false, false); if (ta.Success && ta.ZeilenIndex <= 10) { var zeile = zeilen[ta.ZeilenIndex].Replace("Name ", ""); if (zeile.Contains("GP-Nr./Az. ")) { aktenzeichen = zeile.Substring(zeile.IndexOf("GP-Nr./Az. ") + 10).Trim(); } var pattern = @"\d{2}\.\d{2}\.\d{4}"; MatchCollection matches = Regex.Matches(zeile, pattern); if (matches.Count > 0) { datum = matches[0].Value; if (zeile.IndexOf(datum) > 0) { name = zeile.Substring(0, zeile.IndexOf(datum)).Trim(); } } } if (String.IsNullOrEmpty(aktenzeichen)) { var pattern = @"\d{10}"; MatchCollection matches = Regex.Matches(pdfText, pattern); if (matches.Count > 0) { aktenzeichen = matches[0].Value; } } if (!String.IsNullOrEmpty(aktenzeichen) || !String.IsNullOrEmpty(name) || !String.IsNullOrEmpty(datum)) { var customerGruppe = new HilfeplanImportItemDC { Label = "Stammdaten", Items = new List() }; if (!String.IsNullOrEmpty(name)) { customerGruppe.Items.Add(new HilfeplanImportItemDC { Label = "Name", FieldName = "LastnameFirstname", Content = name }); } if (!String.IsNullOrEmpty(datum)) { customerGruppe.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", FieldName = "Birthdate", Content = datum }); } if (!String.IsNullOrEmpty(aktenzeichen)) { customerGruppe.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", FieldName = "CustomerReferenceNumber", Content = aktenzeichen }); } return customerGruppe; } return null; } private List LeseKlientenStammdaten(string pdfText) { var liste = new List(); var zeilen = pdfText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); var ta = TextAbschnittReader.LeseBisText(zeilen, 0, "BEI_NRW für den Zeitraum vom ", true, false, false); if (ta.Success) { var idx = ta.ZeilenIndex; liste.Add(ErstelleStammdatenFeld("BEI_NRW für den Zeitraum vom", "ApprovalPeriod", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("GP-Nummer/Az", "CustomerReferenceNumber", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Name", "Lastname", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Vorname", "Firstname", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Titel", "Titel", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Geburtsdatum", "Birthdate", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Geschlecht", "Sex", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Nationalität", "Nationality", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Beruf", "Job", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Familienstand", "FamilyStatus", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Anzahl und Alter der Kinder", "Children", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("PLZ", "PostalCode", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Ort", "Town", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Straße", "Street", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Telefon", "Phone", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("Fax", "Fax", zeilen, idx, out idx)); liste.Add(ErstelleStammdatenFeld("E-Mail", "EMail", zeilen, idx, out idx)); } return liste; } private HilfeplanImportItemDC ErstelleStammdatenFeld(string label, string fieldname, string[] zeilen, int startIndex, out int foundIdx) { var item = new HilfeplanImportItemDC { Label = label, FieldName = fieldname }; var ta = TextAbschnittReader.LeseBisText(zeilen, startIndex, label, true, false, false); foundIdx = 0; if (ta.Success) { item.Content = zeilen[ta.ZeilenIndex].Replace(label, "").Trim(); if (item.Label.Contains("_")) { item.Label = label.Replace("_", "__"); } foundIdx = ta.ZeilenIndex; } return item; } } }