0Pricing
AI Agents · Pelajaran

Mengurai PDF dengan PyMuPDF dan pdfplumber

Ekstrak teks, tabel, dan metadata dari PDF secara terprogram.

Mengurai PDF dengan PyMuPDF dan pdfplumber adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Mengapa Penguraian PDF Tidak Sederhana

PDF adalah format presentasi, bukan format data. Teks disimpan sebagai glif yang ditempatkan, bukan sebagai paragraf logis. Mengekstrak teks yang bermakna memerlukan pemahaman tentang tata letak, urutan baca, properti jenis huruf, serta penanganan kasus khusus seperti tata letak multikolom, kepala dan kaki halaman, serta gambar tersemat.

Dua pustaka yang paling banyak digunakan adalah PyMuPDF (kecepatan) dan pdfplumber (ekstraksi tabel).

Dasar-Dasar PyMuPDF

PyMuPDF (diimpor sebagai fitz) adalah pustaka PDF Python tercepat. Pustaka ini menangani ekstraksi teks, metadata, gambar, dan perenderan. Instal dengan pip install pymupdf.

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])

Mode Ekstraksi Teks PyMuPDF

page.get_text() mendukung berbagai format keluaran. Gunakan 'text' untuk teks biasa, 'blocks' untuk blok teks dengan kotak pembatas, dan 'dict' untuk keluaran terstruktur yang kaya, termasuk nama dan ukuran jenis huruf.

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()

Mengekstrak Metadata Halaman

Metadata halaman membantu agen memahami struktur dokumen: jumlah halaman, judul dokumen, penulis, tanggal pembuatan, dan dimensi halaman. PyMuPDF menyediakan semua informasi ini.

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']}")

pdfplumber untuk Ekstraksi Tabel

pdfplumber unggul dalam mengekstrak tabel dari PDF. Pustaka ini menggunakan analisis geometris untuk mendeteksi batas sel, bahkan dalam PDF tanpa penanda tabel eksplisit.

Instal dengan pip install pdfplumber.

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)

Pengaturan Tabel pdfplumber

Ekstraksi tabel pdfplumber dapat disesuaikan dengan pengaturan untuk menangani berbagai gaya tabel: garis eksplisit, kolom yang dipisahkan spasi, atau tata letak campuran.

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])

Menangani Tata Letak Multikolom

Makalah akademik dan surat kabar menggunakan tata letak multikolom. Ekstraksi teks secara naif membaca melintasi kolom dari kiri ke kanan sehingga menghasilkan teks yang kacau. Perbaiki masalah ini dengan mengurutkan blok teks berdasarkan kolom terlebih dahulu.

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

Memfilter Kepala dan Kaki Halaman

Kepala dan kaki halaman PDF berulang di setiap halaman dan mengotori teks yang diekstrak. Identifikasi berdasarkan posisi vertikalnya (10% teratas atau terbawah halaman), lalu keluarkan dari ekstraksi isi.

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)

Membagi Teks PDF Menjadi Potongan untuk Agen

PDF yang panjang harus dibagi menjadi beberapa potongan untuk penyematan dan pengambilan. Bagilah pada batas alami: paragraf, bagian, atau halaman. Sertakan tumpang tindih antarpotongan agar konteks tidak terputus di tengah kalimat.

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]}')

Menggabungkan PyMuPDF dan pdfplumber

Gunakan PyMuPDF untuk ekstraksi teks (lebih cepat) dan pdfplumber untuk deteksi tabel (lebih akurat). Ekstraktor gabungan menjalankan keduanya pada setiap halaman dan mengembalikan konten terstruktur dengan teks dan tabel yang dipisahkan.

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

Menyimpan Teks yang Diekstrak ke Berkas

Setelah mengekstrak teks dari PDF, simpan teks tersebut dalam format yang dapat digunakan oleh agen pada tahap berikutnya. Berkas teks biasa cocok untuk alur pemrosesan penyematan; JSON mempertahankan struktur halaman untuk pelacakan sitasi.

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', '.')

Pemeriksaan Pengetahuan

Pustaka Python mana yang paling sesuai untuk mengekstrak tabel dari berkas PDF?

Rangkuman: Penguraian PDF dengan PyMuPDF dan pdfplumber

PyMuPDF (fitz) adalah pilihan cepat untuk ekstraksi teks, metadata, dan penanganan tata letak multikolom. pdfplumber unggul dalam ekstraksi tabel dengan strategi geometris yang dapat dikonfigurasi.

Teknik utama: gunakan get_text('blocks') untuk ekstraksi yang memperhatikan posisi, saring tajuk dan kaki halaman berdasarkan posisi vertikal, tangani tata letak multikolom dengan mengurutkan blok berdasarkan kolom, lalu bagi teks menjadi potongan yang saling tumpang tindih untuk sistem pengambilan oleh agen. Gabungkan kedua pustaka untuk mendapatkan hasil terbaik.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengurai PDF dengan PyMuPDF dan pdfplumber” gratis?

Ya — teks lengkap “Mengurai PDF dengan PyMuPDF dan pdfplumber” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengurai PDF dengan PyMuPDF dan pdfplumber”?

Ekstrak teks, tabel, dan metadata dari PDF secara terprogram. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Mengurai PDF dengan PyMuPDF dan pdfplumber” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengurai PDF dengan PyMuPDF dan pdfplumber
  2. OCR untuk Dokumen Hasil Pemindaian
  3. Agen Tanya Jawab Multidokumen
  4. Klasifikasi dan Perutean Dokumen
← Kembali ke AI Agents