PhpSpreadsheet provides three PDF writer implementations, each using a different underlying PDF library. All PDF writers extend the Html writer and render spreadsheets as HTML tables before converting to PDF.
Namespace: PhpOffice\PhpSpreadsheet\Writer\Pdf
Extends: Html → BaseWriter
Available PDF Writers
PhpSpreadsheet supports three PDF libraries:
- Dompdf - Pure PHP library, good balance of features and ease of use
- Mpdf - Feature-rich, excellent UTF-8 and RTL support
- Tcpdf - Comprehensive features, highly configurable
You must install one of these libraries separately via Composer:
composer require dompdf/dompdf
composer require mpdf/mpdf
composer require tecnickcom/tcpdf
Common PDF Writer Base
All PDF writers share these common features from the Pdf base class:
Common Methods
setFont()
public function setFont(string $fontName): self
Sets the default font for the PDF.
Font name (e.g., ‘freesans’, ‘dejavusans’)
setPaperSize()
public function setPaperSize(int $paperSize): self
Sets the paper size for the PDF.
Paper size constant from PageSetup::PAPERSIZE_*
setOrientation()
public function setOrientation(string $orientation): self
Sets the page orientation.
PageSetup::ORIENTATION_PORTRAIT or PageSetup::ORIENTATION_LANDSCAPE
setTempDir()
public function setTempDir(string $temporaryDirectory): self
Sets the temporary directory for intermediate files.
Path to temporary directory (must exist)
Dompdf Writer
Class: PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf
Install: composer require dompdf/dompdf
Dompdf is a pure PHP library that converts HTML to PDF. It offers good performance and doesn’t require external dependencies.
Features
- ✅ Pure PHP (no extensions required)
- ✅ Automatic image embedding
- ✅ CSS support
- ⚠️ Limited Unicode support
- ⚠️ Basic table rendering
Usage
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello PDF!');
$writer = new Dompdf($spreadsheet);
$writer->save('output.pdf');
Configuration
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
$writer = new Dompdf($spreadsheet);
// Set paper size
$writer->setPaperSize(PageSetup::PAPERSIZE_A4);
// Set orientation
$writer->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
$writer->save('output.pdf');
Mpdf Writer
Class: PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf
Install: composer require mpdf/mpdf
Mpdf is a powerful PHP library with excellent UTF-8 and internationalization support. It’s ideal for multilingual documents and complex layouts.
Features
- ✅ Excellent UTF-8 support
- ✅ RTL (Right-to-Left) language support
- ✅ CJK (Chinese, Japanese, Korean) fonts
- ✅ Advanced CSS support
- ✅ Page headers and footers
- ✅ Watermarks
Usage
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'مرحبا'); // Arabic text
$writer = new Mpdf($spreadsheet);
$writer->save('output.pdf');
Configuration
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
$writer = new Mpdf($spreadsheet);
// Set paper size and orientation
$writer->setPaperSize(PageSetup::PAPERSIZE_LETTER);
$writer->setOrientation(PageSetup::ORIENTATION_PORTRAIT);
// Set font for Unicode support
$writer->setFont('dejavusans');
// Set temp directory
$writer->setTempDir('/tmp/mpdf');
$writer->save('output.pdf');
Unicode Fonts
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
$writer = new Mpdf($spreadsheet);
// Chinese, Japanese, Korean
$writer->setFont('arialunicid0-korean');
// Arabic
$writer->setFont('dejavusans');
$writer->save('unicode.pdf');
Tcpdf Writer
Class: PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf
Install: composer require tecnickcom/tcpdf
TCPDF is a comprehensive PHP library with extensive features and high configurability. It’s suitable for complex PDF requirements.
Features
- ✅ Comprehensive PDF features
- ✅ Barcodes and QR codes
- ✅ Digital signatures
- ✅ Multiple languages
- ✅ Font subsetting
- ✅ Page numbering
- ✅ Bookmarks
Usage
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello PDF!');
$writer = new Tcpdf($spreadsheet);
$writer->save('output.pdf');
Configuration
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
$writer = new Tcpdf($spreadsheet);
// Set paper size and orientation
$writer->setPaperSize(PageSetup::PAPERSIZE_A4);
$writer->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
// Set font
$writer->setFont('helvetica');
$writer->save('output.pdf');
Common Usage Patterns
Basic PDF Export
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf; // or Dompdf, Tcpdf
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Add data
$sheet->fromArray([
['Name', 'Email', 'Phone'],
['John Doe', '[email protected]', '555-1234'],
['Jane Smith', '[email protected]', '555-5678']
]);
// Style header
$sheet->getStyle('A1:C1')->getFont()->setBold(true);
$writer = new Mpdf($spreadsheet);
$writer->save('report.pdf');
Download PDF to Browser
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
// Set headers for download
header('Content-Type: application/pdf');
header('Content-Disposition: attachment;filename="report.pdf"');
header('Cache-Control: max-age=0');
$writer = new Mpdf($spreadsheet);
$writer->save('php://output');
exit;
Custom Page Setup
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
// Configure worksheet page setup
$sheet = $spreadsheet->getActiveSheet();
$sheet->getPageSetup()
->setOrientation(PageSetup::ORIENTATION_LANDSCAPE)
->setPaperSize(PageSetup::PAPERSIZE_A4);
// Set margins (in inches)
$sheet->getPageMargins()
->setTop(1)
->setRight(0.75)
->setBottom(1)
->setLeft(0.75);
$writer = new Mpdf($spreadsheet);
$writer->save('custom-page.pdf');
Multiple Sheets to PDF
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
$writer = new Mpdf($spreadsheet);
$writer->writeAllSheets(); // Include all worksheets
$writer->save('all-sheets.pdf');
Include Charts
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
$writer = new Mpdf($spreadsheet);
$writer->setIncludeCharts(true);
$writer->save('with-charts.pdf');
Embedded Images
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
$drawing = new Drawing();
$drawing->setPath('logo.png');
$drawing->setCoordinates('A1');
$drawing->setWorksheet($spreadsheet->getActiveSheet());
$writer = new Mpdf($spreadsheet);
$writer->save('with-image.pdf');
Choosing a PDF Library
Use Dompdf when:
- ✅ You need a simple, lightweight solution
- ✅ Pure PHP is required (no extensions)
- ✅ Basic PDF output is sufficient
- ✅ Latin character sets are primary
Use Mpdf when:
- ✅ You need excellent UTF-8 support
- ✅ Working with RTL languages (Arabic, Hebrew)
- ✅ CJK fonts are required
- ✅ Complex layouts with CSS
- ✅ Professional page headers/footers
Use Tcpdf when:
- ✅ You need comprehensive PDF features
- ✅ Digital signatures are required
- ✅ Barcodes or QR codes are needed
- ✅ Maximum configurability is important
- ✅ PDF/A compliance is needed
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
$writer = new Mpdf($spreadsheet);
// Disable formula calculation for speed
$writer->setPreCalculateFormulas(false);
// Use disk caching for large files
$writer->setUseDiskCaching(true, '/tmp/cache');
// Set temp directory
$writer->setTempDir('/tmp/pdf');
$writer->save('output.pdf');
Common Issues
Memory Limit
// Increase memory limit for large PDFs
ini_set('memory_limit', '512M');
Missing Fonts
// Ensure appropriate fonts are installed
$writer->setFont('dejavusans'); // Bundled with Mpdf
Image Paths
// Use absolute paths for images
$drawing->setPath('/var/www/html/images/logo.png');