Technical Article

Delphi ile PDF'de Barkodlar: QR, PDF417, DataMatrix

Bir nakliye etiketi veya fatura üzerindeki bir barkodun tek bir işi vardır: ilk geçişte bir tarayıcı tarafından okunmak. Bu geçişten sağ çıkıp çıkmayacağı, paket rıhtıma ulaşmadan çok önce belirlenir. Sembolün sayfaya nasıl yerleştirildiği ile belirlenir. Raporlama boru hattında yapılan en yaygın hata, barkodu başka bir yerde bit eşlem olarak işlemek ve bu görüntüyü PDF'e yerleştirmektir. Ekranda bir yakınlaştırma düzeyinde iyi görünür ve ardından diğer her yerde bozulur

Alternatif, sembolü vektör içeriği olarak doğrudan sayfanın içine çizmektir. PDFlibPas, tam olarak bunun için 2D matris sembolleri QR, PDF417 ve DataMatrix'i, Code128 ve GS1-128 üzerinden doğrusal aileleri ve posta otomasyonu için USPS Intelligent Mail'i kapsayan bir çizim çağrıları ailesi sunar. Vektör lehine olan argüman estetik değildir. Çubukların tarayıcının beklediği yere gelip gelmediği ile ilgilidir

Neden vektör yerleştirilmiş bir bit eşlemi yener

Barkod, çubukların ve boşlukların bir deseni veya iki boyutta koyu ve açık modüllerin bir ızgarasıdır. Kod çözücü bu genişliklerin oranını ölçerek çalışır. Oranları bozan her şey, sembolün hata bütçesini tüketen gürültüdür. Rasterleştirilmiş bir barkod görüntüsü sabit pikseller taşır. PDF, noktaları görüntü ızgarasına eşit olarak bölünmeyen bir yazıcıda işlendiğinde, rasterleştiricinin yeniden örnekleme yapması gerekir ve keskin olması gereken modül kenarları iki cihaz pikseline yayılır. Dar bir çubuk kalınlaşabilir, bitişik bir boşluk incelebilir ve kod çözücünün dayandığı genişlik oranı kayar

Vektör içeriği olarak çizilen aynı sembol, PDF kullanıcı alanı koordinatlarında tanımlanan bir dizi dolu dikdörtgendir. Savaşılacak sabit bir piksel ızgarası yoktur. Yazdırma zamanında cihaz her dikdörtgeni gerçekten sahip olduğu çözünürlükte işler, böylece every modül kenarı donanımın izin verdiği ölçüde keskin olur, herhangi bir ölçekte ve herhangi bir baskı boyutunda. Bir palet etiketi için bir vektör sembolünü büyütün veya bir paket için küçültün; geometri tam olarak kalır. Bu hassasiyet, ilk geçiş okuma oranını yüksek tutan şeydir; bu da sayfaya barkod koymanın tüm amacıdır

QR kodları ve dört düzeltme seviyesi

QR, her iki eksende birden okunan bir 2D matris sembolüdür; bu yüzden küçük bir kareye çok fazla veri paketler. Hasar toleransı, dört seviyede sunulan Reed-Solomon hata düzeltmesinden gelir. Seviye L kod sözcüklerinin kabaca yüzde 7'sini, M yaklaşık yüzde 15'ini, Q yaklaşık yüzde 25'ini ve H yaklaşık yüzde 30'unu kurtarır. Daha yüksek düzeltme ücretsiz değildir. Kurtarma kod sözcükleri modül kapasitesini işgal eder, bu nedenle sabit miktarda veri için daha yüksek bir seviye daha yoğun veya fiziksel olarak daha büyük bir sembolü zorlar

Bu ticaret, sembolün yaşayacağı ortamla ilgili bir sorudur. Yalnızca bir ekrandan taranacak temiz bir dijital belge L seviyesinde kalabilir ve kompakt kalabilir. Yazdırılacak, taşınacak, yıpranacak ve muhtemelen kısmen bantla kapatılacak bir etiket Q veya H ister, çünkü ekstra yedeklilik, bir kod çözücünün artık bozulmamış olan bir sembolden veriyi yeniden oluşturmasını sağlayan şeydir. DrawQRCode, konumu ve çizilen genişlik ile yüksekliği sabitleyen bir SymbolSize'ı, ayrıca veri modunu seçen bir EncodeOptions değerini (otomatik için 0 veya sayısal, alfasayısal, ISO-8859-1 ve UTF-8 varyantları) ve yönlendirme için bir DrawOptions değerini alır

var
  Pdf: TPDFlib;
begin
  Pdf := TPDFlib.Create(nil);
  try
    Pdf.NewDocument;
    Pdf.SetPageSize('A4');
    Pdf.SetMeasurementUnits(1);   // 1 = millimetres
    Pdf.NewPage;

    // 30 mm square QR, automatic encoding, normal orientation
    Pdf.DrawQRCode(20, 20, 30, 'https://www.loslab.com/', 0, 0);

    Pdf.SaveToFile('Label_QR.pdf');
  finally
    Pdf.Free;
  end;
end;

Düzeltme seviyesinin kendisi, verileri istediğiniz sembole sığdırmak için kodlayıcı tarafından seçilir. Sert bir ortam için garantili yüksek bir seviyeye ihtiyacınız varsa, kodlayıcının sığdırmak için zorlanmak yerine yedekliliğe harcayacak modül bütçesine sahip olması için sembolü cömertçe boyutlandırın

Kimlikler ve nakliye etiketleri için PDF417

PDF417 yığılmış doğrusal bir semboldür. Her satır kısa bir doğrusal barkoddur ve satırlar bir blok oluşturacak şekilde üst üste yığılır; bu yüzden sürücü ehliyetlerinde, biniş kartlarında ve daha geniş bir veri şeridinin dikdörtgen bir ayak izinde oturması gereken kargo nakliye etiketlerinde görünür. Hata düzeltmesi 0 ile 8 arasında bir ölçekte çalışır. Her adım düzeltme kod sözcüklerinin sayısını kabaca ikiye katlar, bu nedenle seviye 5, sayfada daha fazla kod sözcüğü pahasına seviye 1'den çok daha fazla yedeklilik taşır

Bir PDF417 bloğunun şekli ayarlanabilir ve bu önemlidir çünkü etiketin doldurulacak sabit bir alanı vardır. DrawPDF417SymbolEx, temel çağrının yapamadığı kontrolleri ortaya çıkarır. FixedColumns ve FixedRows, veri sütunu sayısını ve satır sayısını sabitler; 0, kodlayıcının karar vermesine izin vermek anlamına gelir. ErrorLevel otomatik için -1 veya açıkça 0 ila 8 alır. ModuleSize, mevcut ölçüm birimindeki en dar öğenin genişliğidir ve HeightWidthRatio, her modülün genişliğine göre ne kadar yüksek olduğunu ayarlar; bu da bloğu sahip olduğunuz alana uyması için kısa ve geniş veya uzun ve dar yapma şeklinizdir

// Fixed 10 data columns, automatic rows, error level 5,
// module 0.30 mm wide, rows three times the module width tall
Pdf.DrawPDF417SymbolEx(20, 60, 'PDF417 PAYLOAD 0123456789',
  0,        // Options: 0 = normal orientation
  10,       // FixedColumns
  0,        // FixedRows: 0 = automatic
  5,        // ErrorLevel: 0 to 8
  0.30,     // ModuleSize, in the current measurement unit
  3.0);     // HeightWidthRatio

Sütunları sabitlemek, bir etiket şablonundaki olağan kaldıraçtır. Sabit bir sütun sayısı bloğa öngörülebilir bir genişlik sağlar, böylece kodlanan veri yükü bir belgeden diğerine uzunluk değiştirdikçe çevreleyen düzen kaymaz; kodlayıcı ise farkı emmek için aşağıya doğru satırlar ekler

Küçük işaretler için DataMatrix

DataMatrix, işaretin küçük olması gerektiğinde ulaşılacak semboldür. Modern Reed-Solomon şeması olan ECC 200'ü kullanan kompakt bir 2D ızgaradır ve aynı veriye sahip bir QR sembolünün garip olacağı boyutlarda okunabilir kalır. Bu, onu doğrudan parça markalama, küçük elektronik bileşenler ve yoğun lojistik etiketleri için standart seçenek haline getirir

DrawDataMatrixSymbol, nokta aralığı için bir ModuleSize, ASCII için 1 değerinde bir Encoding ve otomatik için 0 veya 10x10'dan 132x132'ye kadar standart kare ve dikdörtgen boyutlarından biri olan bir SymbolSize alır. Options parametresi, yönlendirmeyi sessiz bölge (quiet zone) genişliği ile birleştirir; burada 100 ila 400 eklemek, bir ila dört modüllük beyaz bir kenarlık ayarlar. Sessiz bölge süsleme değildir. Bir kod çözücü, sembolün bulucu desenini bulmak için o net marja ihtiyaç duyar ve diğer mürekkeplerin arasına sıkıştırılmış bir sembol, alınamayan bir semboldür

// Auto-sized ASCII DataMatrix, 0.5 mm module, normal orientation
// with a one-module quiet zone (Options 0 + 100)
Pdf.DrawDataMatrixSymbol(20, 110, 0.5, 'DMX-SN-4408812',
  1,        // Encoding: 1 = ASCII
  0,        // SymbolSize: 0 = automatic
  100);     // Options: normal + one-module quiet zone

1D barkodların hala hüküm sürdüğü yerler

İki boyutlu semboller dikkat çekiyor ancak doğrusal barkodlar hala perakende ve lojistiğin büyük bölümlerine sahip ve bunun nedeni tek bir tarama okuyan lazer tarayıcıların kurulu tabanıdır. Code128 alfasayısal veriler için iş gücüdür ve verimliliği üç karakter kümesinden gelir. Set A kontrol karakterlerini ve büyük harfleri kapsar, set B basılabilir tam ASCII aralığını kapsar ve set C sayılar için önemli olandır. Alt küme C, tek bir sembol karakterinde bir çift basamağı kodlar, böylece bir sayısal veri dizisi, A veya B kümesinde alacağı sembol karakterlerinin yarısını alır. Bu, uzun bir sayısal barkod yerleştirmenin en kompakt yoludur ve PDFlibPas Code128 uygulaması buna ulaşmak için B ve C kümelerini otomatik olarak birleştirir

Eski adı EAN-128 olan GS1-128 standardı, alıcı sisteme aşağıdaki basamakların bir seri numarası mı, bir parti kodu mu yoksa bir son kullanma tarihi mi olduğunu söyleyen parantez içindeki önekler olan Uygulama Tanımlayıcılarını taşıyarak Code128 üzerine inşa edilir. Yapı, sembolü GS1 kodlu olarak işaretleyen ve değişken uzunluktaki alanları ayıran özel bir veri dışı karakter olan FNC1 ile işaretlenir. PDFlibPas'ta, her uygulama tanımlayıcısının başladığı veri dizesine yerleştirilen değişmez [FNC1] işaretçisini kullanarak Code128 türüyle DrawBarcode aracılığıyla bir GS1-128 sembolü çizersiniz

var
  W: Double;
begin
  // Code128, with FNC1 markers this becomes a GS1-128 symbol.
  // AI 21 (serial) = ABC123, AI 20 (variant) = 13
  Pdf.DrawBarcode(20, 150, 60, 18, '[FNC1]21ABC123[FNC1]2013',
    3,        // Barcode: 3 = Code128
    0);       // Options: 0 = default drawing

  // Measure the rendered width for a 0.30 mm narrow bar before laying out
  W := Pdf.GetBarcodeWidth(0.30, '[FNC1]21ABC123[FNC1]2013', 3);
end;

Posta için, OneCode olarak da adlandırılan USPS Intelligent Mail, posta otomasyonu için tek bir yükseklik modülasyonlu barkodda yönlendirme ve takip verilerini kodlar. DrawIntelligentMailBarcode, çubuk genişliği, tam çubuk yüksekliği, izleyici yüksekliği ve boşluk genişliği için açık geometri alır ve veriler yalnızca basamaklardan oluşan 20, 25, 29 veya 31 basamaklı bir dize olarak sağlanır. Açık çubuk ve izleyici yükseklikleri mevcuttur çünkü sembol, her çubuğun tam bir çubuk mu, üst çıkıntı mı (ascender) yoksa alt çıkıntı mı (descender) olduğuna dair bilgi taşır ve posta okuyucusu bu yüksekliklerin spesifikasyona uygun tutulmasına bağlıdır

Sayfaya çizim yapma ve düzen için ölçme

Burada gösterilen her çağrı, metninizi ve resimlerinizi alan aynı yüzey olan o anda seçili sayfanın içeriğine çizim yapar, böylece barkod ayrı bir varlık olarak içe aktarılmak yerine normal belge oluşturmanın bir parçası olarak üretilir. Semboller vektör içeriği olduğundan, kodladıkları veriler ve işgal ettikleri geometri çizim zamanında bilinir, bu da onları belirlenmiş şekilde yerleştirmenize olanak tanır

Doğrusal aileler için düzen, önce ölçüm yapmaktan yararlanır. GetBarcodeWidth, belirli bir dar çubuk genişliği ve barkod türü için bir barkodun toplam çizilen genişliğini döndürür, böylece sayfa oluşturulduktan sonra tahmin edip bir çakışma keşfetmek yerine çizimi taahhüt etmeden önce tam yatay alanı ayırabilirsiniz. 2D sembolleri yerleştirmek daha basittir çünkü çizilen boyutlarını doğrudan SymbolSize veya ModuleSize aracılığıyla ayarlarsınız ve sembol bu ayak izini doldurur. Her iki durumda da disiplin aynıdır. Tarama ortamından fiziksel boyuta karar verin, sembolün sahip olduğunuz yuvaya sığdığını doğrulayın ve vektör geometrisinin ekran önizlemesinden son baskıya kadar her kenarı keskin tutmasına izin verin

Bu barkodların düştüğü daha geniş sayfa oluşturma iş akışı için, metin, resim ve yazı tipi çıkarma hakkındaki makalemizdeki teknikler içeriği bir PDF'ten geri okumayı kapsar ve doğrudan erişimle büyük PDF birleştirme ve bölme kılavuzu yüksek hacimli belgelerin nasıl verimli bir şekilde birleştirileceğini gösterir. Her ikisi de, bu blogun başka yerlerinde ele alınan metin, grafik, form ve imza API'lerinin yanı sıra Delphi and C++Builder için Delphi PDF Kitaplığı'nın bir parçası olarak sunulan burada açıklanan çizim API'si ile doğal olarak eşleşir