| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- <?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]);
- }
- }
|