215 lines
5.4 KiB
PHP
215 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace PhpOffice\PhpSpreadsheet\Worksheet;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
|
|
use ZipArchive;
|
|
|
|
class Drawing extends BaseDrawing
|
|
{
|
|
const IMAGE_TYPES_CONVERTION_MAP = [
|
|
IMAGETYPE_GIF => IMAGETYPE_PNG,
|
|
IMAGETYPE_JPEG => IMAGETYPE_JPEG,
|
|
IMAGETYPE_PNG => IMAGETYPE_PNG,
|
|
IMAGETYPE_BMP => IMAGETYPE_PNG,
|
|
];
|
|
|
|
/**
|
|
* Path.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $path;
|
|
|
|
/**
|
|
* Whether or not we are dealing with a URL.
|
|
*
|
|
* @var bool
|
|
*/
|
|
private $isUrl;
|
|
|
|
/**
|
|
* Create a new Drawing.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
// Initialise values
|
|
$this->path = '';
|
|
$this->isUrl = false;
|
|
|
|
// Initialize parent
|
|
parent::__construct();
|
|
}
|
|
|
|
/**
|
|
* Get Filename.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getFilename()
|
|
{
|
|
return basename($this->path);
|
|
}
|
|
|
|
/**
|
|
* Get indexed filename (using image index).
|
|
*/
|
|
public function getIndexedFilename(): string
|
|
{
|
|
return md5($this->path) . '.' . $this->getExtension();
|
|
}
|
|
|
|
/**
|
|
* Get Extension.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getExtension()
|
|
{
|
|
$exploded = explode('.', basename($this->path));
|
|
|
|
return $exploded[count($exploded) - 1];
|
|
}
|
|
|
|
/**
|
|
* Get full filepath to store drawing in zip archive.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getMediaFilename()
|
|
{
|
|
if (!array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) {
|
|
throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
|
|
}
|
|
|
|
return sprintf('image%d%s', $this->getImageIndex(), $this->getImageFileExtensionForSave());
|
|
}
|
|
|
|
/**
|
|
* Get Path.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getPath()
|
|
{
|
|
return $this->path;
|
|
}
|
|
|
|
/**
|
|
* Set Path.
|
|
*
|
|
* @param string $path File path
|
|
* @param bool $verifyFile Verify file
|
|
* @param ZipArchive $zip Zip archive instance
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setPath($path, $verifyFile = true, $zip = null)
|
|
{
|
|
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;
|
|
// Implicit that it is a URL, rather store info than running check above on value in other places.
|
|
$this->isUrl = true;
|
|
$imageContents = file_get_contents($path);
|
|
$filePath = tempnam(sys_get_temp_dir(), 'Drawing');
|
|
if ($filePath) {
|
|
file_put_contents($filePath, $imageContents);
|
|
if (file_exists($filePath)) {
|
|
$this->setSizesAndType($filePath);
|
|
unlink($filePath);
|
|
}
|
|
}
|
|
} elseif (file_exists($path)) {
|
|
$this->path = $path;
|
|
$this->setSizesAndType($path);
|
|
} elseif ($zip instanceof ZipArchive) {
|
|
$zipPath = explode('#', $path)[1];
|
|
if ($zip->locateName($zipPath) !== false) {
|
|
$this->path = $path;
|
|
$this->setSizesAndType($path);
|
|
}
|
|
} else {
|
|
throw new PhpSpreadsheetException("File $path not found!");
|
|
}
|
|
} else {
|
|
$this->path = $path;
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get isURL.
|
|
*/
|
|
public function getIsURL(): bool
|
|
{
|
|
return $this->isUrl;
|
|
}
|
|
|
|
/**
|
|
* Set isURL.
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setIsURL(bool $isUrl): self
|
|
{
|
|
$this->isUrl = $isUrl;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get hash code.
|
|
*
|
|
* @return string Hash code
|
|
*/
|
|
public function getHashCode()
|
|
{
|
|
return md5(
|
|
$this->path .
|
|
parent::getHashCode() .
|
|
__CLASS__
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get Image Type for Save.
|
|
*/
|
|
public function getImageTypeForSave(): int
|
|
{
|
|
if (!array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) {
|
|
throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
|
|
}
|
|
|
|
return self::IMAGE_TYPES_CONVERTION_MAP[$this->type];
|
|
}
|
|
|
|
/**
|
|
* Get Image file extention for Save.
|
|
*/
|
|
public function getImageFileExtensionForSave(bool $includeDot = true): string
|
|
{
|
|
if (!array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) {
|
|
throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
|
|
}
|
|
|
|
$result = image_type_to_extension(self::IMAGE_TYPES_CONVERTION_MAP[$this->type], $includeDot);
|
|
|
|
return "$result";
|
|
}
|
|
|
|
/**
|
|
* Get Image mime type.
|
|
*/
|
|
public function getImageMimeType(): string
|
|
{
|
|
if (!array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) {
|
|
throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
|
|
}
|
|
|
|
return image_type_to_mime_type(self::IMAGE_TYPES_CONVERTION_MAP[$this->type]);
|
|
}
|
|
}
|