path($pdfStoragePath); if (!file_exists($pdfAbsPath)) { return null; } $tempPrefix = sys_get_temp_dir() . '/terr_thumb_' . uniqid(); exec( 'pdftoppm -r 72 -png -l 1 ' . escapeshellarg($pdfAbsPath) . ' ' . escapeshellarg($tempPrefix), $output, $exitCode ); // pdftoppm may produce -1.png, -01.png or even -001.png depending on page count $generated = null; foreach (['-1.png', '-01.png', '-001.png'] as $suffix) { $candidate = $tempPrefix . $suffix; if (file_exists($candidate)) { $generated = $candidate; break; } } if (!$generated) { return null; } $thumbRelPath = 'territori-thumbnails/' . basename($pdfStoragePath, '.pdf') . '.png'; Storage::disk('public')->put($thumbRelPath, file_get_contents($generated)); unlink($generated); return $thumbRelPath; } /** * Delete an existing thumbnail from the public disk. */ public function delete(string $thumbnailPath): void { if ($thumbnailPath) { Storage::disk('public')->delete($thumbnailPath); } } }