Altinn / altinn-pdf

Altinn platform microservice for generating PDFs
0 stars 1 forks source link

Dynamic hiding of elements in pdf results in multiple blank pages #8

Closed OddArneSaetervik closed 2 years ago

OddArneSaetervik commented 2 years ago

@hflateland commented on Fri Mar 11 2022

We have a long form with many questions, where the user often only changes radio-button values on a few. We have therefore added dynamic hiding in the produced PDF of all fields in the schema that is unchanged (Possible answers are Yes, No, Unchanged).

The problem that we face is that the PDF is still created with room for all the fields that has been hidden and we get a PDF with eight blank pages that otherwise would have contained the answers.

Screenshot: image

Example file: Forespørsel om endring av vergefullmakt (6).pdf

Steps to reproduce:

Analysis

Ater studying the source code for the PdfHandler implemented in the app in question. Seems the issue is simple to fix through the code. There is a possibility of excluding full pages in addition to the form components. By re-writing the logic when components are hidden to check if the isn't any content left on the page, the page can simple be excluded.

old logic:

  var list = new[]{
        new {Item = page3, Headers = page3Headers},
        new {Item = page4, Headers = page4Headers},
        new {Item = page5, Headers = page5Headers},
        new {Item = page6, Headers = page6Headers},
        new {Item = page7, Headers = page7Headers},
        new {Item = page8, Headers = page8Headers},
        new {Item = page9, Headers = page9Headers},
        new {Item = page10, Headers = page10Headers},

      };

      foreach (var page in list)
      {
        var hasValue = false;
        foreach (var item in page.Item)
        {
          if (item.Value == "ingenEndring" || string.IsNullOrEmpty(item.Value))
            layoutSettings.Components.ExcludeFromPdf.Add(item.Id);
          else
            hasValue = true;
        }
        if (!hasValue)
          foreach (var item in page.Headers)
          {
            layoutSettings.Components.ExcludeFromPdf.Add(item.Id);
          }
      }
    }

new logic


            var list = new[]{
                new {Name = "side03", Item = page3, Headers = page3Headers},
                new {Name = "side04",Item = page4, Headers = page4Headers},
                new {Name = "side05",Item = page5, Headers = page5Headers},
                new {Name = "side06",Item = page6, Headers = page6Headers},
                new {Name = "side07",Item = page7, Headers = page7Headers},
                new {Name = "side08",Item = page8, Headers = page8Headers},
                new {Name = "side09",Item = page9, Headers = page9Headers},
                new {Name = "side10",Item = page10, Headers = page10Headers}
             };

            foreach (var page in list)
            {
                var hasValue = false;
                foreach (var item in page.Item)
                {
                    if (item.Value == "ingenEndring" || string.IsNullOrEmpty(item.Value))
                        layoutSettings.Components.ExcludeFromPdf.Add(item.Id);
                    else
                        hasValue = true;
                }

                if (!hasValue)
                {
                    layoutSettings.Pages.ExcludeFromPdf ??= new List<string>();
                    layoutSettings.Pages.ExcludeFromPdf.Add(page.Name);
                }
            }

new logic results in this pdf image.png This issue seems to be partly related to https://github.com/Altinn/app-frontend-react/issues/790