{"id":36779,"date":"2025-12-23T01:00:39","date_gmt":"2025-12-22T22:00:39","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/"},"modified":"2025-12-23T01:00:39","modified_gmt":"2025-12-22T22:00:39","slug":"sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/","title":{"rendered":"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!)"},"content":{"rendered":"<h2>Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!)<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimi ve performans her \u015feyden \u00f6nemli hale geldi. \u00d6zellikle PDF dosyalar\u0131yla \u00e7al\u0131\u015fmak, genellikle sunucu taraf\u0131nda a\u011f\u0131r i\u015flemler gerektiren karma\u015f\u0131k bir s\u00fcre\u00e7 olarak bilinir. Ancak, modern JavaScript k\u00fct\u00fcphaneleri sayesinde bu alg\u0131 de\u011fi\u015fiyor. Bu makalede, React ve g\u00fc\u00e7l\u00fc <code>pdf-lib<\/code> k\u00fct\u00fcphanesini kullanarak, tamamen taray\u0131c\u0131 tabanl\u0131, yani arka u\u00e7 (backend) gerektirmeyen bir PDF birle\u015ftirici ve d\u00fczenleyici uygulamas\u0131n\u0131 nas\u0131l geli\u015ftirebilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, kullan\u0131c\u0131 verilerinin sunucuya g\u00f6nderilmesine gerek kalmadan, h\u0131zl\u0131, g\u00fcvenli ve maliyet etkin bir \u00e7\u00f6z\u00fcm sunabileceksiniz.<\/p>\n<h3>1. Giri\u015f: Neden Sunucusuz PDF \u0130\u015fleme?<\/h3>\n<p>PDF dosyalar\u0131, belge payla\u015f\u0131m\u0131 ve ar\u015fivleme i\u00e7in vazge\u00e7ilmez bir format olsa da, bu dosyalar \u00fczerinde i\u015flem yapmak (birle\u015ftirme, b\u00f6lme, d\u00fczenleme vb.) genellikle sunucu tabanl\u0131 \u00e7\u00f6z\u00fcmlerle ili\u015fkilendirilir. Ancak, bu yakla\u015f\u0131m\u0131n baz\u0131 \u00f6nemli dezavantajlar\u0131 bulunmaktad\u0131r.<\/p>\n<h4>Geleneksel Yakla\u015f\u0131mlar\u0131n Zorluklar\u0131<\/h4>\n<p>Geleneksel olarak, bir PDF dosyas\u0131n\u0131 i\u015flemek istedi\u011finizde, dosyay\u0131 sunucuya y\u00fcklemeniz, sunucuda bir k\u00fct\u00fcphane (\u00f6rne\u011fin Python&#8217;da PyPDF2, Java&#8217;da iText) kullanarak i\u015flemi ger\u00e7ekle\u015ftirmeniz ve ard\u0131ndan i\u015flenmi\u015f dosyay\u0131 kullan\u0131c\u0131ya geri g\u00f6ndermeniz gerekirdi. Bu s\u00fcre\u00e7; dosya boyutuna ba\u011fl\u0131 olarak yava\u015flamalar, sunucu maliyetleri, \u00f6l\u00e7eklenebilirlik sorunlar\u0131 ve en \u00f6nemlisi, hassas verilerin sunucuya aktar\u0131lmas\u0131yla ilgili gizlilik endi\u015feleri yaratabilir.<\/p>\n<h4>Sunucusuz Frontend \u00c7\u00f6z\u00fcm\u00fcn\u00fcn Avantajlar\u0131<\/h4>\n<p>Tamamen taray\u0131c\u0131 tabanl\u0131 bir \u00e7\u00f6z\u00fcm, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in idealdir. Avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>H\u0131z ve Performans:<\/strong> T\u00fcm i\u015flemler kullan\u0131c\u0131n\u0131n cihaz\u0131nda ger\u00e7ekle\u015fti\u011fi i\u00e7in, a\u011f gecikmesi minimuma iner ve i\u015flemler an\u0131nda tamamlan\u0131r.<\/li>\n<li><strong>Gizlilik ve G\u00fcvenlik:<\/strong> Dosyalar hi\u00e7bir zaman sunucuya y\u00fcklenmez. Bu, \u00f6zellikle hassas veya ki\u015fisel veriler i\u00e7eren PDF&#8217;ler i\u00e7in b\u00fcy\u00fck bir gizlilik avantaj\u0131 sa\u011flar.<\/li>\n<li><strong>Maliyet Etkinli\u011fi:<\/strong> Sunucu kaynaklar\u0131na ihtiya\u00e7 duymad\u0131\u011f\u0131n\u0131z i\u00e7in bar\u0131nd\u0131rma ve i\u015fletme maliyetleri \u00f6nemli \u00f6l\u00e7\u00fcde azal\u0131r.<\/li>\n<li><strong>\u00c7evrimd\u0131\u015f\u0131 \u00c7al\u0131\u015fma Potansiyeli:<\/strong> Temel i\u015flevler i\u00e7in internet ba\u011flant\u0131s\u0131 gerekmeyebilir (uygulama bir kez y\u00fcklendikten sonra).<\/li>\n<\/ul>\n<h4><code>pdf-lib<\/code> K\u00fct\u00fcphanesine Genel Bak\u0131\u015f<\/h4>\n<p><code>pdf-lib<\/code>, JavaScript ile PDF dosyalar\u0131n\u0131 olu\u015fturmak, de\u011fi\u015ftirmek ve kaydetmek i\u00e7in g\u00fc\u00e7l\u00fc ve tam \u00f6zellikli bir k\u00fct\u00fcphanedir. Taray\u0131c\u0131da veya Node.js ortam\u0131nda \u00e7al\u0131\u015fabilir. Bu k\u00fct\u00fcphane sayesinde, mevcut PDF&#8217;leri ayr\u0131\u015ft\u0131rabilir, sayfalar\u0131n\u0131 kopyalayabilir, yeni sayfalar ekleyebilir, metin ve resim yerle\u015ftirebilir, form alanlar\u0131n\u0131 doldurabilir ve \u00e7ok daha fazlas\u0131n\u0131 yapabilirsiniz. Tamamen TypeScript ile yaz\u0131lm\u0131\u015f olmas\u0131, geli\u015ftirme s\u00fcrecinde tip g\u00fcvenli\u011fi ve daha iyi bir geli\u015ftirici deneyimi sunar.<\/p>\n<h3>2. Proje Kurulumu ve Temel Dosya Y\u00f6netimi<\/h3>\n<p>Uygulamam\u0131z\u0131n temelini olu\u015fturmak i\u00e7in bir React projesi ba\u015flatacak ve gerekli k\u00fct\u00fcphaneyi kuraca\u011f\u0131z. Ard\u0131ndan, PDF dosyalar\u0131n\u0131 taray\u0131c\u0131ya y\u00fckleme mekanizmas\u0131n\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<h4>React Uygulamas\u0131 Ba\u015flatma ve <code>pdf-lib<\/code> Kurulumu<\/h4>\n<p>Yeni bir React projesi olu\u015fturmak i\u00e7in Create React App (CRA) veya Vite gibi ara\u00e7lar\u0131 kullanabiliriz. Burada CRA \u00fczerinden ilerleyelim:<\/p>\n<pre><code class=\"language-bash\">npx create-react-app pdf-editor-app\ncd pdf-editor-app\nnpm start\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi <code>pdf-lib<\/code> k\u00fct\u00fcphanesini projemize dahil edelim:<\/p>\n<pre><code class=\"language-bash\">npm install pdf-lib\n<\/pre>\n<p><\/code><\/p>\n<p>Art\u0131k projemiz haz\u0131r ve <code>pdf-lib<\/code>'i kullanmaya ba\u015flayabiliriz.<\/p>\n<h4>Dosya Y\u00fckleme Bile\u015feni Olu\u015fturma<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n PDF dosyalar\u0131n\u0131 uygulamaya y\u00fckleyebilmesi i\u00e7in basit bir input bile\u015feni olu\u015fturaca\u011f\u0131z. Bu bile\u015fen, birden fazla dosya se\u00e7imine izin verecek ve se\u00e7ilen dosyalar\u0131 React state'inde saklayacak.<\/p>\n<pre><code class=\"language-jsx\">import React, { useState } from 'react';\n\nfunction FileUploader({ onFilesSelected }) {\n  const handleFileChange = (event) => {\n    onFilesSelected(Array.from(event.target.files));\n  };\n\n  return (\n    <div>\n      <input type=\"file\" accept=\"application\/pdf\" multiple onChange={handleFileChange} \/>\n      <p>PDF dosyalar\u0131n\u0131 se\u00e7in veya buraya s\u00fcr\u00fckleyin.<\/p>\n    <\/div>\n  );\n}\n\nexport default FileUploader;\n<\/pre>\n<p><\/code><\/p>\n<h4>Y\u00fcklenen PDF'leri Bellekte Y\u00f6netme<\/h4>\n<p>Y\u00fcklenen dosyalar\u0131 i\u015fleyebilmek i\u00e7in, bu dosyalar\u0131 uygulaman\u0131n ana bile\u015feninde (\u00f6rne\u011fin <code>App.js<\/code>) bir state'te tutmam\u0131z gerekecek. Her dosya i\u00e7in benzersiz bir kimlik ve dosyan\u0131n kendisi gibi bilgileri saklayabiliriz.<\/p>\n<pre><code class=\"language-jsx\">import React, { useState } from 'react';\nimport FileUploader from '.\/FileUploader';\nimport { PDFDocument } from 'pdf-lib'; \/\/ pdf-lib'i import ediyoruz\n\nfunction App() {\n  const [pdfFiles, setPdfFiles] = useState([]); \/\/ Y\u00fcklenen PDF dosyalar\u0131n\u0131 tutacak state\n\n  const handleFilesSelected = async (files) => {\n    const newPdfFiles = [];\n    for (const file of files) {\n      try {\n        const arrayBuffer = await file.arrayBuffer();\n        const pdfDoc = await PDFDocument.load(arrayBuffer); \/\/ pdf-lib ile PDF'i y\u00fckl\u00fcyoruz\n        newPdfFiles.push({\n          id: file.name + '-' + Date.now(), \/\/ Benzersiz ID\n          name: file.name,\n          file: file, \/\/ Orijinal File nesnesi\n          pdfDoc: pdfDoc, \/\/ pdf-lib taraf\u0131ndan y\u00fcklenmi\u015f PDFDocument nesnesi\n          pageCount: pdfDoc.getPageCount(),\n        });\n      } catch (error) {\n        console.error('PDF y\u00fcklenirken hata olu\u015ftu:', error);\n        alert(<code>\"${file.name}\" dosyas\u0131 y\u00fcklenemedi veya ge\u00e7erli bir PDF de\u011fil.<\/code>);\n      }\n    }\n    setPdfFiles((prevFiles) => [...prevFiles, ...newPdfFiles]);\n  };\n\n  return (\n    <div className=\"App\">\n      <h1>Sunucusuz PDF Birle\u015ftirici & D\u00fczenleyici<\/h1>\n      <FileUploader onFilesSelected={handleFilesSelected} \/>\n      <div>\n        <h2>Y\u00fcklenen PDF'ler:<\/h2>\n        {pdfFiles.length === 0 ? (\n          <p>Hen\u00fcz PDF y\u00fcklenmedi.<\/p>\n        ) : (\n          <ul>\n            {pdfFiles.map((pdf) => (\n              <li key={pdf.id}>\n                {pdf.name} ({pdf.pageCount} sayfa)\n              <\/li>\n            ))}\n          <\/ul>\n        )}\n      <\/div>\n    <\/div>\n  );\n}\n\nexport default App;\n<\/pre>\n<p><\/code><\/p>\n<h3>3. PDF Birle\u015ftirme ve Sayfa Kopyalama<\/h3>\n<p>Uygulamam\u0131z\u0131n temel i\u015flevlerinden biri, birden fazla PDF dosyas\u0131n\u0131 tek bir belgede birle\u015ftirmektir. Bu b\u00f6l\u00fcm, <code>pdf-lib<\/code> kullanarak bu i\u015flemi nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizi detayland\u0131r\u0131yor.<\/p>\n<h4>Birden Fazla PDF'i Y\u00fckleme<\/h4>\n<p>\u00d6nceki b\u00f6l\u00fcmde olu\u015fturdu\u011fumuz <code>FileUploader<\/code> bile\u015feni ve <code>handleFilesSelected<\/code> fonksiyonu sayesinde, kullan\u0131c\u0131lar birden fazla PDF dosyas\u0131n\u0131 ayn\u0131 anda y\u00fckleyebilirler. Bu dosyalar, <code>pdfFiles<\/code> state'inde <code>PDFDocument<\/code> nesneleri olarak saklan\u0131r.<\/p>\n<h4><code>pdf-lib<\/code> ile Sayfalar\u0131 Kopyalama ve Yeni PDF Olu\u015fturma<\/h4>\n<p>PDF birle\u015ftirme i\u015flemi, temelde yeni bir bo\u015f PDF belgesi olu\u015fturmak ve ard\u0131ndan mevcut PDF'lerin sayfalar\u0131n\u0131 bu yeni belgeye kopyalamaktan ibarettir. <code>pdf-lib<\/code>, bu i\u015flemi olduk\u00e7a basit hale getirir.<\/p>\n<pre><code class=\"language-jsx\">import { PDFDocument } from 'pdf-lib';\n\nconst mergePdfs = async (pdfsToMerge) => {\n  if (pdfsToMerge.length === 0) return;\n\n  const mergedPdf = await PDFDocument.create(); \/\/ Yeni bo\u015f bir PDF olu\u015ftur\n\n  for (const pdf of pdfsToMerge) {\n    \/\/ Her bir PDF'in t\u00fcm sayfalar\u0131n\u0131 kopyala\n    const copiedPages = await mergedPdf.copyPages(pdf.pdfDoc, pdf.pdfDoc.getPageIndices());\n    copiedPages.forEach((page) => mergedPdf.addPage(page)); \/\/ Kopyalanan sayfalar\u0131 birle\u015ftirilmi\u015f PDF'e ekle\n  }\n\n  const mergedPdfBytes = await mergedPdf.save(); \/\/ Birle\u015ftirilmi\u015f PDF'i byte dizisine d\u00f6n\u00fc\u015ft\u00fcr\n  return mergedPdfBytes;\n};\n<\/pre>\n<p><\/code><\/p>\n<p>Bu fonksiyon, bir dizi <code>pdf-lib<\/code> <code>PDFDocument<\/code> nesnesi al\u0131r ve bunlar\u0131 s\u0131ras\u0131yla yeni bir <code>PDFDocument<\/code>'e ekler.<\/p>\n<h4>Birle\u015ftirilmi\u015f PDF'i \u0130ndirme Mekanizmas\u0131<\/h4>\n<p>\u0130\u015flem tamamland\u0131ktan sonra, kullan\u0131c\u0131n\u0131n birle\u015ftirilmi\u015f PDF'i indirmesi gerekir. Bu, taray\u0131c\u0131n\u0131n <code>Blob<\/code> ve <code>URL.createObjectURL<\/code> \u00f6zelliklerini kullanarak kolayca yap\u0131labilir.<\/p>\n<pre><code class=\"language-jsx\">const downloadPdf = (pdfBytes, filename = 'birlesmis.pdf') => {\n  const blob = new Blob([pdfBytes], { type: 'application\/pdf' });\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = filename;\n  document.body.appendChild(a);\n  a.click();\n  document.body.removeChild(a);\n  URL.revokeObjectURL(url); \/\/ Bellek s\u0131z\u0131nt\u0131s\u0131n\u0131 \u00f6nlemek i\u00e7in URL'i serbest b\u0131rak\n};\n\n\/\/ App.js i\u00e7inde birle\u015ftirme ve indirme i\u015flemini tetikleme\nconst handleMergeAndDownload = async () => {\n  if (pdfFiles.length < 2) {\n    alert('Birle\u015ftirmek i\u00e7in en az iki PDF y\u00fcklemelisiniz.');\n    return;\n  }\n  \/\/ Y\u00fcklenen t\u00fcm PDF'leri birle\u015ftirme fonksiyonuna g\u00f6nderiyoruz\n  const mergedPdfBytes = await mergePdfs(pdfFiles);\n  if (mergedPdfBytes) {\n    downloadPdf(mergedPdfBytes, 'birlesmis_belgeler.pdf');\n  }\n};\n\n\/\/ Birle\u015ftirme butonunu render etmek i\u00e7in:\n\/\/ <button onClick={handleMergeAndDownload}>PDF'leri Birle\u015ftir & \u0130ndir<\/button>\n<\/pre>\n<p><\/code><\/p>\n<h3>4. PDF D\u00fczenleme Temelleri: Sayfa Silme ve D\u00f6nd\u00fcrme<\/h3>\n<p>Birle\u015ftirmenin yan\u0131 s\u0131ra, kullan\u0131c\u0131lar\u0131n mevcut PDF'ler \u00fczerinde temel d\u00fczenlemeler yapabilmesi de \u00f6nemlidir. Bu b\u00f6l\u00fcmde, y\u00fcklenen bir PDF'ten sayfa silme ve sayfalar\u0131 d\u00f6nd\u00fcrme i\u015flevlerini ele alaca\u011f\u0131z.<\/p>\n<h4>Y\u00fcklenen PDF'in Sayfalar\u0131n\u0131 G\u00f6r\u00fcnt\u00fcleme<\/h4>\n<p>Kullan\u0131c\u0131n\u0131n hangi sayfalar\u0131 silece\u011fini veya d\u00f6nd\u00fcrece\u011fini se\u00e7ebilmesi i\u00e7in, y\u00fcklenen PDF'in sayfalar\u0131n\u0131 g\u00f6rsel olarak sunmak faydal\u0131 olacakt\u0131r. Bu genellikle bir \u00f6nizleme bile\u015feni veya sayfa numaralar\u0131n\u0131n listelenmesiyle yap\u0131l\u0131r. Basit\u00e7e, her bir PDF'in sayfa say\u0131s\u0131n\u0131 listeledi\u011fimiz k\u0131s\u0131m bu ad\u0131m\u0131n ba\u015flang\u0131c\u0131d\u0131r.<\/p>\n<p>Geli\u015fmi\u015f bir \u00f6nizleme i\u00e7in, her bir sayfay\u0131 bir canvas eleman\u0131na render edebilir veya \u00fc\u00e7\u00fcnc\u00fc taraf bir PDF g\u00f6r\u00fcnt\u00fcleyici k\u00fct\u00fcphanesi (\u00f6rne\u011fin <code>react-pdf<\/code>) kullanabilirsiniz. Ancak, bu makalenin kapsam\u0131 gere\u011fi, biz sadece sayfa numaralar\u0131 \u00fczerinden i\u015flem yapaca\u011f\u0131z.<\/p>\n<h4>Se\u00e7ilen Sayfalar\u0131 Silme \u0130\u015flemi<\/h4>\n<p>Bir PDF'ten sayfa silmek, <code>pdf-lib<\/code> ile olduk\u00e7a basittir. <code>PDFDocument<\/code> nesnesinin <code>removePage<\/code> metodunu kullanarak belirli bir indeksteki sayfay\u0131 kald\u0131rabilirsiniz.<\/p>\n<pre><code class=\"language-jsx\">const deletePage = async (pdfDoc, pageIndexToDelete) => {\n  if (pageIndexToDelete < 0 || pageIndexToDelete >= pdfDoc.getPageCount()) {\n    console.error('Ge\u00e7ersiz sayfa indeksi.');\n    return pdfDoc;\n  }\n  pdfDoc.removePage(pageIndexToDelete);\n  return pdfDoc; \/\/ G\u00fcncellenmi\u015f PDFDocument nesnesini d\u00f6nd\u00fcr\n};\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi (\u00f6rne\u011fin ilk sayfay\u0131 silmek i\u00e7in):\n\/\/ const updatedPdfDoc = await deletePage(myPdfDoc, 0);\n\/\/ \/\/ updatedPdfDoc'u yeni bir dosyaya kaydedip indirebilirsiniz.\n<\/pre>\n<p><\/code><\/p>\n<p>Bu fonksiyon, belirtilen <code>pdfDoc<\/code>'tan <code>pageIndexToDelete<\/code> indeksindeki sayfay\u0131 kald\u0131r\u0131r. Kullan\u0131c\u0131 aray\u00fcz\u00fcnde, hangi PDF'ten hangi sayfalar\u0131n silinece\u011fini se\u00e7mek i\u00e7in bir mekanizma sa\u011flaman\u0131z gerekecektir.<\/p>\n<h4>Sayfalar\u0131 D\u00f6nd\u00fcrme ve G\u00fcncelleme<\/h4>\n<p><code>pdf-lib<\/code>, sayfalar\u0131n y\u00f6n\u00fcn\u00fc de\u011fi\u015ftirmek i\u00e7in de yetenekler sunar. Her sayfan\u0131n kendi d\u00f6n\u00fc\u015f a\u00e7\u0131s\u0131 \u00f6zelli\u011fi vard\u0131r. Bunu de\u011fi\u015ftirmek i\u00e7in <code>setRotation<\/code> metodunu kullanabiliriz.<\/p>\n<pre><code class=\"language-jsx\">import { degrees } from 'pdf-lib'; \/\/ Derece de\u011ferlerini kullanmak i\u00e7in\n\nconst rotatePage = (pdfDoc, pageIndexToRotate, rotationAngle) => {\n  if (pageIndexToRotate < 0 || pageIndexToRotate >= pdfDoc.getPageCount()) {\n    console.error('Ge\u00e7ersiz sayfa indeksi.');\n    return pdfDoc;\n  }\n  const page = pdfDoc.getPage(pageIndexToRotate);\n  page.setRotation(degrees(rotationAngle)); \/\/ Sayfay\u0131 belirli bir a\u00e7\u0131yla d\u00f6nd\u00fcr\n  return pdfDoc;\n};\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi (\u00f6rne\u011fin ikinci sayfay\u0131 90 derece d\u00f6nd\u00fcrmek i\u00e7in):\n\/\/ const updatedPdfDoc = await rotatePage(myPdfDoc, 1, 90);\n\/\/ \/\/ updatedPdfDoc'u yeni bir dosyaya kaydedip indirebilirsiniz.\n<\/pre>\n<p><\/code><\/p>\n<p><code>rotationAngle<\/code> genellikle 0, 90, 180 veya 270 gibi de\u011ferler al\u0131r. Bu i\u015flevleri uygulad\u0131ktan sonra, g\u00fcncellenmi\u015f <code>PDFDocument<\/code> nesnesini <code>save()<\/code> metoduyla kaydedip kullan\u0131c\u0131ya indirme se\u00e7ene\u011fi sunmal\u0131s\u0131n\u0131z.<\/p>\n<h3>5. Kullan\u0131c\u0131 Deneyimi ve \u0130leri Optimizasyonlar<\/h3>\n<p>Uygulamam\u0131z\u0131n i\u015flevselli\u011fi kadar, kullan\u0131c\u0131 deneyimi de \u00f6nemlidir. Bu b\u00f6l\u00fcmde, uygulaman\u0131n kullan\u0131labilirli\u011fini art\u0131racak baz\u0131 \u00f6zelliklere ve optimizasyonlara de\u011finece\u011fiz.<\/p>\n<h4>S\u00fcr\u00fckle-B\u0131rak (Drag-and-Drop) ve \u00d6nizleme<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n dosyalar\u0131 kolayca y\u00fckleyebilmesi i\u00e7in s\u00fcr\u00fckle-b\u0131rak (drag-and-drop) \u00f6zelli\u011fi eklemek, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir. HTML5'in Drag and Drop API'si ile bu kolayca uygulanabilir. Ayr\u0131ca, y\u00fcklenen PDF'lerin k\u00fc\u00e7\u00fck \u00f6nizlemelerini (thumbnail) g\u00f6stermek, kullan\u0131c\u0131n\u0131n do\u011fru dosyalar\u0131 y\u00fckledi\u011finden emin olmas\u0131na yard\u0131mc\u0131 olur ve d\u00fczenleme i\u015flemlerini g\u00f6rselle\u015ftirir.<\/p>\n<p>\u00d6nizleme i\u00e7in <code>pdf-lib<\/code> do\u011frudan bir g\u00f6r\u00fcnt\u00fcleme mekanizmas\u0131 sunmaz. Bunun yerine, her PDF sayfas\u0131n\u0131 bir <code>canvas<\/code> elementine render etmek i\u00e7in <code>pdf.js<\/code> gibi ba\u015fka bir k\u00fct\u00fcphaneyi entegre etmeniz gerekebilir. Bu, uygulaman\u0131n boyutunu ve karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131rabilir, ancak kullan\u0131c\u0131 etkile\u015fimini zenginle\u015ftirir.<\/p>\n<h4>Performans \u0130pu\u00e7lar\u0131 ve Hata Y\u00f6netimi<\/h4>\n<p>B\u00fcy\u00fck PDF dosyalar\u0131yla \u00e7al\u0131\u015f\u0131rken performans kritik \u00f6neme sahiptir. \u0130\u015fte baz\u0131 ipu\u00e7lar\u0131:<\/p>\n<ul>\n<li><strong>Bellek Y\u00f6netimi:<\/strong> \u0130\u015flemler tamamland\u0131ktan sonra gereksiz hale gelen <code>Blob URL<\/code>'lerini <code>URL.revokeObjectURL()<\/code> ile serbest b\u0131rakmay\u0131 unutmay\u0131n.<\/li>\n<li><strong>Asenkron \u0130\u015flemler:<\/strong> T\u00fcm PDF i\u015flemleri asenkron oldu\u011fu i\u00e7in, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn donmas\u0131n\u0131 \u00f6nlemek i\u00e7in uygun <code>await\/async<\/code> kullan\u0131m\u0131 \u015fartt\u0131r.<\/li>\n<li><strong>Kullan\u0131c\u0131 Geri Bildirimi:<\/strong> Uzun s\u00fcren i\u015flemler i\u00e7in y\u00fckleme g\u00f6stergeleri (spinner) veya ilerleme \u00e7ubuklar\u0131 kullan\u0131n.<\/li>\n<\/ul>\n<p>Hata y\u00f6netimi, uygulaman\u0131n kararl\u0131l\u0131\u011f\u0131 i\u00e7in hayati \u00f6nem ta\u015f\u0131r. Dosya y\u00fckleme hatalar\u0131, bozuk PDF'ler veya ge\u00e7ersiz i\u015flem denemeleri gibi durumlar\u0131 yakalamak ve kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r mesajlar sunmak gerekir. <code>try-catch<\/code> bloklar\u0131n\u0131 etkin bir \u015fekilde kullan\u0131n.<\/p>\n<h4>Uygulamay\u0131 Geli\u015ftirme ve Da\u011f\u0131tma<\/h4>\n<p>Uygulaman\u0131z\u0131 geli\u015ftirmek i\u00e7in, daha fazla d\u00fczenleme \u00f6zelli\u011fi (metin ekleme, resim ekleme, sayfalar\u0131 yeniden s\u0131ralama, PDF'i b\u00f6lme vb.) ekleyebilirsiniz. <code>pdf-lib<\/code> bu t\u00fcr i\u015flemler i\u00e7in geni\u015f bir API sunar.<\/p>\n<p>Uygulamay\u0131 da\u011f\u0131tmak i\u00e7in, React projenizi build alman\u0131z yeterlidir:<\/p>\n<pre><code class=\"language-bash\">npm run build\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, uygulaman\u0131z\u0131n statik dosyalar\u0131n\u0131 <code>build<\/code> klas\u00f6r\u00fcne derler. Bu klas\u00f6r\u00fcn i\u00e7eri\u011fini herhangi bir statik site bar\u0131nd\u0131rma hizmetine (\u00f6rne\u011fin Netlify, Vercel, GitHub Pages, Firebase Hosting) y\u00fckleyerek uygulaman\u0131z\u0131 yay\u0131nlayabilirsiniz. Unutmay\u0131n, bu tamamen frontend bir uygulama oldu\u011fu i\u00e7in sunucu taraf\u0131 bir yap\u0131land\u0131rmaya ihtiyac\u0131n\u0131z olmayacak.<\/p>\n<h3>6. Sonu\u00e7<\/h3>\n<p>Bu makalede, React ve <code>pdf-lib<\/code> k\u00fct\u00fcphanesini kullanarak tamamen taray\u0131c\u0131 tabanl\u0131, arka u\u00e7 gerektirmeyen bir PDF birle\u015ftirici ve d\u00fczenleyici uygulamas\u0131n\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde inceledik. Geleneksel sunucu tabanl\u0131 \u00e7\u00f6z\u00fcmlerin aksine, bu yakla\u015f\u0131m h\u0131z, gizlilik, g\u00fcvenlik ve maliyet etkinli\u011fi gibi \u00f6nemli avantajlar sunar.<\/p>\n<h4>\u00d6zet ve Kazan\u0131mlar<\/h4>\n<p>\u00d6\u011frendiklerimiz:<\/p>\n<ul>\n<li><code>pdf-lib<\/code> k\u00fct\u00fcphanesinin temel yetenekleri ve PDF manip\u00fclasyonundaki g\u00fcc\u00fc.<\/li>\n<li>React ile dosya y\u00fckleme ve state y\u00f6netimi.<\/li>\n<li>Birden fazla PDF'i birle\u015ftirme ve yeni bir belge olarak kaydetme.<\/li>\n<li>Mevcut PDF'lerden sayfa silme ve sayfalar\u0131 d\u00f6nd\u00fcrme gibi temel d\u00fczenleme i\u015flemleri.<\/li>\n<li>Kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in s\u00fcr\u00fckle-b\u0131rak ve hata y\u00f6netimi stratejileri.<\/li>\n<\/ul>\n<p>Bu proje, modern web teknolojilerinin s\u0131n\u0131rlar\u0131n\u0131 zorlayarak, daha \u00f6nce yaln\u0131zca sunucu taraf\u0131nda m\u00fcmk\u00fcn oldu\u011fu d\u00fc\u015f\u00fcn\u00fclen karma\u015f\u0131k i\u015flemleri taray\u0131c\u0131ya ta\u015f\u0131man\u0131n harika bir \u00f6rne\u011fidir. Kendi uygulamalar\u0131n\u0131zda bu teknikleri kullanarak kullan\u0131c\u0131lar\u0131n\u0131za daha h\u0131zl\u0131, daha g\u00fcvenli ve daha etkile\u015fimli deneyimler sunabilirsiniz.<\/p>\n<h4>Gelecek Potansiyeli<\/h4>\n<p>Bu temel yap\u0131 \u00fczerine in\u015fa edilebilecek bir\u00e7ok geli\u015fmi\u015f \u00f6zellik bulunmaktad\u0131r:<\/p>\n<ul>\n<li>PDF'i b\u00f6lme (sayfa aral\u0131klar\u0131na g\u00f6re).<\/li>\n<li>Metin ve resim filigran\u0131 ekleme.<\/li>\n<li>PDF \u015fifreleme ve \u015fifre \u00e7\u00f6zme.<\/li>\n<li>Form alanlar\u0131n\u0131 doldurma veya olu\u015fturma.<\/li>\n<li>Sayfalar\u0131 s\u00fcr\u00fckle-b\u0131rak ile yeniden s\u0131ralama.<\/li>\n<li>Daha zengin bir \u00f6nizleme ve etkile\u015fimli d\u00fczenleme aray\u00fcz\u00fc.<\/li>\n<\/ul>\n<p><code>pdf-lib<\/code>'in geni\u015f API'si sayesinde, hayal g\u00fcc\u00fcn\u00fczle s\u0131n\u0131rl\u0131 kalmadan bir\u00e7ok farkl\u0131 PDF arac\u0131n\u0131 taray\u0131c\u0131da hayata ge\u00e7irebilirsiniz.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>Bu \u00e7\u00f6z\u00fcm g\u00fcvenli mi?<\/h4>\n<p>Evet, olduk\u00e7a g\u00fcvenlidir. T\u00fcm i\u015flemler kullan\u0131c\u0131n\u0131n taray\u0131c\u0131s\u0131nda, yani yerel cihaz\u0131nda ger\u00e7ekle\u015fir. PDF dosyalar\u0131 hi\u00e7bir zaman sunucuya y\u00fcklenmedi\u011fi i\u00e7in veri gizlili\u011fi a\u00e7\u0131s\u0131ndan geleneksel sunucu tabanl\u0131 \u00e7\u00f6z\u00fcmlerden \u00e7ok daha g\u00fcvenlidir.<\/p>\n<h4>B\u00fcy\u00fck PDF dosyalar\u0131yla nas\u0131l ba\u015fa \u00e7\u0131k\u0131l\u0131r?<\/h4>\n<p><code>pdf-lib<\/code>, b\u00fcy\u00fck dosyalar\u0131 i\u015flemekte genellikle iyidir ancak taray\u0131c\u0131n\u0131n bellek limitleri ve kullan\u0131c\u0131n\u0131n cihaz\u0131n\u0131n performans\u0131 bir s\u0131n\u0131rlama olu\u015fturabilir. \u00c7ok b\u00fcy\u00fck dosyalar (\u00f6rne\u011fin y\u00fczlerce MB) taray\u0131c\u0131da yava\u015flamalara veya \u00e7\u00f6kmelere neden olabilir. Performans optimizasyonlar\u0131 ve kullan\u0131c\u0131ya geri bildirim sa\u011flamak \u00f6nemlidir.<\/p>\n<h4>Hangi taray\u0131c\u0131lar destekleniyor?<\/h4>\n<p><code>pdf-lib<\/code> modern taray\u0131c\u0131lar\u0131n \u00e7o\u011funu (Chrome, Firefox, Safari, Edge) destekler. Uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan JavaScript ve WebAssembly (Wasm) deste\u011fi, g\u00fcncel t\u00fcm taray\u0131c\u0131larda mevcuttur.<\/p>\n<h4>Arka u\u00e7 olmadan ger\u00e7ekten t\u00fcm PDF i\u015flemleri yap\u0131labilir mi?<\/h4>\n<p><code>pdf-lib<\/code> ile olu\u015fturma, birle\u015ftirme, b\u00f6lme, d\u00fczenleme (metin\/resim ekleme, sayfa silme\/d\u00f6nd\u00fcrme), form doldurma gibi bir\u00e7ok yayg\u0131n PDF i\u015flemi taray\u0131c\u0131da yap\u0131labilir. Ancak, PDF OCR (optik karakter tan\u0131ma) gibi \u00e7ok yo\u011fun i\u015flem gerektiren veya d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 olan baz\u0131 \u00f6zel i\u015flemler i\u00e7in hala sunucu taraf\u0131 \u00e7\u00f6z\u00fcmler gerekebilir.<\/p>\n<h4>Bu \u00e7\u00f6z\u00fcm \u00fccretsiz mi?<\/h4>\n<p>Evet, <code>pdf-lib<\/code> a\u00e7\u0131k kaynakl\u0131 ve MIT lisansl\u0131 bir k\u00fct\u00fcphanedir, yani \u00fccretsiz olarak kullanabilir ve projelerinizde da\u011f\u0131tabilirsiniz. React de benzer \u015fekilde \u00fccretsiz ve a\u00e7\u0131k kaynakl\u0131d\u0131r. Uygulaman\u0131z\u0131n bar\u0131nd\u0131rma maliyeti, tamamen statik dosyalar oldu\u011fu i\u00e7in minimum d\u00fczeyde olacakt\u0131r.<\/p>\n","protected":false},"excerpt":{"rendered":"Geleneksel olarak, bir PDF dosyas\u0131n\u0131 i\u015flemek istedi\u011finizde, dosyay\u0131 sunucuya y\u00fcklemeniz, sunucuda bir k\u00fct\u00fcphane (\u00f6rne\u011fin Python&#8217;da PyPDF2, Java&#8217;da &#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[128],"tags":[],"class_list":{"0":"post-36779","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!)\" \/>\n<meta property=\"og:description\" content=\"Geleneksel olarak, bir PDF dosyas\u0131n\u0131 i\u015flemek istedi\u011finizde, dosyay\u0131 sunucuya y\u00fcklemeniz, sunucuda bir k\u00fct\u00fcphane (\u00f6rne\u011fin Python&#039;da PyPDF2, Java&#039;da ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-22T22:00:39+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!)\",\"datePublished\":\"2025-12-22T22:00:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/\"},\"wordCount\":2112,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"React\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/\",\"name\":\"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-22T22:00:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/","og_locale":"tr_TR","og_type":"article","og_title":"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!)","og_description":"Geleneksel olarak, bir PDF dosyas\u0131n\u0131 i\u015flemek istedi\u011finizde, dosyay\u0131 sunucuya y\u00fcklemeniz, sunucuda bir k\u00fct\u00fcphane (\u00f6rne\u011fin Python'da PyPDF2, Java'da ...","og_url":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-22T22:00:39+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!)","datePublished":"2025-12-22T22:00:39+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/"},"wordCount":2112,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["React"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/","url":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/","name":"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-22T22:00:39+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/sunucusuz-pdf-birlestirici-ve-duzenleyici-olusturma-react-ve-pdf-lib-ile-arka-uc-olmadan\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Sunucusuz PDF Birle\u015ftirici ve D\u00fczenleyici Olu\u015fturma: React ve pdf-lib ile (Arka U\u00e7 Olmadan!)"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36779"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36779\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}