using System.Text.RegularExpressions; namespace Remiss.Core.Pdf; /// /// Kontrakt (v1) för det maskinläsbara försättsbladet. Vi äger formatet. /// /// Sida 1 i den sammanfogade PDF:en innehåller: /// • ordet stort – ankare för "det här är en remiss" /// • en egen rad enligt : nyckelordet /// följt av HSA-id:t, i monospace, överst till vänster /// /// Nedströms server-OCR läser sida 1 och kör på texten. /// Parsern är avsiktligt tolerant mot vanliga OCR-fel (tappat bindestreck/kolon, /// blandade versaler/gemener, extra blanksteg). /// public static class OcrContract { public const string DocumentMarker = "REMISS"; public const string HsaIdLabel = "HSA-ID:"; /// Exakt den rad som ska renderas maskinläsbart på försättsbladet. public static string FormatHsaIdLine(string hsaId) => $"{HsaIdLabel} {hsaId.Trim()}"; // Etiketten följt av id:t på samma rad. Tål tappat bindestreck/kolon och // enstaka blanksteg som OCR lagt in i id:t – men inte radbrytningar, så // matchningen inte rinner vidare in i människoläsbar text under. private static readonly Regex HsaIdPattern = new( @"HSA[-\s]?ID[:\s]*([A-Za-z0-9][A-Za-z0-9 \-]{2,}[A-Za-z0-9])", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled); /// /// Plockar ut HSA-id ur (ev. brusig) OCR-text från sida 1. /// Blanksteg som OCR:n råkat lägga in mitt i id:t tas bort. /// public static bool TryParseHsaId(string ocrText, out string hsaId) { hsaId = ""; if (string.IsNullOrWhiteSpace(ocrText)) return false; var match = HsaIdPattern.Match(ocrText); if (!match.Success) return false; hsaId = Regex.Replace(match.Groups[1].Value, @"\s+", ""); return hsaId.Length > 0; } }