带有FPDF的循环中的多个PDF

时间:2016-10-17 19:54:09

标签: php pdf fpdf

我有一个FDPF功能,可以为网站的各个部分创建标准PDF。它只需要一些数据,创建一个多页PDF并返回PDF对象,例如。

function pdfBuild($orderData) {



class PDF extends FPDF
{
// Page header
function Header()
{
    // Logo
    $this->Image('logo.png',10,6,30);
    // Arial bold 15
    $this->SetFont('Arial','B',15);
    // Move to the right
    $this->Cell(80);
    // Title
    //$this->Cell(80,10,'Game Sheet',1,0,'C');
    // Line break
    $this->Ln(20);
}

// Page footer
function Footer()
{
    // Position at 1.5 cm from bottom
    $this->SetY(-15);
    // Arial italic 8
    $this->SetFont('Arial','I',8);
    // Page number
    $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
}



}

$pdf = new PDF();
$pdf->AliasNbPages();
$pdf->SetFont('Times','',12);
   for($a=0;$a<count($orderData);$a++) {
    $pdf->AddPage();
    //Add stuff to PDF
   }
return $pdf;

}

我的问题出现在一个循环中,通过电子邮件将单个PDF发送给客户端,例如

function buildPDFs() {

    //Get a location
    $query = "GET SOME CLIENT INFORMATION";
    $result = getSQLConnection($query);
    if ($result->num_rows > 0) {

            while($row = $result->fetch_assoc()) {

                //Get some info from dB using $row

                //Format info from db into $data variable

                $pdf = pdfBuild($data);

                //Test Data
                $to = 'stackoverflow@question.com';
                $from = 'hello@clientinfo.com';
                $subject = 'PDFs'
                $message = 'Howdy';
                //End
                emailPDF($pdf, $to, $from, $subject, $message);

            }
    }

    echo 'Done';

}

问题在于,如果我对循环执行两次迭代,则附件是在第一个实例中生成的PDF,但是我收到两封具有相同附件的电子邮件。因此,看起来$ pdf对象永远不会在循环中发生变化,即使我确定每次传递给PDF生成函数的数据都不同。生成的PDF文件完全相同。

我是否需要每次在循环中取消设置或以其他方式“销毁”PDF对象?

更新

删除页眉和页脚的类定义,如上面的代码片段所示,解决了这个问题。但我无法理解为什么。

问题:为什么删除“类扩展”代码可以解决问题并允许循环每次都按预期生成不同的PDF并正确发送电子邮件?

从Veve回答以下问题并解决问题。我错误地宣布并完全滥用了课程

1 个答案:

答案 0 :(得分:1)

  

为什么删除'class extend'代码可以解决问题   允许循环每次生成不同的PDF,如预期的那样   给他们发正确的电子邮件?

这是因为你混合了一个函数的声明和一个类。

要解决此问题,请首先使用扩展类创建 pdf.php ,这只会覆盖所需的方法:

require_once('fpdf.php');

class PDF extends FPDF
{
    // Page header
    function Header()
    {
        // Logo
        $this->Image('logo.png',10,6,30);
        // Arial bold 15
        $this->SetFont('Arial','B',15);
        // Move to the right
        $this->Cell(80);
        // Title
        //$this->Cell(80,10,'Game Sheet',1,0,'C');
        // Line break
        $this->Ln(20);
    }

    // Page footer
    function Footer()
    {
        // Position at 1.5 cm from bottom
        $this->SetY(-15);
        // Arial italic 8
        $this->SetFont('Arial','I',8);
        // Page number
        $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
    }
}

之后,在 code.php 中,您可以使用此类,以及用于在其自己的函数中生成PDF的代码:

require_once('pdf.php');

function pdfBuild($orderData) {
    $pdf = new PDF();
    $pdf->AliasNbPages();
    $pdf->SetFont('Times','',12);
       for($a=0;$a<count($orderData);$a++) {
        $pdf->AddPage();
        //Add stuff to PDF
       }
    return $pdf;
}

function buildPDFs() {

    //Get a location
    $query = "GET SOME CLIENT INFORMATION";
    $result = getSQLConnection($query);
    if ($result->num_rows > 0) {

            while($row = $result->fetch_assoc()) {

                //Get some info from dB using $row

                //Format info from db into $data variable

                $pdf = pdfBuild($data);

                //Test Data
                $to = 'stackoverflow@question.com';
                $from = 'hello@clientinfo.com';
                $subject = 'PDFs'
                $message = 'Howdy';
                //End
                emailPDF($pdf, $to, $from, $subject, $message);

            }
    }

    echo 'Done';

}