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 AndaResep yang direkomendasikanAlasannya
Ekstrak setidaknya 40 karakter yang tidak kosong dari satu halamanEkstraksi 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% halamanDikirim ke antrean kandidat OCRPemindaian halaman penuh cocok untuk pengenalan, tetapi foto murni juga memenuhi persyaratan
Halaman kosong, teks vektor, judul yang jarang, atau teka-teki kompleksInspeksi 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 halamanPra-periksa halaman demi halaman, jangan proses semua salinanHindari 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.

PengamatanArtikel ini dibagi menjadi beberapa alurPerhatian masih dibutuhkan
Setidaknya 40 karakter yang tidak kosongTEXT_CANDIDATELapisan OCR buruk tersembunyi juga mungkin memiliki banyak kata
Kurang dari 40 kata dan cakupan minimal 70% dari satu gambarOCR_CANDIDATEFoto murni juga memenuhi persyaratan; OCR mungkin tidak bermakna
Sisa situasiREVIEWRuang 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

RuteKondisi pemicuHalaman yang sesuaiRisiko besar
Ekstraksi Langsung (TEXT_CANDIDATE)Setidaknya 40 karakter tanpa spasiHalaman isi dari lapisan teks yang sudah adaLapisan 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 penuhFoto murni juga memenuhi persyaratan, tetapi hasil OCR mungkin tidak bermakna
Inspeksi Manual (ULASAN)Dokumen ini tidak memenuhi dua kategori di atasHalaman kosong, teks vektor, judul yang jarang, teka-teki kompleksPenilaian 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

Diperbarui 2026-11-15