options['officeBinary']); } /** * {@inheritDoc} */ public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage { if (!$this->isAvailable($file)) { return null; } $tempManager = Server::get(ITempManager::class); // The file to generate the preview for. $absPath = $this->getLocalFile($file); // The destination for the LibreOffice user profile. // LibreOffice can rune once per user profile and therefore instance id and file id are included. $profile = $tempManager->getTemporaryFolder( 'nextcloud-office-profile-' . \OC_Util::getInstanceId() . '-' . $file->getId() ); // The destination for the LibreOffice convert result. $outdir = $tempManager->getTemporaryFolder( 'nextcloud-office-preview-' . \OC_Util::getInstanceId() . '-' . $file->getId() ); if ($profile === false || $outdir === false) { $this->cleanTmpFiles(); return null; } $parameters = [ $this->options['officeBinary'], '-env:UserInstallation=file://' . escapeshellarg($profile), '--headless', '--nologo', '--nofirststartwizard', '--invisible', '--norestore', '--convert-to png', '--outdir ' . escapeshellarg($outdir), escapeshellarg($absPath), ]; $cmd = implode(' ', $parameters); exec($cmd, $output, $returnCode); if ($returnCode !== 0) { $this->cleanTmpFiles(); return null; } $preview = $outdir . pathinfo($absPath, PATHINFO_FILENAME) . '.png'; $image = new \OCP\Image(); $image->loadFromFile($preview); $this->cleanTmpFiles(); if ($image->valid()) { $image->scaleDownToFit($maxX, $maxY); return $image; } return null; } }