diff --git a/samples/Basic/27_Images_Html_Pdf.php b/samples/Basic/27_Images_Html_Pdf.php new file mode 100644 index 00000000..751775a7 --- /dev/null +++ b/samples/Basic/27_Images_Html_Pdf.php @@ -0,0 +1,39 @@ +log('Load Xlsx template file'); +$reader = IOFactory::createReader('Xls'); +$initialSpreadsheet = $reader->load(__DIR__ . '/../templates/27template.xls'); + +$xlsxFile = File::temporaryFilename(); +$writer = new XlsxWriter($initialSpreadsheet); +$helper->log('Save as Xlsx'); +$writer->save($xlsxFile); +$initialSpreadsheet->disconnectWorksheets(); +$reader2 = new XlsxReader(); +$helper->log('Load Xlsx'); +$spreadsheet = $reader2->load($xlsxFile); + +$helper->log('Hide grid lines'); +$spreadsheet->getActiveSheet()->setShowGridLines(false); + +$helper->log('Set orientation to landscape'); +$spreadsheet->getActiveSheet()->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); + +$className = Mpdf::class; +$helper->log("Write to PDF format using {$className}, and to Html"); +IOFactory::registerWriter('Pdf', $className); + +// Save +$helper->write($spreadsheet, __FILE__, ['Pdf', 'Html']); +unlink($xlsxFile); +$spreadsheet->disconnectWorksheets(); diff --git a/src/PhpSpreadsheet/Worksheet/Drawing.php b/src/PhpSpreadsheet/Worksheet/Drawing.php index f62873bb..ebda19b7 100644 --- a/src/PhpSpreadsheet/Worksheet/Drawing.php +++ b/src/PhpSpreadsheet/Worksheet/Drawing.php @@ -106,7 +106,7 @@ class Drawing extends BaseDrawing */ public function setPath($path, $verifyFile = true, $zip = null) { - if ($verifyFile) { + if ($verifyFile && preg_match('~^data:image/[a-z]+;base64,~', $path) !== 1) { // Check if a URL has been passed. https://stackoverflow.com/a/2058596/1252979 if (filter_var($path, FILTER_VALIDATE_URL)) { $this->path = $path; diff --git a/src/PhpSpreadsheet/Writer/Html.php b/src/PhpSpreadsheet/Writer/Html.php index 555f4dc7..45d4ce85 100644 --- a/src/PhpSpreadsheet/Writer/Html.php +++ b/src/PhpSpreadsheet/Writer/Html.php @@ -485,6 +485,7 @@ class Html extends BaseWriter $html .= $endTag; } + --$row; $html .= $this->extendRowsForChartsAndImages($sheet, $row); // Write table footer @@ -675,7 +676,7 @@ class Html extends BaseWriter $html .= PHP_EOL; $imageData = self::winFileToUrl($filename); - if ($this->embedImages && !$this->isPdf) { + if (($this->embedImages && !$this->isPdf) || substr($imageData, 0, 6) === 'zip://') { $picture = @file_get_contents($filename); if ($picture !== false) { $imageDetails = getimagesize($filename); @@ -699,7 +700,7 @@ class Html extends BaseWriter ob_end_clean(); // End the output buffer. /** @phpstan-ignore-next-line */ - $dataUri = 'data:image/jpeg;base64,' . base64_encode($contents); + $dataUri = 'data:image/png;base64,' . base64_encode($contents); // Because of the nature of tables, width is more important than height. // max-width: 100% ensures that image doesnt overflow containing cell diff --git a/tests/PhpSpreadsheetTests/Writer/Html/ImageCopyTest.php b/tests/PhpSpreadsheetTests/Writer/Html/ImageCopyTest.php new file mode 100644 index 00000000..adee76b0 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Writer/Html/ImageCopyTest.php @@ -0,0 +1,70 @@ +xlsxFile !== '') { + unlink($this->xlsxFile); + $this->xlsxFile = ''; + } + } + + public function testImageCopyXls(): void + { + $file = 'samples/templates/27template.xls'; + $reader = new XlsReader(); + $reloadedSpreadsheet = $reader->load($file); + + $writer = new Html($reloadedSpreadsheet); + $writer->writeAllSheets(); + self::assertFalse($writer->getEmbedImages()); + $html = $writer->generateHTMLAll(); + self::assertSame(4, substr_count($html, 'writeAndReload($reloadedSpreadsheet, 'Html'); + $reloadedSpreadsheet->disconnectWorksheets(); + } + + public function testImageCopyXlsx(): void + { + $file = 'samples/templates/27template.xls'; + $reader = new XlsReader(); + $spreadsheet = $reader->load($file); + $this->xlsxFile = File::temporaryFilename(); + $writer = new XlsxWriter($spreadsheet); + $writer->save($this->xlsxFile); + $spreadsheet->disconnectWorksheets(); + $reader2 = new XlsxReader(); + $reloadedSpreadsheet = $reader2->load($this->xlsxFile); + + $writer = new Html($reloadedSpreadsheet); + $writer->writeAllSheets(); + self::assertFalse($writer->getEmbedImages()); + $html = $writer->generateHTMLAll(); + self::assertSame(4, substr_count($html, 'writeAndReload($reloadedSpreadsheet, 'Html'); + $reloadedSpreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/PhpSpreadsheetTests/Writer/Mpdf/ImageCopyPdfTest.php b/tests/PhpSpreadsheetTests/Writer/Mpdf/ImageCopyPdfTest.php new file mode 100644 index 00000000..111848da --- /dev/null +++ b/tests/PhpSpreadsheetTests/Writer/Mpdf/ImageCopyPdfTest.php @@ -0,0 +1,69 @@ +xlsxFile !== '') { + unlink($this->xlsxFile); + $this->xlsxFile = ''; + } + } + + public function testImageCopyXls(): void + { + $file = 'samples/templates/27template.xls'; + $reader = new XlsReader(); + $reloadedSpreadsheet = $reader->load($file); + $this->xlsxFile = File::temporaryFilename(); + + $writer = new Mpdf($reloadedSpreadsheet); + self::assertFalse($writer->getEmbedImages()); + $html = $writer->generateHTMLAll(); + self::assertSame(4, substr_count($html, 'writeAndReload($reloadedSpreadsheet, 'Html'); + $reloadedSpreadsheet->disconnectWorksheets(); + } + + public function testImageCopyXlsx(): void + { + $file = 'samples/templates/27template.xls'; + $reader = new XlsReader(); + $spreadsheet = $reader->load($file); + $this->xlsxFile = File::temporaryFilename(); + $writer = new XlsxWriter($spreadsheet); + $writer->save($this->xlsxFile); + $spreadsheet->disconnectWorksheets(); + $reader2 = new XlsxReader(); + $reloadedSpreadsheet = $reader2->load($this->xlsxFile); + + $writer = new Mpdf($reloadedSpreadsheet); + self::assertFalse($writer->getEmbedImages()); + $html = $writer->generateHTMLAll(); + self::assertSame(4, substr_count($html, 'writeAndReload($reloadedSpreadsheet, 'Html'); + $reloadedSpreadsheet->disconnectWorksheets(); + } +}