You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FPDF 1.83生成PDF标签时触发DivisionByZeroError除零错误的技术求助

问题分析与解决方案

你的错误是除零异常,根源是调用FPDF的MultiCell时传入了负数宽度(-3),导致FPDF内部计算时出现除数为0的情况。追踪代码可知,这个宽度值来自PDF_Label类的$_Width属性,而该属性是通过标签格式参数转换得到的。

可能的触发原因

  1. 自定义标签格式101700参数错误
    • 你使用的PdfLabel::$labelFormats['101700']格式中,width字段可能为负数,或者metric参数设置错误,导致转换后$_Width变为负数。
  2. PDF_Label构造函数的单位逻辑矛盾
    • 该类构造函数先以标签格式的metric作为文档单位初始化FPDF,之后又将$_Metric_Doc设为传入的$unit参数,导致单位转换后的数值与实际文档单位不匹配,引发异常数值。
  3. 换行符使用错误(附加问题)
    • 你在标签文本中使用\n换行,但FPDF的MultiCell需要\r\n或PHP_EOL才能正确识别换行。

分步解决方案

1. 检查并修正自定义标签格式参数

首先确认101700格式的所有参数是否合法:

// 在index.php中添加以下代码,打印格式参数
var_dump(PdfLabel::$labelFormats['101700']);
exit;

重点核查:

  • width必须为正数
  • metric只能是mm或in
  • marginLeft、marginTop、NX、NY等参数均为合理正数

如果发现width为负数,直接修正为正数即可解决核心问题。

2. 修复PDF_Label构造函数的单位逻辑

构造函数中初始化FPDF时,应该使用传入的$unit作为文档单位,而非标签格式的metric。修改构造函数如下:

function PDF_Label ($format, $unit='mm', $posX=1, $posY=1) {
    if (is_array($format)) {
        $Tformat = $format;
    } else {
        $Tformat = $this->_Avery_Labels[$format];
    }
    // 修复:使用传入的$unit作为文档单位,而非$Tformat['metric']
    parent::FPDF('P', $unit, $Tformat['paper-size']);
    $this->_Metric_Doc = $unit; // 先设置文档单位,再进行格式转换
    $this->_Set_Format($Tformat);
    $this->Set_Font_Name('Arial');
    $this->SetMargins(0,0);
    $this->SetAutoPageBreak(false);

    // 剩余代码保持不变
    if ($posX > 1)
        $posX--;
    else
        $posX=0;
    if ($posY > 1)
        $posY--;
    else
        $posY=0;
    if ($posX >= $this->_X_Number)
        $posX = $this->_X_Number-1;
    if ($posY >= $this->_Y_Number)
        $posY = $this->_Y_Number-1;
    $this->_COUNTX = $posX;
    $this->_COUNTY = $posY;
}

这个修复确保了单位转换后的数值与文档实际单位一致,避免因单位不匹配导致的异常数值。

3. 修正标签文本的换行符

将index.php中的\n替换为PHP_EOL,确保MultiCell能正确识别换行:

$text = $row['NOME'].' '.$row['COGNOME'].PHP_EOL;
$text.= $row['INDIRIZZO'].PHP_EOL;
$text.= $row['CITTA'].PHP_EOL;
$text.= $row['CAP'].PHP_EOL;

4. 验证宽度数值(可选调试)

在Add_PDF_Label方法中添加调试代码,确认$_Width的有效性:

function Add_PDF_Label($texte) {
    // 添加调试代码,提前拦截无效宽度
    if ($this->_Width <= 0) {
        die("Invalid label width detected: " . $this->_Width);
    }
    // 剩余代码保持不变
    if (($this->_COUNTX ==0) and ($this->_COUNTY==0)) {
        $this->AddPage();
    }
    $_PosX = $this->_Margin_Left+($this->_COUNTX*($this->_Width+$this->_X_Space));
    $_PosY = $this->_Margin_Top+($this->_COUNTY*($this->_Height+$this->_Y_Space));
    $this->SetXY($_PosX+3, $_PosY+3);
    $this->MultiCell($this->_Width, $this->_Line_Height, $texte);
    $this->_COUNTY++;
    if ($this->_COUNTY == $this->_Y_Number) {
        $this->_COUNTX++;
        $this->_COUNTY=0;
    }
    if ($this->_COUNTX == $this->_X_Number) {
        $this->_COUNTX=0;
        $this->_COUNTY=0;
    }
}

总结

最可能的核心问题是自定义标签格式的width参数错误,或者PDF_Label构造函数的单位逻辑矛盾。按照上述步骤逐一排查,应该能快速解决除零错误。

内容的提问来源于stack exchange,提问作者Claudia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:07:28