Apakah PDF memerlukan OCR? Gunakan PyMuPDF untuk pra-inspeksi halaman demi halaman, daripada mengidentifikasi ulang seluruh salinan
Apakah PDF membutuhkan OCR atau tidak, tidak perlu mengidentifikasi ulang seluruh dokumen. Menggunakan PyMuPDF untuk memeriksa halaman demi halaman apakah ada lapisan teks atau gambar halaman penuh, hanya mengirim halaman yang benar-benar dibutuhkan untuk pengenalan. Termasuk sampel yang dapat dijalankan, tes halaman yang diputar, dan penjelasan batas pengalihan.
Banyak tim cenderung memberi label seluruh dokumen sebagai "scan" atau "copyable" pada titik masuk saat menangani terjemahan atau pengarsipan PDF. PDF sepanjang 300 halaman mungkin memiliki lapisan teks untuk 280 halaman pertama, dengan hanya 20 halaman terakhir yang dipindai sebagai lampiran. Jika diklasifikasikan berdasarkan file utuh, seluruh OCR akan memperpanjang waktu tunggu dan bahkan bisa salah mengidentifikasi angka yang awalnya benar. Sebaliknya, hanya melihat bahwa halaman utama dapat menyalin teks dan membuat semua halaman melewati OCR juga berisiko.
Pendekatan yang lebih andal adalah membiarkan setiap halaman membawa hasil pra-skrining ke tahap berikutnya. Makalah ini menerapkan pembagian tiga saluran yang konservatif: ekstraksi langsung, pengiriman ke antrean kandidat OCR, dan inspeksi manual. Ini adalah heuristik rekayasa yang dapat diinterpretasikan, bukan klasifikator universal untuk menilai kualitas teks. Setelah membaca, Anda akan menerima program pra-penerbangan yang dapat dijalankan halaman demi halaman, beserta batas pengalihan dan strategi penanganan kesalahan yang umum.
Kesimpulan satu kalimat
Anda tidak perlu memeriksa seluruh PDF untuk OCR; gunakan PyMuPDF untuk memeriksa halaman demi halaman, hanya mengirim halaman yang benar-benar perlu dikenali ke OCR.
| Situasi Anda | Resep yang direkomendasikan | Alasannya |
|---|---|---|
| Ekstrak setidaknya 40 karakter yang tidak kosong dari satu halaman | Ekstraksi Langsung (TEXT_CANDIDATE) | Sudah ada cukup banyak karakter, tapi lapisan OCR buruk tersembunyi masih perlu diperiksa secara mendadak |
| Kurang dari 40 kata, dan satu gambar harus menutupi setidaknya 70% halaman | Dikirim ke antrean kandidat OCR | Pemindaian halaman penuh cocok untuk pengenalan, tetapi foto murni juga memenuhi persyaratan |
| Halaman kosong, teks vektor, judul yang jarang, atau teka-teki kompleks | Inspeksi Manual (ULASAN) | Situasi-situasi ini tidak dapat diklasifikasikan secara andal ke dalam dua kategori pertama dan tidak dapat secara otomatis dilewati atau dibuang |
| Dokumen campuran sepanjang 300 halaman | Pra-periksa halaman demi halaman, jangan proses semua salinan | Hindari melakukan OCR pada semua halaman karena memindai beberapa lampiran, atau melewati semua OCR karena halaman utama berisi teks |
Catatan: Konten dalam gambar berasal dari PDF komposit yang dihasilkan oleh kode berikut, bukan file klien, maupun antarmuka OmniDoc. Teks pada halaman gambar adalah piksel grid; Teks di halaman teks memiliki lapisan teks yang nyata.
Pertama, putuskan apa yang akan diperiksa
Di sini, dua sinyal digunakan: jumlah karakter teks setelah penghapusan ruang kosong, dan proporsi gambar terbesar di halaman terhadap area halaman. Yang pertama menjawab "Apakah karakter sudah cukup diekstrak?" Yang kedua membantu membedakan antara pemindaian halaman penuh dan halaman kosong. Area gambar akan terlebih dahulu berpotongan dengan kotak potong untuk menghindari melebihi skala zoom gambar pada halaman.
| Pengamatan | Artikel ini dibagi menjadi beberapa alur | Perhatian masih dibutuhkan |
|---|---|---|
| Setidaknya 40 karakter yang tidak kosong | TEXT_CANDIDATE | Lapisan OCR buruk tersembunyi juga mungkin memiliki banyak kata |
| Kurang dari 40 kata dan cakupan minimal 70% dari satu gambar | OCR_CANDIDATE | Foto murni juga memenuhi persyaratan; OCR mungkin tidak bermakna |
| Sisa situasi | REVIEW | Ruang kosong, teks vektor, judul yang jarang, dan teka-teki kompleks semuanya bisa ada di sini |
Ambang batas 40 dan 0,70 dimaksudkan untuk memudahkan audit dalam rangkaian tes ini, bukan standar lintas bahasa. Bahasa Mandarin, formula, sampul, dan bentuk pendek harus diberi label terpisah. Di sini, gambar terbesar berdasarkan luas diambil, bukan hanya menambahkan area gambar yang saling tumpang tindih. Oleh karena itu, halaman yang dipindai yang terdiri dari beberapa gambar dapat masuk ke REVIEW. Ini adalah batas yang sengaja dipertahankan.
Sampel lengkap yang dapat dijalankan
Sampel ini menggunakan PyMuPDF==1.28.0, tidak bergantung pada Tesseract, dan tidak memanggil layanan OCR atau terjemahan online apa pun. Simpan sebagai example.py dan jalankan di direktori kosong. Nama file yang dibuat tetap menjadi routing-fixture.pdf. Untuk proyek nyata, harap jangan menimpa file input.
import json
import pymupdf
def inspect_page(page):
chars = len("".join(page.get_text().split()))
bounds = page.cropbox
# 图片坐标与文本坐标都是未旋转坐标;不要混用旋转后的 page.rect。
bounds = pymupdf.Rect(0, 0, bounds.width, bounds.height)
ratios = []
for image in page.get_image_info():
rect = pymupdf.Rect(image["bbox"]) & bounds
ratios.append(max(0, rect.get_area()) / bounds.get_area())
largest = max(ratios, default=0.0)
route = ("TEXT_CANDIDATE" if chars >= 40 else
"OCR_CANDIDATE" if largest >= 0.70 else "REVIEW")
return {"page": page.number + 1, "chars": chars,
"largest_image_ratio": round(largest, 3), "route": route}
with pymupdf.open() as source:
page = source.new_page(width=360, height=480)
page.insert_text((28, 60), "Sample invoice 2026-09-26", fontsize=16)
page.insert_text((28, 100), "Quantity 12 Unit price USD 15.00", fontsize=12)
page.insert_text((28, 132), "Amount USD 180.00 Checked manually", fontsize=12)
scan = page.get_pixmap(matrix=pymupdf.Matrix(2, 2)).tobytes("png")
page = source.new_page(width=360, height=480)
page.insert_image(page.rect, stream=scan)
source.new_page(width=360, height=480)
source.save("routing-fixture.pdf")
with pymupdf.open("routing-fixture.pdf") as pdf:
result = [inspect_page(page) for page in pdf]
assert [r["route"] for r in result] == [
"TEXT_CANDIDATE", "OCR_CANDIDATE", "REVIEW"]
assert result[1]["chars"] == 0
assert result[1]["largest_image_ratio"] == 1.0
pdf[1].set_rotation(90)
assert inspect_page(pdf[1])["route"] == "OCR_CANDIDATE"
print(json.dumps(result, indent=2))
Saat mengakses OCR, cache TextPage, bukan penanda keberhasilan
Antarmuka OCR PyMuPDF adalah page.get_textpage_ocr(...). Tesseract dan data bahasa terkait perlu disiapkan secara terpisah. Setelah memperoleh TextPage, ekstraksi selanjutnya harus meneruskannya sebagai parameter textpage untuk menghindari pengenalan duplikat pada halaman yang sama. Untuk metode instalasi dan parameter spesifik, silakan lihat Dokumen OCR PyMuPDF.
Artikel ini tidak menjalankan mesin OCR, sehingga hasil pengujian hanya membuktikan bahwa logika distribusi dan penggunaan koordinat benar, dan tidak mewakili tingkat pengenalan bahasa Mandarin, laju pemulihan tabel, atau kualitas terjemahan. Dalam produksi, versi mesin OCR, paket bahasa, nomor halaman, ringkasan file input, dan hasil sampling manual harus dicatat. Jangan hanya menyimpan string terakhir, karena akan sulit untuk menafsirkan halaman mana sebuah angka berasal.
Tiga Jenis Kesalahan yang Paling Mudah Diabaikan
Lapisan teks tersembunyi mungkin berupa teks yang kacau. Memenuhi jumlah karakter hanya berarti "Anda dapat terus mencoba ekstraksi." Anda juga perlu memeriksa apakah karakter yang diganti, baris duplikat, dan bidang kunci sesuai dengan rendering. Item kunci seperti nomor kontrak dan jumlah harus diperiksa secara acak.
Teks yang digambar oleh jalur vektor bukanlah teks maupun gambar. Mereka akan masuk REVIEW. Jangan secara otomatis menandai halaman sebagai kosong, dan jangan secara diam-diam menjatuhkan halaman.
Menggunakan Halaman setelah menutup Dokumen akan menghasilkan objek yang tidak valid. Harap pertahankan cakupan with pymupdf.open(...) dan lepaskan file hanya setelah pra-check, render, dan ekstrak. Untuk detail lebih lanjut tentang koordinat, informasi gambar, dan siklus hidup halaman, lihat PyMuPDF Page API.
PDF yang tidak terpercaya juga harus mengatur ukuran file, jumlah halaman, piksel render, batas, waktu, dan memori dalam proses mandiri. Contoh ini hanya menguji file kecil dan tidak menyediakan sandbox untuk file berbahaya. Sebelum memproduksi dan menggunakan PyMuPDF, Anda juga harus memverifikasi syarat lisensi dan metode distribusi Anda.
Transisi dari Alur Kerja Streaming ke Terjemahan
Keluaran yang berkualifikasi bukanlah rangkaian teks, melainkan catatan dengan nomor halaman dan alasan pengambilan keputusan. Sebelum menerjemahkan, pastikan halaman mana yang dapat diekstrak dengan andal; Setelah diterjemahkan, isi, angka, dan tata letak kemudian ditinjau. Anda dapat melihat layanan pemrosesan dokumen di Entri produk OmniDoc. Program lokal dalam artikel ini berjalan secara independen dan tidak bergantung pada akun OmniDoc, juga bukan berarti ini adalah algoritma produk internal.
📊 Perbandingan Inti
| Rute | Kondisi pemicu | Halaman yang sesuai | Risiko besar |
|---|---|---|---|
| Ekstraksi Langsung (TEXT_CANDIDATE) | Setidaknya 40 karakter tanpa spasi | Halaman isi dari lapisan teks yang sudah ada | Lapisan OCR buruk tersembunyi mungkin mengandung teks yang kacau |
| Kandidat OCR (OCR_CANDIDATE) | Kurang dari 40 kata, dengan satu gambar mencakup setidaknya 70% | Salinan pindai halaman penuh | Foto murni juga memenuhi persyaratan, tetapi hasil OCR mungkin tidak bermakna |
| Inspeksi Manual (ULASAN) | Dokumen ini tidak memenuhi dua kategori di atas | Halaman kosong, teks vektor, judul yang jarang, teka-teki kompleks | Penilaian manual diperlukan; melewatkan atau membuang tidak dapat dilakukan secara otomatis |
🎯 Metode mana yang cocok untukmu?
Jika kamu ......
- Menangani dokumen campuran, dengan perbedaan kualitas yang besar antara halaman depan dan belakang: halaman demi halaman pra-check, masing-masing masuk ke rute berbeda.
- Utamanya menangani kontrak, dokumen keuangan, dan dokumen lain yang berisi nomor kunci: Untuk halaman TEXT_CANDIDATE, periksa secara acak kesesuaian antara angka dan rendering.
- Pemrosesan batch pemindaian: Rekam versi mesin, paket bahasa, dan nomor halaman untuk hasil OCR agar mudah dilacak.
- Menerima PDF dari sumber yang tidak diketahui: Tetapkan batas sumber daya dalam proses mandiri; jangan memprosesnya langsung di proses utama.
❓ Pertanyaan yang Sering Diajukan (FAQ)
1. Halaman utama dapat menyalin teks; apakah saya bisa melewati proses OCR untuk seluruh PDF?
Tidak, kamu tidak bisa. Memiliki lapisan teks di halaman pertama tidak berarti halaman berikutnya juga memilikinya; Anda harus menilai halaman demi halaman.
2. Kenapa tidak langsung saja menambahkan area gambar?
Menambahkan gambar yang tumpang tindih berdasarkan area akan melebih-lebihkan tingkat cakupan. Artikel ini mengambil gambar terbesar berdasarkan area, sehingga halaman yang dipindai yang disambungkan dari beberapa gambar mungkin masuk ke bagian REVIEW, yang merupakan batasan yang disengaja.
3. Jika jumlah karakter mencapai 40, apakah itu berarti kualitas teksnya baik-baik saja?
Tidak bisa disimpulkan seperti itu. Layer OCR buruk tersembunyi juga mungkin memiliki banyak karakter, jadi Anda tetap perlu memeriksa karakter pengganti, baris duplikat, dan field kunci spot.
4. Bagaimana seharusnya teks yang digambar dalam jalur vektor ditangani?
Halaman tersebut bukan teks maupun gambar, masukkan REVIEW, dan dinilai secara manual; tidak boleh secara otomatis ditandai sebagai halaman kosong atau diam-diam dijatuhkan.
5. Apakah program lokal mengandalkan akun OmniDoc?
Tidak bergantung. Program lokal dalam artikel ini berjalan secara independen dan tidak memanggil layanan OCR atau penerjemahan online apa pun.
📝 Ringkasan
Pertama, tinggalkan bukti halaman demi halaman sebelum memutuskan apakah akan melakukan OCR. Meninggalkan halaman yang tidak pasti dalam antrean lebih efektif daripada menyamarkan hasil yang tidak pasti sebagai keberhasilan.
Rasakan sekarang: Unggah dokumen Anda untuk mulai menerjemahkan, mempertahankan format asli


