Cara mengambil jumlah dalam PDF, posisinya di halaman
Artikel ini mendemonstrasikan penggunaan PyMuPDF untuk menemukan jumlah teks berulang dalam persegi panjang tertentu. Dengan mengurai lima bidang pertama dari kata oktet dan memverifikasi jumlah kandidat, kesalahan penilaian dalam penyambungan fragmen dapat dihindari. Memberikan contoh Python tingkat memori, strategi pemrosesan batas, dan tabel penerimaan, serta memberikan saran praktis untuk menghubungkan dengan alur kerja terjemahan dokumen OmniDoc.
Bagaimana cara menemukan jumlah duplikat? Kesimpulan satu kalimat
Ketika tata letaknya sudah diperbaiki, pertama-tama batasi area yang diketahui dan kemudian periksa teksnya, dan serahkan jumlah kandidat kepada penelepon untuk dinilai. Hal ini lebih mudah untuk ditafsirkan daripada terus menumpuk ekspresi reguler, dan kecil kemungkinannya untuk membuat kesalahan diam-diam.
| situasi Anda | Praktik yang direkomendasikan | alasan |
|---|---|---|
| Jumlah yang sama muncul di beberapa tempat pada halaman | Batasi pencarian pada area persegi panjang tempat lapangan usaha berada lalu lakukan pencarian | Pencarian teks lengkap tidak dapat menentukan bidang mana yang merupakan bidang bisnis |
| Ada banyak kandidat di area kueri | Kembalikan semua kandidat, dikombinasikan dengan label atau disambiguasi manual | Program tidak boleh menentukan pilihan bagi bisnis |
| Tidak ada hasil di area kueri | Tandai alasannya dan periksa halaman aslinya, tanpa bantalan nol | Wilayah yang salah, jumlah yang terpecah, atau lapisan teks yang hilang dapat mengakibatkan hasil nihil |
| Posisi frame terlihat offset | Rantai transformasi eksplisit untuk rotasi, pemotongan, dan penskalaan rendering | Mencampur koordinat tampilan dan koordinat yang diekstraksi akan menyebabkan penyimpangan |
Dua jumlah yang identik dalam satu laporan
1,200.00 muncul dua kali dalam laporan: sekali pada kolom jumlah terutang dan sekali pada teks uraian. Pencarian teks lengkap dapat menemukannya, tetapi tidak dapat memutuskan mana bidang bisnisnya.
Jika tata letak formulir sudah diperbaiki, biasanya lebih mudah untuk menafsirkannya dengan terlebih dahulu membatasi area yang diketahui dan kemudian mencari teks daripada terus menyesuaikan ekspresi reguler. Kuncinya bukanlah "menemukan hanya satu kotak", tetapi memperlakukan nol hit dan multiple hit sebagai hasil yang jelas, dan tidak membiarkan program membuat pilihan yang tidak sah.
Tinggalkan posisi kata, bukan hanya teks
`page.get_text("words")` PyMuPDF mengembalikan catatan kata dengan posisi, bidang umum adalah (x0, y0, x1, y1, text, block_no, line_no, word_no). Contoh berikut hanya mengambil lima bidang pertama, dan tiga angka terakhir tidak terlibat dalam pemfilteran regional untuk saat ini.
"Kata" di sini adalah penggalan yang diberikan oleh ekstraktor, yang belum tentu sama dengan sebuah kata dalam pengertian linguistik, juga tidak ada jaminan bahwa suatu jumlah akan selalu menjadi penggalan yang lengkap. 1,200.00 dapat dibongkar atau mungkin memiliki tag yang berdekatan. Artikel ini hanya membahas pencocokan persis dari fragmen lengkap: Saya lebih suka menyerahkan catatan yang tidak memenuhi persyaratan untuk ditinjau daripada secara diam-diam membaginya ke dalam jumlah yang tampaknya legal.
Verifikasi dengan dua halaman sintetis dengan jumlah yang sama
Kami membuat halaman PDF baru di memori dan menempatkan jumlah yang sama di dekat koordinat vertikal masing-masing 120 dan 420. Area kueri hanya mencakup jumlah di atas.
Titik penyisipan teks adalah posisi garis dasar, bukan sudut kiri atas kotak teks. Tinggi dan lebar kotak sebenarnya akan dipengaruhi oleh font dan ukuran font, sehingga koordinat tidak dapat dikodekan secara permanen menjadi nilai tetap.
Output yang benar harus memenuhi dua kondisi:
- Hanya ada satu kandidat di area kueri, dan persegi panjang kandidat sepenuhnya termasuk dalam area tersebut.
- Setelah memperluas cakupan kueri ke seluruh halaman, dua kandidat harus diperoleh, sehingga memasuki cabang ambiguitas.
Terakhir, periksa zero hits dengan string yang tidak ada di halaman. Ini lebih dekat dengan kontrak yang dibutuhkan oleh antarmuka nyata daripada sekadar menunjukkan pencarian yang berhasil.
Kode yang dapat dijalankan: menyerahkan nomor kandidat kepada penelepon
Ketergantungannya adalah pymupdf, silakan instal dan kunci versi di lingkungan pengujian. Kode berikut tidak mengakses jaringan, tidak menulis file, dan tidak mengubah dokumen pelanggan asli. Itu hanya membuat PDF demonstrasi.
import pymupdf
def locate(page, target, query):
query = pymupdf.Rect(query)
candidates = []
for word in page.get_text("words"):
x0, y0, x1, y1, text = word[:5]
box = pymupdf.Rect(x0, y0, x1, y1)
if text == target and query.contains(box):
candidates.append(tuple(box))
return candidates
def decide(candidates):
if len(candidates) == 0:
return "missing"
if len(candidates) > 1:
return "ambiguous"
return "unique"
with pymupdf.open() as doc:
page = doc.new_page(width=595, height=842)
page.insert_text((80, 120), "1,200.00", fontsize=11)
page.insert_text((80, 420), "1,200.00", fontsize=11)
query = pymupdf.Rect(72, 100, 300, 150)
local = locate(page, "1,200.00", query)
assert decide(local) == "unique"
assert query.contains(pymupdf.Rect(local[0]))
assert decide(locate(page, "1,200.00", page.rect)) == "ambiguous"
assert decide(locate(page, "999.99", query)) == "missing"
print("unique / ambiguous / missing cases passed")
contains memerlukan penyertaan menyeluruh, bukan sekadar menyentuh batas wilayah. Jika kotak kueri terlalu sempit, jumlah sampingan mungkin jatuh ke dalam nol klik, yang bukan merupakan alasan mengapa kotak tersebut secara otomatis melebar ke halaman penuh. Anda harus memeriksa sistem koordinat yang digunakan untuk mengukur luas sebelum memutuskan bagaimana menyesuaikan rentangnya.
Jika perusahaan mengizinkan titik pusat untuk jatuh, peraturan tambahan harus dibuat dan pengujian tambahan untuk batas yang tumpang tindih harus dilakukan. Jangan diam-diam mengubah arti penghakiman dalam fungsi yang sama.
Logika produksi tidak boleh hanya mengandalkan assert untuk mencegat pengecualian, karena mode pengoptimalan dapat menghapus pernyataan. Pernyataan dalam contoh digunakan untuk pemeriksaan regresi. Saat benar-benar mengakses antrian tugas, cabang bersyarat dan status bisnis yang jelas harus digunakan.
Tiga hasil, tiga metode pemrosesan
Hasil kueri biasanya dibagi menjadi tiga kategori, masing-masing memerlukan tindakan pemrosesan berbeda:
- Hanya satu pukulan: Hanya ada satu fragmen lengkap yang cocok di area tersebut, dan nomor halaman, teks asli, persegi panjang, dan versi aturan disimpan.
- Zero hit: Mungkin areanya salah, jumlahnya terpecah, atau lapisan teksnya hilang. Tandai kandidat penyebabnya, periksa halaman aslinya, dan jangan tambahkan angka nol.
- Beberapa Hit: Ada jumlah duplikat di area yang sama, atau templat telah berubah, mengembalikan semua kandidat, menggabungkan label, atau disambiguasi manual.
Dua situasi lainnya juga perlu ditangani secara terpisah:
- Ada bingkai tetapi nilainya salah: Lapisan teks itu sendiri mungkin salah, atau target pencocokannya salah. Anda harus kembali ke halaman asli untuk memeriksa dan mencegah koordinat mendukung nilai.
- Pergeseran tampilan bingkai: Koordinat tampilan dan koordinat ekstraksi mungkin tercampur, dan rantai transformasi rotasi, pemotongan, dan penskalaan rendering harus jelas.
📊 Perbandingan inti
| Metode kueri | Kriteria penilaian | butuh perhatian |
|---|---|---|
| Penyertaan lengkap (contoh diadopsi) | Kandidat persegi panjang sepenuhnya berada dalam area kueri | Jika kotak kueri terlalu sempit, jumlah di samping mungkin tidak mendapat hasil. |
| Titik pusatnya jatuh (perlu menulis aturan lain) | Titik pusat kandidat berada dalam wilayah tersebut | Tumpang tindih batas memerlukan pengujian terpisah |
| Kueri halaman penuh | Cari semua kandidat | Hasilnya sebagian besar bersifat ambigu dan memerlukan pelabelan atau penilaian manual lebih lanjut. |
Ini bukan ekstraktor jumlah universal
Kode ini tidak mengurai mata uang, pemisah ribuan, atau aturan desimal, juga tidak mengenali semantik seperti "hutang pada periode ini" versus "saldo pada periode sebelumnya". Hanya karena hanya ada satu kandidat bukan berarti makna bisnisnya benar.
Pemindaian juga harus memiliki teks dan lokasi yang tersedia terlebih dahulu. Halaman dengan lapisan teks tetapi kontennya salah tidak dapat dilepaskan hanya karena dapat disalin.
Artikel ini menggunakan halaman sintetis yang tidak dirotasi. Saat halaman sebenarnya diputar, Anda harus terlebih dahulu menunjukkan apakah kotak kueri berasal dari layar tampilan atau koordinat yang diekstraksi, lalu mengonversinya jika perlu. Jangan mengalikan dengan matriks apapun sumbernya.
Saat menyimpan halaman sumber, Anda juga harus membedakan antara indeks berbasis nol dan nomor halaman berorientasi manusia untuk menghindari pengulas salah mengira bahwa bukti tidak ada setelah membuka halaman yang berdekatan.
🎯 Metode mana yang cocok untuk Anda?
Jika Anda perlu mendapatkan nomor dari formulir tata letak tetap
Batasi dulu area tempat bidang usaha itu berada, lalu cari jumlahnya, dan simpan nomor halaman, persegi panjang, dan versi aturannya.
Jika Anda menemui banyak kandidat
Jangan langsung mengambil yang pertama, mengembalikan semua kandidat, dan menentukan bidang usaha berdasarkan label atau penilaian manual.
Jika laman Anda sering kali tidak mendapat hasil sama sekali
Periksa koordinat area, apakah jumlahnya terbagi, dan apakah lapisan teks ada sebelum memutuskan untuk menyesuaikan rentang atau menggunakan rute ekstraksi lain.
Jika Anda ingin melakukan penerjemahan dokumen
Gabungkan konten utama seperti jumlah, tanggal, kuantitas, dll. ke dalam tinjauan manual, dan miliki pembagian kerja yang jelas antara inspeksi teknis dan tinjauan manual.
Tinggalkan tokoh-tokoh penting untuk tinjauan pasca terjemahan
Penerjemahan dokumen tidak hanya bergantung pada kelancaran kalimatnya, tetapi juga isi utama seperti jumlah, tanggal, dan kuantitas harus dikonfirmasi satu per satu. OmniDoc (portal produk) menyediakan portal terjemahan untuk berbagai dokumen. Perbandingan bilingual yang diperkenalkan di situs resmi dapat digunakan sebagai portal ulasan; skrip penentuan posisi koordinat cocok untuk menyimpan bukti teks asli dan membantu menemukan area masalah.
Disarankan untuk terlebih dahulu menggunakan sampel yang tidak peka yang Anda punya izin untuk mengunggahnya untuk evaluasi. Ketika terjemahan menjadi lebih panjang, posisi konten dapat berubah secara wajar. "Koordinat lama dan baru persis sama" tidak dapat dianggap sebagai syarat sulit untuk penerjemahan yang benar.
Pemeriksaan yang lebih berharga adalah: apakah jumlahnya dipertahankan, apakah mata uangnya jelas, dan apakah label yang bersangkutan masih menunjukkan arti bisnis yang sama.
❓ Pertanyaan yang Sering Diajukan (FAQ)
1. Mengapa tidak menerima pukulan pertama saja?
Karena pencarian teks lengkap hanya dapat memberi tahu di mana jumlah tersebut muncul, tidak dapat menentukan tempat mana yang menjadi ladang usahanya. Ambil saja pukulan pertama dan hasilnya mungkin terlihat benar, namun sumbernya mungkin salah.
2. Mengapa kotak kueri harus disertakan sepenuhnya, bukan hanya menyentuh tepinya saja?
Contoh ini menggunakan metode penentuan penyertaan lengkap untuk menghindari memperlakukan fragmen yang tidak lengkap sebagai klik yang valid. Jika kotak kueri terlalu sempit dan menghasilkan nol hit, sistem koordinat dan rentang harus dicentang terlebih dahulu daripada melebarkan secara otomatis ke satu halaman penuh.
3. Apa yang harus Anda lakukan jika hasil kuerinya nol?
Tandai kandidat penyebab dan periksa halaman asli tanpa padding nol. Area yang salah, jumlah yang terpecah, atau lapisan teks yang hilang semuanya dapat menghasilkan hasil nihil.
4. Apakah kode ini bisa langsung digunakan untuk tagihan asli?
Itu tidak dapat digunakan secara langsung. Contohnya tidak berhubungan dengan mata uang, pemisah ribuan, dan semantik bisnis, dan contoh sintetik dalam artikel ini tidak mewakili uji keakuratan uang kertas sebenarnya.
📝 Ringkasan
Saat menemukan jumlahnya, pertama-tama batasi areanya, lalu serahkan jumlah lengkap kandidat kepada penelepon untuk dinilai. Harus ada tindakan pemrosesan yang jelas untuk zero hits dan multiple hits. Pertama-tama gunakan sampel yang tidak peka untuk memverifikasi aturan, dan kemudian secara bertahap mengakses dokumen nyata.


