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();
我有一个标签生成器,如果您有足够的标签可以打印,它就可以正常工作,在我的例子中,它大约有 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();