using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using PdfSharp.Fonts;
namespace Remiss.Core.Pdf;
/// Uppgifter som ska stå på försättsbladet. Ingen patientdata här.
public sealed record CoverInfo(string MottagningNamn, string HsaId, DateTime Skapad);
///
/// Genererar försättsbladet (sida 1). Layouten följer :
/// ankarordet REMISS överst, därefter den maskinläsbara HSA-ID-raden i monospace
/// på egen rad med gott om luft omkring, så att server-OCR:n träffar rätt.
///
public static class CoverPageGenerator
{
// Consolas finns på alla Windows-installationer sedan Vista. Byt till
// "Courier New" om målmiljön saknar den.
private const string MonospaceFont = "Consolas";
private const string SansFont = "Arial";
static CoverPageGenerator()
{
// PdfSharp 6.1 kräver en explicit resolver för namngivna typsnitt.
GlobalFontSettings.FontResolver ??= new WindowsFontResolver();
}
public static void Generate(string outputPath, CoverInfo info)
{
var doc = new Document();
doc.Info.Title = "Remiss – försättsblad";
var normal = doc.Styles["Normal"]!;
normal.Font.Name = SansFont;
normal.Font.Size = 12;
normal.Font.Color = Colors.Black;
var section = doc.AddSection();
section.PageSetup.PageFormat = PageFormat.A4;
section.PageSetup.TopMargin = Unit.FromCentimeter(2.5);
section.PageSetup.LeftMargin = Unit.FromCentimeter(2.5);
section.PageSetup.RightMargin = Unit.FromCentimeter(2.5);
// Ankare: dokumenttyp, stort och fetstilt.
var heading = section.AddParagraph(OcrContract.DocumentMarker);
heading.Format.Font.Name = SansFont;
heading.Format.Font.Size = 48;
heading.Format.Font.Bold = true;
heading.Format.SpaceAfter = Unit.FromCentimeter(1.4);
// Maskinläsbar rad: egen rad, monospace, stor, svart på vitt, mycket luft.
var machine = section.AddParagraph(OcrContract.FormatHsaIdLine(info.HsaId));
machine.Format.Font.Name = MonospaceFont;
machine.Format.Font.Size = 20;
machine.Format.Font.Bold = true;
machine.Format.SpaceBefore = Unit.FromCentimeter(0.8);
machine.Format.SpaceAfter = Unit.FromCentimeter(0.8);
// Människoläsbar kontext – används inte av parsern.
var human = section.AddParagraph();
human.Format.Font.Size = 14;
human.Format.SpaceBefore = Unit.FromCentimeter(1.2);
human.AddText("Mottagning: ");
human.AddFormattedText(info.MottagningNamn, TextFormat.Bold);
var note = section.AddParagraph("Remiss bifogad som sida 2.");
note.Format.Font.Size = 16;
note.Format.Font.Bold = true;
note.Format.SpaceBefore = Unit.FromCentimeter(1.5);
var foot = section.AddParagraph($"Försättsblad genererat {info.Skapad:yyyy-MM-dd HH:mm}");
foot.Format.Font.Size = 9;
foot.Format.SpaceBefore = Unit.FromCentimeter(4);
var renderer = new PdfDocumentRenderer { Document = doc };
renderer.RenderDocument();
renderer.PdfDocument.Save(outputPath);
}
}