| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | <?phpnamespace PhpOffice\PhpSpreadsheet\Writer\Pdf;use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;use PhpOffice\PhpSpreadsheet\Writer\Pdf;class Mpdf extends Pdf{    /**     * Gets the implementation of external PDF library that should be used.     *     * @param array $config Configuration array     *     * @return \Mpdf\Mpdf implementation     */    protected function createExternalWriterInstance($config)    {        return new \Mpdf\Mpdf($config);    }    /**     * Save Spreadsheet to file.     *     * @param string $pFilename Name of the file to save as     *     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception     * @throws PhpSpreadsheetException     */    public function save($pFilename)    {        $fileHandle = parent::prepareForSave($pFilename);        //  Default PDF paper size        $paperSize = 'LETTER'; //    Letter    (8.5 in. by 11 in.)        //  Check for paper size and page orientation        if (null === $this->getSheetIndex()) {            $orientation = ($this->spreadsheet->getSheet(0)->getPageSetup()->getOrientation()                == PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';            $printPaperSize = $this->spreadsheet->getSheet(0)->getPageSetup()->getPaperSize();        } else {            $orientation = ($this->spreadsheet->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation()                == PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';            $printPaperSize = $this->spreadsheet->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize();        }        $this->setOrientation($orientation);        //  Override Page Orientation        if (null !== $this->getOrientation()) {            $orientation = ($this->getOrientation() == PageSetup::ORIENTATION_DEFAULT)                ? PageSetup::ORIENTATION_PORTRAIT                : $this->getOrientation();        }        $orientation = strtoupper($orientation);        //  Override Paper Size        if (null !== $this->getPaperSize()) {            $printPaperSize = $this->getPaperSize();        }        if (isset(self::$paperSizes[$printPaperSize])) {            $paperSize = self::$paperSizes[$printPaperSize];        }        //  Create PDF        $config = ['tempDir' => $this->tempDir];        $pdf = $this->createExternalWriterInstance($config);        $ortmp = $orientation;        $pdf->_setPageSize(strtoupper($paperSize), $ortmp);        $pdf->DefOrientation = $orientation;        $pdf->AddPageByArray([            'orientation' => $orientation,            'margin-left' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getLeft()),            'margin-right' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getRight()),            'margin-top' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getTop()),            'margin-bottom' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getBottom()),        ]);        //  Document info        $pdf->SetTitle($this->spreadsheet->getProperties()->getTitle());        $pdf->SetAuthor($this->spreadsheet->getProperties()->getCreator());        $pdf->SetSubject($this->spreadsheet->getProperties()->getSubject());        $pdf->SetKeywords($this->spreadsheet->getProperties()->getKeywords());        $pdf->SetCreator($this->spreadsheet->getProperties()->getCreator());        $pdf->WriteHTML($this->generateHTMLHeader(false));        $html = $this->generateSheetData();        foreach (\array_chunk(\explode(PHP_EOL, $html), 1000) as $lines) {            $pdf->WriteHTML(\implode(PHP_EOL, $lines));        }        $pdf->WriteHTML($this->generateHTMLFooter());        //  Write to file        fwrite($fileHandle, $pdf->Output('', 'S'));        parent::restoreStateAfterSave($fileHandle);    }    /**     * Convert inches to mm.     *     * @param float $inches     *     * @return float     */    private function inchesToMm($inches)    {        return $inches * 25.4;    }}
 |