Cara ekstrak teks dari PDF di Python (3 library dibandingkan)
Mengekstrak teks dari PDF memang terdengar mudah, tetapi siapa pun yang pernah mencoba baca PDF dengan Python tahu kenyataannya tidak sesederhana itu. Ada banyak pengecualian, layout berantakan, sampai file berbasis gambar yang sulit diproses. Panduan ini langsung fokus ke hal yang penting. Kita mulai dengan membandingkan library Python untuk ekstrak PDF yang paling layak dipakai, supaya Anda bisa cepat memilih tool yang tepat untuk proyek Anda.

Setelah itu, kita bahas contoh kode untuk tiga library yang paling efektif—PyPDF2, pdfplumber, dan PyMuPDF (Fitz)—mulai dari ekstrak teks dasar sampai menangani tabel yang kompleks. Kita juga akan membahas tantangan paling sulit: PDF scan yang membutuhkan OCR, lalu menunjukkan cara praktis untuk menanganinya tanpa setup lokal yang rumit. Di akhir panduan, Anda akan punya kode dan strategi yang bisa langsung dipakai untuk mengotomatisasi workflow pemrosesan PDF dengan lebih andal.
Ringkasan cepat: library Python terbaik untuk ekstrak teks PDF
Sebelum masuk ke kode, berikut gambaran singkat tentang opsi terbaik yang bisa dipilih. Library yang paling cocok sepenuhnya bergantung pada kebutuhan Anda: apakah lebih mementingkan kecepatan, kemudahan, atau analisis layout yang presisi.
| Library | Paling cocok untuk | Penanganan layout/tabel | Performa | Kemudahan penggunaan (1-5) |
|---|---|---|---|---|
| PyPDF2 | Dokumen sederhana yang hanya berisi teks; manipulasi PDF dasar (gabung/pisah) | Kurang baik (mengekstrak aliran teks tanpa data posisi) | Sedang | 5 |
| pdfplumber | Ekstrak data dari tabel; dokumen dengan layout terstruktur | Sangat baik (menyediakan koordinat untuk teks, garis, dan persegi panjang) | Lebih lambat | 4 |
| PyMuPDF (Fitz) | Pemrosesan batch berkecepatan tinggi; menangani gambar dan anotasi | Baik (bisa mengekstrak teks dengan info posisi dasar) | Sangat baik (paling cepat) | 4 |
Intinya: Mulai dengan PyPDF2 untuk kasus yang paling sederhana. Begitu Anda menemukan tabel, pindah ke pdfplumber. Jika prioritas utama Anda adalah performa, pilih PyMuPDF.
Sebelum mulai: siapkan environment Python Anda
Agar dependensi proyek tetap rapi dan tidak bentrok, selalu kerjakan semuanya di dalam virtual environment. Ini adalah praktik terbaik yang wajib untuk proyek Python yang serius.
Berikut cara menyiapkannya lewat terminal:
- Buat virtual environment:
# Di macOS/Linux
python3 -m venv pdf_env
# Di Windows
python -m venv pdf_env
```
2. **Aktifkan:**
```plaintext
# Di macOS/Linux
source pdf_env/bin/activate
# Di Windows
.\pdf_env\Scripts\activate
```
Prompt terminal Anda sekarang seharusnya menampilkan `(pdf_env)`.
3. **Install library yang dibutuhkan:** Kita akan memasang ketiga library yang sedang dibandingkan agar Anda bisa langsung mencoba semuanya.
```plaintext
pip install pypdf2 pdfplumber pymupdf
```
Setelah itu, environment Anda siap dipakai untuk contoh kode di bawah.
---
## Metode 1: ekstrak teks PDF dasar dengan PyPDF2
PyPDF2 adalah library andalan untuk operasi PDF dasar. Cara pakainya sederhana, sudah lama digunakan, dan sangat cocok untuk PDF "native" yang teksnya bisa dipilih, bukan bagian dari gambar. Jika dokumen Anda berupa laporan sederhana, artikel, atau hasil ekspor berbasis teks, PyPDF2 biasanya sudah cukup untuk menyelesaikan pekerjaan dengan kode yang minim.
Keterbatasan utamanya? PyPDF2 membaca aliran teks internal dari PDF, yang tidak selalu sama dengan urutan baca visual di dokumen, terutama pada layout multi-kolom. Library ini juga tidak memahami struktur tabel; semua isi sel biasanya akan tergabung menjadi satu blok teks.
Berikut contoh script sederhana untuk ekstrak semua teks dari PDF:
```python
# requirements: pip install pypdf2
import PyPDF2
def extract_text_with_pypdf2(pdf_path):
"""
Mengekstrak teks dari file PDF menggunakan library PyPDF2.
Args:
pdf_path (str): Path file PDF.
Returns:
str: Isi teks yang berhasil diekstrak, atau pesan error.
"""
try:
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
num_pages = len(reader.pages)
print(f"Total halaman: {num_pages}")
full_text = ""
for page_num in range(num_pages):
page = reader.pages[page_num]
full_text += page.extract_text() + "\n"
return full_text
except FileNotFoundError:
return f"Error: File di {pdf_path} tidak ditemukan."
except Exception as e:
return f"Terjadi error tak terduga: {e}"
# --- Contoh penggunaan ---
pdf_file = 'path/to/your/document.pdf'
extracted_text = extract_text_with_pypdf2(pdf_file)
if "Error" not in extracted_text:
print("--- Teks hasil ekstraksi ---")
print(extracted_text)
else:
print(extracted_text)
Script ini bekerja sangat baik untuk teks sederhana dengan satu kolom. Tetapi apa yang terjadi jika Anda memakainya untuk laporan keuangan dengan tabel yang rapi? Hasilnya biasanya berupa campuran teks dan angka tanpa struktur yang jelas. Di sinilah library berikutnya jauh lebih unggul.
Metode 2: Ekstrak tabel dan layout PDF dengan pdfplumber
Kalau tugas Anda adalah mengambil data terstruktur dari PDF, pdfplumber adalah pilihan yang tepat. Library ini dibangun di atas pdfminer.six dan dirancang untuk memberi akses yang detail ke geometri halaman PDF. pdfplumber bisa "melihat" karakter, garis, dan kotak, serta punya metode bawaan yang sangat andal untuk mendeteksi dan ekstrak tabel dari PDF.
Ini sangat membantu untuk workflow data science dan otomasi bisnis. Bayangkan Anda perlu mengambil data laba kuartalan dari laporan PDF perusahaan. Dengan PyPDF2, prosesnya bisa jadi mimpi buruk karena harus parsing string secara manual. Dengan pdfplumber, datanya bisa langsung diambil sebagai list of lists yang rapi dan siap diubah menjadi Pandas DataFrame.
Alasan utama pdfplumber lebih unggul daripada PyPDF2 untuk data terstruktur adalah kemampuannya membaca layout visual dokumen, bukan hanya aliran teks mentah. Library ini memahami bahwa elemen teks tertentu sejajar dalam baris dan kolom, lalu dipisahkan oleh garis.
Berikut cara ekstrak tabel dari halaman PDF:
# kebutuhan: pip install pdfplumber
import pdfplumber
import pandas as pd
def extract_tables_with_pdfplumber(pdf_path, page_number=0):
"""
Mengekstrak semua tabel dari halaman tertentu pada file PDF menggunakan pdfplumber.
Args:
pdf_path (str): Path file PDF.
page_number (int): Nomor halaman untuk ekstrak tabel (indeks dimulai dari 0).
Returns:
list of pandas.DataFrame: Daftar DataFrame, di mana setiap elemen
merepresentasikan tabel yang ditemukan pada halaman.
"""
tables = []
try:
with pdfplumber.open(pdf_path) as pdf:
if page_number >= len(pdf.pages):
print(f"Error: Halaman {page_number} di luar jangkauan. PDF ini memiliki {len(pdf.pages)} halaman.")
return tables
page = pdf.pages[page_number]
# .extract_tables() adalah metode utama di sini
extracted_tables = page.extract_tables()
for table_data in extracted_tables:
# Ubah list of lists menjadi pandas DataFrame
df = pd.DataFrame(table_data[1:], columns=table_data[0])
tables.append(df)
return tables
except FileNotFoundError:
print(f"Error: File di {pdf_path} tidak ditemukan.")
return tables
except Exception as e:
print(f"Terjadi error yang tidak terduga: {e}")
return tables
# --- Contoh penggunaan ---
# Anda memerlukan pandas untuk contoh ini: pip install pandas
pdf_file_with_table = 'path/to/your/report.pdf'
all_tables = extract_tables_with_pdfplumber(pdf_file_with_table, page_number=0)
if all_tables:
print(f"Ditemukan {len(all_tables)} tabel di halaman 0.")
for i, table_df in enumerate(all_tables):
print(f"\n--- Tabel {i+1} ---")
print(table_df)
else:
print("Tidak ada tabel yang ditemukan pada halaman yang dipilih.")
Kompromi dari presisi ini adalah kecepatan. pdfplumber melakukan lebih banyak analisis pada halaman, jadi secara alami lebih lambat dibanding library yang hanya mengekspor teks apa adanya.
Metode 3: Ekstrak teks PDF cepat dengan PyMuPDF (Fitz)
Kalau Anda perlu memproses ratusan sampai ribuan PDF dengan cepat, performa jadi faktor penentu. Di sinilah PyMuPDF, yang di-import sebagai fitz, benar-benar unggul. Library ini adalah binding Python untuk MuPDF, library C yang ringan, sehingga performanya sangat cepat.
Saya pernah menangani proyek yang harus memproses beberapa ribu dokumen hukum multi-halaman. Script pdfplumber awal saya diperkirakan butuh waktu berjam-jam. Setelah pindah ke PyMuPDF, total runtime turun menjadi kurang dari 30 menit. Selisih kecepatannya memang sedrastis itu.
Selain cepat, PyMuPDF juga kaya fitur. Library ini bisa merender halaman menjadi gambar (sangat penting untuk workflow OCR PDF scan Python), mengekstrak gambar yang tertanam, dan menangani anotasi. Memang, fitur ekstrak tabelnya tidak sepraktis pdfplumber, tetapi untuk ekstrak teks mentah dari PDF, kecepatannya sulit ditandingi.
Berikut versi PyMuPDF untuk ekstrak teks dengan cepat:
# kebutuhan: pip install PyMuPDF
import fitz # Library PyMuPDF
def extract_text_with_pymupdf(pdf_path):
"""
Mengekstrak teks dari file PDF menggunakan library PyMuPDF (Fitz) berperforma tinggi.
Args:
pdf_path (str): Path file PDF.
Returns:
str: Konten teks hasil ekstraksi, atau pesan error.
"""
try:
doc = fitz.open(pdf_path)
full_text = ""
for page in doc:
# .get_text() adalah fungsi inti
full_text += page.get_text() + "\n"
doc.close()
return full_text
except FileNotFoundError:
return f"Error: File di {pdf_path} tidak ditemukan."
except Exception as e:
# PyMuPDF dapat memunculkan error spesifik, misalnya fitz.fitz.FitzError
return f"Terjadi error pada PyMuPDF: {e}"
# --- Contoh penggunaan ---
pdf_file = 'path/to/your/document.pdf'
fast_extracted_text = extract_text_with_pymupdf(pdf_file)
if "Error" not in fast_extracted_text:
print("--- Teks hasil ekstraksi (metode cepat) ---")
print(fast_extracted_text)
else:
print(fast_extracted_text)
Untuk throughput murni pada PDF berbasis teks, PyMuPDF adalah pilihan terbaik tanpa banyak perdebatan.
Kasus khusus: menangani PDF hasil scan dengan OCR
Mungkin Anda bertanya-tanya: bagaimana kalau semua metode di atas tidak bekerja? Jika Anda menjalankan kode tadi pada dokumen hasil scan—misalnya foto kontrak atau halaman buku yang didigitalkan—hasilnya biasanya hanya string kosong.
Ini terjadi karena tidak ada text layer di dalam file tersebut. PDF itu berisi gambar, bukan karakter teks. Solusinya, Anda perlu Optical Character Recognition (OCR) untuk "membaca" gambar lalu mengubahnya menjadi teks yang bisa diproses mesin.
Solusi standar di Python adalah pytesseract, yaitu wrapper untuk engine Tesseract OCR milik Google. Walau powerful, ada satu kendala besar: Anda harus menginstal Tesseract secara terpisah di sistem Anda (misalnya lewat brew di Mac atau installer di Windows) dan memastikan Python bisa menemukan executable-nya. Setup seperti ini bisa cukup rapuh, terutama saat deploy code ke server atau membagikannya ke rekan kerja.
Alternatif: pra-proses PDF kompleks dengan tool no-code
Kalau deadline Anda mepet atau Anda tidak ingin repot mengelola dependensi OCR, alternatif yang praktis adalah menyerahkan proses ekstrak teks ke tool khusus terlebih dahulu. Dengan begitu, masalah OCR yang kompleks dipisahkan dari logika inti Python Anda.
Tool berbasis AI seperti ekstraktor teks PDF AI Lynote bisa berfungsi sebagai pre-processor yang andal. Anda cukup upload PDF scan yang sulit dibaca, lalu tool ini akan menangani OCR di belakang layar dan menghasilkan teks bersih yang bisa langsung dimasukkan ke script Anda. Pendekatan ini sangat berguna untuk tugas sekali pakai atau saat Anda hanya menangani sejumlah kecil file bermasalah.
Alur kerjanya sesederhana ini:
- Upload file PDF Anda. Buka workspace Lynote. Di tab 'Upload File', Anda bisa drag-and-drop PDF atau memilih file dari komputer. Cara ini bisa dipakai untuk PDF berbasis teks maupun PDF berbasis gambar hasil scan.
- Ekstrak teks dari PDF. Setelah file terunggah, klik tombol "Create Note". Mesin AI Lynote akan memproses dokumen, otomatis menerapkan OCR jika mendeteksi file berbasis gambar, lalu membuat versi teks yang bersih dan bisa dicari.
- Salin teks hasil ekstraksi. Setelah teks muncul di editor, Anda bisa meninjaunya, melakukan koreksi kecil jika perlu, lalu memakai tombol salin untuk mengambil seluruh isi teks. Sekarang teks tersebut sudah ada di clipboard dan siap ditempel ke script Python Anda sebagai variabel string.


Pendekatan ini membuat Anda bisa fokus ke analisis data dalam code, bukan ke infrastruktur dan penanganan error dari setup OCR lokal.
Kendala umum dan tips lanjutan
Mengekstrak teks dari PDF jarang berjalan sempurna. Berikut beberapa masalah umum yang paling sering muncul:
- Encoding karakter: Anda bisa saja menemui
UnicodeDecodeError. Ini sering terjadi pada PDF lama atau PDF yang dibuat dengan software yang kurang umum. Sebagian besar library modern sudah menanganiUTF-8dengan baik, tetapi pada beberapa kasus, menentukan encoding secara manual bisa membantu jika library tersebut mendukungnya. - PDF yang dilindungi kata sandi: Jika PDF memerlukan password untuk dibuka, semua library ini akan gagal membacanya. Anda harus memberikan password saat proses membuka file. Contohnya,
PyPDF2.PdfReader(file, password='your_password'). - Format hilang: Perlu diingat, ekstrak teks dari PDF hampir selalu menghilangkan format seperti bold, italic, ukuran font, dan warna. Yang Anda dapatkan adalah konten teks mentah, bukan tampilan visual dokumen.
- Teks berantakan pada layout kolom: Seperti yang dibahas pada PyPDF2, layout multi-kolom (misalnya pada paper akademik) bisa membuat teks dari kolom yang berbeda tercampur.
pdfplumberjauh lebih baik untuk kasus ini karena memahami geometri dan struktur halaman.
Catatan ahli: Selalu uji script Anda pada sampel dokumen yang benar-benar mewakili data asli. Solusi yang bekerja sempurna pada satu PDF bisa gagal total pada PDF lain dari sumber yang berbeda.
Pertanyaan yang Sering Diajukan
Kenapa hasil ekstrak teks dari tabel saya berubah jadi satu string panjang yang berantakan?
Ini adalah mode kegagalan klasik pada library seperti PyPDF2 yang tidak melakukan analisis layout halaman. Library tersebut membaca aliran teks mentah sesuai urutan penyimpanannya di file, yang sering kali tidak sama dengan struktur baris dan kolom yang terlihat di dokumen. Solusinya, Anda harus memakai library yang memahami layout seperti **pdfplumber**, karena library ini memang dirancang untuk mengenali data tabel.
Apakah Python bisa mengambil teks dari area tertentu di halaman PDF?
Bisa, tetapi Anda memerlukan library yang menyediakan informasi koordinat. pdfplumber dan PyMuPDF sangat cocok untuk kebutuhan ini. Dengan pdfplumber, Anda bisa memakai metode .crop((x0, top, x1, bottom)) untuk membuat bounding box, lalu menjalankan .extract_text() atau .extract_tables() hanya pada area yang sudah dipotong tersebut.
Kenapa hasil ekstrak teks kosong pada PDF hasil scan saya?
PDF Anda berisi gambar teks, bukan data teks yang sebenarnya. Library standar tidak bisa "membaca" gambar secara langsung. Anda perlu memakai proses Optical Character Recognition (OCR). Anda bisa menyiapkan engine OCR lokal dengan pytesseract, atau memakai alat pra-pemrosesan seperti Lynote untuk mengonversi PDF berbasis gambar menjadi teks yang lebih bersih terlebih dahulu.
Bagaimana cara menangani PDF dengan banyak bahasa?
Library modern seperti PyMuPDF dan pdfplumber umumnya sudah menangani Unicode dengan baik, sehingga mendukung sebagian besar bahasa. Tantangan utamanya biasanya muncul saat proses OCR. Misalnya, Tesseract mengharuskan Anda mengunduh dan menentukan paket bahasa yang ingin dipakai (contoh: -l eng+fra untuk bahasa Inggris dan Prancis).
Kesimpulan: Memilih Tool PDF Python yang Tepat
Tidak ada satu library yang bisa disebut paling terbaik untuk ekstrak teks dari PDF di Python. Pilihan yang tepat selalu bergantung pada jenis dokumen yang Anda olah dan tujuan proyek Anda.
Supaya lebih mudah, berikut ringkasan keputusan sederhananya:
- Jika PDF Anda berupa dokumen sederhana berbasis teks dan Anda hanya butuh konten mentahnya, PyPDF2 adalah opsi yang paling mudah dan cepat untuk diterapkan.
- Jika PDF Anda berisi tabel atau layout terstruktur yang perlu diubah menjadi data (misalnya untuk dimasukkan ke database atau Pandas DataFrame), pdfplumber adalah pilihan paling unggul.
- Jika Anda memproses dokumen dalam jumlah besar dan kecepatan menjadi prioritas utama, PyMuPDF (Fitz) adalah opsi yang paling kuat dan paling tinggi performanya.
- Jika Anda menangani PDF hasil scan yang berbasis gambar, Anda wajib menggunakan OCR. Jika ingin solusi yang cepat dan andal tanpa repot setup lokal yang kompleks, pra-pemrosesan file dengan tool eksternal sering menjadi langkah paling praktis sebelum teks bersihnya diproses lagi di environment Python Anda.
Mulailah dari tool paling sederhana yang sudah memenuhi kebutuhan Anda, lalu siap beralih ke opsi yang lebih kuat saat kompleksitas dokumen Anda meningkat.


