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); } }