PHP FPDF 标签输出 gibberish/garbage 数据,如果没有打印足够的标签,但足够了它工作正常

PHP FPDF Label outputting gibberish/garbage data if not enough labels are printed, but with enough it works just fine

我有一个标签生成器,如果您有足够的标签可以打印,它就可以正常工作,在我的例子中,它大约有 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("%s\n%s, %s, %s\n%s\n%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('/^(\xEF\xBB\xBF)?\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;

当我看到我的错误时,它会检查这段代码,但不会输出您看到的任何错误,因此我们可以说缓冲区中没有 headers 已发送或输出。

我找到了一个解决方案,尽管它没有解决根本问题。我在网络选项卡中比较工作和非工作场景中的 headers,并注意到 'Content-Type: application/pdf' 被删除用于较短的条目集(加上一些其他更改)。由于这在我的 Laravel 站点之外没有发生,我尝试在 '$pdf->Output();' 之后添加 'exit;' 这一行现在无论有多少条目都可以使用。

随着较长的条目 sheet,我注意到它增加了 'Transfer-Encoding: chunked' 并保留了 'Content-Type: application/pdf'。也许 Laravel header 处理中存在与此相关的错误?我真的不确定。

试试写下面的内容

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

ob_flush();
exit;

之后

$pdf->Output();