Laporan PDF sering terlihat seperti satu dokumen, padahal di dalamnya ada lapisan teks, gambar hasil pindai, tabel, grafik, dan catatan kaki. Mengirim seluruh berkas ke model lalu meminta “ambil semua angka” dapat menghasilkan tabel rapi yang salah membaca satuan atau memasangkan angka dengan kolom yang keliru.
Dokumentasi PDF Claude menjelaskan pengolahan teks dan unsur visual; kemampuan aktual juga bergantung pada jalur API serta model. Panduan vision menunjukkan bahwa gambar merupakan masukan tersendiri. Rancangan berikut memakai contoh laporan fiktif untuk membangun pipeline ekstraksi yang dapat diperiksa, bukan mengklaim akurasi OCR suatu produk.
Inventaris halaman sebelum ekstraksi
Buat klasifikasi sederhana per halaman: teks digital, pindai, tabel padat, grafik, atau campuran. Catat rotasi, jumlah kolom, bahasa, dan kebutuhan resolusi. Halaman yang dapat diekstrak sebagai teks tetap perlu diperiksa urutan bacanya; PDF dua kolom bisa menghasilkan paragraf yang tercampur.
Jangan menghapus nomor halaman sumber ketika memecah dokumen. Nomor halaman berkas dan nomor tercetak dapat berbeda akibat sampul serta daftar isi. Simpan keduanya bila tersedia. Editor harus dapat menemukan sel yang dimaksud tanpa menebak halaman mana yang dipakai sistem.
Untuk data sensitif, seleksi halaman dan bidang yang benar-benar diperlukan sebelum mengirim ke layanan. Thumbnail, nama berkas, dan metadata dokumen juga dapat membawa informasi. Menghapus nama dari teks hasil ekstraksi tidak otomatis membersihkan berkas aslinya.
Keluaran harus membawa lokasi bukti
Rancang setiap nilai sebagai gabungan data dan provenance. Contoh berikut bukan skema resmi provider:
{
"document_id": "report-demo",
"revision": "r1",
"page_index": 3,
"printed_page": "2",
"table_id": "T01",
"field": "revenue",
"raw_text": "1.234,50",
"normalized": "1234.50",
"unit": "juta rupiah",
"period": "2026-Q3",
"bbox_normalized": [0.12, 0.31, 0.44, 0.38]
}
Koordinat di contoh menggunakan rentang 0–1 terhadap halaman setelah orientasi diperbaiki. Ini konvensi aplikasi sendiri, bukan jaminan format koordinat provider. Simpan transformasi bila halaman di-crop atau dirotasi, sehingga kotak bukti bisa dipetakan kembali ke gambar sumber.
Nilai 1234.50 tanpa unit akan kehilangan arti. Menganggap “juta rupiah” sebagai “rupiah” menciptakan kesalahan besar walaupun semua digit terbaca benar. Periode dan tanda negatif harus diperlakukan sebagai bagian dari fakta.
Normalisasi angka membutuhkan asumsi yang eksplisit
Pemisah ribuan dan desimal berbeda menurut format dokumen. Kode lokal berikut sengaja hanya menerima format Indonesia tertentu. Ia menolak pola yang tidak dikenali daripada menebaknya:
import re
from decimal import Decimal
def parse_id_number(raw):
pattern = r"-?(?:\d{1,3}(?:\.\d{3})+|\d+)(?:,\d+)?"
value = raw.strip()
if not re.fullmatch(pattern, value):
raise ValueError("Format angka Indonesia tidak dikenali")
return Decimal(value.replace(".", "").replace(",", "."))
print(parse_id_number("1.234,50"))
print(parse_id_number("-25,75"))
Fungsi tersebut tidak menangani kurung sebagai tanda negatif, persen, mata uang, atau notasi ilmiah. Tambahkan aturan terpisah setelah format sumber diketahui. Simpan raw_text agar perubahan parser dapat dievaluasi ulang tanpa mengekstrak dokumen dari awal.
Gunakan tipe desimal ketika aritmetika dokumen menuntut ketepatan desimal. Jangan menormalisasi angka lewat substitusi karakter yang sama untuk semua dokumen; sumber berbahasa Inggris dapat memakai titik sebagai desimal.
Tabel perlu header dan hubungan baris
Satu sel dapat mewarisi tahun dari header atas, kategori dari kolom kiri, dan satuan dari judul tabel. Jika potongan gambar hanya menampilkan angka, model kehilangan informasi yang diperlukan untuk memberi label.
Pisahkan ekstraksi struktur dari interpretasi. Tahap pertama mengenali baris, kolom, header bertingkat, dan sel gabungan. Tahap berikutnya memetakan nilai ke konsep yang dipakai aplikasi. Simpan sel kosong sebagai kosong; jangan mengisi dengan nilai baris sebelumnya kecuali dokumen memang memakai konvensi itu.
Lakukan pemeriksaan rekonsiliasi. Jika tiga komponen seharusnya menjumlah ke total, hitung selisihnya. Tentukan toleransi berdasarkan pembulatan pada sumber, bukan angka universal. Ketidaksesuaian tidak selalu berarti OCR salah: sumber dapat membulatkan komponen atau memberi catatan penyesuaian.
Grafik tidak sama dengan tabel angka
Sebuah batang yang tampak dua kali lebih tinggi belum tentu merepresentasikan nilai dua kali lipat bila sumbu dipotong atau skalanya logaritmik. Periksa label, legenda, rentang sumbu, dan catatan sebelum menyimpulkan tren.
Untuk angka yang hanya diperkirakan dari visual, beri label estimasi dan batas ketelitian. Jangan menggabungkannya dengan nilai tabel yang presisi seolah keduanya setara. Bila tersedia tabel data pendamping, prioritaskan data itu untuk penghitungan dan gunakan grafik sebagai pemeriksaan konteks.
| Kegagalan | Pemeriksaan yang membantu | Jalur penanganan |
|---|---|---|
| Digit keliru | Cocokkan crop sumber | Review nilai |
| Kolom tahun tertukar | Periksa header lengkap | Ekstrak ulang struktur |
| Satuan hilang | Cocokkan judul dan catatan | Tahan penghitungan |
| Grafik ditafsirkan terlalu presisi | Periksa skala dan data pendamping | Label estimasi |
| Teks catatan terlewat | Audit bagian bawah halaman | Lengkapi konteks |
Evaluasi per bidang dan per halaman
Siapkan sampel yang mencakup PDF digital, pindai berkualitas rendah, tabel dengan header bertingkat, dan angka negatif. Label rujukan perlu memuat nilai, unit, periode, serta lokasi. Menilai kesamaan teks saja dapat melewatkan kesalahan hubungan kolom.
Ukur field accuracy, kesalahan unit, sel yang hilang, dan proporsi halaman yang membutuhkan review. Catat biaya serta waktu review per halaman yang diterima. Ukuran itu membantu memilih kapan ekstraksi otomatis bermanfaat dan kapan pembacaan manual lebih efisien.
Sebelum menyebarkan hasil sebagai slide atau video, hubungkan angka ke manifest klaim. Pipeline review Gemini Notebook memberi contoh pemeriksaan antarformat. Koreksi satu sel harus dapat dilacak ke semua artikel, grafik, dan ringkasan yang menggunakannya.