PDF417 barkod oluşturmak sadece dört satır Python kodu gerektirir. Bir telefon fotoğrafından, 200 DPI taramadan veya birinin cebinde bir gün kalan bir biniş kartından barkodu okumak, gerçek işin başladığı yerdir ve çoğu PDF417 entegrasyonunun aslında başarısız olduğu noktadır. Bu makalede, kaynak görüntü kusurlu olduğunda Python’da PDF417 barkodlarını nasıl okuyacağınızı öğreneceksiniz. Eğer oluşturma tarafıyla ilgileniyorsanız, daha önceki PDF417 barkodlarını Python kullanarak oluşturma rehberi temel ve özel PDF417 sembollerinin, satır ve sütun kontrolü dahil, nasıl oluşturulacağını kapsar ve Python barkod okuyucu rehberi genel amaçlı taramayı çeşitli semboller üzerinde ele alır. Burada takip eden kısım, PDF417 tanıma konusunda dar ve derin bir bakış sunar.
Aşağıdaki her kod parçacığı, Linux’ta Python 3.12 ile Aspose.BarCode for Python via .NET 26.7 üzerinde çalıştırıldı. Zamanlamalar ve okuma/başarısızlık sonuçları tahmin edilmemiş, ölçülmüştür ve bunları üreten betik, kendi görüntülerinizde yeniden çalıştırabilmeniz için sonunda yer almaktadır.
PDF417 Tanımasını Gerçekten Bozanlar
PDF417, yığılmış bir semboloji türüdür: kod sözcüklerinden oluşan satırlar, her kod sözcüğü 17 modül kapsayan dört çubuk ve dört boşluktan oluşur. Bu yapı Reed‑Solomon hata düzeltme içerir, bu yüzden yırtılmış bir köşe ya da kahve lekesi genellikle dayanabilir. Dayanamaz olan ise modül ızgarasını kaybetmektir.
Üç şey ızgarayı yok eder, üretimde ne sıklıkla ortaya çıktıklarına göre kabaca sıralanmıştır:
- İki pikselin altına düşen etkili modül genişliği. Bu, baskın hatadır. Bu, ölçek küçültme, kamera mesafesi ve bulanıklık yoluyla gerçekleşir; bulanıklık bir modülün mürekkebini komşularına yayar. Üç piksel başına bir modül olarak oluşturulan ve ardından bulanıklaştırılan bir barkod, işlevsel olarak bir piksel başına bir modül barkodudur.
- Perspektif ve dönüş. Açılı bir şekilde fotoğraflanan bir barkodun satırları artık paralel tarama çizgileri değildir. Algılayıcı bunu yönetir, ancak en hızlı ön ayarın atladığı bir algılama geçişi maliyetine sahiptir.
- Kontrast çöküşü. Solmuş termal kağıt, parlamalı bir ortamda fotoğraflanmış ekran veya parlaklığı sabitlenmiş bir tarama. Aşağıdaki sayılar gösterdiği gibi, göründüğü kadar ölümcül değildir.
Pratik sonuç, tanıma ayarlarının bir kurtarma mekanizması olduğu, yakalama kalitesinin yerine geçmediğidir. Görüntü kalitesinin orta bandını geri kazandırırlar. Alt bandı geri kazandırmazlar.
Python PDF417 Okuyucusunu Kurun
Kütüphaneyi PyPI’dan yükleyin:
pip install aspose-barcode-for-python-via-net
Tanıma API’si aspose.barcode.barcoderecognition içinde bulunur. Bu makale için iki sınıf önemlidir: BarCodeReader, algılamayı ve kod çözmeyi yöneten sınıf ve QualitySettings, okuyucunun ne kadar çaba harcayacağını kontrol eden sınıf.
Python’da PDF417 Barkod Okuma
Minimum uygulanabilir okuma iki argüman ve bir döngüdür:
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)

Python’da PDF417 Barkod Okuma.
Temiz bir görüntüde çıktı:
Code text: PASSENGER|KHAN/M|SEAT14C|LHE-DXB
Symbology: Pdf417
Reading quality: 100.0
İkinci argüman pratikte isteğe bağlı değildir. Bunu çıkardığınızda BarCodeReader DecodeType.ALL_SUPPORTED_TYPES değerine geri döner, bu da görüntüdeki her aday bölgeye karşı altmıştan fazla semboloji için algılama yapar. Sadece PDF417 içeren bir işlem hattında bu tamamen boşa harcama olur ve PDF417 satır yapısı içinde lineer bir semboloji yanlış pozitifine kapı açar. Türü belirtin.
Girişiniz bir dosya yerine bir yüklemeden gelen baytlar olarak geliyorsa, bir akış geçirin ve bir zaman aşımı ayarlayın, böylece patolojik bir görüntü bir çalışanı duraklatamaz:
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()]
Python’da PDF417 Tanıma Kalite Ayarlarını Karşılaştırın
QualitySettings dört ön ayar içerir, bilmeniz gereken. Birini okuyucuya atamak tek bir satırdır:
reader = rec.BarCodeReader("scan.png", rec.DecodeType.PDF417)
reader.quality_settings = rec.QualitySettings.high_quality
| Ön ayar | Amaç | Maliyet |
|---|---|---|
high_performance | Temiz, makine tarafından oluşturulan görüntüler | En hızlı, kurtarma geçişlerini atlar |
normal_quality | Varsayılan. Normal taramalar ve dışa aktarmalar | Dengeli |
high_quality | Kamera çekimleri, bozulmuş taramalar | Orta |
max_quality | Zaten başarısız olan görüntülerde yeniden deneme geçişi | Çok büyük bir farkla en yavaş |
Bu açıklamaların pratikte ne anlama geldiğini görmek için, üç piksel modül başına bir PDF417 oluşturdum, Pillow ile altı farklı şekilde bozuldu ve her ön ayarı her varyantta çalıştırdım. Üç çalıştırmanın medyanı:
| Kaynak görüntü | high_performance | normal_quality | high_quality | max_quality |
|---|---|---|---|---|
| Temiz | okuma, 35 ms | okuma, 50 ms | okuma, 45 ms | okuma, 106 ms |
| 12° döndürülmüş, bulanık | kaçırıldı, 15 ms | okuma, 74 ms | okuma, 67 ms | okuma, 157 ms |
| Gauss gürültüsü (σ 40) | okuma, 31 ms | okuma, 49 ms | okuma, 52 ms | okuma, 123 ms |
| Yarı çözünürlük | okuma, 22 ms | okuma, 37 ms | okuma, 35 ms | okuma, 86 ms |
| Düşük kontrast | okuma, 24 ms | okuma, 38 ms | okuma, 43 ms | okuma, 112 ms |
| Yoğun bulanıklık (σ 2.2) | kaçırıldı, 5 ms | kaçırıldı, 25 ms | kaçırıldı, 85 ms | kaçırıldı, 180 ms |
Bu tablodan dört şey çıkar ve bunlar tek tek sayılardan daha faydalıdır:
- Gürültü ve düşük kontrast, insanların düşündüğü gibi bir sorun değildir. Reed‑Solomon ve dedektör, ağır Gaussian gürültüsünü ve en hızlı ön ayarda %82 kontrast azalmasını absorbe etti. Bunlar için ayarlamayı durdurun.
- Döndürme ve bulanıklık, ön ayarları ayıran durumdur. Bu aynı zamanda elde taşınan telefon çekiminin tam profilidir, bu yüzden
high_performanceherhangi bir mobil kaynaklı işlem hattı için yanlış varsayılandır. max_qualitynormal_quality‘nin üç katı sürede çalışır ve ekstra bir şey okumaz. Bu, varsayılan değil, ikinci deneme yolu olarak yerini hak eder.- Modül ızgarası bir kez kaybolduğunda, hiçbir ön ayar onu geri getiremez. Ağır bulanıklık satırı tüm genelinde bir hatadır ve
max_qualitybunu kanıtlamak için 180 ms harcadı. Bu, daha fazla piksel, daha iyi odaklama, üretim sırasında daha büyükx_dimensiongibi bir yakalama düzeltmesi gerektiren bir yakalama sorunudur.
Bulanık PDF417 Barkodlarını Python’da Okumak İçin QualitySettings’i Ayarlayın
Bir ön ayar, bireysel özelliklerin bir paketidir ve bir ön ayardan başlayıp birini geçersiz kılabilirsiniz. Bu, bilinen, tekrarlanabilir bir kusur için gerçek kazançların bulunduğu yerdir.
Yukarıdaki döndürülmüş ve bulanıklaştırılmış görüntü iyi bir gösterimdir. high_performance altında eksik kalıyor. Aynı ön ayarın üzerine dekonvolüsyonu etkinleştirin ve şu şekilde okunur:
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)

QualitySettings’i Ayarlayarak Bulanık PDF417 Barkodlarını Python’da Okuyun.
Ölçüldü: geçersiz kılma olmadan 12 ms’de kaçırıldı, geçersiz kılma ile 54 ms’de okundu. Bir özellik sonucun tersine dönmesini sağladı ve sonuç yine max_quality ön ayarının beklediğinden daha hızlı geldi.
Bilmeniz gereken özellikler:
| Özellik | Değerler | Ne zaman kullanılmalı |
|---|---|---|
deconvolution | FAST, NORMAL, SLOW | Hareket bulanıklığı ve odak dışı çekimler |
barcode_quality | HIGH, NORMAL, LOW | Baskı kusurları, termal solma, faks artefaktları |
x_dimension | AUTO, SMALL, NORMAL, LARGE, USE_MINIMAL_X_DIMENSION | Yoğun barkodlar veya sabit bilinen modül boyutu |
minimal_x_dimension | float | USE_MINIMAL_X_DIMENSION ile eşleştirerek bir alt sınır belirleyin |
complex_background | AUTO, DISABLED, ENABLED | Sanat eseri veya desenli bir form üzerine basılmış barkod |
inverse_image | AUTO, DISABLED, ENABLED | Beyaz-siyah barkodlar, ekran görüntüleri |
allow_incorrect_barcodes | bool | Yalnızca tanı amaçlı, asla üretimde kullanılmaz |
Sonuncusu bir uyarıyı hak ediyor. allow_incorrect_barcodes checksum doğrulamasını geçemeyen sembolleri döndürür. Bu, “dedektör burada bir şey buldu mu?” yanıtlamaya yardımcı bir hata ayıklama aracıdır. Bunu dağıtmak, eksik olmaları yerine hatalı çözülen dizgileri dağıtmak anlamına gelir; bu da bir kaçırmadan kesinlikle daha kötüdür.
Üretimde iyi çalışan bir katmanlama stratejisi: önce normal_quality deneyin ve bir eksik durumda bir kez high_quality ve deconvolution = SLOW ile tekrar deneyin. Sadece ihtiyacı olan görüntüler için pahalı yolu ödersiniz.
Python’da PDF417 Çözümleme Sonuçlarını Doğrulama
Kodlanmış bir dize otomatik olarak doğru bir dize değildir. BarCodeResult üzerindeki üç alan yardımcı olur:
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)]
Görüntülerde Bölünmüş Bir Macro PDF417’yi Yeniden Birleştir
Macro PDF417, tek bir mantıksal mesajı birden fazla sembole böler; bu, nakliye manifestolarında ve çok sayfalı belgelerde görülür. Segment meta verileri dönüşüm sırasında korunur, bu yüzden yeniden birleştirme deterministiktir:
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")

Sayfa 1.

Sayfa 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
Şunu unutmayın ki
macro_pdf_417_file_idbir tam sayıdır, hem oluşturma hem de tanıma tarafında dize (string) değildir. Aynı nesne, kodlayıcı bunları doldurduğunda ayrıcamacro_pdf_417_file_name,macro_pdf_417_sender,macro_pdf_417_addressee,macro_pdf_417_time_stampvemacro_pdf_417_checksumöğelerini de ortaya çıkarır.
Kendi Görüntülerinizde PDF417 Tanıma Performansını Ölçün
Ön ayar seçimi bir ölçüm olmalı, tahmin değil. Bunu gerçek hattınızdan temsilci yakalamalar içeren bir klasöre yönlendirin ve hangi ön ayarın maliyetine değer olduğunu size söyleyecek:
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
Bunu elli gerçek yakalama üzerinde bir kez çalıştırın ve önceden ayarlanmış tartışma sona erer.
Pratik Kılavuzlar
DecodeType‘ıPDF417ile sınırlayın aksi takdirde gerçekten karışık sembolojiler beklemiyorsanız. Varyantı bildiğinizdeMACRO_PDF417,COMPACT_PDF417veyaMICRO_PDF417kullanın.- Kodlamadan önce kırpın. Barkod yalnızca %5’i kapladığında tam bir A4 taramasını geçirmek, algılama süresini boşa harcar ve yanlış pozitif yüzey ekler.
- Ara dosyaları kayıpsız tutun. PNG veya TIFF. Düşük kalite ayarlarında JPEG halkaları, çözücünün ihtiyaç duyduğu çubuk kenarlarını tam olarak etkiler.
- Deneme sayısını kademelendirin en yavaş ön ayara varsayılan olarak gitmek yerine.
- Tanıma ayarlamadan önce üretimi düzeltin. Kodlayıcıyı kontrol ediyorsanız,
x_dimensiondeğerini artırmak hiçbir maliyet getirmez ve herhangi bir okuyucu ayarından daha fazla hatayı çözer. PDF417 üretim makalesi bu parametreleri kapsar. - Kullanıcı tarafından sağlanan görüntülere dokunan herhangi bir okuyucuda
timeoutayarlayın.
Ücretsiz Lisans Alın
Değerlendirme sürümü, Code 39 dışındaki sembolojiler için çözülen metne su işareti ekler; bu, yaptığınız herhangi bir çift yönlü testine müdahale eder. Bir ücretsiz geçici lisans bu durumu değerlendirme için kaldırır.
Ücretsiz Ek Kaynaklar
- Barkod Okuma Kalite Seçenekleri ve Ön Ayarlar
- Özel Barkod Okuma Durumları
- API Referansı
- Ücretsiz Çevrimiçi Barkod Araçları
Sonuç
Python’da PDF417 barkodlarını okumak, temiz görüntülerde iki satırlık bir işlem ve gerçek görüntülerde bir mühendislik problemidir. Yukarıdaki ölçümler basit bir yaklaşımı işaret ediyor: DecodeType‘ınızı adlandırın, varsayılan olarak normal_quality kullanın, bir kez high_quality ve dekonvolüsyon etkinleştirerek tekrar deneyin ve işlem yapmadan önce her sonucu doğrulayın. Tekrar deneme yolu için pahalı ön ayarları saklayın ve bir bütün görüntü sınıfı her ayarda başarısız olduğunda, okuyucu yerine yakalamayı düzeltin. Sorularınızı ücretsiz destek forumunda bekliyoruz.
FAQs
Aynı PDF417 barkodu bir görüntüde okunup diğerinde neden başarısız oluyor?
Tanıma, yakalama sonrası her bir modülün kaç piksel kapladığına bağlıdır. Bulanıklık, ölçek küçültme ve JPEG sıkıştırması, etkili modül genişliğini azaltır ve bir modül yaklaşık iki temiz pikselin altına düştüğünde, hiçbir ön ayar bunu kurtaramaz.PDF417 için hangi tanıma ön ayarını kullanmalıyım?
normal_qualityile başlayın; bu varsayılandır. Kamera çekimleri ve taramalar içinhigh_quality‘ye geçin vemax_quality‘yi yalnızca tekrar denemeleri için ayırın çünkü bu ayar çok daha yavaştır ve çok fazla ek okuma sağlamaz.DecodeType’ı PDF417 ile sınırlamak gerçekten okumayı hızlandırıyor mu?
Evet. VarsayılanDecodeType.ALL_SUPPORTED_TYPESolup, desteklenen tüm sembolojiler için dedektörü çalıştırır. PDF417’yi açıkça belirtmek bu işi ortadan kaldırır ve başka bir sembolojiden yanlış pozitif oluşma ihtimalini de ortadan kaldırır.Aspose.BarCode, birkaç görüntüye bölünmüş bir Macro PDF417 mesajını okuyabilir mi?
Evet. Her bir segmentiDecodeType.MACRO_PDF417ile okuyun ve genişletilmiş sonuçtamacro_pdf_417_file_id,macro_pdf_417_segment_idvemacro_pdf_417_segments_countdeğerlerini kullanarak yükü sırasıyla yeniden birleştirin.Çözülen bir sonucun güvenilir olup olmadığını nasıl anlarım?
BarCodeResultüzerindekireading_qualityveconfidencedeğerlerini kontrol edin veregiondörtgenini kullanarak barkodun görüntüde beklediğiniz yerde bulunup bulunmadığını doğrulayın.Bir sürücü belgesi veya biniş kartı fotoğrafından PDF417’yi okuyabilir mi?
Evet, yakalama odakta olduğu ve barkod kesilmemiş olduğu sürece okuyabilir. Okumadan önce barkod bölgesini kırpın ve ara dosyalar için JPEG yerine PNG tercih edin.
