Sist endret: 15. juni 2026

PDF

Hvordan konfigurere generering av PDF

Ny PDF-generering

Aktivere ny PDF-generering

Fra og med versjon 7.5 av nuget-pakkene (Altinn.App.Api og Altinn.App.Core) er det lansert en ny måte å generere PDF-er på. Denne nye måten kan skrus av og på ved å legge til følgende seksjon og innstilling i appsettings.json.

  "FeatureManagement": {
    "NewPdfGeneration": true
  }

Dette kaller den nye PDF-tjenesten. Den aksepterer en URL, som peker tilbake til en automatisk generert side i appen. Siden bygges opp og danner grunnlaget for PDF-en. Grensesnittet IPdfFormatter, som dokumentert under er fortsatt relevant hvis du trenger spesiallogikk for å skjule komponenter/sider fra PDF-en.

Innstillinger

Selv om standardinnstillingene for den nye tjenesten skal være nok for de fleste apper, kan du overstyre dem ved å legge til en PdfGeneratorSettings-seksjon i appsettings.json (se standardinnstillingene under).

  "PdfGeneratorSettings": {
    "ServiceEndpointUri": "https://{org}.apps.{hostName}/{appId}/#/instance/{instanceId}",
    "AppPdfPageUriTemplate": "https://{org}.apps.{hostName}/{appId}/#/instance/{instanceId}?pdf=1",
    "WaitForSelector": "#readyForPrint",
    "WaitForTime": 5000
  }

Hvis WaitForSelector er satt så blir WaitForTime ignorert. WaitForSelector sikrer at siden er ferdig oppbygd og presentert før PDF-en genereres.

Det er to ulike måter å konfigurere PDF-genereringen på:

  1. Automatisk basert på skjema-sidene dine
  2. Manuelt basert på en egendefinert PDF-side

Det er også mulig å se en forhåndsvisning av hvordan PDF-en kommer til å se ut i nettleseren imens du jobber med den (kun v7.5+).

Automatisk konfigurasjon

Denne metoden brukes som standard dersom du ikke har spesifisert en egendefinert PDF-side. Denne metoden trekker ut alle sidene og komponentene i den rekkefølgen de vises, og tar de med i PDF-dokumentet.

MERK: Denne metoden viser ikke oppsummerings-komponenter fra skjemaet.

Ekskludering av sider og komponenter

Som regel har man behov for å ekskludere visse sider og komponenter som ikke er relevant for PDF-dokumentet. Dette kan konfigureres på to ulike måter:

  1. Ved å modifisere Settings.json-filen for layout-settet.
  2. Programmatisk ved å implementere det i kode. Dette åpner for dynamisk ekskludering basert på skjemadataen.

Den programmatiske metoden du velger å sette opp er avhengig av hvilken versjon du kjører, men logikken er helt lik. Oversikten under viser hvordan du setter det opp for den versjonen du kjører:

    1. Opprett en klasse som implementerer IPdfFormatter-grensesnittet som ligger i Altinn.App.Core.Features-navnerommet.
      Du kan navngi og plassere filene i den mappestrukturen du selv ønsker i prosjektet ditt. Men vi anbefaler at du benytter meningsfulle navnerom som i et hvilket som helst annet .Net-prosjekt.
    2. Registrer din implementering i Program.cs-klassen.
       services.AddTransient<IPdfFormatter, PdfFormatter>();
      
      Dette sørger for at din kode er kjent for applikasjonen og at koden blir kjørt når den skal.
    Endre PdfHandler.cs-filen under App/logic/Print-mappen.

    1. Settings.json

    Legg til en liste med sidenavn som skal eksluderes på excludeFromPdf under pages:

    {
      "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layoutSettings.schema.v1.json",
      "pages": {
        "order": ["side1", "side2"],
        "excludeFromPdf": ["side2"]
      }
    }
    

    2. Programmatisk

    public async Task<LayoutSettings> FormatPdf(LayoutSettings layoutSettings, object data)
    {
      if (data.GetType() == typeof(Skjema))
      {
        layoutSettings.Pages.ExcludeFromPdf.Add("side2");
      }
      return await Task.FromResult(layoutSettings);
    }
    

    NB: Du trenger kun å velge én av disse metodene.

    1. Settings.json

    Legg til en liste over komponent-ID-er som skal ekskluderes på excludeFromPdf under components:

    {
      "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layoutSettings.schema.v1.json",
      "pages": {
        "order": ["side1"]
      },
      "components": {
        "excludeFromPdf": ["bilde-komponent-id"]
      }
    }
    

    2. Programmatisk

    public async Task<LayoutSettings> FormatPdf(LayoutSettings layoutSettings, object data)
    {
      if (data.GetType() == typeof(Skjema))
      {
        layoutSettings.Components.ExcludeFromPdf.Add("bilde-komponent-id");
      }
      return await Task.FromResult(layoutSettings);
    }
    

    NB: Du trenger kun å velge én av disse metodene.

    Dersom du trenger å ekskludere en komponent fra en spesifikk rad i en repeterende gruppe må du spesifisere radnummeret i tillegg til komponent-ID-en.

    Formatet er: komponentID-<rad-nummer>.

    1. Settings.json

    {
      "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layoutSettings.schema.v1.json",
      "pages": {
        "order": ["side1"]
      },
      "components": {
        "excludeFromPdf": ["komponent-i-gruppe-1"]
      }
    }
    

    2. Programmatisk

    public async Task<LayoutSettings> FormatPdf(LayoutSettings layoutSettings, object data)
    {
      if (data.GetType() == typeof(Skjema))
      {
        layoutSettings.Components.ExcludeFromPdf.Add("komponent-i-gruppe-1");
      }
      return await Task.FromResult(layoutSettings);
    }
    

    NB: Du trenger kun å velge én av disse metodene.

    Egendefinert konfigurasjon

    Med Altinn Studio

    Du kan legge til et tilpasset PDF-oppsett i Studio ved å konvertere en side til PDF-oppsett i sidekonfigurasjonen:

    Skjermbilde av PDF-bryteren

    Du kan bruke komponenten Oppsummering, til å angi hvilke deler av oppsettet du vil ha med i PDF-en.

    Skjermbilde av en oppsummeringskomponent i en PDF-oppsett-side

    Manuell konfigurasjon

    Denne metoden er kun tilgjengelig i versjon 7.5 og høyere.

    Denne metoden lar deg spesifisere en helt egendefinert PDF ved å definere en layout-fil som bestemmer hva den skal inneholde.

    For å ta i bruk denne metoden må du opprette en ny layout-fil for PDF-en og sette pdfLayoutName i Settings.json til å peke til den filen:

    {
      "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layoutSettings.schema.v1.json",
      "pages": {
        "order": ["side1"],
        "pdfLayoutName": "minPdfLayout"
      }
    }
    

    Denne layout-filen konfigureres på akkurat samme måte som andre layout-filer, bortsett fra at ikke alle komponenttyper er tilgjengelig. Komponenttypene som kan brukes i en PDF-layout er følgende:

    • Summary
    • Group
    • InstanceInformation
    • Header
    • Paragraph
    • Image
    • Panel

    Den automatiske PDF-layouten inkluder en forside med instans-informasjon som avsender, mottaker, dato, og referansenummer. Dette bør du også inkludere i din egendefinerte PDF-layout. Eksempelet under viser hvordan du kan inkludere denne informasjonen på akkurat samme måte som i den automatiske metoden:

    {
       "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
       "data": {
          "layout": [
             {
                "id": "pdf-instance",
                "type": "InstanceInformation",
                "elements": {
                   "dateSent": true,
                   "sender": true,
                   "receiver": true,
                   "referenceNumber": true
                },
                "pageBreak": {
                   "breakAfter": "always"
                }
             },
             ...
          ]
       }
    }
    

    Du kan spesifisere at en komponent skal starte på en ny side eller at et sideskift skal komme rett etter en komponent ved å bruke pageBreak-egenskapen. Denne egenskapen er tilgjengelig på alle komponenter. I eksempelet under brukes det på en overskrift for å sørge for at den starter på en ny side:

    {
      "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
      "data": {
        "layout": [
          {
            "id": "pdf-header",
            "type": "Header",
            "textResourceBindings": {
              "title": "Dette er en ny seksjon"
            },
            "size": "L",
            "pageBreak": {
              "breakBefore": "always",
              "breakAfter": "avoid"
            }
          }
        ]
      }
    }
    

    NB: Verdien av breakBefore og breakAfter kan enten være auto (standard), always, avoid, eller ett uttrykk som returnerer en av disse verdiene.

    Det er mulig å ekskludere enkeltkomponenter inne i en gruppe ved å bruke excludedChildren-egenskapen på en Summary-komponent som refererer til en Group-komponent. Dette gjøres ved å legge ID-en til komponenten i listen over ekskluderte komponenter som i eksempelet under:

    {
      "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
      "data": {
        "layout": [
          {
            "id": "pdf-group-summary",
            "type": "Summary",
            "componentRef": "en-gruppe-komponent",
            "excludedChildren": ["en-komponent-i-gruppen"]
          }
        ]
      }
    }
    

    Forhåndsvisning i nettleseren

    Forhåndsvisningen gjelder kun dersom du bruker ny PDF generering (v7.5+). Se ovenfor for mer informasjon.

    Det er mulig å se en forhåndsvisning av hvordan den genererte PDF-en kommer til å se ut i nettleseren imens du jobber. Følg instruksjonene nedenfor:

    1. Viktig: Bruk Google Chrome til å forhåndsvise PDF.
      PDF-generatoren bruker en variant av Chrome til å generere PDF-en, så andre nettlesere vil ikke produsere et korrekt resultat ved forhåndsvisning.
    2. Kjør opp appen din lokalt eller åpne appen din i testmiljøet, og start en instans.
    3. Åpne utviklerverktøyet ved å trykke på knappen nederst i høyre hjørne, eller bruk hurtigtasten Ctrl+Shift+K/⌘+Shift+K.

      Knappen som åpner utviklerverktøyet, skjermbilde

    4. Trykk på Forhåndsvis PDF-knappen i utviklerverktøyet.

      Utviklerverktøyet, skjermbilde

    Denne funksjonaliteten er kun tilgjengelig i versjon 8.3.8 og høyere.

    Forutsetninger

    For å bruke PDF footer-funksjonaliteten må applikasjonen din støtte tidssoner. Dette gjøres ved å legge til følgende linjer i Dockerfile:

      # Add globalization timezone support
      RUN apk add --no-cache icu-libs icu-data-full tzdata
      ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
    

    Linjene må legges til etter “FROM”-seksjonen som ender på “AS final”

    Configuration

    Di kan legge til en footer i den genererte PDF-en ved å legge til "DisplayFooter": true i PdfGeneratorSettings-seksjonen i appsettings.json-filen.

      "PdfGeneratorSettings": {
        "DisplayFooter": true
      }
    

    Innhold

    Footeren vil inneholde følgende informasjon:

    • Navnet på appen

    • Navnet på organisasjonen

    • Dato og tid for når PDF-en ble generert

    • Altinn referanse-ID

    • Sidenummer

      PDF footer eksempel

    Skjule app-navnet i PDF-en

    Du kan skjule app-navnet i toppteksten og bunnteksten i den genererte PDF-en ved å sette hideAppNameInPdf i uiSettings i layout-sets.json.

    Egenskapen godtar true, false, eller et boolsk dynamisk uttrykk. Uttrykket må evaluere til true eller false — tekstuttrykk støttes ikke.

    {
      "uiSettings": {
        "hideAppNameInPdf": true
      }
    }
    

    Se dynamiske uttrykk for mer informasjon.

    Lag en PDF i Figma

    Hvis du vil teste hvordan du kan sette opp PDF-en din, kan du gjøre det her:
    Altinn Studio Komponenter.
    Merk at eksempelet ikke er identisk med den faktiske koden, men er tilpasset for å lage prototyper i Figma.