Using TCPDF with Symfony2 is pretty simple. However there are a few problems that may arise.
namespace Acme\DemoBundle\Controller;
class PdfController extends Controller
{
public function pdfAction()
{
$pdf = new \TCPDF();
// Construct the PDF.
$pdf->Output('filename.pdf');
}
}
Easy enough. The PDF loads, but we get this error in the logs:
request.CRITICAL: Uncaught PHP Exception LogicException: "The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?"
We can fix that:
namespace Acme\DemoBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class PdfController extends Controller
{
public function pdfAction()
{
$pdf = new \TCPDF();
// Construct the PDF.
$pdf->Output('filename.pdf');
return new Response(); // To make the controller happy.
}
}
Add some authentication and remember me tokens, close the browser, relaunch the browser, and visit the PDF page. We get a new error:
request.CRITICAL: Uncaught PHP Exception RuntimeException: "Failed to start the session because headers have already been sent by "[...]/vendor/tecnick.com/tcpdf/include/tcpdf_static.php"
Darn. TCPDF::Output() sends headers before Symfony has the chance. We can fix that too:
namespace Acme\DemoBundle\Controller;
use Symfony\Component\HttpFoundation\StreamedResponse;
class PdfController extends Controller
{
public function pdfAction()
{
$pdf = new \TCPDF();
// Construct the PDF.
return new StreamedResponse(function () use ($pdf) {
$pdf->Output('filename.pdf');
});
}
}
Perfect. Now Symfony and TCPDF::Output() can both send their headers, and everything plays nice.