Installation:
composer require cravler/print2pdf-bundle:dev-master
Enable the bundle in config/bundles.php (required for Symfony < 4.4 or without Flex).
First Use Case: Generate a PDF from a URL in a controller:
use Cravler\Print2PdfBundle\Service\Print2Pdf;
public function generatePdf(Print2Pdf $print2Pdf)
{
$pdf = $print2Pdf->generate('https://example.com', [
'paper_width' => 8.5,
'paper_height' => 11,
]);
return new Response($pdf, 200, ['Content-Type' => 'application/pdf']);
}
Key Files:
src/Service/Print2Pdf.php: Core service class.config/packages/cravler_print2pdf.yaml: Default configuration (if provided).URL-to-PDF Pipeline:
// Controller
public function generateInvoicePdf(Print2Pdf $print2Pdf, $invoiceUrl)
{
$pdf = $print2Pdf->generate($invoiceUrl, [
'landscape' => true,
'header_template' => $this->renderView('invoice_header.html.twig'),
]);
return $this->file($pdf, 'invoice.pdf');
}
Dynamic HTML Generation:
// Twig template: `invoice.html.twig`
{{ render(controller('App\Controller\InvoiceController::generatePdfContent', {'id': invoice.id})) }}
// Controller
public function generatePdfContent($id)
{
$html = $this->renderView('invoice_content.html.twig', ['invoice' => $invoice]);
return new Response($html);
}
Batch Processing:
public function generateBulkPdfs(array $urls, array $options = [])
{
$print2Pdf = $this->container->get(Print2Pdf::class);
return array_map(fn($url) => $print2Pdf->generate($url, $options), $urls);
}
Symfony Forms: Attach PDF generation to form submission:
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$pdf = $print2Pdf->generateFromHtml($form->createView(), ['paper_width' => 11]);
$this->addFlash('success', 'PDF generated!');
return $this->redirectToRoute('download_pdf', ['pdf' => base64_encode($pdf)]);
}
Event Listeners: Trigger PDF generation on entity events (e.g., postPersist):
public function onPostPersist(EntityManagerInterface $em, $entity)
{
if ($entity instanceof Invoice) {
$pdf = $print2Pdf->generate($entity->getUrl());
$entity->setPdf($pdf);
$em->flush();
}
}
Queue Workers: Offload heavy PDF generation to a queue (e.g., Symfony Messenger):
$message = new GeneratePdfMessage($url, $options);
$this->messageBus->dispatch($message);
Dependency on go-print2pdf:
go-print2pdf). Ensure it’s installed and accessible in your Docker container or server environment.go install github.com/cravler/go-print2pdf@latest
Timeout Handling:
timeout: 0 means no timeout. Set a reasonable value (e.g., 30) for production:
$print2Pdf->generate($url, ['timeout' => 30]);
CSS/HTML Quirks:
print_background: true if backgrounds are missing.@media print CSS rules for better control.Memory Limits:
memory_limit in php.ini or use chunked processing.Check Binary Path:
$print2Pdf->setBinaryPath('/path/to/go-print2pdf'); // Override if needed
Log Errors:
try {
$pdf = $print2Pdf->generate($url);
} catch (\Exception $e) {
$this->logger->error('PDF generation failed', ['error' => $e->getMessage()]);
}
Test Locally:
generateFromHtml() with static HTML to isolate issues:
$html = file_get_contents('test.html');
$pdf = $print2Pdf->generateFromHtml($html);
Custom Templates:
$print2Pdf->generate($url, [
'header_template' => $this->renderView('custom_header.html.twig'),
]);
Post-Processing:
setasign/fpdf) to add watermarks or signatures:
$pdfContent = $print2Pdf->generate($url);
$pdf = \FPDF::parse($pdfContent);
$pdf->addPage();
$pdf->write(0, 'Confidential');
Configuration:
config/packages/cravler_print2pdf.yaml:
cravler_print2pdf:
default_options:
paper_width: 11
paper_height: 17
landscape: true
$print2Pdf->generate($url); // Uses configured defaults
Docker Optimization:
FROM php:8.1 as builder
RUN go install github.com/cravler/go-print2pdf@latest && \
mv $(go env GOPATH)/bin/go-print2pdf /usr/local/bin/
How can I help you explore Laravel packages today?