使用FPDF 1.83生成PDF标签时触发DivisionByZeroError除零错误的技术求助
问题分析与解决方案
你的错误是除零异常,根源是调用FPDF的MultiCell时传入了负数宽度(-3),导致FPDF内部计算时出现除数为0的情况。追踪代码可知,这个宽度值来自PDF_Label类的$_Width属性,而该属性是通过标签格式参数转换得到的。
可能的触发原因
- 自定义标签格式
101700参数错误- 你使用的
PdfLabel::$labelFormats['101700']格式中,width字段可能为负数,或者metric参数设置错误,导致转换后$_Width变为负数。
- 你使用的
PDF_Label构造函数的单位逻辑矛盾- 该类构造函数先以标签格式的
metric作为文档单位初始化FPDF,之后又将$_Metric_Doc设为传入的$unit参数,导致单位转换后的数值与实际文档单位不匹配,引发异常数值。
- 该类构造函数先以标签格式的
- 换行符使用错误(附加问题)
- 你在标签文本中使用
\n换行,但FPDF的MultiCell需要\r\n或PHP_EOL才能正确识别换行。
- 你在标签文本中使用
分步解决方案
1. 检查并修正自定义标签格式参数
首先确认101700格式的所有参数是否合法:
// 在index.php中添加以下代码,打印格式参数 var_dump(PdfLabel::$labelFormats['101700']); exit;
重点核查:
width必须为正数metric只能是mm或inmarginLeft、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
相关产品推荐
相关产品推荐

