\documentclass{scrartcl}

\usepackage[left=1.9cm, right=2.75cm, top=0cm, bottom=0cm]{geometry}
\pagestyle{empty}
\usepackage{background}
\backgroundsetup{scale = 1.0, angle = 0, opacity = 1.0,%
  contents = {\includegraphics[width = \paperwidth, height = \paperheight,
    keepaspectratio] {templates/Badge_Kiffel.pdf}}}%

\usepackage{qrcode}

\usepackage{xcolor}
\definecolor{helfer} {rgb}{0.69, 0.88, 0.11}  % #B1E11C (grün)
\definecolor{kiffel} {rgb}{0.09, 0.45, 0.56}  % #16738F (petrol)
\definecolor{orga}   {rgb}{0.69, 0.11, 0.20}  % #B11D33 (rot)
\definecolor{sponsor}{rgb}{0.35, 0.00, 0.50}  % #5A0080 (lila)
\definecolor{kukkel} {rgb}{0.96, 0.56, 0.07}  % #F48E12 (orange)

\usepackage{fontspec}
\usepackage{montserrat}
\usepackage{microtype}
\setmainfont{Montserrat}

% fitbox stuff
\usepackage{environ}% http://ctan.org/pkg/environ
\newdimen\fontdim%
\newdimen\upperfontdim%
\newdimen\lowerfontdim%
\newif\ifmoreiterations%
\fontdim12pt

\newbox\trialbox%
\newbox\linebox%
\global\newcount\maxbad%
\newcount\linebad%
\newcount\currenthbadness%


\makeatletter
\NewEnviron{fitbox}[2]{% \begin{fitbox}{<width>}{<height>} stuff \end{fitbox}
    % Store environment body
    \def\stuff{%
        \BODY%
    }%
    % prepare badness box
    \def\badnessbox{%
        \global\maxbad=0\relax%
        \currenthbadness=\hbadness% save old \hbadness
        \hbadness=10000000\relax% make sure, TeX reports overfull boxes
        \message{Starting measureline recursion with width #1^^J}%
        \setbox\trialbox=\vbox{%
            \hsize#1\relax%
            \fontsize{\fontdim}{1.2\fontdim}%
            \selectfont%
            \stuff\par%
            \measurelines% start recursion
        }%
%       \noindent\usebox\trialbox\par
        \hbadness=\currenthbadness% restore old \hbadness
    }
    % prepare recursion to measure line badness
    \def\measurelines{%
        \message{Iteration of measurelines^^J}%
        \begingroup%
            \setbox\linebox=\lastbox% get the last line
            \setbox0=\hbox%
            to \hsize{\unhcopy\linebox}% put the last line into box0 to provoke badness calculation
            \linebad=\the\badness\relax% \badness now reflects the last typeset box, i.e. box0
            \message{Badness: \the\badness\space\the\linebad\space with max \the\maxbad\space at Fontsize: \the\fontdim\space^^J}%
            \ifnum\linebad>\maxbad% store the maximum badness
                \global\maxbad=\linebad% Uncomment this line to ignore overfull hboxes!
            \fi%
            \ifvoid% end of recursion
                \linebox%
            \else%
                \unskip\unpenalty\measurelines% do the recursion
                \ifhmode%
                    \newline%
                \fi%
                \noindent\box\linebox% do the output
            \fi%
        \endgroup%
    }%
    % Prepare measurement box
    \def\buildbox{%
        \badnessbox% measure badness
        \setbox0\vbox{% measure height
            \hbox{%
                \fontsize{\fontdim}{1.2\fontdim}%
                \selectfont%
                \minipage{#1}%
                    \vbox{%                     
                        \stuff\par%
                    }%
                \endminipage%
            }%
        }%
        \message{Measured badness: \the\maxbad\space at Fontsize: \the\fontdim\space^^J}%
        \dimen@\ht0
        \advance\dimen@\dp0
        \message{Measured box height: \the\dimen@\space^^J}%
    }%
    \def\shrinkheight{%
        \loop%
            \fontdim.5\fontdim% Reduce font size by half
            \buildbox%
            \message{Shrinking, new box height: \the\dimen@\space at Fontsize: \the\fontdim\space^^J}%
        \ifdim\dimen@>#2 \repeat%
        \lowerfontdim\fontdim%
        \upperfontdim2\fontdim%
        \fontdim1.5\fontdim%
    }%
    \def\shrinkwidth{%
        \loop%
            \fontdim.5\fontdim% Reduce font size by half
            \buildbox%
        \ifnum\maxbad>10000 \repeat%
        \lowerfontdim\fontdim%
        \upperfontdim2\fontdim%
        \fontdim1.5\fontdim%
    }%
    \def\growheight{%
        \loop%
            \fontdim2\fontdim% Double font size
            \buildbox%
            \message{Growing, new box height: \the\dimen@\space at Fontsize: \the\fontdim\space^^J}%
        \ifdim\dimen@<#2 \repeat%
        \upperfontdim\fontdim%
        \lowerfontdim.5\fontdim%
        \fontdim.75\fontdim%
    }%
    \buildbox%
    % Compute upper and lower bounds
    \ifdim\dimen@>#2
        \message{Need to shrink box height: \the\dimen@\space^^J}%
        \shrinkheight%
    \else
        \message{Need to grow box height: \the\dimen@\space to target: #2^^J}%
        \growheight%
    \fi
    \message{Max font: \the\upperfontdim\space^^J}%
    \message{Min font: \the\lowerfontdim\space^^J}%
    % Potentially further reduce bounds for overfull box
    \ifnum\maxbad>10000
        \shrinkwidth%
    \fi 
    \message{Max font adjusted: \the\upperfontdim\space^^J}%
    \message{Min font adjusted: \the\lowerfontdim\space^^J}%
    % Now try to find the optimum height and width
    \loop%
        \buildbox%
        \message{Height: \the\dimen@\space^^J}%
        \ifdim\dimen@>#2
            \moreiterationstrue%
            \upperfontdim\fontdim%
            \advance\fontdim\lowerfontdim%
            \fontdim.5\fontdim%
        \else
            \ifnum\maxbad>10000
                \moreiterationstrue%
                \upperfontdim\fontdim%
                \advance\fontdim\lowerfontdim%
                \fontdim.5\fontdim%
            \else
                \advance\dimen@-#2
                \ifdim\dimen@<10pt
                    \lowerfontdim\fontdim%
                    \advance\fontdim\upperfontdim%
                    \fontdim.5\fontdim%
                    \dimen@\upperfontdim%
                    \advance\dimen@-\lowerfontdim%
                    \ifdim\dimen@<.2pt
                        \moreiterationsfalse%
                    \else
                        \moreiterationstrue%
                    \fi
                \else
                    \moreiterationsfalse%
                \fi
            \fi
        \fi
    \ifmoreiterations\repeat%
    \message{Selected font: \the\fontdim\space^^J}%
    \vbox%
    to #2{\box0\hbox{}}% Typeset content
}%
\makeatother

\def\chopline#1,#2,#3 \\{
  \def\name{#1}
  \def\kdvCode{#2}
  \def\uni{#3}
}

\newif\ifmore{} \moretrue%

\begin{document}

\newread\file%
\openin\file=list_kiffel.csv

\loop%
  \read\file%
    to \line%
  \ifeof\file%
    \global\morefalse%
  \else
    \expandafter\chopline\line\\

\vspace*{4.5cm}
\begin{minipage}[t][][c]{\textwidth}
  \begin{fitbox}{\textwidth}{.075\textheight}
    \centering
    \textbf{\name}%
  \end{fitbox}
\end{minipage}

\vspace*{.75cm}
\begin{minipage}[t][][c]{\textwidth}
  \begin{fitbox}{\textwidth}{.042\textheight}
    \centering
    \uni%
  \end{fitbox}
\end{minipage}

\vspace{7.30cm}
\qrcode[height=54.831mm]{\kdvCode}

\pagebreak

\fi%
\ifmore\repeat%
%
\closein\file%

\end{document}
