fix: use png as preview right away

The initial office preview implementation converted an office document with LibreOffice to PDF, used ImageMagick to extract the first page as JPEG, and passed it OC_Image.

https://github.com/nextcloud/server/pull/10198 changed the implementation to use PNG rather than PDF. OC_Image can use a PNG as a preview right away, so the ImageMagick step is unnecessary.

The registration code was updated to not ask ImageMagick if PDF is supported, as PDFs are no longer used to create office document previews.

Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
This commit is contained in:
Daniel Kesselberg 2023-11-13 21:35:22 +01:00
parent b5241d5220
commit 475dd60354
No known key found for this signature in database
GPG Key ID: 36E3664E099D0614
2 changed files with 43 additions and 37 deletions

View File

@ -33,7 +33,6 @@ use OCP\Files\FileInfo;
use OCP\IImage;
use OCP\ITempManager;
use OCP\Server;
use Psr\Log\LoggerInterface;
abstract class Office extends ProviderV2 {
/**
@ -93,30 +92,18 @@ abstract class Office extends ProviderV2 {
return null;
}
try {
$filename = $outdir . pathinfo($absPath, PATHINFO_FILENAME) . '.png';
$png = new \Imagick($filename . '[0]');
$png->setImageFormat('jpg');
} catch (\Exception $e) {
$this->cleanTmpFiles();
\OC::$server->get(LoggerInterface::class)->error($e->getMessage(), [
'exception' => $e,
'app' => 'core',
]);
return null;
}
$preview = $outdir . pathinfo($absPath, PATHINFO_FILENAME) . '.png';
$image = new \OCP\Image();
$image->loadFromData((string) $png);
$image->loadFromFile($preview);
$this->cleanTmpFiles();
if ($image->valid()) {
$image->scaleDownToFit($maxX, $maxY);
return $image;
}
return null;
}
}

View File

@ -366,7 +366,7 @@ class PreviewManager implements IPreview {
$this->registerCoreProvider(Preview\OpenDocument::class, '/application\/vnd.oasis.opendocument.*/');
$this->registerCoreProvider(Preview\Imaginary::class, Preview\Imaginary::supportedMimeTypes());
// SVG, Office and Bitmap require imagick
// SVG and Bitmap require imagick
if ($this->imagickSupport->hasExtension()) {
$imagickProviders = [
'SVG' => ['mimetype' => '/image\/svg\+xml/', 'class' => Preview\SVG::class],
@ -391,28 +391,10 @@ class PreviewManager implements IPreview {
$this->registerCoreProvider($class, $provider['mimetype']);
}
}
if ($this->imagickSupport->supportsFormat('PDF')) {
// Office requires openoffice or libreoffice
$officeBinary = $this->config->getSystemValue('preview_libreoffice_path', null);
if (!is_string($officeBinary)) {
$officeBinary = $this->binaryFinder->findBinaryPath('libreoffice');
}
if (!is_string($officeBinary)) {
$officeBinary = $this->binaryFinder->findBinaryPath('openoffice');
}
if (is_string($officeBinary)) {
$this->registerCoreProvider(Preview\MSOfficeDoc::class, '/application\/msword/', ["officeBinary" => $officeBinary]);
$this->registerCoreProvider(Preview\MSOffice2003::class, '/application\/vnd.ms-.*/', ["officeBinary" => $officeBinary]);
$this->registerCoreProvider(Preview\MSOffice2007::class, '/application\/vnd.openxmlformats-officedocument.*/', ["officeBinary" => $officeBinary]);
$this->registerCoreProvider(Preview\OpenDocument::class, '/application\/vnd.oasis.opendocument.*/', ["officeBinary" => $officeBinary]);
$this->registerCoreProvider(Preview\StarOffice::class, '/application\/vnd.sun.xml.*/', ["officeBinary" => $officeBinary]);
$this->registerCoreProvider(Preview\EMF::class, '/image\/emf/', ['officeBinary' => $officeBinary]);
}
}
}
$this->registerCoreProvidersOffice();
// Video requires avconv or ffmpeg
if (in_array(Preview\Movie::class, $this->getEnabledDefaultProvider())) {
$movieBinary = $this->config->getSystemValue('preview_ffmpeg_path', null);
@ -430,6 +412,43 @@ class PreviewManager implements IPreview {
}
}
private function registerCoreProvidersOffice(): void {
$officeProviders = [
['mimetype' => '/application\/msword/', 'class' => Preview\MSOfficeDoc::class],
['mimetype' => '/application\/vnd.ms-.*/', 'class' => Preview\MSOffice2003::class],
['mimetype' => '/application\/vnd.openxmlformats-officedocument.*/', 'class' => Preview\MSOffice2007::class],
['mimetype' => '/application\/vnd.oasis.opendocument.*/', 'class' => Preview\OpenDocument::class],
['mimetype' => '/application\/vnd.sun.xml.*/', 'class' => Preview\StarOffice::class],
['mimetype' => '/image\/emf/', 'class' => Preview\EMF::class],
];
$findBinary = true;
$officeBinary = false;
foreach ($officeProviders as $provider) {
$class = $provider['class'];
if (!in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
continue;
}
if ($findBinary) {
// Office requires openoffice or libreoffice
$officeBinary = $this->config->getSystemValue('preview_libreoffice_path', false);
if ($officeBinary === false) {
$officeBinary = $this->binaryFinder->findBinaryPath('libreoffice');
}
if ($officeBinary === false) {
$officeBinary = $this->binaryFinder->findBinaryPath('openoffice');
}
$findBinary = false;
}
if ($officeBinary) {
$this->registerCoreProvider($class, $provider['mimetype'], ['officeBinary' => $officeBinary]);
}
}
}
private function registerBootstrapProviders(): void {
$context = $this->bootstrapCoordinator->getRegistrationContext();