基础理论与定位原理
FPDF坐标系与可用区域
FPDF 的坐标系以页面左上角为原点,水平向右为 X 轴,垂直向下为 Y 轴,单位默认为毫米(mm)。
页面尺寸和边距决定了可用区域,可以通过 GetPageWidth/ GetPageHeight 获取整页尺寸,通过 lMargin 与 rMargin、tMargin 与 bMargin 了解可用区域的边界。
在进行图像定位时,理解 “可用区域等于整页减去左右边距”的概念非常关键,因为只有在这一区域内才能实现精准的居中对齐。
边距与居中计算的关系
水平居中需要考虑左右边距,可用宽度 = GetPageWidth() - lMargin - rMargin;水平居中 X 坐标的计算公式为:x = lMargin + (可用宽度 - 图像宽度) / 2。
垂直居中需要考虑上下边距,可用高度 = GetPageHeight() - tMargin - bMargin;垂直居中 Y 坐标的计算公式为:y = tMargin + (可用高度 - 图像高度) / 2。
下列公式在后续的代码中会以具体数值示例呈现,帮助你在实际开发中快速落地。
手动计算居中定位的实战步骤
步骤要点概览
步骤一:获取页面尺寸与边距,确保你知道整页宽高和边距的真实值。
步骤二:确定图像的实际尺寸,若需要等比缩放,需要知道图片在毫米单位下的宽度和高度。
步骤三:计算 X、Y 坐标,使用上文给出的居中公式得到中心点的坐标。
手动计算公式演示
水平居中 X 坐标公式:x = lMargin + (GetPageWidth() - lMargin - rMargin - w) / 2。
垂直居中 Y 坐标公式:y = tMargin + (GetPageHeight() - tMargin - bMargin - h) / 2。
请注意,当你设置了图片的宽度 w 与高度 h 时,以上公式即可直接落地;若仅设置宽度而让高度自适应,请把高度参数设为 0,居中计算需要额外的图片高度信息。
边距、单位与单位转换注意事项
FPDF 的单位默认是毫米,确保你在计算时使用相同的单位;若你在图片原始尺寸单位不是毫米,需要进行换算。
在多页文档中,页边距与页面尺寸可能不同,请在每页添加新页前重新计算坐标,避免跨页错位。
实战代码与案例演示
简单居中图片示例
下面的示例展示如何在单页页面中水平居中图片,并演示如何结合边距来精准定位横向中心。
AddPage();
// 设置单位为毫米,默认边距(左、上、右、下)通常为 1 cm (~10 mm),你也可以通过属性直接修改
$w = 100; // 需要居中的图片宽度,单位 mm
$img = 'images/sample.jpg';
// 计算可用区域
$x = $pdf->lMargin + (($pdf->GetPageWidth() - $pdf->lMargin - $pdf->rMargin) - $w) / 2;
// 若需要垂直居中,需要已知图片高度 h
// 例如假设图片高度为 60 mm
$h = 60;
// 计算垂直居中(若只想水平居中,可将 y 设置为 tMargin)
$y = $pdf->tMargin + (($pdf->GetPageHeight() - $pdf->tMargin - $pdf->bMargin) - $h) / 2;
// 绘制图片,若高度为 0 将保持宽高比,若同时指定宽高则强制缩放
$pdf->Image($img, $x, $y, $w, $h);
// 输出
$pdf->Output();
?>
温馨提示:如果你只设置了图片宽度而高度设为 0,FPDF 会按照原始宽高比自动计算高度,此时垂直居中需要额外获取实际计算后的高度值再进行定位。
带自动高度的居中实战案例
为确保高度自适应的情况下仍实现居中,你需要在获取图片像素信息后将其转换为毫米单位,并据此计算 y 坐标。
AddPage();
$imgPath = 'images/sample_large.jpg';
list($imgWpx, $imgHpx) = getimagesize($imgPath);
// 假设屏幕分辨率为 96 DPI,1 px ≈ 0.264583 mm
$px2mm = 0.264583;
$imgWmm = $imgWpx * $px2mm;
$imgHmm = $imgHpx * $px2mm;
$w = 120; // 你希望在 PDF 中显示的宽度
$h = ($imgHmm / $imgWmm) * $w; // 保持原图纵横比
$x = $pdf->lMargin + (($pdf->GetPageWidth() - $pdf->lMargin - $pdf->rMargin) - $w) / 2;
$y = $pdf->tMargin + (($pdf->GetPageHeight() - $pdf->tMargin - $pdf->bMargin) - $h) / 2;
$pdf->Image($imgPath, $x, $y, $w, $h);
$pdf->Output();
?>
进阶应用与场景化案例
多图并排居中排布
当页面需要多张图片并排居中时,应先计算单张图片的总宽度再分配空白区域,避免单张图片居中时相邻图片错位。
可以采用等分法或自定义间距法来实现整页的对称美感,并在每列设置相同的 y 坐标以实现整齐的网格布局。
示例思路:将总宽度按列数分配,计算每列的 x 坐标,然后逐张调用 Image() 进行绘制。
带页眉/页脚的居中影响与处理
若文档中包含页眉或页脚时,需要把它们排除在居中计算之外,以免图片被顶格或压缩到边缘。
解决办法是把页眉/页脚高度作为额外的固定偏移量,在 y 坐标计算中减去页眉高度、加上页脚留白空间,确保图片纵向居中时不会被覆盖。
常见问题与优化技巧
多页文档的居中处理
在新的一页开始时重新计算边距和居中坐标,因为不同页的边距可能不同,尤其在横向与纵向切换时需重新定位。
推荐封装成函数,如 centerX(pdf, w) 与 centerY(pdf, h) 以提高代码复用性和可读性。
图片清晰度与尺寸策略
为保持图片清晰度,优先使用较高分辨率的图像,再依据页面尺寸进行缩放,避免强制放大导致的像素化。
在自动缩放时考虑 DPI 与单位换算,确保在不同设备和查看器中的视觉一致性。
兼容性与性能提示
避免在循环中逐张图片进行复杂的计算,可以在一次计算后缓存坐标,提升生成大文档时的性能。
若遇到图像位置偏移,检查是否有全局变换、字体设置或背景绘制影响了当前坐标系的原点。


