Sist endret: 29. jan. 2026

PDF

Generering av PDF følger med appen som en standard systemoppgave som kan legges til som et steg i prosessen.

Tidligere lå ikke denne funksjonaliteten i en systemoppgave, men var bakt inn i den grenerelle koden for å endre prosesssteg. Dersom appen din ble satt opp før versjon 8.9, så bør du deaktivere funksjonalitenen som kjøres utenfor prosessdefinisjonen.

Det gjør du ved å slå av “enablePdfGeneration” på alle datatyper.

Fordeler med å migrere til systemoppgave er:

  • Mulighet for å prøve på nytt dersom PDF-generering feiler, uten å måtte kjøre en full process next på ny, som kan ha utilsiktede sideeffekter.
  • Mulighet til å lage mange PDF-er basert på en oppgave, eller slå sammen mange oppgaver til én PDF.
  • I fremtiden: Kjøre PDF-generering som bakgrunnsjobb med automatiske retries og bedre skalering.

Du kan bruke arbeidsflyt-fanen i Altinn Studio for å legge til en PDF-systemoppgave. Det finnes to alternativer:

Følgende systemoppgave vil bli satt inn i process.bpmn. Innholdet vil da basere seg på komponentene i skjemaet, men i “oppsummeringsmodus”. Denne funksjonen respekterer ikke pdfLayoutName-konfigurasjon i Settings.json.

App/config/process/process.bpmn
<bpmn:serviceTask id="Pdf_auto" name="PDF">
    <bpmn:extensionElements>
        <altinn:taskExtension>
            <altinn:taskType>pdf</altinn:taskType>
            <altinn:pdfConfig>
                <altinn:filenameTextResourceKey>pdfFileName</altinn:filenameTextResourceKey>
                <altinn:autoPdfTaskIds>
                    <altinn:taskId>Form1</altinn:taskId>
                    <altinn:taskId>Form2</altinn:taskId>
                </altinn:autoPdfTaskIds>
            </altinn:pdfConfig>
        </altinn:taskExtension>
    </bpmn:extensionElements>
    <bpmn:incoming>Flow_0er70tq</bpmn:incoming>
    <bpmn:outgoing>Flow_19ikt1z</bpmn:outgoing>
</bpmn:serviceTask>

Følgende systemoppgave vil bli satt inn i process.bpmn. Med dette alternativet så kan du selv definere innholdet i PDF-en i et layout-set for PDF-systemoppgaven.

App/config/process/process.bpmn
<bpmn:serviceTask id="Pdf" name="PDF">
    <bpmn:extensionElements>
        <altinn:taskExtension>
            <altinn:taskType>pdf</altinn:taskType>
            <altinn:pdfConfig>
                <altinn:filenameTextResourceKey>pdfFileName</altinn:filenameTextResourceKey>
            </altinn:pdfConfig>
        </altinn:taskExtension>
    </bpmn:extensionElements>
    <bpmn:incoming>SequenceFlow_0c458hu</bpmn:incoming>
    <bpmn:outgoing>SequenceFlow_5assd2s</bpmn:outgoing>
</bpmn:serviceTask>

Layout-set

Det trengs et nytt layout-set for PDF-systemoppgaven for å definere innholdet. Dette vil bli automatisk generert om du bruker arbeidsflyt-editor. Da må du bare redigere innholdet i PdfLayout.json.

Filene og mappestrukturen skal se omtrent slik ut:

App/ui/
├── layout-sets.json
├── form/
│   ├── Settings.json
│   └── layouts/
│       └── ...
└── Pdf/
    ├── Settings.json
    └── layouts/
        ├── PdfLayout.json
        └── ServiceTask.json

layout-sets.json

App/ui/layout-sets.json
{
  "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout-sets.schema.v1.json",
  "sets": [
    {
      "id": "form",
      "dataType": "model",
      "tasks": [
        "Task_Utfylling"
      ]
    },
    {
      "id": "Pdf",
      "dataType": "model",
      "tasks": [
        "Pdf"
      ]
    }
  ],
  "uiSettings": {
    "taskNavigation": [
      {
        "taskId": "Task_Utfylling",
        "name": "Utfylling"
      },
      {
        "type": "receipt"
      }
    ]
  }
}

Settings.json

App/ui/Pdf/Settings.json
{
  "$schema": "https://altinncdn.no/schemas/json/layout/layoutSettings.schema.v1.json",
  "pages": {
    "pdfLayoutName": "PdfLayout",
    "order": [
      "ServiceTask"
    ]
  }
} 

PdfLayout.json

I denne filen defineres innholdet i PDF-en. Ofte brukes komponenten Summary2, enten mot enkeltkomponter eller mot hele sider/layout-sets.

App/ui/Pdf/layouts/PdfLayout.json
{
  "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
  "data": {
    "layout": [
      {
        "id": "InstanceInformation",
        "type": "InstanceInformation"
      },
      {
        "id": "Summary_form",
        "type": "Summary2",
        "target": {
          "type": "layoutSet",
          "taskId": "form"
        }
      }
    ]
  }
}

ServiceTask.json

Denne layout-filen vises hvis PDF-genereringen feiler. Den kan inneholde feilmeldinger eller instruksjoner til brukeren. Tilpass gjerne.

App/ui/Pdf/layouts/ServiceTask.json
{
  "$schema": "https://altinncdn.no/schemas/json/layout/layout.schema.v1.json",
  "data": {
    "layout": [
      {
        "size": "L",
        "id": "service-task-title",
        "type": "Header",
        "textResourceBindings": {
            "title": "service_task.title"
        }
      },
      {
        "id": "service-task-body",
        "type": "Paragraph",
        "textResourceBindings": {
            "title": "service_task.body"
        }
      },
      {
        "id": "service-task-help-text",
        "type": "Paragraph",
        "textResourceBindings": {
            "title": "service_task.help_text"
        }
      },
      {
        "id": "service-task-button-group",
        "type": "ButtonGroup",
        "children": [
            "service-task-retry-button",
            "service-task-back-button"
        ]
      },
      {
        "id": "service-task-retry-button",
        "type": "Button",
        "textResourceBindings": {
            "title": "service_task.retry_button"
        }
      },
      {
        "id": "service-task-back-button",
        "type": "ActionButton",
        "textResourceBindings": {
            "title": "service_task.back_button"
        },
        "action": "reject",
        "buttonStyle": "secondary"
      },
    ]
  }
}

Filnavn

Det er frivillig å inkludere <altinn:filenameTextResourceKey>. Her kan du oppgi en tekstressursnøkkel som vil bli brukt somn filnavn, med språk og variabelstøtte. Om den mangler vil PDF-en få navnet på applikasjonen som filnavn.

{
  "id": "pdfFileName",
  "value": "Mitt filnavn {0}",
  "variables": [
    {
      "key": "EtDatamodellfelt",
      "dataSource": "dataModel.model"
    }
  ]
}
Ved bruk av autogenerert PDF kan man ikke bruke datamodel.default. Man må bruke faktisk ID for datamodellen, feks. dataModel.model.

Test

Fyll ut skjemaet og gå videre. Når du når systemoppgaven for PDF i arbeidsflyten, så skal PDF-en genereres og gå automatisk videre til neste element i BPMN-prosessen, for eksempel kvittering.

Feilsøking

Dersom du får feilmelding om at systemoppgaven feilet under PDF-generering, så kan det være lurt å åpne skjemaet i appen og legge til query param pdf=1. Da vil du se det samme innholdet som PDF-en skulle inneholdt, og evt. de samme feilmeldingene i frontend.