foxygit / digitalskrivare_merge Log in
commits tags

/README.md · 5.43 KB

raw

Remiss – automatiskt försättsblad vid utskrift

När en användare skriver ut en remiss fångas jobbet av en PDF-skrivare ("Remiss"), den här appen får PDF:en som argument, låter användaren välja mottagning, genererar ett försättsblad, sammanfogar det med remissen och skickar allt tyst till måldigitalskrivaren.

Se Plan.md för arkitektur, teknikval och faser.

Status

FasInnehållLäge
0Spika hur nedströms-skrivaren läser av mottagningKlart: text-OCR server-side. Kontrakt.
1Fristående C#-app, körs manuellt med test-PDFBygger + tester gröna. Kvar: manuellt dialog+utskriftstest.
2Koppla på fångst (clawPDF)Ej påbörjad
3Härdning (HSA, config, audit, temp, felflöden)Delvis förberedd i koden
4Paketering & utrullningEj påbörjad

Förutsättningar

  • Windows
  • .NET SDK 8.x (byggt och verifierat med 8.0.424). På utvecklingsmaskinen är

    den installerad per användare i %LOCALAPPDATA%\Microsoft\dotnet – eftersom maskin-PATH pekar på en SDK-lös runtime i C:\Program Files\dotnet finns en dotnet-shim i PowerShell-profilen som väljer rätt host. net8.0-targeten fungerar även med nyare SDK (10.x).

  • SumatraPDF-binär i tools/ – se tools/README.md.

    Behövs bara för det sista utskriftssteget; dialog + försättsblad + merge fungerar utan.

  • Typsnitten Arial och Consolas (standard på Windows) – försättsbladet

    renderas mot dem via en egen WindowsFontResolver.

Bygga och köra (Fas 1)

dotnet build Remiss.sln
dotnet test  Remiss.sln

# Kör mot en test-PDF och en testskrivare
dotnet run --project src/Remiss.App -- "C:\temp\testremiss.pdf"

Målskrivaren styrs av targetPrinter i config/appsettings.json (default: "Microsoft Print to PDF" – byt till en riktig skrivare vid test).

Utan SumatraPDF-binär kommer stegen dialog → försättsblad → merge att köras, och utskriftssteget kastar ett tydligt fel.

Iterera på försättsbladets OCR-layout utan hela flödet:

dotnet run --project tools/Remiss.CoverPreview -- preview.pdf SE2321000131-E000000000009 "Testmottagning"

Projektstruktur

Remiss.sln
config/
  appsettings.json        sökvägar, målskrivare, retry, flaggor
  mottagningar.json        POC-register (namn → HSA-id)
docs/
  forsattsblad-ocr.md      OCR-kontraktet för försättsbladet (Fas 0)
tools/
  README.md                buntad SumatraPDF (checkas ej in)
  Remiss.CoverPreview/     dev-verktyg: rendera försättsblad för öga-test
src/
  Remiss.Core/             all logik, UI-oberoende
    Abstractions/          IMottagningRepository, IPrinter
    Models/                Mottagning
    Repositories/          JsonMottagningRepository
    Pdf/                   CoverPageGenerator, PdfMerger, OcrContract, WindowsFontResolver
    Printing/              SumatraPdfPrinter (retry)
    Security/              SecureTempStore (ACL + shred), SecureFile
    Audit/                 AuditLogger (JSONL + separat error-logg)
    AppConfig.cs           konfigmodell + inläsning
    RemissWorkflow.cs      steg [3]–[6]
  Remiss.App/              WinForms-exe (AssemblyName: Remiss)
    Program.cs             entrypoint, argument, returkoder
    MottagningDialog.cs    sökbar lista, avbryt-hantering
tests/
  Remiss.Core.Tests/       xUnit: PDF-pipeline, register, SecureTempStore

Konfiguration (config/appsettings.json)

NyckelBetydelse
targetPrinterNamn på måldigitalskrivaren. Tom = Windows standardskrivare (tyst, inga dialoger).
sumatraPdfPathSökväg till SumatraPDF.exe (relativt exe-mappen)
mottagningarPathSökväg till mottagningsregistret
secureTempRootTom = %LOCALAPPDATA%\Remiss\temp
auditLogPathTom = %LOCALAPPDATA%\Remiss\audit\audit.jsonl
errorLogPathTom = %LOCALAPPDATA%\Remiss\logs\error.log
printRetries / printRetryDelayMsRetry vid utskriftsfel
deleteSourceAfterPrintfalse i Fas 1 (behåll test-PDF:en). true i Fas 2.
debugOutputDirEndast test. Satt = kopiera mergad PDF hit (patientdata, städas ej). Tom i drift.

Säkerhet

Remiss-PDF:erna är känsliga personuppgifter.

  • Temp-filer skrivs till en jobb-isolerad mapp under användarprofilen (inte %TEMP%),

    med ACL låst till användaren + SYSTEM + Administrators.

  • SecureTempStore.Dispose() skriver över och raderar alla temp-filer – körs även

    när utskriften fallerar.

  • Audit-loggen innehåller bara metadata: användare, maskin, mottagning (namn +

    HSA-id), tidpunkt, utfall. Aldrig patientdata, filnamn eller innehåll.

  • Error-loggen kan innehålla sökvägar och stacktraces. Den ligger användar-scopat

    och ska redigeras/rensas i Fas 3-härdningen.

Kända begränsningar (Fas 1)

  • Försättsbladets layout följer OCR-kontrakt v1. Den bör verifieras mot

    nedströmssystemets faktiska OCR innan pilot – ingen checksumma ännu.

  • Mottagningsregistret är statisk JSON; HSA-katalog kopplas i Fas 3 bakom

    IMottagningRepository.

  • Tester täcker Core (PDF, register, temp). Dialog + utskrift är inte

    automattestade – kräver ett manuellt körtest.

  • Tidiga fel visas som blockerande MessageBox. OK för Fas 2 (användaren står

    vid skärmen efter Skriv ut), men ses över inför tyst drift.

  • SecureFile.Shred är bäst-möjligt, inte forensiskt (SSD/wear-leveling).