foxygit / digitalskrivare_merge Log in
commits tags

/src/Remiss.Core/Pdf/CoverPageGenerator.cs · 3.17 KB

raw
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using PdfSharp.Fonts;

namespace Remiss.Core.Pdf;

/// <summary>Uppgifter som ska stå på försättsbladet. Ingen patientdata här.</summary>
public sealed record CoverInfo(string MottagningNamn, string HsaId, DateTime Skapad);

/// <summary>
/// Genererar försättsbladet (sida 1). Layouten följer <see cref="OcrContract"/>:
/// 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.
/// </summary>
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);
    }
}