PDFlib PHP实现表格从指定FitBox底部起始并向上扩展的方法
解决PDFlib表格从FitBox底部向上绘制的问题
要让你的表格从指定FitBox的底部开始绘制并向上扩展,只需要调整fit_table()的核心选项,同时修正代码里的小问题(比如未传入FitBox坐标),具体步骤如下:
关键修改点
PDFlib的fit_table()默认从FitBox的顶部开始布局,我们只需要一个简单的选项就能改变这个行为:
- 在
fit_table的选项列表中加入position=bottom,这会让表格从FitBox的下边缘(也就是你定义的$lly)开始向上排列行。 - 把FitBox的坐标作为参数传入
createTable函数,避免未定义变量的错误。
修改后的完整代码
function createTable(pdflib $p, int $fontMedium, int $fontRegular, array $arrInput, float $llx, float $lly, float $urx, float $ury) { // 修改:传入FitBox坐标参数 $tbl=0; $rowmax = 8; /* ---------- table header */ $row = 1; $col = 1; $optlist = "margin=4 fittextline={position=center font=" . $fontMedium . " fontsize=10} " . "matchbox={fillcolor={#ffed00}} colspan=1 colwidth=200"; $tbl = $p->add_table_cell($tbl, $col, $row, $arrInput['table']['tableHeading'], $optlist); if ($tbl == 0) { echo("Error: " . $p->get_errmsg()); exit(1); } /* ---------- content rows */ foreach($arrInput['table']['tableListings'] as $listings) { if ($row <= $rowmax) { $row++; } else { echo("Error: Too many Items for table"); exit(1); } $font = $p->load_font("W-Regular", "unicode", ""); if ($font == 0) { echo("Error: " . $p->get_errmsg()); exit(1); } $optlist = "charref fontname=W-Regular encoding=unicode fontsize=10"; $tf = $p->add_textflow(0, $listings, $optlist); if ($tf == 0) { echo("Error: " . $p->get_errmsg()); exit(1); } $optlist = "margin=4 matchbox={fillcolor={rgb 0.9 0.5 0}} textflow=" . $tf; $tbl = $p->add_table_cell($tbl, $col, $row, "", $optlist); if ($tbl == 0) { echo("Error: " . $p->get_errmsg()); exit(1); } } do { $optlist = "header=1 rowheightdefault=20 " . "stroke={{line=other}} " . "position=bottom"; // 修改:添加position=bottom让表格从底部开始布局 $result = $p->fit_table($tbl, $llx, $lly, $urx, $ury, $optlist); if ($result == "_error") { echo("Couldn't place table: " . $p->get_errmsg()); exit(1); } } while ($result == "_boxfull"); $p->delete_table($tbl, ""); }
调用示例
当你调用这个函数时,传入你定义的FitBox坐标即可:
// 你的FitBox坐标定义 $llx = 350; $lly = 500; $urx = 600; $ury = 800; // 调用createTable函数 createTable($p, $fontMedium, $fontRegular, $arrInput, $llx, $lly, $urx, $ury);
额外说明
- PDFlib的坐标系统默认以页面左下角为原点,所以
$lly=500是FitBox的底部边缘,表格会从这里开始向上绘制,行高累加后填充到$ury=800的位置。 - 如果你的表格内容超过FitBox的高度,
_boxfull的循环会触发,你可以根据需求在新的区域继续绘制(比如调整FitBox的$ury到更高位置,或者在新页面绘制),不过你的代码限制了最多8行,当前FitBox高度足够容纳。
内容的提问来源于stack exchange,提问作者strayed soul
相关产品推荐
相关产品推荐

