Barcode bukan gambar yang Anda pakai menghias dokumen. Ia adalah sebuah pengukuran, dan pemindai adalah instrumen yang membacanya. Pembingkaian ulang itu menentukan hampir segalanya tentang bagaimana Anda seharusnya menggambarnya ke dalam PDF. Bar-bar itu tidak membawa informasi lewat kehitamannya; informasinya hidup dalam rasio lebar bar terhadap lebar spasi, dan pembaca memulihkannya dengan mengukur waktu transisi saat laser atau sensor menyapu melintasinya. Perah geometri itu, kaburkan, atau sesaki marginnya, dan Anda menghasilkan sesuatu yang tampak persis seperti barcode tetapi terpindai seperti noda. HotPDF memberi Anda dua cara menaruhnya di halaman, dan perbedaan keduanya persis perbedaan antara mengendalikan geometri itu dan menyerahkannya

Apa yang dapat disandikan HotPDF
HotPDF menggambar simbologi linear (satu dimensi), dan himpunannya lebih luas daripada kebutuhan kebanyakan proyek. Enumerasi THPDFBarcodeType mencakup keluarga Code 2 of 5 dalam bentuk interleaved, industrial, dan matrix; Code 39 beserta varian extended-nya; ketiga subset Code 128 yaitu A, B, dan C; Code 93 biasa dan extended; MSI; PostNet; Codabar; kelompok ritel UPC dan EAN, yakni EAN-8, EAN-13, UPC-A, UPC-E0 dan UPC-E1 yang terkompresi, serta add-on suplemen UPC 2 dan 5 digit; dan subset GS1-128 (EAN-128). Itu cukup untuk mencakup label rantai pasok, titik penjualan ritel, dan kode industri lawas yang masih hidup di gudang
Yang tidak digambarnya adalah keluarga dua dimensi. Tidak ada QR, Data Matrix, atau PDF417 di sini. Ketiganya menyandikan byte dalam kisi dengan matematika koreksi galatnya sendiri, dan jika sebuah kebutuhan menyebut salah satunya, ini adalah perkakas yang keliru dan Anda sebaiknya tahu itu sebelum membangun di sekitarnya, bukan sesudahnya. Untuk kode satu dimensi, pertanyaan praktisnya lebih sempit: simbologi mana yang menerima data yang benar-benar Anda punya, karena penyandiannya tidak saling tertukar
Kendala datanya nyata dan menggigit pada saat pembuatan. Varian Code 2 of 5 dan MSI hanya menerima digit. Code 39 membawa huruf kapital, digit, dan segelintir tanda baca; jika Anda membutuhkan huruf kecil atau rentang ASCII penuh, itu wilayah Code 39 Extended atau salah satu subset Code 128. Code 128C memampatkan dua digit ke dalam tiap simbol demi kerapatan, jadi ia menginginkan string numerik berpanjang genap dan tidak lain. EAN-13 mengharapkan dua belas digit lalu menghitung digit ketiga belas sebagai check; EAN-8 mengharapkan tujuh dan menghitung yang kedelapan; UPC-A menerima dua belas. Berikan sebuah simbologi data yang tak dapat diwakilinya dan Anda tidak mendapat eksepsi yang membantu, Anda mendapat barcode yang menyandikan sampah, yang lebih buruk, karena tampak baik-baik saja sampai seseorang memindainya di kasir
Dua jalur menggambar, dua tingkat kendali
Metode yang perlu diraih untuk produksi adalah DrawBarcode, pada objek halaman. Ia menerima simbologi, posisi, tinggi, dan satu parameter yang lebih penting daripada sisanya: MUnit, lebar modulnya. Modul adalah lebar bar tersempit, atom yang setiap ukuran lain dalam kode itu merupakan kelipatannya, dan di sini dinyatakan dalam poin. Segala hal tentang apakah hasil cetaknya terpindai berpangkal pada satu bilangan bulat itu
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'label.pdf';
Pdf.BeginDoc;
// BCType, X, Y, Height, MUnit (lebar modul dalam poin), sudut,
// data, UseCheckSum, warna bar, warna latar.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // simbologi
72, 680, // X, Y dalam poin dari kiri bawah
60, // tinggi bar
1, // MUnit: bar tersempit 1pt
0, // tanpa rotasi
'123456789012', // 12 digit; yang ke-13 adalah check
True, // tambahkan check digit modulo-10
clBlack, clWhite); // bar hitam, latar putih
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Dua argumen pantas dilihat lebih dekat. UseCheckSum menambahkan check digit modulo-10 yang diharapkan simbologinya, dan untuk kode ritel Anda hampir selalu menginginkannya True; matikan hanya ketika data Anda sudah membawa check yang telah dihitung sebelumnya, atau Anda akan mendapat digit ganda. Warna bar dan latar adalah dua parameter terakhir, dan godaan untuk berkreasi di situ adalah jebakan yang dibahas di bawah. Perhatikan juga titik asal koordinatnya: seperti setiap panggilan menggambar lain di HotPDF, X dan Y diukur dari sudut kiri bawah halaman dalam poin, dengan Y bertambah ke atas, konvensi yang sama yang ditelusuri contoh Hello World
Jalur kedua adalah DirectDrawBarcode, yang menerima data dan sebuah kotak pembatas, X, Y, Width, Height, lalu menskalakan pola bar agar mengisi lebar itu. Ia praktis untuk menata kode pada sebuah kisi karena Anda menyebut jejak ruangnya dan metode itu menyesuaikan bar ke dalamnya. Kepraktisan itu sekaligus bahayanya. Ketika Anda memberinya lebar, Anda tidak lagi menetapkan ukuran modul; metode itu membagi ruang berapa pun yang Anda izinkan di antara sebanyak apa pun bar yang dibutuhkan data, dan bar tersempit menjadi apa pun hasil pembagian itu. Minta string Code 128 yang padat di dalam kotak yang terlalu sempit dan modulnya menyusut di bawah apa yang dapat diuraikan pemindai mana pun, secara senyap. Untuk apa pun yang harus terpindai dengan andal, pilihlah DrawBarcode dan setel MUnit secara sengaja. Sisakan DirectDrawBarcode untuk pratinjau dan untuk penataan yang sudah Anda ukur bahwa bar hasilnya tetap terbaca
Lebar modul adalah keputusan resolusi
Inilah aritmetika yang menentukan apakah label Anda berfungsi. Pemindai laser maupun kamera sama-sama punya fitur terkecil yang dapat dibedakannya, dan bar sempit harus mendarat dengan nyaman di atas ambang itu setelah dicetak. Batas bawah yang lazim dikutip untuk kode linear serbaguna adalah bar sempit 13 mil, sekitar 0,33 mm, dan banyak panduan ritel serta industri memperlakukannya sebagai minimum alih-alih target. Terjemahkan itu ke satuan PDF: satu poin adalah 1/72 inci, kira-kira 0,353 mm, sehingga satu poin lebar modul duduk tepat di batas bawah itu. Itulah sebabnya MUnit := 1 adalah nilai terkecil yang layak Anda percayai untuk kode yang ditujukan ke pemindai sungguhan, dan sebabnya menggandakannya menjadi 2 membeli margin yang nyaris tanpa biaya pada label yang masih punya ruang
Sekarang hubungkan itu dengan resolusi keluaran, karena modulnya juga harus selamat melewati pencetak. Pada pencetak laser 300 DPI satu titik perangkat adalah 1/300 inci, sehingga modul satu poin selebar sekitar empat titik. Empat titik nyaris tak cukup untuk merender tepi yang bersih; sebaran toner dan galat registrasi kecil menggerogotinya, dan bar yang terukur satu poin di PDF Anda tercetak lebih gemuk atau lebih kurus daripada yang diizinkan spesifikasi. Naikkan modulnya ke 2 poin dan Anda punya delapan titik untuk digarap, yang menyerap derau itu. Aturan yang layak dihayati: lebar modul yang Anda setel dalam poin harus memetakan ke jumlah titik perangkat yang bulat dan nyaman pada resolusi cetak Anda yang sebenarnya, bukan resolusi yang Anda angankan. Kode yang terpindai sempurna dari layar tetapi gagal dari pencetak gudang hampir selalu gagal pada pemeriksaan ini
Quiet zone adalah bagian dari simbolnya
Alasan tunggal paling umum sebuah barcode yang tersandi benar tidak mau terpindai adalah quiet zone, margin kosong di kedua sisi bar. Pemindai memakai kekosongan itu untuk menemukan di mana kodenya bermula dan berakhir; tanpanya, pembaca tidak dapat membedakan bar pertama dari apa pun yang duduk di sebelahnya pada halaman. Standarnya spesifik. Sebagian besar simbologi linear menginginkan quiet zone setidaknya sepuluh kali lebar modul di tiap sisi, dan kode ritel UPC serta EAN menuntut sembilan modul di kiri dan tujuh di kanan. Dengan modul satu poin, itu berarti kira-kira sepuluh poin, sekitar sepertujuh inci, ruang putih terjamin yang mengapit bar
HotPDF menggambar bar dan tidak lebih. Ia tidak mencadangkan quiet zone untuk Anda, yang berarti tanggung jawabnya ada di tangan Anda dan mudah terlupakan. Mode kegagalannya halus: Anda menempatkan barcode rapat ke garis sel tabel, atau Anda membiarkan tata letak halaman menyesakkan sebuah logo di sebelahnya, dan kode yang lolos setiap pengujian di halaman kosong berhenti terpindai begitu ia dikirim di dalam dokumen sungguhan. Anggarkan marginnya secara eksplisit. Sebelum memanggil DrawBarcode, sisakan setidaknya sepuluh lebar modul ruang bersih di kedua sisi, dan perlakukan grafis, garis, atau teks apa pun yang menerobos pita itu sebagai cacat, bukan pilihan kosmetik
Warna, kontras, dan baris yang terbaca manusia
Warna bar dan latar ada agar Anda dapat menyelaraskannya dengan palet merek, dan keduanya adalah cara tercepat merusak kode yang tadinya bekerja. Pemindai membaca kontras, secara klasik dengan cahaya merah, dan mengharapkan bar gelap di atas bidang terang. Hitam di atas putih adalah satu-satunya kombinasi yang boleh Anda raih tanpa pengujian. Biru tua atau hijau tua di atas putih mungkin lolos; apa pun yang kontras luminansinya rendah, dan khususnya bar merah, yang dilihat pemindai bercahaya merah sebagai latar, tidak akan lolos. Jika seorang perancang meminta barcode berwarna, jawaban jujurnya adalah bar tetap hitam dan warnanya pergi ke tempat lain pada label itu
Jalur DrawBarcode juga dapat merender teks yang terbaca manusia di bawah bar, yaitu digit yang diketik petugas ketika pemindaian gagal. Teks itu adalah cadangan, bukan hiasan, jadi ketika Anda menempatkan keterangan sendiri jauhkan ia dari quiet zone; label simbologi yang dijejalkan ke margin samping justru mengalahkan ruang kosong yang sama yang menjadi sandaran pemindai. Field dalam contoh di sini, termasuk TextOut untuk label apa pun di sekelilingnya, adalah panggilan menggambar yang sama yang dibahas di panduan keluaran laporan, yang menjadi tempat dituju ketika barcode hanyalah satu elemen dalam halaman tersusun yang lebih besar
Kebiasaan verifikasi singkat
Bar berbasis vektor adalah keunggulan yang layak disebut. Karena DrawBarcode menuliskan kodenya sebagai operator gambar PDF alih-alih citra terasterisasi, bar-nya tetap tajam pada zoom berapa pun dan berkasnya tidak membawa resolusinya sendiri; satu-satunya resolusi yang penting adalah milik pencetak. Itu tidak membebaskan Anda dari pengujian, hanya berarti pengujiannya harus terjadi di atas kertas. Hasilkan satu contoh, cetak pada perangkat beresolusi terendah yang benar-benar akan ditemui kode Anda, dan pindai dengan kelas pembaca yang sama yang dipegang pengguna Anda, bukan imager kelas atas di meja Anda. Periksa quiet zone dengan penggaris pada hasil cetak, pastikan lebar modulnya selamat melewati perjalanan dari poin ke titik, dan verifikasi bahwa nilai hasil pembacaan cocok dengan yang Anda sandikan, lengkap dengan check digit-nya. Lima menit dengan pemindai sungguhan menangkap setiap kegagalan yang dijelaskan di atas, dan menangkapnya sebelum satu palet stok yang salah label melakukannya
Metode DrawBarcode dan DirectDrawBarcode yang ditunjukkan di sini adalah bagian dari HotPDF Delphi Component untuk Delphi dan C++Builder