Java İle Pdf Dosyalarından Metin Çıkarma İşlemi Nasıl Yapılır?

Java İle Pdf Dosyalarından Metin Çıkarma İşlemi Nasıl Yapılır?
Java İle Pdf Dosyalarından Metin Çıkarma İşlemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projenizi başlatmadan önce Java Geliştirme Kiti (JDK) 17 veya daha güncel bir sürümün yüklü olduğundan emin olmalısınız. Bağımlılık yönetimi için Maven veya Gradle kullanılması önerilir. Apache PDFBox, Java dünyasında PDF işleme konusunda endüstri standardı olarak kabul edilen, açık kaynaklı ve oldukça stabil bir kütüphanedir.

Maven kullanıyorsanız, pom.xml dosyanıza aşağıdaki bağımlılığı ekleyerek işe başlayabilirsiniz:


    org.apache.pdfbox
    pdfbox
    3.0.1

Bu bağımlılık, PDF dosyalarını yüklemek, metin katmanlarına erişmek ve metni ayıklamak için gerekli tüm sınıfları sağlar. Sürüm olarak 3.x serisini tercih etmek, performans ve güvenlik açısından 2026 standartlarına uygun en doğru yaklaşımdır.

Adım Adım PDF Dosyasından Metin Okuma

Bir PDF dosyasından metin çıkarmanın en temel yolu, dosya yolunu belirterek PDDocument sınıfını kullanmaktır. Bu sınıf, PDF dosyasının belleğe yüklenmesini ve içerik ağacına erişilmesini sağlar. İşlem bittikten sonra kaynakların serbest bırakılması (memory leak önleme) için dosyanın kapatılması zorunludur.

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;
import java.io.IOException;

public class PdfOkuyucu {
    public static void main(String[] args) {
        File dosya = new File("ornek_belge.pdf");
        try (PDDocument belge = PDDocument.load(dosya)) {
            PDFTextStripper stripper = new PDFTextStripper();
            String metin = stripper.getText(belge);
            System.out.println(metin);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Yukarıdaki kod, try-with-resources yapısını kullanarak PDDocument nesnesini otomatik olarak kapatır. PDFTextStripper sınıfı, PDF içindeki metinleri satır ve paragraf düzenini koruyarak Java String nesnesine dönüştürür.

Belirli Sayfa Aralığından Metin Çıkarma

Büyük PDF dosyalarında tüm içeriği okumak yerine sadece belirli sayfalara odaklanmak, bellek kullanımını optimize eder. PDFTextStripper sınıfı, başlangıç ve bitiş sayfası belirlemenize olanak tanır. Bu yöntem, özellikle fatura veya rapor gibi çok sayfalı dokümanlarda belirli bir sayfadaki veriyi işlemek için idealdir.

PDFTextStripper stripper = new PDFTextStripper();
stripper.setStartPage(1);
stripper.setEndPage(2);
String metin = stripper.getText(belge);
System.out.println("Seçili sayfaların metni: " + metin);

Bu kod bloğunda setStartPage ve setEndPage metotları, PDFBox'ın sadece belirtilen sayfa aralığını işlemesini sağlar. Sayfa numaralarının 1'den başladığını unutmamak önemlidir.

PDF Metin Çıkarma Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
PDFBox (Default) Hızlı, ücretsiz, geniş dokümantasyon Karmaşık tablolarda metin kayması
Tesseract (OCR) Görsel tabanlı PDF'leri okur Yüksek CPU tüketimi
Tabula Tablo verilerini CSV'ye çevirir Sadece tablo odaklıdır

Karakter Kodlaması ve Türkçe Karakter Sorunlarını Çözme

PDF dosyalarından metin çıkarırken en sık karşılaşılan sorun, Türkçe karakterlerin (ç, ğ, ş, ı, ö, ü) yanlış görüntülenmesidir. Bu durum, PDF'in oluşturulma aşamasında kullanılan fontların standart dışı kodlama içermesinden kaynaklanır. PDFBox, varsayılan olarak UTF-8 desteği sunsa da bazen ek yapılandırma gerekebilir.

PDFTextStripper stripper = new PDFTextStripper();
stripper.setSortByPosition(true); // Metinleri görsel sıraya göre diz
String metin = stripper.getText(belge);
// Metni UTF-8 olarak işlemek için standart Java String metotlarını kullanın

setSortByPosition(true) parametresi, PDF içindeki karakterlerin koordinatlarına göre sıralanmasını sağlar. Bu, metnin okunabilirliğini artırır ve karmaşık düzenli PDF'lerde metin akışının bozulmasını engeller.

Güvenlik Uyarısı: Kullanıcıdan gelen PDF dosyalarını işlerken, dosyaların kötü amaçlı yazılım (malware) içerebileceğini unutmayın. Dosyaları işlemeden önce mutlaka boyut kontrolü yapın ve dosya türünü doğrulayın. Üretim ortamında (production), PDF işleme süreçlerini ana iş parçacığından (main thread) ayrı bir servis veya kuyruk sistemi üzerinde çalıştırmanız önerilir.

İleri Seviye: PDF İçindeki Tabloları İşleme

PDFBox metin çıkarma konusunda çok başarılı olsa da, tablo yapılarındaki hücreleri birbirinden ayırmakta zorlanabilir. Bu durumda, metin çıkarma işleminden sonra elde edilen veriyi Regex (Düzenli İfadeler) kullanarak parçalamanız gerekir.

String metin = stripper.getText(belge);
String[] satirlar = metin.split("\\r?\\n");
for (String satir : satirlar) {
    if (satir.contains("Toplam")) {
        System.out.println("Bulunan veri: " + satir);
    }
}

Regex kullanarak belirli desenleri (örneğin bir fatura numarası veya toplam tutar) yakalamak, PDF'in metin akışını manipüle etmeden veriye ulaşmanın en pratik yoludur.

Sıkça Sorulan Sorular

PDF'den metin çıkarırken neden boş sonuç alıyorum?

Bazı PDF dosyaları "taranmış" (resim tabanlı) PDF'lerdir. Bu tür dosyalarda metin katmanı yoktur. Bu durumda Apache PDFBox yerine Tesseract gibi bir OCR (Optik Karakter Tanıma) kütüphanesi kullanmanız gerekir.

PDFBox ile şifreli PDF dosyalarını nasıl okuyabilirim?

PDDocument.load(file, "parola") metodunu kullanarak şifreli dosyaları yükleyebilirsiniz. Ancak, dosyanın izinlerinin metin çıkarmaya açık olduğundan emin olmalısınız.

Çok büyük PDF dosyalarında bellek hatası alıyorum, ne yapmalıyım?

Büyük dosyaları yüklerken MemoryUsageSetting.setupTempFileOnly() ayarını kullanarak verinin RAM yerine disk üzerinde geçici olarak tutulmasını sağlayabilirsiniz.

PDF içindeki fontları nasıl değiştirebilirim?

PDFBox öncelikli olarak okuma ve ayrıştırma kütüphanesidir. Metin çıkarma işlemi sırasında font değiştiremezsiniz; ancak metni çıkardıktan sonra Java tarafında istediğiniz formatta işleyebilirsiniz.

Bu yöntem 2026 yılındaki güncel Java sürümleriyle uyumlu mu?

Evet, Apache PDFBox 3.x sürümü Java 17, 21 ve daha yeni LTS sürümleriyle tam uyumlu çalışmaktadır.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Yazılım geliştirme sürecinde, özellikle üçüncü taraf kütüphanelerin güvenlik açıklarını (CVE) düzenli olarak takip etmeli ve kütüphanelerinizi her zaman en güncel kararlı sürüme yükseltmelisiniz. Veri işleme süreçlerinde kişisel verilerin korunması kanunlarına (KVKK) uygun hareket etmek geliştiricinin sorumluluğundadır.

PDF İşleme Süreçlerinde Performans Optimizasyonu

Büyük ölçekli projelerde, özellikle binlerce PDF dosyasını aynı anda işlemeniz gereken durumlarda, bellek yönetimi ve işlemci kullanımı kritik bir rol oynar. Standart PDFTextStripper kullanımı, doküman boyutu arttıkça "Heap Space" hatalarına yol açabilir. Bu durumu aşmak için metin çıkarma işlemini akış (stream) tabanlı yönetmek ve kaynakları manuel olarak serbest bırakmak gerekir.

Performansı artırmak adına izleyebileceğiniz en etkili yöntem, dokümanı tamamen belleğe yüklemek yerine RandomAccessRead arayüzünü kullanarak disk üzerinden okuma yapmaktır. Aşağıdaki örnek, yüksek performanslı bir okuma modelini göstermektedir:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.io.RandomAccessReadBuffer;

import java.io.File;
import java.io.IOException;

public class HighPerformanceReader {
    public static void extractTextOptimized(String filePath) throws IOException {
        File file = new File(filePath);
        try (PDDocument document = PDDocument.load(new RandomAccessReadBuffer(file.getPath()))) {
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setSortByPosition(true);
            // Büyük dosyalar için tüm metni bir kerede String'e almak yerine 
            // sayfa sayfa işleyerek bellek kullanımını düşürebilirsiniz.
            for (int i = 1; i


Sonuç

Java ile PDF dosyalarından metin çıkarma işlemi, doğru kütüphane seçimi ve yapılandırılmış bir kod mimarisi ile oldukça verimli bir hale getirilebilir. Apache PDFBox, sunduğu esnek API sayesinde hem basit metin okuma hem de karmaşık doküman analizi ihtiyaçlarınızı karşılayacaktır. Bu rehberde öğrendiğiniz yöntemleri temel alarak, bir sonraki adımda elde ettiğiniz metinleri veritabanına kaydetmeyi veya yapay zeka modellerine girdi olarak vermeyi deneyebilirsiniz. Başarılı bir geliştirme süreci için her zaman küçük parçalarla başlayıp, hata yönetimi (exception handling) mekanizmalarını kodunuza dahil etmeyi unutmayın.

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

On yıllık içerik üretimi deneyimiyle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Pratik ev çözümleri ve hayatı kolaylaştıran teknikler konusunda uzmanım.

Yorumlar (0)

Yorum Yaz