Teknik Makale

Delphi'de HotPDF ile PDF'de Taranabilir Barkodlar Oluşturma

Bir barkod, bir belgeyi süslediğiniz bir resim değildir. O bir ölçümdür ve tarayıcı onu okuyan araçtır. Bu yeniden çerçeveleme, onu bir PDF'ye nasıl çizmeniz gerektiğiyle ilgili hemen hemen her şeye karar verir. Çubuklar siyahlıklarıyla hiçbir bilgi taşımazlar; bilgi, çubuk genişliklerinin boşluk genişliklerine oranında yaşar ve bir okuyucu, bir lazer veya sensör üzerinden geçerken geçişleri zamanlayarak onu kurtarır. Bu geometriyi sıkıştırın, bulanıklaştırın veya kenar boşluklarını doldurun; tıpkı bir barkod gibi görünen ve bir leke gibi taranan bir şey üretirsiniz. HotPDF, onu bir sayfaya yerleştirmeniz için size iki yol sunar ve aralarındaki fark, tam olarak bu geometriyi kontrol etmek ile ondan vazgeçmek arasındaki farktır

Delphi'de HotPDF tarafından çizilen farklı sembolojilerde doğrusal barkodlardan oluşan bir ızgarayı gösteren bir PDF sayfası
HotPDF ile tek bir PDF'ye çizilen doğrusal barkod sembolojileri

HotPDF neleri kodlayabilir

HotPDF doğrusal (tek boyutlu) sembolojiler çizer ve bu küme çoğu projenin ihtiyaç duyduğundan daha geniştir. THPDFBarcodeType numaralandırması, aralıklı (interleaved), endüstriyel ve matris formlarındaki Code 2 of 5 ailesini; Code 39 ve genişletilmiş varyantını; Code 128 alt kümeleri olan A, B ve C'yi; Code 93 düz ve genişletilmiş versiyonlarını; MSI; PostNet; Codabar; EAN-8, EAN-13, UPC-A, sıkıştırılmış UPC-E0 ve UPC-E1 ile UPC ek 2 ve 5 haneli eklentileri olan perakende UPC ve EAN grubunu; ve GS1-128 (EAN-128) alt kümelerini kapsar. Bu, tedarik zinciri etiketlerini, perakende satış noktalarını ve depolarda hala canlı olan eski endüstriyel kodları kapsamak için yeterlidir

Çizmediği şey ise iki boyutlu ailedir. Burada QR, Data Matrix veya PDF417 yoktur. Bunlar, kendi hata düzeltme matematiğiyle bir ızgarada baytları kodlar ve bir gereksinim bunlardan birini belirtiyorsa, bu yanlış araçtır ve bunu etrafında bir şeyler inşa ettikten sonra değil, önce bilmelisiniz. Tek boyutlu kodlar için pratik soru daha dardır: Hangi semboloji aslında sahip olduğunuz veriyi kabul eder, çünkü kodlamalar birbirinin yerine geçemez

Veri kısıtlamaları gerçektir ve oluşturma zamanında kendilerini gösterirler. Code 2 of 5 varyantları ve MSI sadece rakamları alır. Code 39, büyük harfleri, rakamları ve birkaç noktalama işaretini taşır; küçük harflere veya tam ASCII aralığına ihtiyacınız varsa, bu Code 39 Extended veya bir Code 128 alt kümesidir. Code 128C, yoğunluk için her sembole iki rakam sığdırır, bu nedenle çift uzunlukta sayısal bir dize ister ve başka bir şey istemez. EAN-13 on iki rakam bekler ve on üçüncüsünü kontrol olarak hesaplar; EAN-8 yedi tane bekler ve sekizinciyi hesaplar; UPC-A on iki tane alır. Bir sembolojiye temsil edemeyeceği veriyi verirseniz yardımcı bir istisna almazsınız, çöp kodlayan bir barkod alırsınız ki bu daha kötüdür, çünkü biri onu kasada tarayana kadar iyi görünür

İki çizim yolu, iki kontrol seviyesi

Üretimde kullanılacak yöntem, sayfa nesnesindeki DrawBarcode yöntemidir. Sembolojiyi, bir konumu, bir yüksekliği ve geri kalanlardan daha önemli olan bir parametreyi alır: modül genişliği olan MUnit. Modül, koddaki diğer tüm ölçülerin katı olduğu atom olan en dar çubuğun genişliğidir ve burada punto (point) cinsinden ifade edilir. Yazdırılan sonucun taranıp taranmadığına dair her şey bu tek tam sayıya dayanır

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'label.pdf';
    Pdf.BeginDoc;

    // BCType, X, Y, Height, MUnit (punto cinsinden modül genişliği), açı,
    // veri, UseCheckSum, çubuk rengi, arka plan rengi.
    Pdf.CurrentPage.DrawBarcode(
      bcCodeEAN13,           // semboloji
      72, 680,               // Sol alttan punto cinsinden X, Y
      60,                    // çubuk yüksekliği
      1,                     // MUnit: 1pt en dar çubuk
      0,                     // döndürme yok
      '123456789012',        // 12 rakam; 13'üncüsü kontroldür
      True,                  // modulo-10 kontrol basamağını ekle
      clBlack, clWhite);     // çubuklar siyah, arka plan beyaz

    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

İki argüman daha yakından bakmayı hak ediyor. UseCheckSum, sembolojinin beklediği modulo-10 kontrol basamağını ekler ve perakende kodları için bunu neredeyse her zaman True istersiniz; yalnızca verileriniz zaten önceden hesaplanmış bir kontrol taşıdığında kapatın, aksi takdirde çift haneli bir basamak elde edersiniz. Çubuk ve arka plan renkleri son iki parametredir ve orada yaratıcı olma cazibesi aşağıda tartışılan bir tuzaktır. Ayrıca koordinat orijinine de dikkat edin: HotPDF'deki diğer tüm çizim çağrıları gibi, X ve Y sayfanın sol alt köşesinden punto cinsinden ölçülür, Y yukarı doğru büyür, Merhaba Dünya örneği'nin izlediği aynı kural

İkinci yol, verileri ve bir sınırlayıcı kutuyu (X, Y, Genişlik, Yükseklik) alan ve çubuk desenini o genişliği dolduracak şekilde ölçekleyen DirectDrawBarcode'dur. Kodları bir ızgaraya yerleştirmek için uygundur çünkü alanı belirlersiniz ve yöntem çubukları ona sığdırır. Bu kolaylık aynı zamanda onun tehlikesidir. Ona bir genişlik verdiğinizde, artık modül boyutunu ayarlamıyorsunuzdur; yöntem izin verdiğiniz alanı verinin ihtiyaç duyduğu kadar çubuğa böler ve en dar çubuk, bu bölme işleminden ne çıkarsa o olur. Çok dar bir kutunun içinde yoğun bir Code 128 dizesi isterseniz modüller herhangi bir tarayıcının çözebileceğinin altına sessizce küçülür. Güvenilir bir şekilde taranması gereken herhangi bir şey için DrawBarcode'u tercih edin ve MUnit'i bilinçli olarak ayarlayın. Ortaya çıkan çubukların okunaklı kaldığını ölçtüğünüz düzenlemeler ve önizlemeler için DirectDrawBarcode'u ayırın

Modül genişliği bir çözünürlük kararıdır

İşte etiketinizin işe yarayıp yaramadığını belirleyen aritmetik. Bir lazer tarayıcı ve bir kameranın her ikisinin de ayırt edebilecekleri en küçük özelliği vardır ve dar çubuğun yazdırıldıktan sonra rahatça bunun üzerine inmesi gerekir. Genel amaçlı doğrusal kodlar için yaygın olarak atıfta bulunulan taban, yaklaşık 0,33 mm olan 13 mil dar çubuktur ve birçok perakende ve endüstriyel kılavuz bunu bir hedeften ziyade bir minimum olarak ele alır. Bunu PDF birimlerine çevirin: bir punto inçin 1/72'sidir, yani kabaca 0,353 mm, bu nedenle modül genişliğinin tek bir puntosu tam o tabanda oturur. Gerçek bir tarayıcı için tasarlanmış bir kod için güvenmeniz gereken en küçük değerin MUnit := 1 olmasının ve onu 2'ye katlamanın, boş yeri olan bir etikette neredeyse hiçbir maliyeti olmayan bir marj satın almasının nedeni budur

Şimdi bunu çıktı çözünürlüğüne bağlayın, çünkü modülün yazıcıda da hayatta kalması gerekir. 300 DPI lazer yazıcıda bir cihaz noktası inçin 1/300'üdür, dolayısıyla bir puntoluk modül yaklaşık dört nokta genişliğindedir. Dört nokta, temiz bir kenar oluşturmak için zar zor yeterlidir; toner yayılması ve hafif kayıt (registration) hatası bunu aşındırır ve PDF'nizde bir punto ölçen çubuk spesifikasyonun izin verdiğinden daha kalın veya daha ince yazdırılır. Modülü 2 puntoya çıkarın ve üzerinde çalışabileceğiniz sekiz noktanız olur ki bu da o gürültüyü emer. İçselleştirmeye değer kural: punto olarak ayarladığınız modül genişliği, sahip olmayı dilediğiniz çözünürlükte değil, gerçek baskı çözünürlüğünüzde tam ve rahat bir cihaz noktası sayısıyla eşleşmelidir. Ekrandan kusursuz bir şekilde taranan ve depo yazıcısından başarısız olan bir kod, neredeyse her zaman bu kontrolden başarısız olmuştur

Sessiz bölge sembolün bir parçasıdır

Doğru şekilde kodlanmış bir barkodun taranmamasının en yaygın tek nedeni sessiz bölge, çubukların her iki yanındaki boş kenar boşluğudur. Tarayıcılar kodun nerede başlayıp nerede bittiğini bulmak için bu boşluğu kullanır; bu olmazsa okuyucu sayfada ilk çubuğu onun yanında oturan her neyse ondan ayırt edemez. Standartlar belirlidir. Çoğu doğrusal semboloji, her iki tarafta en az modül genişliğinin on katı bir sessiz bölge ister ve UPC ve EAN perakende kodları solda dokuz ve sağda yedi modül gerektirir. Bir puntoluk bir modülle bu, kabaca on puntodur, yani inçin yaklaşık yedide biri kadar, çubukları çevreleyen garantili bir beyaz alandır

HotPDF çubukları çizer ve başka hiçbir şey çizmez. Sessiz bölgeyi sizin için ayırmaz, bu da sorumluluğun size ait olduğu ve unutulmasının kolay olduğu anlamına gelir. Başarısızlık modu incedir: bir tablo hücresi kenarlığına tam olarak dayanacak şekilde bir barkod yerleştirirsiniz veya sayfa düzeninin bir logoyu yanına sıkıştırmasına izin verirsiniz ve boş bir sayfadaki her testi geçen kod, gerçek bir belgenin içinde gönderildiği an taranmayı durdurur. Kenar boşluğunu açıkça bütçeleyin. DrawBarcode'u çağırmadan önce her iki tarafta en az on modül genişliğinde temiz boşluk bırakın ve bu banda giren herhangi bir grafiği, çizgiyi veya metni kozmetik bir seçim değil, bir kusur olarak değerlendirin

Renk, kontrast ve insan tarafından okunabilen satır

Çubuk ve arka plan renkleri bir marka paletine uymanız için mevcuttur ve bunlar çalışan bir kodu bozmanın en hızlı yoludur. Tarayıcılar kontrastı klasik olarak kırmızı ışıkla okurlar ve açık bir alanda koyu renkli çubuklar beklerler. Test etmeden ulaşmanız gereken tek kombinasyon beyaz üzerine siyahtır. Beyaz üzerine koyu mavi veya koyu yeşil geçebilir; düşük parlaklık kontrastına sahip herhangi bir şey ve özellikle kırmızı ışık tarayıcısının arka plan olarak gördüğü kırmızı çubuklar geçemez. Bir tasarımcı renkli barkodlar isterse dürüst cevap çubukların siyah kalacağı ve rengin etiketin başka bir yerine gideceğidir

DrawBarcode yolu, çubukların altındaki insan tarafından okunabilen metni, bir tarama başarısız olduğunda bir tezgahtarın girdiği rakamları da oluşturabilir. Bu metin bir yedektir, dekorasyon değildir, bu nedenle kendi başlığınızı yerleştirirken sessiz bölgeden uzak tutun; yan kenar boşluğuna sıkıştırılmış semboloji etiketi tarayıcının güvendiği aynı boş alanı bozar. Buradaki örnekte bulunan ve çevresindeki herhangi bir etiket için TextOut da dahil olmak üzere alanlar, barkod daha büyük oluşturulmuş bir sayfadaki tek bir öğe olduğunda gidilecek yer olan rapor çıktısı kılavuzu'nda kapsanan çizim çağrılarının aynısıdır

Kısa bir doğrulama alışkanlığı

Vektör çubukları adlandırılmaya değer bir avantajdır. DrawBarcode kodu rasterleştirilmiş bir resim yerine PDF çizim operatörleri olarak yazdığından çubuklar herhangi bir yakınlaştırmada net kalır ve dosya kendi başına bir çözünürlük taşımaz; önemli olan tek çözünürlük yazıcınınkidir. Bu sizi test etmekten kurtarmaz, sadece testin kağıt üzerinde yapılması gerektiği anlamına gelir. Bir örnek oluşturun, onu kodlarınızın fiilen buluşacağı en düşük çözünürlüklü cihazda yazdırın ve masanızdaki son teknoloji görüntüleyiciyle değil, kullanıcılarınızın elindeki aynı sınıf okuyucuyla tarayın. Çıktıdaki sessiz bölgeleri bir cetvelle kontrol edin, modül genişliğinin puntolardan noktalara olan yolculuktan sağ çıktığını onaylayın ve kodu çözülen değerin kodladığınızla (kontrol basamağı ve tümüyle) eşleştiğini doğrulayın. Gerçek bir tarayıcıyla geçirilen beş dakika, yukarıda açıklanan her başarısızlığı yakalar ve bunları yanlış etiketlenmiş bir palet mal yapmadan önce yakalar

Burada gösterilen DrawBarcode ve DirectDrawBarcode yöntemleri Delphi ve C++Builder için HotPDF Bileşeni'nin bir parçasıdır