Tworzenie plików pdf za pomocą biblioteki CakePDF

W artykule pokażę jak tworzyć w CakePHP 3 dokumenty pdf za pomocą CakePDF. Najpierw instalujemy bibliotekę za pomocą composera.

composer require friendsofcake/cakepdf
Musimy zainstalować również jeden z silników do generowania pdf - DomPdf, Mpdf lub Tcpdf. Można to zrobić za pomocą poniższych komend.
composer require dompdf/dompdf
composer require tecnickcom/tcpdf
composer require mpdf/mpdf
Teraz musimy załadować plugin CakePdf. W pliku Application.php w metodzie bootstrap ładujemy plugin.
public function bootstrap()
{
	parent::bootstrap();
	...
	$this->addPlugin('CakePdf', ['bootstrap' => true]);
	...
}
Jeśli zamierzasz korzystać z funkcji widoku PDF, która automatycznie renderuje i zwraca plik PDF w celu wysłania go do przeglądarki, powinieneś również zarejestrować rozszerzenie pdf w pliku config/routes.php.
Router::scope('/', function (RouteBuilder $routes) {
    $routes->addExtensions(['pdf']);
});
Teraz zajmiemy się konfiguracją plugina. W tym celu można napisać np. w pliku bootstrap.php za pomocą Configure::write.
Configure::write('CakePdf', [
    'engine' => 'CakePdf.Mpdf',
    'margin' => [
        'bottom' => 15,
        'left' => 50,
        'right' => 30,
        'top' => 45
    ],
    'orientation' => 'landscape'
]);
lub ustawić właściwość kontrolera $pdfConfig (tylko gdy jest używana z PdfView).
class DemosController extends AppController
{
	public function view($id = null)
	{
		$demo = $this->Demos->get($id);
		$this->viewBuilder()->options([
			'pdfConfig' => [
				'orientation' => 'portrait',
				'filename' => 'File_' . $id
			]
		]);
		$this->set('demo', $demo);
	}
}
Obowiązkowo musisz podać engine w konfiguracji. Wszystkie opcje konfiguracyjne możesz znaleźć na stronie.

Użycie CakePDF

Renderowanie jako pdf. Dotyczy to również wymuszonego pobierania tzw. force download. Możesz tworzyć pliki PDF i pliki layoutów dla akcji kontrolera i automatycznie je renderować. Umieść szablony widoku w podkatalogu "pdf", na przykład src/Template/Demos/pdf/view.ctp, układy będą w src/Template/Layout/pdf/default.ctp. Upewnij się ponadto, że klasa Twojego kontrolera ładuje komponent RequestHandler. W akcji kontrolera wystarczy dodać:
$this->viewBuilder()->setClassName('CakePdf.Pdf');
Zamiast renderowania pliku PDF w przeglądarce, można zmusić go do pobrania za pomocą opcji pobierania. Dodatkowo możesz określić niestandardową nazwę pliku za pomocą opcji nazwy pliku.
$this->viewBuilder()->options([
'pdfConfig' => [
	'download' => true, // This can be omitted if "filename" is specified.
	'filename' => 'Invoice_' . $id // This can be omitted if you want file name based on URL.
]
Tworzenie surowych plików pdf w celu załączenia do emaila lub przechowywania w systemie plików. Poniżej przykład wykorzystania jako załącznik do emaila.
$CakePdf = new CakePdf();
$CakePdf->templatePath('Panel'. DS . 'Demos' . DS . 'pdf');
$CakePdf->template('export_pdf', 'default');
$CakePdf->viewVars([
	'demo' => $demo
]);
$outputPdf = $CakePdf->output();
$options['attachments'] = [
	'Demo_file_'.pdf' => [
		'mimetype' => 'application/pdf',
		'contentId' => 'po-pdf',
		'data' => $outputPdf
	]
];
Można też zapisać $outputPdf na dysku.