Skip to main content

Overview

PhpSpreadsheet can export spreadsheets to PDF format using third-party PDF rendering libraries. You must install one of the supported libraries separately using Composer.

Supported PDF Libraries

LibraryPackageWriter ClassNotes
Dompdfdompdf/dompdfWriter\Pdf\DompdfGood HTML/CSS support, moderate speed
mPDFmpdf/mpdfWriter\Pdf\MpdfExcellent Unicode support, feature-rich
TCPDFtecnickcom/tcpdfWriter\Pdf\TcpdfComprehensive features, well-tested
PhpSpreadsheet does not include any PDF library by default. You must install your preferred library using Composer.

Installation

Install one of the PDF libraries:
# Install Mpdf
composer require mpdf/mpdf

# OR install Dompdf
composer require dompdf/dompdf

# OR install TCPDF
composer require tecnickcom/tcpdf

Basic Usage

Method 1: Using IOFactory

Register your chosen PDF writer, then create it:
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;

// Register the PDF renderer
IOFactory::registerWriter('Pdf', Mpdf::class);

// Create writer
$writer = IOFactory::createWriter($spreadsheet, 'Pdf');
$writer->save('output.pdf');

Method 2: Direct Instantiation

Instantiate the writer directly:
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;

$writer = new Mpdf($spreadsheet);
$writer->save('output.pdf');

Method 3: Using Specific Library Name

use PhpOffice\PhpSpreadsheet\IOFactory;

// Use library-specific name
$writer = IOFactory::createWriter($spreadsheet, 'Mpdf');
// or
$writer = IOFactory::createWriter($spreadsheet, 'Dompdf');
// or
$writer = IOFactory::createWriter($spreadsheet, 'Tcpdf');

$writer->save('output.pdf');

Using Mpdf

Package: mpdf/mpdf
Class: PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf

Basic Example

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;

// Register Mpdf
IOFactory::registerWriter('Pdf', Mpdf::class);

$writer = IOFactory::createWriter($spreadsheet, 'Pdf');
$writer->save('output.pdf');

Mpdf Options

use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;

$writer = new Mpdf($spreadsheet);

// Set orientation
$writer->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);

// Set paper size
$writer->setPaperSize(PageSetup::PAPERSIZE_A4);

// Set font
$writer->setFont('dejavusans');

// Set temporary directory
$writer->setTempDir('/tmp');

// Disable pre-calculation
$writer->setPreCalculateFormulas(false);

$writer->save('output.pdf');

Complete Example

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// Add data
$sheet->setCellValue('A1', 'Hello');
$sheet->setCellValue('B1', 'World');

// Configure page setup
$sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
$sheet->setShowGridLines(false);

// Create PDF
$writer = new Mpdf($spreadsheet);
$writer->save('output.pdf');

Using Dompdf

Package: dompdf/dompdf
Class: PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf

Basic Example

use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;

$writer = new Dompdf($spreadsheet);
$writer->save('output.pdf');

Dompdf Options

use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;

$writer = new Dompdf($spreadsheet);

// Set orientation
$writer->setOrientation(PageSetup::ORIENTATION_PORTRAIT);

// Set paper size
$writer->setPaperSize(PageSetup::PAPERSIZE_LETTER);

// Set font
$writer->setFont('helvetica');

$writer->save('output.pdf');

Using TCPDF

Package: tecnickcom/tcpdf
Class: PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf

Basic Example

use PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf;

$writer = new Tcpdf($spreadsheet);
$writer->save('output.pdf');

TCPDF Options

use PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;

$writer = new Tcpdf($spreadsheet);

// Set orientation
$writer->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);

// Set paper size
$writer->setPaperSize(PageSetup::PAPERSIZE_A3);

// Set font (TCPDF has many built-in fonts)
$writer->setFont('helvetica');

$writer->save('output.pdf');

Common Options

All PDF writers support these common options:

Page Orientation

use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;

// Set at worksheet level (preferred)
$spreadsheet->getActiveSheet()
    ->getPageSetup()
    ->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);

// Or override at writer level
$writer->setOrientation(PageSetup::ORIENTATION_PORTRAIT);

Paper Size

use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;

// Set at worksheet level
$spreadsheet->getActiveSheet()
    ->getPageSetup()
    ->setPaperSize(PageSetup::PAPERSIZE_A4);

// Or override at writer level
$writer->setPaperSize(PageSetup::PAPERSIZE_LETTER);
Available paper sizes:
  • PageSetup::PAPERSIZE_LETTER (default)
  • PageSetup::PAPERSIZE_LEGAL
  • PageSetup::PAPERSIZE_A3
  • PageSetup::PAPERSIZE_A4
  • PageSetup::PAPERSIZE_A5
  • PageSetup::PAPERSIZE_B4
  • PageSetup::PAPERSIZE_B5
  • And many more…

Multiple Worksheets

By default, only the first worksheet is exported:
// Export all worksheets
$writer->writeAllSheets();

// Or export specific sheet
$writer->setSheetIndex(2); // Export sheet 3

Formula Pre-calculation

// Disable for better performance
$writer->setPreCalculateFormulas(false);

Include Charts

$writer->setIncludeCharts(true);

Customizing PDF Output

Hide Grid Lines

$spreadsheet->getActiveSheet()->setShowGridLines(false);

Set Print Area

$spreadsheet->getActiveSheet()->getPageSetup()->setPrintArea('A1:F20');

Page Margins

$sheet = $spreadsheet->getActiveSheet();

// Set margins in inches
$sheet->getPageMargins()->setTop(1);
$sheet->getPageMargins()->setRight(0.75);
$sheet->getPageMargins()->setLeft(0.75);
$sheet->getPageMargins()->setBottom(1);

Headers and Footers

$sheet = $spreadsheet->getActiveSheet();

$sheet->getHeaderFooter()->setOddHeader('&C&HCompany Name');
$sheet->getHeaderFooter()->setOddFooter('&LPage &P of &N' . '&RDate: &D');

Edit HTML Callback

Modify the HTML before PDF generation:
function modifyHtml(string $html): string
{
    // Change styles
    $html = str_replace(
        '{border: 1px solid black;}',
        '{border: 2px solid blue;}',
        $html
    );
    return $html;
}

$writer = new Mpdf($spreadsheet);
$writer->setEditHtmlCallback('modifyHtml');
$writer->save('output.pdf');

Advanced Configuration

Custom TCPDF Implementation

use PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf;

class CustomTcpdf extends \TCPDF
{
    // Custom configuration
    public function Header()
    {
        $this->SetY(10);
        $this->SetFont('helvetica', 'B', 12);
        $this->Cell(0, 10, 'Custom Header', 0, 1, 'C');
    }
}

class CustomTcpdfWriter extends Tcpdf
{
    protected function createExternalWriterInstance(
        string $orientation,
        string $unit,
        $paperSize
    ): \TCPDF {
        return new CustomTcpdf($orientation, $unit, $paperSize);
    }
}

$writer = new CustomTcpdfWriter($spreadsheet);
$writer->save('output.pdf');

Downloading PDFs

Browser Download

use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;

// Set headers
header('Content-Type: application/pdf');
header('Content-Disposition: attachment;filename="report.pdf"');
header('Cache-Control: max-age=0');

// Generate PDF to browser
$writer = new Mpdf($spreadsheet);
$writer->save('php://output');
exit;

Inline Display

header('Content-Type: application/pdf');
header('Content-Disposition: inline;filename="report.pdf"');

$writer = new Mpdf($spreadsheet);
$writer->save('php://output');
exit;

Number Formatting

Control decimal and thousands separators:
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;

// Set before creating the writer
StringHelper::setDecimalSeparator('.');
StringHelper::setThousandsSeparator(',');

$writer = new Mpdf($spreadsheet);
$writer->save('output.pdf');

Choosing a PDF Library

Best for:
  • Unicode and international characters
  • Complex layouts
  • RTL (right-to-left) languages
  • Custom headers/footers
Pros:
  • Excellent Unicode support
  • Good HTML/CSS support
  • Active development
  • Good documentation
Cons:
  • Moderate speed
  • Higher memory usage

Troubleshooting

Memory Issues

// Increase memory limit
ini_set('memory_limit', '512M');

// Disable formula pre-calculation
$writer->setPreCalculateFormulas(false);

// Process sheets individually
for ($i = 0; $i < $spreadsheet->getSheetCount(); $i++) {
    $writer->setSheetIndex($i);
    $writer->save("sheet_{$i}.pdf");
}

Font Issues

// Use built-in fonts
$writer->setFont('helvetica'); // TCPDF
$writer->setFont('dejavusans'); // Mpdf

// For special characters
$writer->setFont('dejavusanscondensed');

Large File Performance

// Optimize for performance
$writer->setPreCalculateFormulas(false);
$writer->setIncludeCharts(false);
$spreadsheet->getActiveSheet()->setShowGridLines(false);

Best Practices

Performance

  • Disable formula pre-calculation for large files
  • Don’t include charts unless necessary
  • Export only required sheets
  • Hide grid lines for cleaner output
  • Increase PHP memory limit if needed

Quality

  • Test with sample data first
  • Verify fonts support your character set
  • Check page breaks in the output
  • Test with target PDF readers
  • Set appropriate paper size and orientation

Security

  • Validate input data before export
  • Set appropriate cache directories
  • Clean up temporary files
  • Use HTTPS for downloads
  • Sanitize user-provided content

Complete Example

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;

// Create spreadsheet
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// Add data
$sheet->setCellValue('A1', 'Product');
$sheet->setCellValue('B1', 'Price');
$sheet->setCellValue('A2', 'Widget');
$sheet->setCellValue('B2', 19.99);
$sheet->setCellValue('A3', 'Gadget');
$sheet->setCellValue('B3', 29.99);

// Style header
$sheet->getStyle('A1:B1')->getFont()->setBold(true);
$sheet->getStyle('A1:B1')->getFill()
    ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
    ->getStartColor()->setRGB('CCCCCC');

// Configure page
$sheet->getPageSetup()
    ->setOrientation(PageSetup::ORIENTATION_PORTRAIT)
    ->setPaperSize(PageSetup::PAPERSIZE_A4);
$sheet->setShowGridLines(false);

// Set margins
$sheet->getPageMargins()->setTop(1);
$sheet->getPageMargins()->setRight(0.75);
$sheet->getPageMargins()->setLeft(0.75);
$sheet->getPageMargins()->setBottom(1);

// Create PDF
$writer = new Mpdf($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save('product-list.pdf');

echo 'PDF generated successfully!';

Build docs developers (and LLMs) love