dompdf中$pdf变量是什么,如何使用page_text函数添加页面文本
问题解答
1. 内嵌脚本中$pdf变量的含义
内嵌<script type="text/php">里的$pdf就是Dompdf渲染阶段暴露的Canvas实例,和你在控制器中调用$dompdf->get_canvas()拿到的是同一个对象,所有Canvas支持的操作方法都可以在这个脚本里直接调用。
另外两个全局常量PAGE_NUM、PAGE_COUNT是Dompdf内置变量,渲染每一页时会自动赋值:PAGE_NUM是当前渲染页的页码(从1开始计数),PAGE_COUNT是PDF总页数。
2. page_text函数使用方法
page_text是Canvas类提供的便捷方法,专门用于给PDF页面添加文本内容,参数顺序如下:
- 第1位:x轴坐标,单位为磅(72磅=1英寸)
- 第2位:y轴坐标,注意PDF坐标原点为页面左下角
- 第3位:待显示的文本内容,支持直接写入
{PAGE_NUM}、{PAGE_COUNT}占位符,会被自动替换为对应数值 - 第4位:字体资源,通过
Font_Metrics::get_font获取 - 第5位:字体大小,单位为磅
- 第6位:RGB颜色数组,三个值取值区间为0-1,比如
array(1,0,0)对应红色
注意:
page_text不支持解析HTML标签,你原有代码里写的<div>会被直接作为普通文本输出,自定义样式只能通过字体、字号、颜色参数设置。
正确的内嵌脚本示例:
<script type="text/php"> if (isset($pdf)) { $font = Font_Metrics::get_font("helvetica", "bold"); // 仅在第2页添加页眉 if (PAGE_NUM === 2) { $pdf->page_text(72, 18, "Header: {PAGE_NUM} of {PAGE_COUNT}", $font, 6, array(0,0,0)); } } </script>
3. 更优的PHP端实现方案
你当前控制器中手动遍历底层页面对象的写法兼容性较差,推荐在$dompdf->render()渲染完成后统一操作页面内容,逻辑更清晰:
<?php $html = view('pdf')->render(); $dompdf = new Dompdf(); $dompdf->loadHtml($html); // 先执行渲染,生成所有页面 $dompdf->render(); $canvas = $dompdf->getCanvas(); $font = $dompdf->getFontMetrics()->getFont("helvetica", "bold"); $totalPages = $canvas->getPageCount(); // 遍历所有页码,从1开始计数 for ($pageNum = 1; $pageNum <= $totalPages; $pageNum++) { // 切换到目标页码 $canvas->set_page($pageNum); // 跳过第一页,给其他页添加页眉 if ($pageNum != 1) { $canvas->text(72, 18, "Header: {$pageNum} of {$totalPages}", $font, 6, array(0,0,0)); } // 给指定页(比如第3页)添加自定义内容 if ($pageNum == 3) { // A4页面高度约842磅,y值设为820对应页面底部位置 $canvas->text(72, 820, "仅第3页显示的自定义内容", $font, 10, array(1,0,0)); } } $dompdf->stream("dompdf_out.pdf", ["Attachment" => false]); exit(0); ?>
该方案优势:
- 不需要操作底层CPDF对象和页面ID,Dompdf封装的
set_page()、getPageCount()方法兼容性更好 - 页码逻辑直观,不会出现页面ID和实际页码对应错误的问题
- 所有控制逻辑都在PHP端实现,不需要在HTML中嵌入PHP脚本,维护性更高
内容的提问来源于stack exchange,提问作者May'Habit
相关产品推荐
相关产品推荐

