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 AndaPraktik yang direkomendasikanalasan
Jumlah yang sama muncul di beberapa tempat pada halamanBatasi pencarian pada area persegi panjang tempat lapangan usaha berada lalu lakukan pencarianPencarian teks lengkap tidak dapat menentukan bidang mana yang merupakan bidang bisnis
Ada banyak kandidat di area kueriKembalikan semua kandidat, dikombinasikan dengan label atau disambiguasi manualProgram tidak boleh menentukan pilihan bagi bisnis
Tidak ada hasil di area kueriTandai alasannya dan periksa halaman aslinya, tanpa bantalan nolWilayah yang salah, jumlah yang terpecah, atau lapisan teks yang hilang dapat mengakibatkan hasil nihil
Posisi frame terlihat offsetRantai transformasi eksplisit untuk rotasi, pemotongan, dan penskalaan renderingMencampur 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 kueriKriteria penilaianbutuh perhatian
Penyertaan lengkap (contoh diadopsi)Kandidat persegi panjang sepenuhnya berada dalam area kueriJika kotak kueri terlalu sempit, jumlah di samping mungkin tidak mendapat hasil.
Titik pusatnya jatuh (perlu menulis aturan lain)Titik pusat kandidat berada dalam wilayah tersebutTumpang tindih batas memerlukan pengujian terpisah
Kueri halaman penuhCari semua kandidatHasilnya 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.

Coba sekarang: Unggah dokumen untuk memulai penerjemahan, dengan tetap mempertahankan tata letak aslinya

Diperbarui 2026-11-14