Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Writer\Pdf;
   4  
   5  use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
   6  use PhpOffice\PhpSpreadsheet\Writer\Html;
   7  use PhpOffice\PhpSpreadsheet\Writer\Pdf;
   8  
   9  class Mpdf extends Pdf
  10  {
  11      /** @var bool */
  12      protected $isMPdf = true;
  13  
  14      /**
  15       * Gets the implementation of external PDF library that should be used.
  16       *
  17       * @param array $config Configuration array
  18       *
  19       * @return \Mpdf\Mpdf implementation
  20       */
  21      protected function createExternalWriterInstance($config)
  22      {
  23          return new \Mpdf\Mpdf($config);
  24      }
  25  
  26      /**
  27       * Save Spreadsheet to file.
  28       *
  29       * @param string $filename Name of the file to save as
  30       */
  31      public function save($filename, int $flags = 0): void
  32      {
  33          $fileHandle = parent::prepareForSave($filename);
  34  
  35          //  Check for paper size and page orientation
  36          $setup = $this->spreadsheet->getSheet($this->getSheetIndex() ?? 0)->getPageSetup();
  37          $orientation = $this->getOrientation() ?? $setup->getOrientation();
  38          $orientation = ($orientation === PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';
  39          $printPaperSize = $this->getPaperSize() ?? $setup->getPaperSize();
  40          $paperSize = self::$paperSizes[$printPaperSize] ?? PageSetup::getPaperSizeDefault();
  41  
  42          //  Create PDF
  43          $config = ['tempDir' => $this->tempDir . '/mpdf'];
  44          $pdf = $this->createExternalWriterInstance($config);
  45          $ortmp = $orientation;
  46          $pdf->_setPageSize($paperSize, $ortmp);
  47          $pdf->DefOrientation = $orientation;
  48          $pdf->AddPageByArray([
  49              'orientation' => $orientation,
  50              'margin-left' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getLeft()),
  51              'margin-right' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getRight()),
  52              'margin-top' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getTop()),
  53              'margin-bottom' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getBottom()),
  54          ]);
  55  
  56          //  Document info
  57          $pdf->SetTitle($this->spreadsheet->getProperties()->getTitle());
  58          $pdf->SetAuthor($this->spreadsheet->getProperties()->getCreator());
  59          $pdf->SetSubject($this->spreadsheet->getProperties()->getSubject());
  60          $pdf->SetKeywords($this->spreadsheet->getProperties()->getKeywords());
  61          $pdf->SetCreator($this->spreadsheet->getProperties()->getCreator());
  62  
  63          $html = $this->generateHTMLAll();
  64          $bodyLocation = strpos($html, Html::BODY_LINE);
  65          // Make sure first data presented to Mpdf includes body tag
  66          //   so that Mpdf doesn't parse it as content. Issue 2432.
  67          if ($bodyLocation !== false) {
  68              $bodyLocation += strlen(Html::BODY_LINE);
  69              $pdf->WriteHTML(substr($html, 0, $bodyLocation));
  70              $html = substr($html, $bodyLocation);
  71          }
  72          foreach (\array_chunk(\explode(PHP_EOL, $html), 1000) as $lines) {
  73              $pdf->WriteHTML(\implode(PHP_EOL, $lines));
  74          }
  75  
  76          //  Write to file
  77          fwrite($fileHandle, $pdf->Output('', 'S'));
  78  
  79          parent::restoreStateAfterSave();
  80      }
  81  
  82      /**
  83       * Convert inches to mm.
  84       *
  85       * @param float $inches
  86       *
  87       * @return float
  88       */
  89      private function inchesToMm($inches)
  90      {
  91          return $inches * 25.4;
  92      }
  93  }