AI Agents · Ders

PyMuPDF ve pdfplumber ile PDF Ayrıştırma

PDF'lerden programlı olarak metin, tablo ve üst veri çıkarma.

1. ders / 413 adım

PyMuPDF ve pdfplumber ile PDF Ayrıştırma, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.

PDF Ayrıştırma Neden Basit Değildir

PDF'ler bir veri biçimi değil, sunum biçimidir. Metin, mantıksal paragraflar olarak değil, konumlandırılmış glifler olarak saklanır. Anlamlı metin çıkarmak; düzenin, okuma sırasının ve yazı tipi özelliklerinin anlaşılmasını, ayrıca çok sütunlu düzenler, üstbilgiler ve altbilgiler ile gömülü görseller gibi uç durumların ele alınmasını gerektirir.

İki kütüphane öne çıkar: PyMuPDF (hız) ve pdfplumber (tablo çıkarma).

PyMuPDF Temelleri

PyMuPDF (fitz olarak içe aktarılır), en hızlı Python PDF kütüphanesidir. Metin çıkarma, üstveriler, görseller ve görselleştirme işlemlerini destekler. pip install pymupdf komutuyla yükleyin.

import fitz  # PyMuPDF

# Open a PDF
doc = fitz.open('document.pdf')

print(f'Pages: {len(doc)}')
print(f'Metadata: {doc.metadata}')

# Extract text from all pages
full_text = ''
for page_num in range(len(doc)):
    page = doc[page_num]
    text = page.get_text()  # plain text extraction
    full_text += f'--- Page {page_num + 1} ---\n{text}\n'

doc.close()
print(full_text[:500])

PyMuPDF Metin Çıkarma Kipleri

page.get_text() farklı çıktı biçimlerini destekler. Düz metin için 'text', sınırlayıcı kutularla birlikte metin blokları için 'blocks', yazı tipi adları ve boyutlarını da içeren zengin yapılandırılmış çıktı için 'dict' kullanın.

import fitz

doc = fitz.open('report.pdf')
page = doc[0]

# Mode 1: plain text
plain = page.get_text('text')

# Mode 2: blocks (each block has bbox + text)
blocks = page.get_text('blocks')
for block in blocks:
    x0, y0, x1, y1, text, block_no, block_type = block
    if block_type == 0:  # text block (1 = image)
        print(f'Block at ({x0:.0f},{y0:.0f}): {text[:80]}')

# Mode 3: dict (full detail including font info)
page_dict = page.get_text('dict')
for block in page_dict['blocks']:
    if block.get('type') == 0:  # text
        for line in block['lines']:
            for span in line['spans']:
                print(f"Font: {span['font']}, Size: {span['size']:.1f}, Text: {span['text']}")

doc.close()

Sayfa Üstverilerini Çıkarma

Sayfa üstverileri, ajanların belge yapısını anlamasına yardımcı olur: sayfa sayısı, belge başlığı, yazar, oluşturulma tarihi ve sayfa boyutları. PyMuPDF bunların tümünü sunar.

import fitz

def extract_pdf_metadata(filepath):
    doc = fitz.open(filepath)
    meta = doc.metadata
    info = {
        'title':    meta.get('title', 'Unknown'),
        'author':   meta.get('author', 'Unknown'),
        'subject':  meta.get('subject', ''),
        'creator':  meta.get('creator', ''),
        'created':  meta.get('creationDate', ''),
        'modified': meta.get('modDate', ''),
        'pages':    len(doc),
        'page_size': {
            'width':  doc[0].rect.width,
            'height': doc[0].rect.height
        }
    }
    doc.close()
    return info

meta = extract_pdf_metadata('contract.pdf')
print(f"Title: {meta['title']}, Pages: {meta['pages']}")

Tablo Çıkarma İçin pdfplumber

pdfplumber, PDF'lerden tablo çıkarmada başarılıdır. Açık bir tablo işaretlemesi olmayan PDF'lerde bile hücre sınırlarını belirlemek için geometrik analiz kullanır.

pip install pdfplumber komutuyla yükleyin.

import pdfplumber

with pdfplumber.open('financial_report.pdf') as pdf:
    for page_num, page in enumerate(pdf.pages):
        tables = page.extract_tables()
        for table_idx, table in enumerate(tables):
            print(f'Page {page_num+1}, Table {table_idx+1}:')
            # table is a list of rows; each row is a list of cell strings
            headers = table[0]
            for row in table[1:]:
                row_dict = dict(zip(headers, row))
                print(row_dict)

pdfplumber Tablo Ayarları

pdfplumber'ın tablo çıkarma işlemi, farklı tablo stillerini ele alacak şekilde ayarlarla yapılandırılabilir: açık çizgiler, boşluklarla ayrılmış sütunlar veya karma düzenler.

import pdfplumber

# Custom table settings for borderless tables
table_settings = {
    'vertical_strategy':   'text',   # 'lines', 'lines_strict', 'text', 'explicit'
    'horizontal_strategy': 'text',
    'snap_tolerance':       5,
    'join_tolerance':       3,
    'edge_min_length':     50,
    'min_words_vertical':   3,
    'min_words_horizontal': 1
}

with pdfplumber.open('nolines_table.pdf') as pdf:
    page = pdf.pages[0]
    table = page.extract_table(table_settings)
    if table:
        import csv
        import io
        output = io.StringIO()
        writer = csv.writer(output)
        writer.writerows(table)
        csv_string = output.getvalue()
        print(csv_string[:300])

Çok Sütunlu Düzenleri Ele Alma

Akademik makaleler ve gazeteler çok sütunlu düzenler kullanır. Basit metin çıkarma, sütunlar arasında soldan sağa okuyarak bozuk metin üretir. Önce metin bloklarını sütunlara göre sıralayarak bunu düzeltin.

import fitz

def extract_multicolumn_text(page, n_columns=2):
    page_width = page.rect.width
    col_width = page_width / n_columns

    blocks = page.get_text('blocks')
    # Filter text blocks only
    text_blocks = [b for b in blocks if b[6] == 0]

    # Assign each block to a column based on x position
    columns = [[] for _ in range(n_columns)]
    for block in text_blocks:
        x0 = block[0]
        col_idx = min(int(x0 / col_width), n_columns - 1)
        columns[col_idx].append(block)

    # Sort each column by vertical position
    for col in columns:
        col.sort(key=lambda b: b[1])  # sort by y0

    # Read columns left to right
    full_text = ''
    for col in columns:
        for block in col:
            full_text += block[4] + '\n'
    return full_text

Üstbilgileri ve Altbilgileri Filtreleme

PDF üstbilgileri ve altbilgileri her sayfada tekrarlanır ve çıkarılan metni gereksiz içerikle doldurur. Bunları dikey konumlarına göre (sayfanın üst veya alt yüzde 10'luk bölümünde) belirleyin ve içerik çıkarma işleminden hariç tutun.

import fitz

def extract_without_headers_footers(page, margin_ratio=0.08):
    page_height = page.rect.height
    top_margin = page_height * margin_ratio
    bottom_margin = page_height * (1 - margin_ratio)

    blocks = page.get_text('blocks')
    content_blocks = []

    for block in blocks:
        x0, y0, x1, y1, text, block_no, block_type = block
        if block_type != 0:
            continue  # skip image blocks
        # Skip blocks in header or footer zone
        if y0 < top_margin or y1 > bottom_margin:
            continue
        content_blocks.append(text)

    return '\n'.join(content_blocks)

Aracılar İçin PDF Metnini Parçalara Ayırma

Uzun PDF'ler, gömme ve getirme işlemleri için parçalara ayrılmalıdır. Parçaları paragraflar, bölümler veya sayfalar gibi doğal sınırlardan ayırın. Bağlamın cümlenin ortasında kesilmesini önlemek için parçalar arasında örtüşme bırakın.

import fitz

def pdf_to_chunks(filepath, chunk_size=1000, overlap=200):
    doc = fitz.open(filepath)
    chunks = []

    for page_num in range(len(doc)):
        page = doc[page_num]
        page_text = page.get_text()

        # Split into chunks with overlap
        start = 0
        while start < len(page_text):
            end = start + chunk_size
            chunk = page_text[start:end]
            chunks.append({
                'text': chunk,
                'page': page_num + 1,
                'char_start': start,
                'source': filepath
            })
            start += chunk_size - overlap  # overlap

    doc.close()
    return chunks

chunks = pdf_to_chunks('research_paper.pdf')
print(f'Total chunks: {len(chunks)}')
print(f'Sample: {chunks[0]["text"][:200]}')

PyMuPDF ve pdfplumber'ı Birleştirme

Metin çıkarma için PyMuPDF'yi (daha hızlı), tablo algılama içinse pdfplumber'ı (daha doğru) kullanın. Birleşik çıkarıcı, her sayfada ikisini de çalıştırır ve metinle tabloların ayrıldığı yapılandırılmış içerik döndürür.

import fitz
import pdfplumber

def full_pdf_extract(filepath):
    result = {'text_by_page': [], 'tables': []}

    # Text extraction with PyMuPDF
    doc = fitz.open(filepath)
    for i in range(len(doc)):
        text = extract_without_headers_footers(doc[i])
        result['text_by_page'].append({'page': i + 1, 'text': text})
    doc.close()

    # Table extraction with pdfplumber
    with pdfplumber.open(filepath) as pdf:
        for page_num, page in enumerate(pdf.pages):
            tables = page.extract_tables()
            for t in tables:
                result['tables'].append({
                    'page': page_num + 1,
                    'headers': t[0] if t else [],
                    'rows': t[1:] if t and len(t) > 1 else []
                })

    return result

Çıkarılan Metni Dosyalara Kaydetme

PDF'lerden metin çıkardıktan sonra bunu sonraki aşamalardaki aracıların kullanabileceği bir biçimde kaydedin. Düz metin dosyaları gömme işlem hatları için iyi çalışır; JSON ise atıf takibi için sayfa yapısını korur.

import json, os

class FakePage:
    def __init__(self, text): self.text = text
    def get_text(self): return self.text

class FakeDoc(list):
    def close(self): pass

def fitz_open(path):
    return FakeDoc([FakePage('Page 1 text'), FakePage('Page 2 text')])

def pdf_to_text_file(pdf_path, output_dir):
    doc = fitz_open(pdf_path)
    base = os.path.splitext(os.path.basename(pdf_path))[0]
    txt_path = os.path.join(output_dir, base + '.txt')
    with open(txt_path, 'w', encoding='utf-8') as f:
        for i, page in enumerate(doc):
            f.write(f'--- Page {i+1} ---\n{page.get_text()}\n')
    json_path = os.path.join(output_dir, base + '.json')
    pages = [{'page': i+1, 'text': p.get_text()} for i, p in enumerate(doc)]
    with open(json_path, 'w') as f:
        json.dump({'source': pdf_path, 'pages': pages}, f, indent=2)
    doc.close()
    print(f'Saved: {txt_path} and {json_path}')
    return txt_path, json_path

pdf_to_text_file('sample.pdf', '.')

Bilgi Kontrolü

PDF dosyalarından tablo çıkarmak için hangi Python kitaplığı en uygundur?

Tekrar: PyMuPDF ve pdfplumber ile PDF Ayrıştırma

PyMuPDF (fitz), metin çıkarma, üst veriler ve çok sütunlu düzenleri işleme için hızlı seçenektir. pdfplumber, yapılandırılabilir geometrik stratejilerle tablo çıkarma konusunda başarılıdır.

Temel teknikler: konum bilgisine duyarlı çıkarma için get_text('blocks') kullanın, üst ve alt bilgileri dikey konuma göre filtreleyin, blokları sütuna göre sıralayarak çok sütunlu düzenleri işleyin ve aracıların getirme sistemleri için metni örtüşmeyle parçalara ayırın. En iyi sonuçlar için her iki kitaplığı birleştirin.

Başlamak ücretsiz

Yapay zeka eğitmeniyle AI Agents öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
60
Dersler
239

Sıkça Sorulan Sorular

“PyMuPDF ve pdfplumber ile PDF Ayrıştırma” dersi ücretsiz mi?

Evet — “PyMuPDF ve pdfplumber ile PDF Ayrıştırma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.

“PyMuPDF ve pdfplumber ile PDF Ayrıştırma” dersinde ne öğreneceğim?

PDF'lerden programlı olarak metin, tablo ve üst veri çıkarma. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Agents öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“PyMuPDF ve pdfplumber ile PDF Ayrıştırma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. PyMuPDF ve pdfplumber ile PDF Ayrıştırma
  2. Taranmış Belgeler İçin OCR
  3. Çok Belgeli Soru-Cevap Aracıları
  4. Belge Sınıflandırma ve Yönlendirme
← AI Agents Sayfasına Dön