Создание многостолбцовых и многостраничных PDF-файлов с помощью FPDF - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь использовать модуль FPDF с Laravel (crabbly / fpdf-laravel)

Нужно создать 1+ страничку с 3 колонками документов. По сути, у меня есть список пар TERM: DESCRIPTION, которые мне нужно выводить одна за другой. Я борюсь с общей логикой, и я даже не уверен, правильно ли я делаю это и задаюсь вопросом, есть ли лучшее решение для этого (кто бы ни знаком с FPDF)

  1. Получить список терминов: Описание пар ($ глоссарий)
  2. Разделите каждое описание на строки длиной не более 75 символов
  3. Подсчитайте, сколько строк уже в столбце
  4. Добавить строки к сообщению
  5. Переключение страницы / столбца, когда число строк превышает определенную длину в 51 строку на столбец

Вот код, который я придумал:

public function getCreatePDF($flascard_id) {
    $flashcard = Flashcard::where('user_id', auth()->id())->findOrFail($flascard_id);

    $glossary = Glossary::with('flashcarditem')
            ->whereHas('flashcarditem', function ($query) use ($flascard_id) {
                $query->where('flashcard_id', '=', $flascard_id);
            })
            ->get();

    $pdf = app('FPDF');
    $pdf->col = 0;
    $pdf->AcceptPageBreak(false);
    //My Loop Controls
    $column = 0; //Control which column to add data
    $columnLenght = 0; //monitor if we need to change the column
    $maxLinesPerColumn = 51;
    $wrapCharacters = 75; //do not exceed this char qty per line
    $collectedDescription = ""; //stack Description here

    $pdf->AddPage(['L', 'Letter']);
    $pdf->SetFont('Arial', 'B');
    $pdf->SetFontSize(18);
    $mid_x = 135; // the middle of the "PDF screen", fixed by now.        
    $pdf->Text($mid_x - ($pdf->GetStringWidth('TITLE') / 2), 102, 'TITLE');
    $pdf->AddPage(['L', 'Letter']);
    $pdf->SetFontSize(7);

    foreach ($glossary as $key => $g) {
        $chunks = explode("\n", wordwrap(strip_tags($g->description), $wrapCharacters));
        $actionCollect = 1;
        $collectedDescription = "";


        for ($i = 0; $i < count($chunks); $i++) {
            if ($columnLenght > $maxLinesPerColumn && $column == 2) {
                $column = 0;
                $columnLenght = 1;

                $pdf->AddPage(['L', 'Letter']);
                $pdf->Footer("d");
                $pdf->col = $column;
                $x = 10 + $column * 95;
                $pdf->SetLeftMargin($x);
                $pdf->SetX($x);
                $pdf->SetY(8);
                $actionCollect = 0;
            } else if ($columnLenght > $maxLinesPerColumn && $column < 2) {
                $columnLenght = 1;
                $column++;
                $pdf->col = $column;
                $x = 10 + $column * 95;
                $pdf->SetLeftMargin($x);
                $pdf->SetX($x);
                $pdf->SetY(8);
                $actionCollect = 0;
            } else {
                $columnLenght ++;
                $actionCollect = 1;
            }

            if ($i == 0) {
                $columnLenght ++;
                $pdf->SetFont('Arial', 'B');
                $term = html_entity_decode($g->term);
                $pdf->MultiCell(90, 3, $term, 'R');
                $pdf->Ln(0);
            }

            $collectedDescription.=strip_tags($chunks[$i]);

            if (count($chunks) - 1 && $i == 0) {

                $pdf->SetFont('Arial');
                $pdf->MultiCell(90, 3, $collectedDescription, 'R');
                $actionCollect = 0;
                $collectedDescription = "";
            } else {
                $pdf->SetFont('Arial');
                $pdf->MultiCell(90, 3, strip_tags($chunks[$i]), 'R');
                $actionCollect = 0;
                $collectedDescription = "";
            }
        }

        $pdf->Ln(1);
    }
}

Мое желаемое состояние

desired state

...