PHP ile Ekran Görüntüsü Alma ve PDF Oluşturma Yöntemleri (wkhtmltopdf Kullanmadan)
PHP ile PDF oluşturma süreci genellikle zorlu bir deneyimdir. wkhtmltopdf, bir binary kurulum gerektirirken modern CSS ve JavaScript ile sorunlar yaşayabilir. Dompdf tamamen PHP tabanlıdır ancak JavaScript ağırlıklı sayfaları render edemez. mPDF benzer bir sınırlamaya sahiptir. Browsershot (Spatie), Puppeteer’i sarmaladığı için sunucunuzda Node.js çalıştırmanızı gerektirmektedir.
Temiz bir yol var: bir HTTP isteği, binary cevap ve sistem bağımlılığı yok.
Bir URL’den Ekran Görüntüsü Alma
<?php
function screenshot(string $url): string
{
$ch = curl_init('https://pagebolt.dev/api/v1/screenshot');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . $_ENV['PAGEBOLT_API_KEY'],
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'url' => $url,
'fullPage' => true,
'blockBanners' => true,
]),
]);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
// Diskte kaydet
file_put_contents('screenshot.png', screenshot('https://example.com'));
Bir URL’den PDF Oluşturma
function pdfFromUrl(string $url): string
{
$ch = curl_init('https://pagebolt.dev/api/v1/pdf');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . $_ENV['PAGEBOLT_API_KEY'],
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'url' => $url,
'blockBanners' => true,
]),
]);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
file_put_contents('page.pdf', pdfFromUrl('https://yourapp.com/invoice/1042'));
HTML’den PDF Oluşturma (wkhtmltopdf / Dompdf Yerine)
Öncelikle PHP şablonunuzu bir HTML stringine render edin, ardından gönderebilirsiniz:
function pdfFromHtml(string $html): string
{
$ch = curl_init('https://pagebolt.dev/api/v1/pdf');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . $_ENV['PAGEBOLT_API_KEY'],
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['html' => $html]),
]);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
// HTML'yi istediğiniz gibi oluşturun
ob_start();
include 'templates/invoice.php';
$html = ob_get_clean();
$pdf = pdfFromHtml($html);
file_put_contents("invoice-{$invoiceId}.pdf", $pdf);
Laravel Kontrolcü Örneği
use Illuminate\Http\Response;
class InvoiceController extends Controller
{
public function download(Invoice $invoice): Response
{
$html = view('invoices.pdf', compact('invoice'))->render();
$ch = curl_init('https://pagebolt.dev/api/v1/pdf');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . env('PAGEBOLT_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['html' => $html]),
]);
$pdf = curl_exec($ch);
curl_close($ch);
return response($pdf, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => "attachment; filename=\"invoice-{$invoice->id}.pdf\"",
]);
}
}
Hiçbir Composer paketi, binary veya Node.js gerektirmiyor. Blade şablonu normal şekilde render ediliyor — sadece PDF oluşturma adımını değiştirmelisiniz.
Dağıtım
Hiçbir buildpack, apt-get veya binary katmanı gerekli değil. Paylaşımlı hosting, Heroku, Laravel Forge veya outbound HTTPS olan herhangi bir PHP ortamında çalışıyor. PAGEBOLT_API_KEY‘yi .env dosyanıza ekleyin ve normal bir şekilde dağıtım yapın.
Kaynak: Orijinal Makale


