Men‑generasi barcode PDF417 hanya membutuhkan empat baris kode Python. Membaca kembali barcode tersebut dari foto ponsel, pemindaian 200 DPI, atau boarding pass yang telah menghabiskan sehari di saku seseorang adalah titik di mana pekerjaan sebenarnya dimulai, dan di sinilah sebagian besar integrasi PDF417 sebenarnya gagal. Dalam artikel ini, Anda akan belajar cara membaca barcode PDF417 dalam Python ketika gambar sumbernya tidak sempurna. Jika Anda mencari sisi generasi, panduan sebelumnya tentang cara menghasilkan barcode PDF417 menggunakan Python mencakup pembuatan simbol PDF417 dasar dan kustom, termasuk kontrol baris dan kolom, dan panduan pembaca barcode Python mencakup pemindaian tujuan umum di seluruh simbol. Apa yang akan dibahas di sini lebih fokus dan mendalam pada pengenalan PDF417.

Setiap potongan kode di bawah ini dijalankan terhadap Aspose.BarCode for Python via .NET 26.7 di Linux dengan Python 3.12. Waktu dan hasil baca/gagal diukur, bukan diperkirakan, dan skrip yang menghasilkan mereka ada di akhir sehingga Anda dapat menjalankannya kembali pada gambar Anda sendiri.

Apa yang Sebenarnya Mengganggu Pengenalan PDF417

PDF417 adalah simbolologi bertumpuk: baris kode, setiap kode dibangun dari empat bar dan empat spasi yang mencakup 17 modul. Struktur itu membawa koreksi kesalahan Reed‑Solomon, sehingga sudut yang sobek atau noda kopi biasanya dapat bertahan. Yang tidak dapat bertahan adalah kehilangan kisi modul itu sendiri.

Tiga hal yang menghancurkan grid, dalam urutan kasar seberapa sering mereka muncul di produksi:

  • Lebar modul efektif turun di bawah dua piksel. Ini adalah kegagalan utama. Hal ini terjadi karena penurunan skala, jarak kamera, dan blur, yang menyebarkan tinta satu modul ke tetangganya. Barcode yang dihasilkan dengan tiga piksel per modul dan kemudian diburamkan secara fungsional menjadi barcode dengan satu piksel per modul.
  • Perspektif dan rotasi. Barcode yang difoto dengan sudut memiliki baris yang tidak lagi sejajar dengan garis pemindaian. Detektor menangani ini, tetapi memerlukan satu proses deteksi yang dilewati oleh preset tercepat.
  • Kehilangan kontras. Kertas termal yang memudar, layar yang difoto di bawah silau, atau pemindaian dengan kecerahan yang dipaksa. Lebih tidak fatal daripada yang terlihat, seperti yang ditunjukkan oleh angka‑angka di bawah ini.

Konsekuensi praktisnya adalah bahwa pengaturan pengenalan merupakan mekanisme pemulihan, bukan pengganti kualitas penangkapan. Mereka mengembalikan kembali pita tengah kualitas gambar. Mereka tidak mengembalikan pita bawah.

Siapkan Pembaca PDF417 Python

Instal perpustakaan dari PyPI:

pip install aspose-barcode-for-python-via-net

API pengenalan berada di aspose.barcode.barcoderecognition. Dua kelas penting untuk artikel ini: BarCodeReader, yang melakukan deteksi dan decoding, dan QualitySettings, yang mengontrol seberapa keras pembaca berusaha.

Baca Kode Barcode PDF417 dengan Python

Pembacaan minimum yang dapat dilakukan adalah dua argumen dan sebuah loop:

from aspose.barcode import barcoderecognition as rec

reader = rec.BarCodeReader("clean.png", rec.DecodeType.PDF417)

for result in reader.read_bar_codes():
    print("Code text:", result.code_text)
    print("Symbology:", result.code_type_name)
    print("Reading quality:", result.reading_quality)
Baca Kode Barcode PDF417 dengan Python.

Baca Kode Barcode PDF417 dengan Python.

Output pada gambar bersih:

Code text: PASSENGER|KHAN/M|SEAT14C|LHE-DXB
Symbology: Pdf417
Reading quality: 100.0

Argumen kedua tidak opsional dalam praktik. Biarkan kosong dan BarCodeReader akan kembali ke DecodeType.ALL_SUPPORTED_TYPES, yang menjalankan deteksi untuk lebih dari enam puluh simbologi pada setiap wilayah kandidat dalam gambar. Pada pipeline yang hanya menggunakan PDF417, itu benar‑benar pemborosan, dan membuka peluang terjadinya false‑positive simbologi linear di dalam struktur baris PDF417. Sebutkan tipe tersebut.

Jika input Anda datang sebagai byte dari unggahan alih‑alih file di disk, berikan stream dan atur batas waktu sehingga gambar patologis tidak dapat menunda pekerja:

import io
from aspose.barcode import barcoderecognition as rec

def decode_pdf417(image_bytes, timeout_ms=2000):
    reader = rec.BarCodeReader(io.BytesIO(image_bytes), rec.DecodeType.PDF417)
    reader.timeout = timeout_ms
    return [r.code_text for r in reader.read_bar_codes()]

Bandingkan Pengaturan Kualitas Pengenalan PDF417 di Python

QualitySettings memiliki empat preset yang penting untuk diketahui. Menetapkan salah satunya ke pembaca hanya membutuhkan satu baris:

reader = rec.BarCodeReader("scan.png", rec.DecodeType.PDF417)
reader.quality_settings = rec.QualitySettings.high_quality
PresetDitujukan untukBiaya
high_performanceBersih, gambar yang dihasilkan mesinTercepat, melewati proses pemulihan
normal_qualityDefault. Pemindaian dan ekspor regulerSeimbang
high_qualityPengambilan kamera, pemindaian yang terdegradasiSedang
max_qualityPercobaan ulang pada gambar yang sudah gagalPaling lambat dengan selisih yang besar

Untuk mengetahui apa arti deskripsi tersebut dalam praktik, saya menghasilkan PDF417 dengan tiga piksel per modul, menurunkannya dengan enam cara menggunakan Pillow, dan menjalankan setiap preset terhadap setiap varian. Median dari tiga kali menjalankan:

Gambar sumberhigh_performancenormal_qualityhigh_qualitymax_quality
Bersihbaca, 35 msbaca, 50 msbaca, 45 msbaca, 106 ms
Diputar 12°, buramlewat, 15 msbaca, 74 msbaca, 67 msbaca, 157 ms
Noise Gaussian (σ 40)baca, 31 msbaca, 49 msbaca, 52 msbaca, 123 ms
Setengah resolusibaca, 22 msbaca, 37 msbaca, 35 msbaca, 86 ms
Kontras rendahbaca, 24 msbaca, 38 msbaca, 43 msbaca, 112 ms
Blur berat (σ 2.2)lewat, 5 mslewat, 25 mslewat, 85 mslewat, 180 ms

Empat hal yang dapat diambil dari tabel ini, dan mereka lebih berguna daripada angka‑angka individual:

  1. Noise dan kontras rendah bukanlah masalah yang orang pikirkan. Reed‑Solomon plus detektor menyerap noise Gaussian yang berat dan pengurangan kontras sebesar 82 % pada preset tercepat. Hentikan penyesuaian untuk hal ini.
  2. Rotasi plus blur adalah kasus yang memisahkan preset. Ini juga merupakan profil tepat dari pengambilan gambar dengan ponsel genggam, yang menjadi alasan mengapa high_performance adalah default yang salah untuk pipeline yang bersumber dari seluler.
  3. max_quality memakan waktu tiga kali lipat dibanding normal_quality dan tidak membaca apa pun tambahan. Ini memperoleh tempatnya sebagai jalur percobaan kedua, bukan sebagai default.
  4. Setelah grid modul hilang, tidak ada preset yang dapat memulihkannya. Baris blur berat merupakan kegagalan secara menyeluruh, dan max_quality menghabiskan 180 ms untuk membuktikannya. Itu adalah masalah pengambilan gambar dengan solusi pengambilan gambar: lebih banyak piksel, fokus yang lebih baik, x_dimension yang lebih besar pada saat generasi.

Sesuaikan QualitySettings untuk Membaca Barcode PDF417 yang Kabur dalam Python

Preset adalah kumpulan properti individu, dan Anda dapat memulai dari preset dan menimpa satu. Di sinilah keuntungan nyata muncul untuk cacat yang diketahui dan dapat diulang.

Gambar yang diputar dan diburamkan di atas merupakan demonstrasi yang baik. Di bawah high_performance itu terlewat. Aktifkan dekonvolusi di atas preset yang sama dan akan terbaca:

from aspose.barcode import barcoderecognition as rec

reader = rec.BarCodeReader("rotated.png", rec.DecodeType.PDF417)

quality = rec.QualitySettings.high_performance
quality.deconvolution = rec.DeconvolutionMode.NORMAL
reader.quality_settings = quality

for result in reader.read_bar_codes():
    print(result.code_text)
Sesuaikan QualitySettings untuk Membaca Kode Bar PDF417 yang Kabur di Python.

Sesuaikan QualitySettings untuk Membaca Kode Bar PDF417 yang Kabur di Python.

Diukur: miss dalam 12 ms tanpa override, dibaca dalam 54 ms dengan override. Satu properti membalikkan hasil, dan hasilnya masih kembali lebih cepat daripada preset max_quality.

Properti yang layak diketahui:

PropertiNilaiKapan menggunakannya
deconvolutionFAST, NORMAL, SLOWBlur gerakan dan gambar yang tidak fokus
barcode_qualityHIGH, NORMAL, LOWCacat cetak, pudar termal, artefak faks
x_dimensionAUTO, SMALL, NORMAL, LARGE, USE_MINIMAL_X_DIMENSIONBarcode padat, atau ukuran modul yang diketahui dan tetap
minimal_x_dimensionfloatDigabungkan dengan USE_MINIMAL_X_DIMENSION untuk menetapkan batas minimum
complex_backgroundAUTO, DISABLED, ENABLEDBarcode dicetak di atas karya seni atau formulir ber pola
inverse_imageAUTO, DISABLED, ENABLEDBarcode putih-di-atas-hitam, tangkapan layar
allow_incorrect_barcodesboolHanya untuk diagnostik, tidak pernah produksi

Yang terakhir itu pantas mendapat peringatan. allow_incorrect_barcodes mengembalikan simbol yang gagal validasi checksum. Ini adalah bantuan debugging untuk menjawab “apakah detektor bahkan menemukan sesuatu di sini?” Menyebarkannya berarti mengirimkan string yang telah didekode yang salah alih-alih tidak ada, yang secara jelas lebih buruk daripada sebuah kegagalan.

Strategi tiering yang bekerja dengan baik di produksi: coba normal_quality terlebih dahulu, dan jika tidak berhasil coba lagi sekali dengan high_quality plus deconvolution = SLOW. Anda hanya membayar jalur yang mahal untuk gambar yang membutuhkannya.

Validasi Hasil Dekode PDF417 di Python

String yang didekode tidak otomatis menjadi string yang benar. Tiga bidang pada BarCodeResult membantu:

for result in reader.read_bar_codes():
    print("Text:", result.code_text)
    print("Reading quality:", result.reading_quality)
    print("Confidence:", result.confidence)
    print("Region:", [(p.x, p.y) for p in result.region.points])
Text: PASSENGER|KHAN/M|SEAT14C|LHE-DXB
Reading quality: 100.0
Confidence: 100
Region: [(7, 6), (261, 7), (261, 276), (7, 277)]

Menyusun Kembali Macro PDF417 yang Terpecah di Antara Gambar

Macro PDF417 membagi satu pesan logis menjadi beberapa simbol, yang muncul dalam manifest pengiriman dan dokumen multi‑halaman. Metadata segmen tetap ada selama perjalanan bolak‑balik, sehingga perakitan kembali bersifat deterministik:

from aspose.barcode import barcoderecognition as rec

segments = {}
total = None

for path in ["page1.png", "page2.png"]:
    reader = rec.BarCodeReader(path, rec.DecodeType.MACRO_PDF417)
    for result in reader.read_bar_codes():
        meta = result.extended.pdf417
        segments[meta.macro_pdf_417_segment_id] = result.code_text
        total = meta.macro_pdf_417_segments_count
        print(f"{path}: segment {meta.macro_pdf_417_segment_id + 1} of {total}, "
              f"file id {meta.macro_pdf_417_file_id}")

if total and len(segments) == total:
    payload = "".join(segments[i] for i in sorted(segments))
    print("Reassembled:", payload)
else:
    print("Incomplete: missing segments")
Halaman 1.

Halaman 1.

Halaman 2.

Halaman 2.

Output:

Data\pdf417\page1.png: segment 1 of 2, file id 42
Data\pdf417\page2.png: segment 2 of 2, file id 42
Reassembled: SEGMENT-A-DATASEGMENT-B-DATA

Perhatikan bahwa macro_pdf_417_file_id adalah integer, bukan string, baik pada sisi pembuatan maupun pengenalan. Objek yang sama juga menampilkan macro_pdf_417_file_name, macro_pdf_417_sender, macro_pdf_417_addressee, macro_pdf_417_time_stamp, dan macro_pdf_417_checksum ketika encoder mengisinya.

Benchmark Pengakuan PDF417 pada Gambar Anda Sendiri

Pilihan preset harus menjadi ukuran, bukan tebakan. Arahkan ini ke folder berisi tangkapan representatif dari pipeline Anda yang sebenarnya dan itu akan memberi tahu Anda preset mana yang sepadan dengan biayanya:

import time, statistics, pathlib
from aspose.barcode import barcoderecognition as rec

PRESETS = ["high_performance", "normal_quality", "high_quality", "max_quality"]

def probe(path, preset, reps=3):
    times, found = [], False
    for _ in range(reps):
        reader = rec.BarCodeReader(str(path), rec.DecodeType.PDF417)
        reader.quality_settings = getattr(rec.QualitySettings, preset)
        start = time.perf_counter()
        results = list(reader.read_bar_codes())
        times.append((time.perf_counter() - start) * 1000)
        found = found or bool(results)
    return found, statistics.median(times)

for image in sorted(pathlib.Path("samples").glob("*.png")):
    row = []
    for preset in PRESETS:
        found, ms = probe(image, preset)
        row.append(f"{preset}: {'read' if found else 'miss'} {ms:.0f}ms")
    print(f"{image.name:28} " + " | ".join(row))
clean.png                    high_performance: read 32ms | normal_quality: read 48ms | high_quality: read 51ms | max_quality: read 130ms
faded_thermal.png            high_performance: read 26ms | normal_quality: read 43ms | high_quality: read 46ms | max_quality: read 144ms
half_resolution.png          high_performance: read 27ms | normal_quality: read 41ms | high_quality: read 41ms | max_quality: read 89ms
heavy_blur.png               high_performance: miss 7ms | normal_quality: miss 24ms | high_quality: miss 69ms | max_quality: miss 180ms
noisy_scan.png               high_performance: read 26ms | normal_quality: read 42ms | high_quality: read 47ms | max_quality: read 116ms
Page1.png                    high_performance: read 21ms | normal_quality: read 34ms | high_quality: read 38ms | max_quality: read 90ms
Page2.png                    high_performance: read 21ms | normal_quality: read 33ms | high_quality: read 38ms | max_quality: read 89ms
rotated.png                  high_performance: miss 16ms | normal_quality: read 43ms | high_quality: read 57ms | max_quality: read 147ms

Jalankan sekali terhadap lima puluh capture nyata dan perdebatan preset berakhir.

Panduan Praktis

  • Batasi DecodeType ke PDF417 kecuali Anda benar-benar mengharapkan simbol campuran. Gunakan MACRO_PDF417, COMPACT_PDF417, atau MICRO_PDF417 ketika Anda mengetahui varian tersebut.
  • Potong sebelum Anda mendekode. Mengirimkan pemindaian A4 penuh ketika barcode hanya menempati 5 % dari gambar membuang waktu deteksi dan menambah permukaan false‑positive.
  • Simpan file perantara tanpa kehilangan. PNG atau TIFF. JPEG dengan pengaturan kualitas rendah menghasilkan ringing yang menyerang tepat pada tepi bar yang dibutuhkan decoder.
  • Tingkatkan ulang percobaan Anda daripada menggunakan preset paling lambat secara default.
  • Perbaiki generasi sebelum menyetel pengenalan. Jika Anda mengendalikan encoder, meningkatkan x_dimension tidak memakan biaya apa pun dan menyelesaikan lebih banyak kegagalan dibandingkan pengaturan pembaca mana pun. Artikel artikel generasi PDF417 membahas parameter tersebut.
  • Atur timeout pada setiap pembaca yang memproses gambar yang diberikan pengguna.

Dapatkan Lisensi Gratis

Build evaluasi menandai teks yang didekode untuk simbol selain Code 39, yang akan mengganggu pengujian round‑trip apa pun yang Anda lakukan. Sebuah lisensi sementara gratis menghilangkan itu untuk evaluasi.

Sumber Daya Tambahan Gratis

Kesimpulan

Membaca kode batang PDF417 di Python adalah operasi dua baris pada gambar bersih dan masalah rekayasa pada gambar nyata. Pengukuran di atas menunjukkan pendekatan sederhana: beri nama DecodeType Anda, gunakan nilai default normal_quality, coba lagi sekali dengan high_quality dan dekonvolusi diaktifkan, serta validasi setiap hasil sebelum menindaklanjutinya. Simpan preset yang mahal untuk jalur percobaan ulang, dan ketika seluruh kelas gambar gagal pada setiap pengaturan, perbaiki proses pengambilan gambar alih-alih pembaca. Pertanyaan dipersilakan di forum dukungan gratis.

FAQs

  1. Mengapa barcode PDF417 yang sama dapat dibaca di satu gambar tetapi gagal di gambar lain?
    Pengakuan tergantung pada berapa banyak piksel yang ditempati setiap modul setelah pengambilan. Blur, penurunan skala, dan kompresi JPEG semuanya memperkecil lebar modul yang efektif, dan begitu sebuah modul turun di bawah kira‑kira dua piksel bersih, tidak ada preset yang dapat memulihkannya.

  2. Preset pengenalan mana yang harus saya gunakan untuk PDF417?
    Mulailah dengan normal_quality, yang merupakan default. Beralih ke high_quality untuk pengambilan gambar dengan kamera dan pemindaian, dan gunakan max_quality untuk percobaan ulang karena ia beberapa kali lebih lambat tanpa membaca jauh lebih banyak.

  3. Apakah membatasi DecodeType ke PDF417 benar-benar mempercepat pembacaan?
    Ya. Defaultnya adalah DecodeType.ALL_SUPPORTED_TYPES, yang menjalankan detektor untuk setiap simbol yang didukung. Menyebutkan PDF417 secara eksplisit menghilangkan pekerjaan tersebut dan juga menghilangkan kemungkinan positif palsu dari simbol lain.

  4. Apakah Aspose.BarCode dapat membaca pesan Macro PDF417 yang terbagi di beberapa gambar?
    Ya. Baca setiap segmen dengan DecodeType.MACRO_PDF417 dan gunakan macro_pdf_417_file_id, macro_pdf_417_segment_id, serta macro_pdf_417_segments_count pada hasil yang diperluas untuk menyusun kembali payload secara berurutan.

  5. Bagaimana saya tahu apakah hasil decode dapat dipercaya?
    Periksa reading_quality dan confidence pada BarCodeResult, dan gunakan kuadran region untuk memastikan barcode ditemukan di lokasi yang Anda harapkan dalam gambar.

  6. Apakah dapat membaca PDF417 dari foto SIM atau boarding pass?
    Bisa, asalkan pengambilan gambar fokus dan barcode tidak terpotong. Potong ke wilayah barcode sebelum membaca, dan pilih PNG daripada JPEG untuk file perantara.

Baca Selengkapnya