spatie/laravel-screenshot
Driver-based Laravel package for taking web page screenshots with great defaults. Use Browsershot (Chromium) or Cloudflare Browser Rendering, customize viewport/format/quality, save to files, and easily fake/assert screenshots in tests.
Installation:
composer require spatie/laravel-screenshot
Publish the config (optional):
php artisan vendor:publish --provider="Spatie\Screenshot\ScreenshotServiceProvider"
First Use Case: Capture a screenshot of a URL (e.g., a marketing page or dynamic content):
use Spatie\Screenshot\Screenshot;
$screenshot = Screenshot::create('https://example.com')->save('path/to/screenshot.png');
browsershot (Chromium-based, local)..env).Where to Look First:
Dynamic Screenshots:
$screenshot = Screenshot::create(route('dashboard'))
->setDriver('browsershot')
->setViewport(1920, 1080)
->save(storage_path('app/screenshots/dashboard.png'));
Batch Processing:
$urls = ['https://site1.com', 'https://site2.com'];
foreach ($urls as $url) {
Screenshot::create($url)->queue();
}
Spatie\QueueableScreenshot for queueable jobs.Cloudflare Integration:
config(['screenshot.driver' => 'cloudflare']);
$screenshot = Screenshot::create('https://example.com')->save('cloud_screenshot.png');
CLOUDFLARE_API_TOKEN in .env.Custom Headers/Cookies:
$screenshot = Screenshot::create('https://app.example.com/dashboard')
->setHeaders(['Authorization' => 'Bearer token123'])
->setCookies(['session_id' => 'abc123']);
Spatie\Screenshot\Storage\Disk to save to custom paths (e.g., S3):
$screenshot->save('s3://bucket/screenshots/image.png');
ScreenshotCreated events to process screenshots post-capture:
Screenshot::created(function ($screenshot) {
// Optimize, upload, or notify
});
$this->partialMock(Screenshot::class, 'createDriver')->willReturn($mockDriver);
Resource Limits:
Screenshot::create(url)->setTimeout(60); // 60 seconds
Dynamic Content:
waitForSelector:
$screenshot->waitForSelector('#dynamic-content');
puppeteer errors (Browsershot under the hood).Configuration Overrides:
viewport) applies to all screenshots. Override per instance:
Screenshot::create(url)->setViewport(1024, 768);
Driver-Specific Quirks:
Browser Rendering permissions.config(['screenshot.log_level' => 'debug']);
getHtml() to debug rendering issues:
$html = Screenshot::create(url)->getHtml();
dd($html); // Check for missing JS/CSS
curl or Postman before using the package.Custom Drivers:
Spatie\Screenshot\Contracts\Driver for new backends (e.g., Playwright):
class PlaywrightDriver implements Driver {
public function capture(string $url, array $options): string { ... }
}
config/screenshot.php:
'drivers' => [
'playwright' => \App\Drivers\PlaywrightDriver::class,
],
Middleware:
Screenshot::middleware(function ($request) {
$request->headers->set('X-Custom-Header', 'value');
});
Post-Processing:
use Intervention\Image\Facades\Image;
$image = Image::make($screenshot->getPath());
$image->resize(300, 200)->save();
How can I help you explore Laravel packages today?