diff --git a/lib/private/Preview/CDR.php b/lib/private/Preview/CDR.php new file mode 100644 index 0000000000000..2b8e6b152e63b --- /dev/null +++ b/lib/private/Preview/CDR.php @@ -0,0 +1,73 @@ +getSize() > 0; + } + public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage { + if (!$this->isAvailable($file)) { + return null; + } + + $localFile = $this->getLocalFile($file); + + if ($localFile === false) { + return null; + } + + $data = $this->extractThumbnail($localFile); + if ($data === null) { + return null; + } + + $image = new Image(); + $image->loadFromData($data); + + if (!$image->valid()) { + return null; + } + + $image->scaleDownToFit($maxX, $maxY); + + return $image; + } + /** * Extract ONLY thumbnail (no pages) */ + private function extractThumbnail(string $file): ?string { + $zip = new \ZipArchive(); + + if ($zip->open($file) !== true) { + return null; + } + + /** * CDR files created by newer CorelDRAW versions store the embedded preview in previews/thumbnail.png. + * OLD CDR format (BMP thumbnail) * metadata/thumbnails/thumbnail.bmp */ + foreach ([ + 'previews/thumbnail.png', + 'metadata/thumbnails/thumbnail.bmp', + ] as $thumbnail) { + $idx = $zip->locateName($thumbnail); + + if ($idx === false) { + continue; + } + + $data = $zip->getFromIndex($idx); + $zip->close(); + + return $data === false ? null : $data; + } + + $zip->close(); + + return null; + } +} diff --git a/lib/private/PreviewManager.php b/lib/private/PreviewManager.php index e99349ea22e32..811e9943cf057 100644 --- a/lib/private/PreviewManager.php +++ b/lib/private/PreviewManager.php @@ -33,6 +33,7 @@ use OC\Preview\MSOfficeDoc; use OC\Preview\OpenDocument; use OC\Preview\PDF; +use OC\Preview\CDR; use OC\Preview\Photoshop; use OC\Preview\PNG; use OC\Preview\Postscript; @@ -278,6 +279,7 @@ protected function getEnabledDefaultProvider(): array { XBitmap::class, Krita::class, WebP::class, + CDR::class, ]; $this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', array_merge([ @@ -323,6 +325,7 @@ protected function registerCoreProviders(): void { $this->registerCoreProvider(BMP::class, '/image\/bmp/'); $this->registerCoreProvider(XBitmap::class, '/image\/x-xbitmap/'); $this->registerCoreProvider(WebP::class, '/image\/webp/'); + $this->registerCoreProvider(CDR::class, '/application\/coreldraw/'); $this->registerCoreProvider(Krita::class, '/application\/x-krita/'); $this->registerCoreProvider(MP3::class, '/audio\/mpeg$/'); $this->registerCoreProvider(OpenDocument::class, '/application\/vnd.oasis.opendocument.*/');