为什么我的 FPDF class 函数 SetMargins() 不影响第一行?

Why doesn't my FPDF class function SetMargins() effect the first row?

我正在使用 FPDF class 根据 mysql 查询的结果创建 pdf。信息按预期以 table 格式输出为 pdf,但是当我使用 SetMargins() 设置页边距时出现了问题。除了第一行之外的所有内容都会受到影响。第一行似乎被硬编码到某个位置或边距定义。

这是我的代码:

class Table extends FPDF
{
    public function CreateTable($header, $data)
    {
        //Header
        $this->SetFillColor(255);
        $this->SetTextColor(0);
        $this->SetFont('Arial','B', 12);
        foreach ($header as $col) {
            $this->Cell($col[1], 10, $col[0], 1, 0, 'C');
            //Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, boolean fill [, mixed link]]]]]]])
        }

        $this->Ln();

        //Data
        $this->SetFillColor(255);
        $this->SetTextColor(0);
        $this->SetFont('Arial', '', 8);
        foreach ($data as $row) {

            $i = 0;
            foreach ($row as $field) {
                $this->Cell($header[$i][1], 6, $field, 1, 0, 'C');
                $i++;

            }
            $this->Ln();
        }

    }
}


//column headings for the department table
$dept_header = array(array('Name', 75), array('Phone', 40), array('Fax', 40));

//column headings for the team tables
$team_header = array(array('Name', 35), array('Role', 30), array('Office', 25), array('Cell', 25), array('Email', 45), array('Pager', 25));

//get data
$query = new ConnectQuery();
$dept_data = $query->all('SELECT * FROM Table');

$team_data = $query->all('SELECT CONCAT_WS(" ", FIRST_NAME, LAST_NAME), JOB_ROLE, OFFICE_PHONE, MOBILE_PHONE, EMAIL, PAGER_NUM FROM Table2');


$pdf = new Table('P', 'mm', 'Letter');

$pdf->AddPage();
$pdf->SetMargins(5, 5);
$pdf->CreateTable($team_header, $team_data);
$pdf->CreateTable($dept_header, $dept_data);


$pdf->Output();

?>

FPDFclass中有一个属性叫做$cMargin,用来计算文本在单元格内打印前的x偏移量,但是没有出现成为它的setter。这是一个 public 属性,因此在实例化 FPDF class 之后,只需调用:

$pdf = new fpdf('P','mm','A4');
$pdf->cMargin = 0;

或者你可以像

这样解决你的第一行
$pdf->Ln(); //workaround for 1st line
  $pdf->Cell(..);

只需在添加第一页之前定义页边距。该位置不会被 setMargins() 调用重置,这会导致在 AddPage() 中设置的 "hardcoded postition":

$pdf = new Table('P', 'mm', 'Letter');
$pdf->SetMargins(5, 5);
$pdf->AddPage();