Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce sisteminizde Node.js (LTS sürümü önerilir) yüklü olmalıdır. PDF dosyalarını işlemek için iki ana aşamaya ihtiyacımız var: PDF'i görsellere dönüştürmek ve bu görselleri OCR motoruna (Tesseract.js) iletmek.
- Node.js: v20.x veya üzeri sürüm.
- Tesseract.js: OCR motoru olarak kullanılacak kütüphane.
- pdf2pic: PDF sayfalarını görsel formatına (PNG/JPEG) çevirmek için kullanılan yardımcı araç.
- Ghostscript: pdf2pic kütüphanesinin arka planda PDF işleme yapabilmesi için sistemde yüklü olması gerekir.
Öncelikle çalışma dizininizi oluşturun ve gerekli paketleri yükleyin:
mkdir pdf-ocr-projesi
cd pdf-ocr-projesi
npm init -y
npm install tesseract.js pdf2pic
Paketlerin yüklenmesi, projenin temel bağımlılıklarını sağlar. Tesseract.js, herhangi bir harici bağımlılık gerektirmeyen (WebAssembly tabanlı) güçlü bir OCR motorudur.
PDF Dosyasını Görsele Dönüştürme
PDF dosyaları doğrudan metin içerebileceği gibi, çoğu zaman taranmış birer görselden ibarettir. OCR işleminin başarılı olması için PDF sayfalarını yüksek çözünürlüklü görsellere çevirmemiz gerekir. Aşağıdaki kod bloğu, bir PDF dosyasının ilk sayfasını görsel olarak dışa aktarır.
const { fromPath } = require("pdf2pic");
const options = {
density: 300, // Çözünürlük (DPI)
saveFilename: "sayfa",
savePath: "./cikti",
format: "png",
width: 2480,
height: 3508
};
const storeAsImage = fromPath("./belge.pdf", options);
storeAsImage(1).then((resolve) => {
console.log("Sayfa başarıyla görsele çevrildi:", resolve);
});
Bu kodda density: 300 değeri, OCR başarısını doğrudan etkiler. Düşük DPI değerlerinde karakter tanıma doğruluğu ciddi oranda düşecektir.
Tesseract.js ile OCR Entegrasyonu
Görsele çevrilen PDF sayfalarını metne dönüştürmek için Tesseract.js kullanacağız. Bu kütüphane, görüntüdeki pikselleri analiz ederek karakterleri tahmin eder.
const Tesseract = require("tesseract.js");
Tesseract.recognize(
'./cikti/sayfa_1.png',
'tur', // Türkçe dil desteği
{ logger: m => console.log(m) }
).then(({ data: { text } }) => {
console.log("Çıkarılan Metin:", text);
});
Burada 'tur' parametresi, Tesseract'ın Türkçe karakterleri (ç, ğ, ı, ö, ş, ü) tanıması için gereklidir. İlk çalıştırmada dil verisi otomatik olarak indirilecektir.
Veri Çıkarımı ve Yapılandırma
OCR'dan gelen ham metin genellikle dağınıktır. Bu metni düzenli bir JSON yapısına dönüştürmek için Regex (Düzenli İfadeler) kullanmamız gerekir. Örneğin, bir faturadaki toplam tutarı çekmek için şu yaklaşımı izleyebilirsiniz:
function veriyiAyikla(metin) {
const toplamRegex = /Toplam:\s?(\d+,\d{2})\s?TL/i;
const eslesme = metin.match(toplamRegex);
return {
toplamTutar: eslesme ? eslesme[1] : "Bulunamadı",
islemTarihi: new Date().toISOString()
};
}
const hamMetin = "Fatura Detayı... Toplam: 1.250,50 TL";
console.log(veriyiAyikla(hamMetin));
Bu yöntem, OCR çıktısını iş süreçlerinizde kullanabileceğiniz bir formata dönüştürür. Karmaşık belgeler için LLM (Large Language Model) entegrasyonu ile bu metinleri daha akıllıca ayrıştırabilirsiniz.
Yöntemlerin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Tesseract.js (Yerel) | Ücretsiz, gizlilik odaklı | İşlemci yoğunluklu |
| Cloud OCR (API) | Çok yüksek doğruluk | Maliyetli, veri dışarı çıkar |
Kritik Güvenlik Uyarısı: PDF dosyalarını işlerken kullanıcı verilerinin gizliliğine dikkat edin. Özellikle kişisel verilerin (KVKK) işlendiği projelerde, geçici dosyaları işlem bittikten sonra fs.unlinkSync() ile sistemden silmeyi unutmayın.
Sıkça Sorulan Sorular
OCR doğruluğunu nasıl artırabilirim?
Daha yüksek DPI (300-600) kullanarak ve görüntüyü siyah-beyaz (grayscale) hale getirerek OCR başarısını artırabilirsiniz.
Tesseract.js neden yavaş çalışıyor?
Tesseract, CPU tabanlı bir işlemdir. Büyük PDF dosyalarında sayfaları paralel (Worker Threads) olarak işlemek performansı artıracaktır.
PDF içindeki tabloları nasıl okurum?
Tablolar için özel bir kütüphane olan pdf-table-extractor kullanabilir veya OCR çıktısını satır bazlı analiz ederek CSV formatına çevirebilirsiniz.
Node.js üzerinde GPU hızlandırma mümkün mü?
Tesseract.js temelinde WebAssembly kullanır. GPU hızlandırma için Tesseract'ın C++ kütüphanesini sisteminize kurup node-tesseract gibi wrapper'lar kullanmanız gerekebilir.
Hangi dosya formatları destekleniyor?
Tesseract.js; PNG, JPG, BMP ve TIFF formatlarını destekler. PDF'leri doğrudan işlemez, bu yüzden önce görselleştirmek şarttır.
OCR Süreçlerinde Hata Ayıklama ve Kalite Kontrolü
OCR projelerinde en büyük zorluk, düşük çözünürlüklü veya gürültülü (noise) görsellerden kaynaklanan yanlış okumalardır. İşlem hattınızda (pipeline) verinin doğruluğunu artırmak için bir doğrulama katmanı eklemek kritik öneme sahiptir. Özellikle metinlerin okunabilirliğini artırmak için sharp kütüphanesi ile ön işleme (preprocessing) adımları uygulayabilirsiniz.
Aşağıdaki kod örneği, OCR işleminden önce görselin kontrastını artırarak ve gri tonlamaya çevirerek tanıma başarısını nasıl optimize edebileceğinizi göstermektedir:
const sharp = require('sharp');
async function preprocessImage(inputPath, outputPath) {
try {
await sharp(inputPath)
.grayscale()
.sharpen()
.normalize()
.toFile(outputPath);
console.log('Görsel OCR için optimize edildi.');
} catch (err) {
console.error('Ön işleme hatası:', err);
}
}
Hata ayıklama sürecinde, Tesseract'ın döndürdüğü confidence değerlerini mutlaka kontrol edin. Eğer bir kelimenin güven skoru %70'in altındaysa, bu veriyi manuel inceleme için bir log dosyasında tutmak veya farklı bir dil modeli ile tekrar işlemek mantıklı bir stratejidir.
Üretim Ortamında Ölçeklenebilir Dağıtım (Deployment)
Node.js üzerinde OCR işlemleri CPU yoğunluklu görevlerdir. Bu görevleri ana uygulama döngüsünde (event loop) çalıştırmak, API yanıt sürelerinizi ciddi oranda yavaşlatır. Üretim ortamında performans kaybını önlemek için "Worker Thread" yapısını veya "Message Queue" (RabbitMQ, Redis) sistemlerini kullanmalısınız.
Ölçeklenebilir bir mimari için şu adımları izleyin:
- Kuyruk Sistemi: PDF yüklemelerini bir kuyruğa (BullMQ gibi) atın.
- Worker İzole Etme: OCR işlemlerini ana sunucudan bağımsız, ayrı bir worker servisinde gerçekleştirin.
- Geçici Dosya Yönetimi: İşlem bitiminde
fs.unlinkile oluşturulan geçici görselleri mutlaka silin, aksi takdirde sunucu disk alanı hızla dolacaktır.
Aşağıda, bir kuyruk sistemi ile OCR görevini nasıl ayırabileceğinize dair basit bir yapı örneği yer almaktadır:
const { Worker } = require('bullmq');
const ocrWorker = new Worker('ocr-queue', async job => {
const { filePath } = job.data;
// OCR işlemini burada tetikleyin
const result = await performOcr(filePath);
return result;
}, { connection: redisConnection });
ocrWorker.on('completed', job => {
console.log(`Görev ${job.id} başarıyla tamamlandı.`);
});
Bu yaklaşım, aynı anda yüzlerce PDF dosyasının işlenmesi gereken durumlarda uygulamanızın çökmesini engeller ve kaynak tüketimini optimize eder. Ayrıca, Docker konteynerleri kullanıyorsanız, tesseract-ocr paketinin sistem seviyesinde kurulu olduğundan ve gerekli dil dosyalarının (traineddata) konteyner imajına dahil edildiğinden emin olun.
Sonuç
Node.js ile PDF dosyalarından veri çıkarımı yapmak, doğru araçlar ve yöntemlerle oldukça verimli bir süreçtir. Bu rehberde öğrendiğiniz PDF'ten görsele dönüşüm ve Tesseract.js ile metin tanıma adımları, çoğu otomasyon ihtiyacınızı karşılayacaktır. Bir sonraki adım olarak, elde ettiğiniz verileri veritabanına kaydetmek için bir Mongoose (MongoDB) şeması oluşturmayı deneyebilirsiniz.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce hata yönetimi (try-catch), dosya boyutu limitleri ve güvenlik duvarı yapılandırmalarını mutlaka uygulayın.

Yorumlar (0)
Yorum Yaz