PHP使用TCPDF设置5.8cm宽自定义页面尺寸不生效问题
问题根因
无报错但尺寸不生效是两个问题叠加导致的:
AddPage()参数传参顺序完全错误
TCPDF的页面单位是构造实例时全局指定的,AddPage()方法没有单独设置单位的入参,该方法的官方签名如下:
public function AddPage( $orientation = '', // 页面方向 $format = '', // 页面格式/自定义尺寸 $keepmargins = false, // 是否保留之前的边距设置,布尔值 $tocpage = false // 是否为目录页 )
你写的$pdf->AddPage('P', 'cm', array(5.8,7));中,第二个参数位置本来应该传页面格式/尺寸,你传入了字符串'cm';第三个参数位置本来应该传布尔值,你传入了尺寸数组。PHP弱类型特性下不会抛出参数类型错误,只会把传入的数组隐式转换为布尔值true,你设置的自定义尺寸根本没有被方法识别,最终页面沿用了构造函数里默认的PDF_PAGE_FORMAT(默认值为A4规格),尺寸自然不符合预期。
2. 默认单位不匹配
TCPDF全局默认长度单位PDF_UNIT的取值是mm(毫米),如果你没有手动修改过该常量定义,就算参数位置传对,直接传厘米单位的数值也会出现10倍的尺寸偏差。
解决方案
二选一即可:
方案1:全局设置厘米单位,按参数规范传值
构造TCPDF实例时直接指定全局单位为厘米,同时设置默认页面尺寸,后续调用AddPage()不需要重复传单位:
// 构造函数第二个参数指定全局单位为cm,第三个参数传默认自定义页面尺寸[宽5.8cm, 高7cm] $pdf = new TCPDF('P', 'cm', array(5.8,7), true, 'UTF-8', false); // 新增页面时仅传方向即可,会自动沿用全局设置的单位和默认尺寸 $pdf->AddPage('P'); // 如果后续需要新增其他尺寸的页面,把尺寸数组作为第二个参数传入即可 // $pdf->AddPage('P', array(10, 8));
方案2:沿用默认毫米单位,换算尺寸后传入
如果不想修改全局单位,将厘米尺寸换算为毫米后传入即可:
// 沿用默认配置,默认单位为mm $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // 5.8cm=58mm,7cm=70mm,尺寸数组作为AddPage第二个参数传入 $pdf->AddPage('P', array(58,70));
尺寸校验方法
生成文件前可以调用内置方法确认尺寸是否正确,返回值单位和你设置的全局单位一致:
// 输出当前页面宽高做校验 echo '当前页面宽度:' . $pdf->getPageWidth() . ',当前页面高度:' . $pdf->getPageHeight();
生成文件后也可以直接在PDF阅读器的「文档属性」中查看实际页面尺寸做二次确认。
内容的提问来源于stack exchange,提问作者Maryam
相关产品推荐
相关产品推荐

