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();
+ }
+}