React İle Yazdırılabilir Pdf Raporu Oluşturma Nasıl Yapılır?

React İle Yazdırılabilir Pdf Raporu Oluşturma Nasıl Yapılır?
React İle Yazdırılabilir Pdf Raporu Oluşturma Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu rehberi uygulamak için bilgisayarınızda Node.js'in güncel bir sürümünün (LTS) yüklü olması gerekir. React projenizde PDF oluşturma işlemleri için en kararlı iki kütüphane olan react-to-print (yazdırma odaklı) ve jspdf (dosya oluşturma odaklı) araçlarını kullanacağız.

Projenizi başlatmak veya mevcut projenize gerekli paketleri kurmak için terminalinizde şu komutu çalıştırın:

npm install react-to-print jspdf html2canvas

Kurulum tamamlandıktan sonra, projenizin package.json dosyasında bu bağımlılıkların göründüğünden emin olun. react-to-print, DOM yapısını doğrudan yazıcıya göndermek için optimize edilmiştir; jspdf ve html2canvas ise DOM elemanlarını görüntüye çevirip PDF dosyası olarak kaydetmek için kullanılır.

React İçerisinde Yazdırılabilir Bileşen Tasarımı

Yazdırılabilir bir rapor oluşturmanın ilk adımı, yazdırılacak içeriği izole bir bileşen (component) olarak tasarlamaktır. Bu bileşen, ana sayfa düzeninden bağımsız, temiz ve CSS ile optimize edilmiş bir yapıya sahip olmalıdır.

import React from 'react';

const RaporIcerigi = React.forwardRef((props, ref) => {
  return (
    

Aylık Satış Raporu

Ürün AdıAdetFiyat
Laptop5150.000 TL
); }); export default RaporIcerigi;

Yukarıdaki kod bloğunda React.forwardRef kullanarak bileşenin referansını üst bileşene taşıyoruz. Bu referans, yazdırma kütüphanesinin hangi DOM elementini hedef alacağını belirlemesi için zorunludur.

react-to-print Kullanarak Yazdırma İşlemi

react-to-print kütüphanesi, tarayıcının yerel yazdırma penceresini tetiklemek için en güvenli yöntemdir. Bu yöntem, PDF oluşturma sürecinde CSS stillerinin korunmasını sağlar.

import React, { useRef } from 'react';
import { useReactToPrint } from 'react-to-print';
import RaporIcerigi from './RaporIcerigi';

const RaporSayfasi = () => {
  const componentRef = useRef();
  const handlePrint = useReactToPrint({
    content: () => componentRef.current,
    documentTitle: 'Satis-Raporu-2026',
  });

  return (
    
PDF Olarak Yazdır
); };

Bu örnekte, useRef kancası (hook) ile bileşene erişim sağlıyoruz. handlePrint fonksiyonu tetiklendiğinde, tarayıcı belirlenen alanı yazıcı dostu bir görünüme sokarak kullanıcıya PDF olarak kaydetme veya yazdırma seçeneği sunar.

PDF Dosyası Olarak İndirme (jsPDF ve html2canvas)

Eğer kullanıcıya doğrudan bir dosya indirtmek istiyorsanız, html2canvas ile DOM elemanını bir görsele çevirip, jspdf ile bu görseli PDF içine gömebilirsiniz. Bu yöntem, tarayıcı yazdırma penceresini atlayarak doğrudan indirme sağlar.

import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';

const pdfIndir = async (element) => {
  const canvas = await html2canvas(element);
  const imgData = canvas.toDataURL('image/png');
  const pdf = new jsPDF('p', 'mm', 'a4');
  pdf.addImage(imgData, 'PNG', 0, 0, 210, 297);
  pdf.save('rapor.pdf');
};

Bu fonksiyon, bir HTML elementini alır, onu tuvale (canvas) çizer ve A4 boyutunda bir PDF dokümanına dönüştürür. 210x297 mm ölçüleri standart A4 kağıt boyutlarını temsil eder.

Yöntemlerin Karşılaştırılması

Hangi yöntemi seçeceğinize karar verirken aşağıdaki tabloyu referans alabilirsiniz:

Özellik react-to-print jsPDF + html2canvas
Kullanım Kolaylığı Yüksek Orta
CSS Desteği Mükemmel Kısıtlı
Doğrudan İndirme Hayır (Yazdırma penceresi) Evet
Performans Hızlı İşlemci Yoğun

Kritik Uyarılar ve Güvenlik

Güvenlik Uyarısı: PDF oluşturma süreçlerinde, kullanıcıdan alınan verileri doğrudan DOM'a yerleştirirken XSS (Cross-Site Scripting) saldırılarına karşı dikkatli olun. Kullanıcı girdilerini her zaman sanitize edin (temizleyin). Ayrıca, sunucu tarafında oluşturulmayan PDF'lerde hassas verilerin (şifreler, özel anahtarlar) istemci tarayıcısında açık metin olarak bulunmadığından emin olun.

Sıkça Sorulan Sorular

PDF raporumda Türkçe karakterler neden bozuk çıkıyor?

jsPDF kullanırken özel fontlar yüklemeniz gerekebilir. Eğer Türkçe karakter sorunu yaşıyorsanız, jspdf içerisine desteklenen bir fontu (örneğin Roboto veya Open Sans) Base64 formatında eklemelisiniz.

Çok sayfalı raporlarda içerik neden kesiliyor?

html2canvas tek bir görsel oluşturduğu için sayfa sonlarını otomatik yönetemez. Çok sayfalı raporlar için veriyi parçalara ayırarak her parçayı ayrı bir sayfaya yazdırmanız gerekir.

Yazdırma penceresinde arka plan renkleri görünmüyor, neden?

Tarayıcılar varsayılan olarak mürekkep tasarrufu için arka plan renklerini yazdırmaz. CSS içerisinde -webkit-print-color-adjust: exact; özelliğini kullanarak bu durumu zorlayabilirsiniz.

Mobil cihazlarda bu yöntemler çalışır mı?

Evet, ancak mobil tarayıcıların yazdırma yetenekleri masaüstüne göre daha kısıtlıdır. Kullanıcılara "PDF İndir" seçeneğini sunmak, mobil deneyimde daha tutarlı sonuçlar verir.

Büyük verilerde tarayıcı donuyor, ne yapmalıyım?

Çok büyük tablolarda html2canvas bellek tüketimini artırır. Bu durumda veriyi sunucu tarafında (Node.js/Puppeteer gibi) PDF'e dönüştürüp istemciye hazır dosya göndermek en profesyonel yaklaşımdır.

PDF Raporlarında Dinamik Grafik Entegrasyonu

Raporlarınızı görselleştirmek, verilerin okunabilirliğini artırır. Recharts kütüphanesini kullanarak PDF çıktısına dahil edilecek bir grafik bileşeni oluştururken dikkat etmeniz gereken en önemli nokta, grafiklerin SVG tabanlı olması ve yazdırma sırasında ölçeklenmesidir.

Aşağıdaki örnekte, bir satış grafiğini PDF'e uygun şekilde nasıl render edeceğinizi görebilirsiniz:

import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';

const ReportChart = ({ data }) => (
  
);

İpucu: Yazdırma sırasında grafiklerin bulanık çıkmasını önlemek için ResponsiveContainer bileşeninin sabit bir genişlik ve yükseklik değerine sahip olduğundan emin olun. Ayrıca, yazdırma CSS'inde @media print bloğu içerisinde grafik kapsayıcısına page-break-inside: avoid; kuralını ekleyerek grafiğin sayfalar arasında bölünmesini engelleyebilirsiniz.

PDF Üretim Sürecinde Performans Optimizasyonu

Büyük veri setleri ile çalışırken, istemci tarafında PDF oluşturmak tarayıcıyı kilitleyebilir. Performansı artırmak için aşağıdaki stratejileri uygulayabilirsiniz:

  • Web Workers Kullanımı: Ağır hesaplamaları veya büyük tablo verilerinin PDF'e dönüştürülme işlemlerini ana iş parçacığından (main thread) ayırmak için Web Workers kullanın.
  • Lazy Loading: Rapor bileşenlerini sadece yazdırma veya indirme butonuna tıklandığında yükleyin (React.lazy ve Suspense).
  • Görüntü Sıkıştırma: Raporunuza eklediğiniz logoları veya görselleri PDF'e gömmeden önce canvas üzerinden optimize ederek boyutlarını küçültün.

Veri İşleme ve Bellek Yönetimi

Eğer 1000 satırdan fazla veri içeren bir rapor oluşturuyorsanız, DOM'a tüm satırları tek seferde render etmek yerine, veriyi sayfalara bölerek (pagination) render etmek bellek kullanımını ciddi oranda düşürür.

// Örnek: Büyük veriyi parçalara ayırma
const chunkArray = (array, size) => {
  const result = [];
  for (let i = 0; i < array.length; i += size) {
    result.push(array.slice(i, i + size));
  }
  return result;
};

// PDF oluştururken her sayfayı ayrı bir bileşen olarak render edin
const pages = chunkArray(largeData, 50);
pages.map((pageData, index) => (
  
));

Bu yöntem, tarayıcının tek bir büyük DOM ağacı oluşturmak yerine, daha küçük ve yönetilebilir parçalarla çalışmasını sağlar. Özellikle düşük donanımlı mobil cihazlarda bu yaklaşım, uygulamanın çökmesini (crash) engellemek için kritiktir.

Sonuç

React ile PDF raporu oluşturmak, doğru araçlar kullanıldığında oldukça verimli bir süreçtir. Basit yazdırma ihtiyaçları için react-to-print, dosya indirme odaklı özel çözümler için ise jsPDF kombinasyonu 2026 standartlarında en güvenilir yollardır. Bir sonraki adımda, raporlarınıza grafikler eklemek için recharts veya chart.js kütüphanelerini bu PDF yapısıyla entegre etmeyi deneyebilirsiniz.

Kod güvenliği sorumluluk reddi: Bu rehberde paylaşılan kodlar eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce kütüphanelerin güncel güvenlik yamalarını kontrol edin ve kullanıcı verilerinin gizliliğini koruyacak gerekli tüm önlemleri (input validation, sanitization) uygulayın.

Bu yazıya tepkinizi paylaşın:
Deniz Aydın

On yıldır dijital yayıncılıkta pratik çözüm rehberleri hazırlıyorum. Karmaşık süreçleri herkesin anlayabileceği adım adım yönergelere dönüştürme konusunda uzmanım.

Yorumlar (0)

Yorum Yaz