Ярлык PHP FPDF выводит данные тарабарщины / мусора, если напечатано недостаточно меток, но с достаточным количеством он работает просто отлично

#php #pdf #label #fpdf

#php #PDF #ярлык #fpdf

Вопрос:

У меня есть генератор ярлыков, который отлично работает, если у вас достаточно ярлыков для печати, в моем случае это примерно 3 страницы объемом 5160 или ~ 70 отдельных записей. Если у вас меньше этого числа, вы в конечном итоге просматриваете это вместо загрузки своего PDF: введите описание изображения здесь

Однако, если у вас достаточно записей, он будет работать правильно и выглядеть следующим образом: введите описание изображения здесь

Примечательно, что когда я перешел с реальных данных на фиктивные данные, чтобы я мог использовать для этого экранную шапку, количество страниц должно было составлять ~ 6, поэтому, похоже, он терпит неудачу, когда не хватает необработанного текста, а не отдельных записей.

Я понятия не имею, как это отладить. Это мой код, с которым я работаю:

 $pdf = new PDF_Label('5160');

        $pdf->AddPage();

        foreach ($entries as $entry) {
            $name = 'Demo thing';

            $date = Carbon::create($order->{'Delivery Date'})->format('M d, Y');

            $text = sprintf("%sn%s, %s, %sn%sn%s", 'Business', 'Employee', '4A', 'Floor 7' ?? '---', $date, $name);
            $pdf->Add_Label($text);
        }

        $pdf->Output();
  

Кто-нибудь сталкивался с этим при работе с FPDF_Label раньше? Любая помощь будет оценена, спасибо!

РЕДАКТИРОВАТЬ: Дополнительная информация о проверке ошибок, которую выполняет FPDF:

 protected function _checkoutput()
{
    if(PHP_SAPI!='cli')
    {
        if(headers_sent($file,$line))
            $this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)");
    }
    if(ob_get_length())
    {
        var_dump('test');
        // The output buffer is not empty
        if(preg_match('/^(xEFxBBxBF)?s*$/',ob_get_contents()))
        {
            // It contains only a UTF-8 BOM and/or whitespace, let's clean it
            ob_clean();
        }
        else
            $this->Error("Some data has already been output, can't send PDF file");
    }
}

//below is within the main output function
            $this->_checkoutput();
            
            if(PHP_SAPI!='cli')
            {
                // We send to a browser
                header('Content-Type: application/pdf');
                header('Content-Disposition: inline; '.$this->_httpencode('filename',$name,$isUTF8));
                header('Cache-Control: private, max-age=0, must-revalidate');
                header('Pragma: public');
            }
            echo $this->buffer;
            break;
  

Когда я вижу свою ошибку, она проходит через этот фрагмент кода и не выводит ни одну из тех ошибок, которые вы видите, поэтому мы можем сказать, что в буфере нет уже отправленных или выходных заголовков.

Комментарии:

1. Я думаю, что ошибка возникает, когда вы случайно выводите предупреждение / сообщение об ошибке в потоке pdf. Вы проверяли свои журналы, чтобы увидеть, есть ли предупреждения / ошибки? Вы также можете попробовать отключить ошибки / предупреждения в начале вашего PHP-скрипта.

2. @bassxzero Есть $this-> _checkoutput(); вызов, который выполняется перед выводом заголовков и содержимого. Это проверяет все, что уже было выведено с помощью if(ob_get_length()) , и я проверил, чтобы убедиться, что это не срабатывает, когда возникают эти проблемы, поэтому я не верю, что это причина.

3. @bassxzero Я добавил этот код, который я только что упомянул, в основной пост

4. Вы уверены, что у вас есть выходной буфер, запущенный в начале скрипта / запроса?

5. «Тарабарщина» — это необработанный (неинтерпретированный) PDF.

Ответ №1:

Попробуйте написать следующее

 ob_clean(); before $pdf = new PDF_Label('5160');
  

и

 ob_flush();
exit;
  

после

 $pdf->Output();
  

Ответ №2:

Я нашел решение для этого, хотя оно не решает основную проблему. Я сравнивал заголовки на вкладке сеть для рабочих и нерабочих сценариев и заметил, что «Content-Type: application / pdf» был удален для более короткого набора записей (плюс некоторые другие изменения). Поскольку это не происходило за пределами моего сайта Laravel, я попытался добавить ‘exit;’ строку после ‘$ pdf-> Output ();’ и теперь это работает независимо от количества записей.

С более длинным вводным листом я заметил, что он добавляет «Transfer-Encoding: chunked», а также сохраняет «Content-Type: application / pdf». Возможно, есть ошибка в обработке заголовка Laravel, связанная с этим? Я действительно не уверен.