使用FPDF生成PDF时,拼接URL传参生成二维码遇400错误求助
收集表单输入的文本字段数据,拼接成URL参数传递给二维码生成器,通过FPDF库在PDF中展示二维码(扫描可查看表单数据),但拼接URL与字符串数据时出现错误。
主PDF生成代码
<?php ..... $str_det=$School_Name . "-" . $School_Place . "-" . $Student_Name; $url="http://localhost/SCHL/qr_generator.php?code="; $pdf->Image("http://localhost/SCHL/qr_generator.php?code=".$str_det, 100,100, 60, 60, "png"); .... ?>
qr_generator.php代码
<?php require_once("phpqrcode/qrlib.php"); QRcode::png($_GET['code']); ?>
Warning: fopen(http://localhost/SCHL/qr_generator.php?code=Our Angels Mat Hr school-Valasaravakkam-Mahesh Sugumar): Failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in C:\xampp\htdocs\SCHL\fpdf.php on line 1274
Fatal error: Uncaught Exception: FPDF error: Can't open image file: http://localhost/SCHL/qr_generator.php?code=Our Angels Mat Hr school-Valasaravakkam-Mahesh Sugumar in C:\xampp\htdocs\SCHL\fpdf.php:267 Stack trace: #0 C:\xampp\htdocs\SCHL\fpdf.php(1276): FPDF->Error('Can't open imag...') #1 C:\xampp\htdocs\SCHL\fpdf.php(890): FPDF->_parsepng('http://localhos...') #2 C:\xampp\htdocs\SCHL\generate_pdf.php(56): FPDF->Image('http://localhos...', 100, 100, 60, 60, 'png') #3 {main} thrown in C:\xampp\htdocs\SCHL\fpdf.php on line 267
方案1:对参数值进行URL编码
错误根源是拼接的字符串包含空格等特殊字符,未做URL编码导致HTTP请求被判定为无效。使用urlencode()函数处理参数值即可解决:
<?php ..... $str_det = $School_Name . "-" . $School_Place . "-" . $Student_Name; // 对参数值进行URL编码 $encoded_str = urlencode($str_det); $pdf->Image("http://localhost/SCHL/qr_generator.php?code=" . $encoded_str, 100, 100, 60, 60, "png"); .... ?>
方案2:本地生成二维码再插入PDF
绕开HTTP请求的方式,直接在本地生成临时二维码图片,插入PDF后删除临时文件,稳定性更高:
<?php require_once("phpqrcode/qrlib.php"); ..... $str_det = $School_Name . "-" . $School_Place . "-" . $Student_Name; // 生成临时二维码图片 $temp_qr_path = tempnam(sys_get_temp_dir(), 'qr_') . '.png'; QRcode::png($str_det, $temp_qr_path); // 将本地图片插入PDF $pdf->Image($temp_qr_path, 100, 100, 60, 60, "png"); // 删除临时文件 unlink($temp_qr_path); .... ?>
内容的提问来源于stack exchange,提问作者user6161

