Passed
Push — master ( 63d396...d8391b )
by
unknown
15:36 queued 06:10
created

Dompdf::specialErrorHandler()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 9
ccs 0
cts 0
cp 0
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 4
crap 12
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Writer\Pdf;
4
5
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
6
use PhpOffice\PhpSpreadsheet\Writer\Pdf;
7
8
class Dompdf extends Pdf
9
{
10
    /**
11
     * embed images, or link to images.
12
     */
13
    protected bool $embedImages = true;
14
15
    /**
16
     * Gets the implementation of external PDF library that should be used.
17
     *
18
     * @return \Dompdf\Dompdf implementation
19
     */
20 6
    protected function createExternalWriterInstance(): \Dompdf\Dompdf
21
    {
22 6
        return new \Dompdf\Dompdf();
23
    }
24
25
    /**
26
     * Save Spreadsheet to file.
27
     *
28
     * @param string $filename Name of the file to save as
29
     */
30 6
    public function save($filename, int $flags = 0): void
31
    {
32 6
        $fileHandle = parent::prepareForSave($filename);
33
34
        //  Check for paper size and page orientation
35 6
        $setup = $this->spreadsheet->getSheet($this->getSheetIndex() ?? 0)->getPageSetup();
36 6
        $orientation = $this->getOrientation() ?? $setup->getOrientation();
37 6
        $orientation = ($orientation === PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';
38 6
        $printPaperSize = $this->getPaperSize() ?? $setup->getPaperSize();
39 6
        $paperSize = self::$paperSizes[$printPaperSize] ?? self::$paperSizes[PageSetup::getPaperSizeDefault()] ?? 'LETTER';
40 6
        if (is_array($paperSize) && count($paperSize) === 2) {
41 1
            $paperSize = [0.0, 0.0, $paperSize[0], $paperSize[1]];
42
        }
43
44 6
        $orientation = ($orientation == 'L') ? 'landscape' : 'portrait';
45
46
        //  Create PDF
47 6
        $restoreHandler = false;
48 6
        if (PHP_VERSION_ID >= self::$temporaryVersionCheck) {
49
            // @codeCoverageIgnoreStart
50
            set_error_handler(self::specialErrorHandler(...));
51
            $restoreHandler = true;
52
            // @codeCoverageIgnoreEnd
53
        }
54 6
        $pdf = $this->createExternalWriterInstance();
55 6
        $pdf->setPaper($paperSize, $orientation);
56
57 6
        $pdf->loadHtml($this->generateHTMLAll());
58 6
        $pdf->render();
59
60
        //  Write to file
61 6
        fwrite($fileHandle, $pdf->output() ?? '');
62
63 6
        if ($restoreHandler) {
64
            restore_error_handler(); // @codeCoverageIgnore
65
        }
66 6
        parent::restoreStateAfterSave();
67
    }
68
69
    protected static int $temporaryVersionCheck = 80500;
70
71
    /**
72
     * Temporary handler for Php8.5 waiting for Dompdf release.
73
     *
74
     * @codeCoverageIgnore
75
     */
76
    public function specialErrorHandler(int $errno, string $errstr, string $filename, int $lineno): bool
77
    {
78
        if ($errno === E_DEPRECATED) {
79
            if (preg_match('/canonical|imagedestroy/', $errstr) === 1) {
80
                return true;
81
            }
82
        }
83
84
        return false; // continue error handling
85
    }
86
}
87