FPDF FPDI Как импортировать страницу из другого класса FPDF?

У меня есть класс, который создает документ FPDF. И я хотел бы включить этот документ в другой класс FPDF.

    // Document/Class 1
    $pdf->new MyFirstDocument();
    $pdf->output

    // Document/Class 2
    class MySecondDocument extends FPDF {

    $this->addPage() //etc

    //and from here i would like to call the 
    //class MyFirstDocument and import the output 
    //into MySecondDocument as an additional page

    }

person user3611673    schedule 28.07.2018    source источник
comment
Попробуйте расширить класс MyFirstDocument вместо расширения FPDF при создании MySecondDocument , например class MySecondDocument extends MyFirstDocument. Затем вызовите все нужные функции сразу, а затем вызовите вывод.   -  person Hello World    schedule 28.07.2018
comment
Я думал об этом, но идея в том, что в зависимости от ситуации можно добавить несколько дополнительных страниц. Итак, у меня был бы MySecondDocument, который создает, скажем, 2 общие страницы, а затем, в зависимости от ситуации, может быть еще одна или две другие и так далее. Мой обходной путь прямо сейчас — создать файл, сохранить его, импортировать с помощью fpdi, а затем удалить файл. но это кажется немного некрасивым.   -  person user3611673    schedule 28.07.2018
comment
Вы можете добавить эти условия в один класс или страницу, а затем после создания всех страниц в зависимости от ваших условий и после всех этих вызовов вывода. Вы можете добавить страницу $this->addPage() условно, а затем создать документ.   -  person Hello World    schedule 28.07.2018


Ответы (1)


Вы написали:

У меня есть класс, который создает документ FPDF. И я хотел бы включить этот документ в другой класс FPDF.

Это не правильно! После $pdf->Output() вы не можете больше ничего выводить, потому что $pdf->Output() создает PDF-документ. Вы должны использовать его только один раз для каждого PDF-документа. Прочтите документацию.

У вас тоже не может быть второго экземпляра из FPDF. Из-за этого вы должны иметь в первом классе конструктор с экземпляром из FPDF в качестве параметра.

Пример решения:

Из-за всего этого мы не можем импортировать страницу из другого класса FPDF с помощью FPDF, но мы можем сделать следующее.

Код от firstpdf_class.php:

<?php 
class FirstPDF_Class
{
    private $fpdf_instance;

    function __construct($fpdf_instance)
    {
        $this->fpdf_instance = $fpdf_instance;
    }

    function print_title($doc_title, $company)
    { 
        $this->fpdf_instance->SetFont('Helvetica','B', 18);
        $this->fpdf_instance->Cell(210,4, $company, 0, 0, 'C'); 

        $this->fpdf_instance->Ln(); 
        $this->fpdf_instance->Ln(); 
        $this->fpdf_instance->Cell(37); 

        $this->fpdf_instance->SetFillColor(209, 204, 244); 
        $this->fpdf_instance->SetFont('Helvetica', 'B', 11);
        $this->fpdf_instance->Cell(150,8, $doc_title, 0, 0, 'C', 1);
    }
}
?>

Код от secondpdf_class.php:

<?php
require('fpdf.php');
require('firstpdf_class.php');

class SecondPDF_Class extends FPDF
{
    private $printpdf;

    function __construct($orientation = 'P', $unit = 'mm', $size = 'A4')
    {
        parent::__construct($orientation, $unit, $size);

        $this->printpdf = new FirstPDF_Class($this);

        $this->import_page('Document 1', 'Company "Fruits Sell"');
        $this->import_page('Document 2', 'Company "Boot Sell"');
    }

    public function import_page($doc_title, $company)
    {
        $this->AddPage();
        $this->printpdf->print_title($doc_title, $company);
    }

    function Footer()
    {
        $this->SetXY(100, -15);
        $this->SetFont('Helvetica','I', 10);
        $this->SetTextColor(128, 128,128);
        // Page number
        $this->Cell(0, 10,'This is the footer. Page '.$this->PageNo(),0,0,'C');
    }
}

$pdf = new SecondPDF_Class();
//not really import page, but some like this
$pdf->import_page('Document 3', 'Company "Auto Sell"');

$pdf->AddPage();
$pdf->SetFont('Helvetica','B', 18);
$pdf->Cell(210,4, 'Page 3.', 0, 0, 'C');
$pdf->Output();
?>
person Bharata    schedule 28.07.2018