Python İle Pyppeteer Kütüphanesi Kullanarak Pdf Raporu Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Pyppeteer ile çalışmaya başlamadan önce Python 3.9 veya daha güncel bir sürümün yüklü olduğundan emin olmalısınız. Pyppeteer, Chromium tarayıcısını otomatik olarak indirdiği için ekstra bir sürücü kurulumuna (Selenium'daki gibi ChromeDriver gibi) ihtiyaç duymaz.

Geliştirme ortamınızda gerekli kütüphaneyi kurmak için terminalinizde şu komutu çalıştırın:

pip install pyppeteer

Kurulum tamamlandıktan sonra, kütüphanenin çalışması için gerekli olan Chromium ikili dosyalarını indirmek üzere ilk kez çalıştırıldığında arka planda bir indirme süreci gerçekleşecektir. Bu nedenle, ilk çalıştırmada internet bağlantınızın aktif olması önemlidir.

Pyppeteer ile Temel Tarayıcı Otomasyonu

Pyppeteer'ın temel çalışma mantığı, bir tarayıcı örneği oluşturmak, bir sayfa açmak ve bu sayfa üzerinde işlemler gerçekleştirmektir. İlk adım olarak basit bir web sayfasını ziyaret edip bunu PDF olarak kaydeden bir yapı kuralım.

import asyncio
from pyppeteer import launch

async def temel_pdf_olustur():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.google.com')
    await page.pdf({'path': 'rapor.pdf', 'format': 'A4'})
    await browser.close()

asyncio.run(temel_pdf_olustur())

Yukarıdaki kod, launch() metodu ile tarayıcıyı başlatır. page.goto() ile belirtilen adrese gider ve page.pdf() metodu ile mevcut görünümü PDF dosyası olarak diske kaydeder. asyncio kütüphanesi, Pyppeteer'ın asenkron yapısını yönetmek için zorunludur.

HTML İçeriğinden Dinamik Rapor Oluşturma

Çoğu zaman bir URL'yi değil, kendi oluşturduğunuz HTML şablonlarını PDF'e dönüştürmek istersiniz. Pyppeteer, setContent metodu ile ham HTML verisini tarayıcıya yüklemenize izin verir.

import asyncio
from pyppeteer import launch

async def html_to_pdf():
    html_icerik = "

Rapor Başlığı

Bu bir Pyppeteer PDF testidir.

" browser = await launch() page = await browser.newPage() await page.setContent(html_icerik) await page.pdf({'path': 'ozel_rapor.pdf', 'format': 'A4', 'printBackground': True}) await browser.close() asyncio.run(html_to_pdf())

printBackground: True parametresi, CSS'te tanımladığınız arka plan renklerinin ve görsellerinin PDF'e doğru şekilde yansımasını sağlar. Bu özellik, raporlarınızın profesyonel görünmesi için kritik öneme sahiptir.

PDF Raporlarında CSS ve Stil Kullanımı

Raporlarınızın kurumsal bir kimliğe sahip olması için harici CSS dosyaları veya stil etiketleri kullanmanız gerekir. Pyppeteer, addStyleTag metodu ile sayfaya dinamik olarak CSS enjekte etmenize olanak tanır.

import asyncio
from pyppeteer import launch

async def stilli_rapor():
    browser = await launch()
    page = await browser.newPage()
    await page.setContent("
Merhaba Dünya
") await page.addStyleTag(content='.kutu { color: blue; font-size: 20px; border: 1px solid black; }') await page.pdf({'path': 'stilli_rapor.pdf', 'format': 'A4'}) await browser.close() asyncio.run(stilli_rapor())

Bu yöntemle, raporlarınızın düzenini (layout) esnek bir şekilde yönetebilir, tabloları ve grafik alanlarını CSS Grid veya Flexbox ile hizalayabilirsiniz.

PDF Dönüştürme Yöntemlerinin Karşılaştırılması

Python ekosisteminde PDF oluşturmak için farklı araçlar mevcuttur. Pyppeteer'ın diğerlerine göre konumunu anlamak için aşağıdaki tabloya göz atabilirsiniz:

Yöntem Avantajları Dezavantajları
Pyppeteer Tam CSS/JS desteği, yüksek görsel kalite Daha fazla kaynak tüketimi (Chromium)
ReportLab Çok hızlı, düşük kaynak tüketimi CSS desteği yok, manuel çizim gerektirir
WeasyPrint Modern CSS desteği Karmaşık JS içeren sayfaları işleyemez

Kritik Uyarılar ve Güvenlik Önlemleri

Güvenlik Uyarısı: Kullanıcıdan gelen ham HTML verisini doğrudan setContent ile işlemek, XSS (Cross-Site Scripting) saldırılarına kapı aralayabilir. Eğer PDF içeriği kullanıcı girdisi içeriyorsa, mutlaka bir HTML sanitization (temizleme) kütüphanesi (örneğin bleach) kullanarak zararlı script etiketlerini temizleyin. Ayrıca, üretim ortamında tarayıcıyı her seferinde başlatıp kapatmak yerine, bir bağlantı havuzu (connection pool) mantığı kurmanız performans açısından önemlidir.

İleri Seviye: Sayfa Ayarları ve Kenar Boşlukları

Profesyonel bir raporda kenar boşlukları (margin), üst bilgi (header) ve alt bilgi (footer) standartları önemlidir. page.pdf fonksiyonu içerisinde bu ayarları detaylıca yapılandırabilirsiniz.

await page.pdf({
    'path': 'profesyonel_rapor.pdf',
    'format': 'A4',
    'margin': {'top': '50px', 'bottom': '50px', 'left': '20px', 'right': '20px'},
    'displayHeaderFooter': False
})

Bu ayarlar, raporunuzun yazıcıdan çıktığında veya dijital olarak paylaşıldığında profesyonel bir görünüm sunmasını sağlar. margin değerlerini piksel veya inç cinsinden belirleyebilirsiniz.

Sıkça Sorulan Sorular

Pyppeteer ile neden PDF oluştururken hata alıyorum?

Genellikle Chromium indirilmemiş olabilir veya asenkron fonksiyonlar düzgün yönetilmemiştir. await anahtar kelimesini kullanmayı unutmadığınızdan emin olun.

Çok sayfalı raporlarda sayfa numarası ekleyebilir miyim?

Evet, displayHeaderFooter özelliğini True yaparak ve footerTemplate parametresini kullanarak sayfa numaralarını dinamik olarak ekleyebilirsiniz.

Üretim ortamında (Production) Pyppeteer kullanmak güvenli mi?

Evet, ancak Chromium'un sistem kaynaklarını (RAM) yoğun kullandığını unutmayın. Docker konteynerlarında çalıştırırken --no-sandbox gibi parametrelere ihtiyaç duyabilirsiniz.

PDF dosyamda görseller neden görünmüyor?

Görsellerin yüklenmesi zaman alabilir. page.goto veya page.setContent işleminden sonra waitUntil='networkidle0' parametresini kullanarak ağ trafiğinin durmasını bekleyebilirsiniz.

Pyppeteer ile şifreli PDF oluşturulabilir mi?

Pyppeteer doğrudan şifreleme desteği sunmaz. Oluşturduğunuz PDF'i PyPDF2 veya pikepdf gibi kütüphanelerle sonradan şifrelemeniz önerilir.

Performans Optimizasyonu ve Kaynak Yönetimi

Pyppeteer, arka planda tam teşekküllü bir Chromium tarayıcısı çalıştırdığı için sistem kaynaklarını yoğun kullanabilir. Özellikle eşzamanlı (concurrent) rapor oluşturma süreçlerinde, tarayıcı örneklerini yönetmek sistemin kilitlenmesini önlemek adına kritiktir.

Performansı artırmak için tarayıcıyı her rapor için yeniden başlatmak yerine bir "Browser Pool" yapısı kurmanız önerilir. Ayrıca, gereksiz kaynakların yüklenmesini engelleyerek PDF oluşturma süresini ciddi oranda kısaltabilirsiniz.

import asyncio
from pyppeteer import launch

async def optimize_pdf_generation(html_content, output_path):
    # Gereksiz kaynakları engelleyerek hızı artırın
    browser = await launch(args=['--no-sandbox', '--disable-dev-shm-usage'])
    page = await browser.newPage()
    
    # Resim ve font yüklemelerini devre dışı bırakmak hızı artırır
    await page.setRequestInterception(True)
    page.on('request', lambda req: req.abort() if req.resourceType in ['image', 'media', 'font'] else req.continue_())
    
    await page.setContent(html_content)
    await page.pdf({'path': output_path, 'format': 'A4', 'printBackground': True})
    await browser.close()

Hata Ayıklama (Debugging) ve Log Yönetimi

PDF oluşturma sürecinde karşılaşılan "boş sayfa" veya "stil yüklenmedi" gibi sorunları çözmek için Pyppeteer'ın hata ayıklama modlarını kullanmalısınız. Tarayıcıyı headless=False modunda çalıştırarak, PDF oluşturulmadan önce sayfanın nasıl göründüğünü görsel olarak inceleyebilirsiniz.

Ayrıca, JavaScript hatalarını yakalamak için sayfa üzerindeki konsol çıktılarını Python tarafına aktarmak, özellikle karmaşık CSS veya JS içeren raporlarda hayat kurtarıcıdır:

# Konsol çıktılarını yakalama
page.on('console', lambda msg: print(f"JS Konsolu: {msg.text}"))

# Sayfa yükleme hatalarını yakalama
page.on('pageerror', lambda err: print(f"Sayfa Hatası: {err}"))

Yaygın Hata Senaryoları ve Çözümleri

  • Timeout Hatası: Sayfanızda çok fazla dış kaynak (CDN üzerinden gelen fontlar vb.) varsa, waitUntil='networkidle0' parametresini kullanarak tarayıcının tüm ağ trafiğinin durmasını beklemesini sağlayın.
  • CSS Yüklenmiyor: Yerel dosyaları kullanırken file:// protokolü yerine mutlak dosya yolları kullanın veya CSS'i doğrudan etiketi içinde HTML içeriğine gömün.
  • PDF Sayfa Kesilmeleri: CSS içerisinde page-break-inside: avoid; kuralını kullanarak, raporunuzdaki kritik tabloların veya blokların sayfa geçişlerinde bölünmesini engelleyebilirsiniz.
Sorun Çözüm Yöntemi
PDF boyutu çok büyük Görselleri PDF'e eklemeden önce sıkıştırın.
Türkçe karakter sorunu HTML dosyanızda etiketini mutlaka kullanın.
Yavaş çalışma Tarayıcıyı bir kez başlatıp birden fazla sayfada kullanın (Singleton pattern).

Sonuç

Python ile Pyppeteer kullanarak PDF raporu oluşturmak, özellikle tarayıcı tabanlı render gücü sayesinde karmaşık web tasarımlarını statik belgelere dönüştürmek için en etkili yöntemdir. Bu rehberde, kurulumdan başlayarak stil yönetimi ve ileri seviye PDF yapılandırmasına kadar tüm adımları inceledik.

Bir sonraki adım olarak, oluşturduğunuz PDF'leri bir veritabanından aldığınız verilerle otomatikleştirerek bir raporlama servisi haline getirebilirsiniz. Kod güvenliği konusunda, her zaman kullanıcı girdilerini temizlemeyi ve sistem kaynaklarını yönetmek için bağlantıları doğru şekilde kapatmayı (browser.close()) unutmayın. Başarılı raporlama süreçleri dilerim.

Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Kullanıcı deneyimi odaklı içerik üretiminde uzmanlaşmış bir editörüm. Özellikle DIY projeleri ve teknik rehberler üzerine detaylı içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz