React İle Web Uygulamaları İçin Dinamik Bir Pdf Önizleme Görüntüleyici Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projemize başlamadan önce geliştirme ortamımızın modern standartlara uygun olduğundan emin olmalıyız. React 19 ve üzeri sürümlerin sunduğu güncel kancaları (hooks) kullanacağız. PDF işleme süreçleri CPU yoğunluklu işlemler olduğu için, projenize react-pdf kütüphanesini dahil etmenizi öneririm. Bu kütüphane, PDF.js altyapısını kullanarak tarayıcıda yüksek performanslı render işlemleri yapmanızı sağlar.

Gerekli paketleri projenize şu komutla ekleyebilirsiniz:

npm install react-pdf

Kurulum tamamlandıktan sonra, PDF dosyalarının düzgün render edilmesi için gerekli olan "worker" dosyasını yapılandırmamız gerekecek. Bu, ana iş parçacığını (main thread) kasmadan PDF sayfalarını arka planda işlememize olanak tanır.

Adım Adım PDF Görüntüleyici Bileşeni Oluşturma

İlk aşamada, temel bir PDF görüntüleyici bileşeni tasarlayalım. Bu bileşen, bir dosya URL'si alacak ve ilk sayfayı ekrana basacaktır. react-pdf kütüphanesinin Document ve Page bileşenlerini kullanarak yapıyı kuruyoruz.

import React, { useState } from 'react';
import { Document, Page, pdfjs } from 'react-pdf';

// PDF worker yapılandırması
pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;

const PdfViewer = ({ fileUrl }) => {
  const [numPages, setNumPages] = useState(null);

  function onDocumentLoadSuccess({ numPages }) {
    setNumPages(numPages);
  }

  return (
    

Toplam Sayfa: {numPages}

); };

Yukarıdaki kodda, onLoadSuccess fonksiyonu ile PDF yüklendiğinde toplam sayfa sayısını state içerisine alıyoruz. workerSrc tanımlaması, tarayıcının PDF'i arka planda işlemesi için zorunludur; aksi takdirde uygulama donabilir.

Dinamik Sayfa Navigasyonu ve Kontrolü

Sadece ilk sayfayı göstermek yeterli değildir. Kullanıcının belgeler arasında gezinebilmesi için bir sayfa numarası yönetimi eklemeliyiz. Aşağıdaki örnekte, önceki ve sonraki sayfalara geçiş yapan bir kontrol mekanizması kuruyoruz.

const DynamicPdfViewer = ({ fileUrl }) => {
  const [pageNumber, setPageNumber] = useState(1);
  const [numPages, setNumPages] = useState(null);

  return (
    
setNumPages(numPages)}>
Önceki Sayfa {pageNumber} / {numPages} = numPages} onClick={() => setPageNumber(pageNumber + 1)}>Sonraki
); };

Bu yapı, kullanıcının mevcut sayfa numarasını state üzerinden takip etmesini sağlar. disabled özniteliği, sınırların dışına çıkılmasını engelleyen basit bir mantıksal koruma sağlar.

PDF Görüntüleme Yöntemlerinin Karşılaştırılması

PDF dosyalarını web üzerinde görüntülemenin farklı yolları vardır. İhtiyacınıza göre en uygun yöntemi seçmek için aşağıdaki tabloyu inceleyebilirsiniz.

Yöntem Avantaj Dezavantaj
react-pdf (Canvas) Yüksek özelleştirme, tam kontrol Daha fazla CPU kullanımı
iframe / embed Çok kolay entegrasyon Tarayıcı bağımlı, stil verilemez
Google Docs Viewer Sıfır kurulum Gizlilik riskleri, dış bağımlılık

Güvenlik ve Performans Optimizasyonu

PDF dosyalarını yüklerken dikkat etmeniz gereken en önemli husus, kullanıcıdan gelen dosya yollarının doğrulanmasıdır. Kullanıcıların rastgele URL'ler girmesine izin vermek, XSS (Cross-Site Scripting) saldırılarına kapı aralayabilir. Ayrıca, büyük boyutlu PDF dosyaları bellek sızıntılarına (memory leak) neden olabilir.

Kritik Uyarı: PDF dosyalarını doğrudan URL üzerinden çekiyorsanız, CORS (Cross-Origin Resource Sharing) politikalarının sunucu tarafında doğru yapılandırıldığından emin olun. Aksi takdirde tarayıcı, güvenlik gerekçesiyle PDF içeriğini render etmeyi reddedecektir.

Performans için loading durumunu yönetmek ve büyük dosyaları parça parça render etmek (lazy loading) en iyi pratiktir.

// Performanslı yükleme için loading durumu
const LoadingSpinner = () => 
PDF Yükleniyor...
; // Kullanımı

Hata Yönetimi ve Debug İpuçları

Geliştirme aşamasında en sık karşılaşılan hata, PDF dosyasının bulunamaması veya bozuk olmasıdır. onLoadError callback fonksiyonunu kullanarak bu hataları yakalayabilir ve kullanıcıya anlamlı bir mesaj gösterebilirsiniz.

const handleError = (error) => {
  console.error("PDF Yükleme Hatası:", error.message);
  alert("PDF dosyası geçersiz veya erişilemez.");
};

// Document bileşenine eklenmesi

  {/* ... */}

Sıkça Sorulan Sorular

React-pdf ile şifreli PDF'leri görüntüleyebilir miyim?

Evet, react-pdf kütüphanesi şifreli PDF'leri destekler. onPassword prop'u aracılığıyla kullanıcıdan şifre alabilir ve dosyayı bu şekilde açabilirsiniz.

Mobil cihazlarda PDF görüntüleme performansı nasıl artırılır?

Mobil cihazlarda render edilen sayfa boyutlarını (width) Page bileşeni üzerinden sınırlamak ve renderTextLayer={false} kullanarak metin katmanını kapatmak performansı ciddi oranda artırır.

PDF dosyasını indirmeden önizlemek güvenli mi?

İstemci tarafında (Client-side) işleme yaptığınız sürece, dosya tarayıcı belleğinde kalır ve sunucunuza ekstra yük bindirmez. Ancak dosya içeriğinin hassas olması durumunda, PDF'e sunucu tarafında filigran eklemek daha güvenlidir.

PDF içinde arama yapabilir miyim?

react-pdf metin katmanlarını destekler. renderTextLayer={true} ayarını aktif ederek PDF içindeki metinlerin seçilebilir ve aranabilir olmasını sağlayabilirsiniz.

Neden PDF yerine resim formatına dönüştürmeliyim?

Eğer çok karmaşık vektörel PDF'leriniz varsa ve tarayıcıyı yoruyorsa, sunucu tarafında PDF'i yüksek çözünürlüklü resimlere (PNG/JPEG) dönüştürüp frontend tarafında bu resimleri göstermek daha akıcı bir deneyim sunar.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce, tüm kullanıcı girdilerini sanitize ettiğinizden ve güvenlik açıklarına karşı gerekli testleri (OWASP standartlarında) tamamladığınızdan emin olun.

PDF Görüntüleyici İçin İleri Seviye Özelleştirme: Annotation Katmanı

PDF görüntüleyicinizin üzerine kullanıcıların not almasını veya belirli alanları vurgulamasını sağlamak, özellikle eğitim ve iş akışı yönetimi uygulamalarında kritik bir özelliktir. Bu işlemi gerçekleştirmek için PDF'in üzerine şeffaf bir div katmanı (overlay) yerleştirerek koordinat bazlı çizim yapabilirsiniz.

Aşağıdaki örnekte, PDF'in üzerine tıklanan koordinatları yakalayan ve basit bir not kutucuğu oluşturan yapı yer almaktadır:


const AnnotationLayer = ({ pageNumber, onAddAnnotation }) => {
  const handleClick = (e) => {
    const rect = e.target.getBoundingClientRect();
    const x = e.clientX - rect.left;
    const y = e.clientY - rect.top;
    onAddAnnotation({ x, y, pageNumber });
  };

  return (
    
); };

PDF Görüntüleme Uygulamalarında Performans İzleme ve Optimizasyon

Büyük boyutlu PDF dosyaları (50MB ve üzeri) tarayıcı belleğini hızla tüketebilir. Performansı optimize etmek için "Lazy Loading" ve "Virtualization" tekniklerini kullanmak zorunludur. react-pdf kütüphanesini kullanırken, yalnızca görüntü alanında (viewport) olan sayfaların render edilmesini sağlamak için react-window gibi kütüphanelerle entegrasyon sağlayabilirsiniz.

Bellek Yönetimi İçin İpuçları:

  • Worker Kullanımı: PDF işleme süreçlerini ana thread'den ayırmak için mutlaka bir Web Worker yapılandırması kullanın.
  • Sayfa Önbellekleme: Kullanıcının geri döndüğü sayfalarda tekrar render maliyetini önlemek için useMemo veya useCallback hook'larını kullanarak bileşenleri optimize edin.
  • Canvas Çözünürlüğü: Mobil cihazlarda yüksek çözünürlüklü render yerine, cihazın devicePixelRatio değerine göre ölçeklendirme yaparak GPU yükünü azaltın.
Teknik Avantajı Risk
Lazy Loading Düşük ilk yükleme süresi Hızlı kaydırmada boşluk hissi
Canvas Rendering Yüksek performans Metin seçme zorluğu
SVG Rendering Keskin metinler Karmaşık dosyalarda yavaşlık

Deployment ve Dağıtım Stratejileri

PDF görüntüleyicinizin üretim ortamında (production) sorunsuz çalışması için statik dosyaların sunulma şekli önemlidir. Özellikle PDF dosyalarını bir S3 bucket veya CDN üzerinden sunuyorsanız, CORS (Cross-Origin Resource Sharing) ayarlarının doğru yapılandırıldığından emin olmalısınız.

Not: PDF dosyalarınızın bulunduğu sunucuda Access-Control-Allow-Origin başlığının uygulamanızın alan adını içermesi gerekir, aksi takdirde PDF dosyaları tarayıcı tarafından güvenlik gerekçesiyle engellenir.

Uygulamanızı yayına alırken PDF işleme kütüphanelerinin (özellikle pdfjs-dist) ana paket boyutunu artırmaması için "code splitting" yöntemini kullanın:


// Dinamik import ile paket boyutunu optimize etme
const PDFViewer = React.lazy(() => import('./components/PDFViewer'));

function App() {
  return (
    
      
    
  );
}

Sonuç

React ile dinamik bir PDF önizleme görüntüleyici oluşturmak, başlangıçta karmaşık görünse de doğru kütüphaneler ve yapılandırma ile oldukça yönetilebilir bir süreçtir. Bu rehberde, react-pdf kullanarak temel görüntüleme, sayfa navigasyonu ve hata yönetimi konularını ele aldık. Bir sonraki adımınız, bu görüntüleyiciyi bir modal (pencere) içerisine entegre etmek veya kullanıcıların PDF üzerine not almasını sağlayan "annotation" (ek açıklama) katmanları eklemek olabilir. Yazılım geliştirme sürecinizde başarılar dilerim.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz