foxygit / digitalskrivare_merge Log in
commits tags

/src/Remiss.Core/Pdf/OcrContract.cs · 1.98 KB

raw
using System.Text.RegularExpressions;

namespace Remiss.Core.Pdf;

/// <summary>
/// Kontrakt (v1) för det maskinläsbara försättsbladet. Vi äger formatet.
///
/// Sida 1 i den sammanfogade PDF:en innehåller:
///   • ordet <see cref="DocumentMarker"/> stort – ankare för "det här är en remiss"
///   • en egen rad enligt <see cref="FormatHsaIdLine"/>: nyckelordet
///     <see cref="HsaIdLabel"/> följt av HSA-id:t, i monospace, överst till vänster
///
/// Nedströms server-OCR läser sida 1 och kör <see cref="TryParseHsaId"/> på texten.
/// Parsern är avsiktligt tolerant mot vanliga OCR-fel (tappat bindestreck/kolon,
/// blandade versaler/gemener, extra blanksteg).
/// </summary>
public static class OcrContract
{
    public const string DocumentMarker = "REMISS";
    public const string HsaIdLabel = "HSA-ID:";

    /// <summary>Exakt den rad som ska renderas maskinläsbart på försättsbladet.</summary>
    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);

    /// <summary>
    /// 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.
    /// </summary>
    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;
    }
}