Laravel使用TCPDF导出数据库存储的HTML条码至PDF输出异常
问题根因
你调用TCPDF的write1DBarcode()方法时,传入的参数是数据库中存储的HTML条码渲染片段,但该方法设计上仅接收原始条码数值(即你生成条码时使用的商品ID),传入HTML内容会导致TCPDF解析异常,输出不符合预期的错误条码。同时你当前代码中指定的条码类型为C39(对应CODE 39格式),和你之前用Picqer生成的CODE 128格式不匹配,也会导致条码无法正常识别。
解决方案
方案1:直接用商品ID生成条码(推荐)
无需调用数据库中存储的HTML条码,直接将商品ID传入write1DBarcode方法即可,修改导出代码如下:
// set style for barcode PDF::SetMargins(3, 3, 3); // remove default header/footer PDF::setPrintHeader(false); PDF::setPrintFooter(false); PDF::setFontSubsetting(true); PDF::SetFont('freeserif', '', 12); // define barcode style $style = array( 'border' => true, 'hpadding' => 'auto', 'vpadding' => 'auto', 'fgcolor' => array(0,0,0), 'bgcolor' => false, 'text' => true, 'font' => 'helvetica', 'fontsize' => 8, 'stretchtext' => 4 ); PDF::SetTitle('商品条码导出'); PDF::AddPage(); PDF::Cell(0, 0, $products[0]->name, 0, 1); // 直接传商品ID,条码类型修改为对应CODE 128的C128 PDF::write1DBarcode($products[0]->id, 'C128', '5', '5', '60', 14, 0.4, $style, 'N'); PDF::Ln(5); PDF::Output('product_barcode.pdf', 'I');
该方案生成的条码清晰度更高,渲染性能更好。
方案2:渲染已存储的HTML条码
如果你需要完全复用数据库中已存储的HTML条码样式,可改用TCPDF的writeHTML()方法直接渲染HTML内容,无需调用条码生成接口:
// 其他配置保持不变 PDF::SetTitle('商品条码导出'); PDF::AddPage(); PDF::Cell(0, 0, $products[0]->name, 0, 1); // 解码HTML后直接写入PDF PDF::writeHTML(html_entity_decode($products[0]->barcode)); PDF::Ln(5); PDF::Output('product_barcode.pdf', 'I');
内容的提问来源于stack exchange,提问作者Bebo
相关产品推荐
相关产品推荐

