Ένα barcode σε μια ετικέτα αποστολής ή ένα τιμολόγιο έχει μία μόνο δουλειά, η οποία είναι να διαβαστεί από έναν σαρωτή με το πρώτο πέρασμα. Το αν θα επιβιώσει από αυτό το πέρασμα αποφασίζεται πολύ πριν το δέμα φτάσει στην αποβάθρα. Αποφασίζεται από τον τρόπο με τον οποίο το σύμβολο τοποθετήθηκε στη σελίδα. Το πιο συνηθισμένο λάθος σε μια ροή εργασιών αναφορών Delphi είναι η απόδοση του barcode ως bitmap κάπου αλλού και η τοποθέτηση αυτής της εικόνας στο PDF. Φαίνεται εντάξει στην οθόνη σε ένα επίπεδο zoom και στη συνέχεια υποβαθμίζεται παντού αλλού.
Η εναλλακτική λύση είναι να σχεδιάσετε το σύμβολο ως διανυσματικό περιεχόμενο (vector), απευθείας στη σελίδα. Το PDFlibPas εκθέτει μια οικογένεια κλήσεων σχεδίασης ακριβώς για αυτό, καλύπτοντας τα δισδιάστατα σύμβολα μήτρας QR, PDF417 και DataMatrix, τις γραμμικές οικογένειες μέσω των Code128 και GS1-128, καθώς και το USPS Intelligent Mail για ταχυδρομικό αυτοματισμό. Το επιχείρημα υπέρ του vector δεν είναι αισθητικό. Αφορά το αν οι ράβδοι προσγειώνονται εκεί που τις περιμένει ο σαρωτής.
Γιατί το vector υπερτερεί μιας τοποθετημένης εικόνας bitmap
Ένα barcode είναι ένα μοτίβο από γραμμές και κενά, ή σε δύο διαστάσεις ένα πλέγμα από σκοτεινά και φωτεινά στοιχεία (modules). Ο αποκωδικοποιητής λειτουργεί μετρώντας την αναλογία αυτών των πλατών. Οτιδήποτε παραμορφώνει τις αναλογίες είναι θόρυβος που καταναλώνει τον προϋπολογισμό σφαλμάτων του συμβόλου. Μια ψηφιογραφημένη (rasterized) εικόνα barcode φέρει σταθερά εικονοστοιχεία. Όταν το PDF αποδίδεται σε έναν εκτυπωτή του οποίου οι κουκκίδες δεν διαιρούνται ομοιόμορφα στο πλέγμα της εικόνας, ο rasterizer πρέπει να κάνει επαναδειγματοληψία, και οι άκρες των στοιχείων που θα έπρεπε να είναι κοφτερές διασκορπίζονται σε δύο εικονοστοιχεία της συσκευής. Μια στενή γραμμή μπορεί να παχύνει, ένα διπλανό κενό να λεπτύνει, και η αναλογία πλάτους στην οποία βασίζεται ο αποκωδικοποιητής να αποκλίνει.
Σχεδιασμένο ως διανυσματικό περιεχόμενο, το ίδιο σύμβολο είναι ένα σύνολο γεμάτων ορθογωνίων που περιγράφονται σε συντεταγμένες χώρου χρήστη PDF. Δεν υπάρχει σταθερό πλέγμα εικονοστοιχείων για να πολεμήσετε. Κατά το χρόνο εκτύπωσης, η συσκευή αποδίδει κάθε ορθογώνιο στην ανάλυση που πραγματικά διαθέτει, οπότε κάθε άκρη στοιχείου είναι τόσο καθαρή όσο επιτρέπει το υλικό, σε οποιαδήποτε κλίμακα και μέγεθος εκτύπωσης. Κλιμακώστε ένα διανυσματικό σύμβολο προς τα πάνω για μια ετικέτα παλέτας ή συρρικνώστε το για ένα δέμα και η γεωμετρία παραμένει ακριβής. Αυτή η ακρίβεια είναι που διατηρεί υψηλό το ποσοστό ανάγνωσης με το πρώτο πέρασμα, το οποίο είναι και το ζητούμενο της τοποθέτησης ενός barcode στη σελίδα.
Κωδικοί QR και τα τέσσερα επίπεδα διόρθωσης
Το QR είναι ένα σύμβολο δισδιάστατης μήτρας που διαβάζεται και στους δύο άξονες ταυτόχρονα, γι' αυτό και συσκευάζει πολλά δεδομένα σε ένα μικρό τετράγωνο. Η ανοχή του σε ζημιές προέρχεται από τη διόρθωση σφαλμάτων Reed-Solomon, η οποία προσφέρεται σε τέσσερα επίπεδα. Το επίπεδο L ανακτά περίπου το 7% των κωδικολέξεων, το M περίπου το 15%, το Q περίπου το 25% και το H περίπου το 30%. Η υψηλότερη διόρθωση δεν είναι δωρεάν. Οι κωδικολέξεις ανάκτησης καταλαμβάνουν χωρητικότητα στοιχείων, οπότε για μια σταθερή ποσότητα δεδομένων ένα υψηλότερο επίπεδο επιβάλλει ένα πιο πυκνό ή φυσικά μεγαλύτερο σύμβολο.
Ο συμβιβασμός εξαρτάται από το περιβάλλον στο οποίο θα ζήσει το σύμβολο. Ένα καθαρό ψηφιακό έγγραφο που θα σαρώνεται μόνο από μια οθόνη μπορεί να παραμείνει στο επίπεδο L και να είναι συμπαγές. Μια ετικέτα που θα εκτυπωθεί, θα υποστεί χειρισμό, θα γδαρθεί και ίσως καλυφθεί εν μέρει από ταινία χρειάζεται Q ή H, επειδή η επιπλέον πλεονάζουσα πληροφορία (redundancy) είναι αυτή που επιτρέπει σε έναν αποκωδικοποιητή να ανακατασκευάσει το περιεχόμενο από ένα σύμβολο που δεν είναι πλέον άθικτο. Η μέθοδος DrawQRCode λαμβάνει τη θέση και ένα SymbolSize που καθορίζει το σχεδιαζόμενο πλάτος και ύψος, καθώς και μια τιμή EncodeOptions που επιλέγει τη λειτουργία δεδομένων (0 για αυτόματη, ή αριθμητικές, αλφαριθμητικές, ISO-8859-1 και UTF-8 παραλλαγές) και μια τιμή DrawOptions για τον προσανατολισμό.
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;
Το ίδιο επίπεδο διόρθωσης επιλέγεται από τον κωδικοποιητή για να χωρέσει τα δεδομένα στο σύμβολο που ζητήσατε. Εάν χρειάζεστε ένα εγγυημένα υψηλό επίπεδο για ένα σκληρό περιβάλλον, δώστε γενναιόδωρο μέγεθος στο σύμβολο, ώστε ο κωδικοποιητής να έχει τον προϋπολογισμό στοιχείων για να ξοδέψει σε πλεονάζουσα πληροφορία αντί να αναγκαστεί να τον μειώσει για να χωρέσει.
PDF417 για ταυτότητες και ετικέτες αποστολής
Το PDF417 είναι ένα στοιβαγμένο γραμμικό σύμβολο (stacked linear). Κάθε σειρά είναι ένα σύντομο γραμμικό barcode, και οι σειρές στοιβάζονται για να σχηματίσουν ένα μπλοκ, γι' αυτό και εμφανίζεται σε άδειες οδήγησης, κάρτες επιβίβασης και ετικέτες αποστολής μεταφορέων, όπου μια ευρύτερη λωρίδα δεδομένων πρέπει να χωρέσει σε ένα ορθογώνιο αποτύπωμα. Η διόρθωση σφαλμάτων του λειτουργεί σε μια κλίμακα από 0 έως 8. Κάθε βήμα σχεδόν διπλασιάζει τον αριθμό των κωδικολέξεων διόρθωσης, επομένως το επίπεδο 5 φέρει πολύ περισσότερη πλεονάζουσα πληροφορία από το επίπεδο 1, με κόστος περισσότερες κωδικολέξεις στη σελίδα.
Το σχήμα ενός μπλοκ PDF417 είναι ρυθμίσιμο, και αυτό έχει σημασία επειδή η ετικέτα έχει σταθερή επιφάνεια να γεμίσει. Η μέθοδος DrawPDF417SymbolEx εκθέτει τα στοιχεία ελέγχου που δεν διαθέτει η βασική κλήση. Οι παράμετροι FixedColumns and FixedRows καρφιτσώνουν τον αριθμό στηλών και σειρών δεδομένων, με το 0 να σημαίνει να αποφασίσει ο κωδικοποιητής. Η ErrorLevel δέχεται -1 για αυτόματο ή μια ρητή τιμή από 0 έως 8. Η ModuleSize είναι το πλάτος του στενότερου στοιχείου στην τρέχουσα μονάδα μέτρησης, και η HeightWidthRatio ορίζει πόσο ψηλό είναι κάθε στοιχείο σε σχέση με το πλάτος του, που είναι ο τρόπος για να κάνετε το μπλοκ κοντό και πλατύ ή ψηλό και στενό για να ταιριάζει με τον χώρο που διαθέτετε.
// 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
Το κλείδωμα των στηλών είναι ο συνήθης μοχλός ελέγχου σε ένα πρότυπο ετικέτας. Ένας σταθερός αριθμός στηλών δίνει στο μπλοκ ένα προβλέψιμο πλάτος, οπότε η γύρω διάταξη δεν μετατοπίζεται καθώς το κωδικοποιημένο περιεχόμενο αλλάζει μήκος από το ένα έγγραφο στο άλλο, ενώ ο κωδικοποιητής προσθέτει σειρές προς τα κάτω για να απορροφήσει τη διαφορά.
DataMatrix για μικρά σημάδια
Το DataMatrix είναι το σύμβολο που πρέπει να επιλέξετε όταν το σημάδι πρέπει να είναι μικρό. Είναι ένα συμπαγές δισδιάστατο πλέγμα που χρησιμοποιεί το ECC 200, το σύγχρονο σχήμα Reed-Solomon, και παραμένει αναγνώσιμο σε μεγέθη όπου ένα σύμβολο QR με τα ίδια δεδομένα θα ήταν άβολο. Αυτό το καθιστά την τυπική επιλογή για απευθείας σήμανση εξαρτημάτων, μικρά ηλεκτρονικά εξαρτήματα και πυκνές ετικέτες εφοδιαστικής (logistics).
Η DrawDataMatrixSymbol λαμβάνει μια τιμή ModuleSize για το βήμα της κουκκίδας (dot pitch), μια τιμή Encoding με 1 για ASCII, και ένα SymbolSize που είναι είτε 0 για αυτόματο είτε μία από τις τυπικές τετράγωνες και ορθογώνιες διαστάσεις, από 10x10 έως 132x132. Η παράμετρος Options συνδυάζει τον προσανατολισμό με το πλάτος της καθαρής ζώνης (quiet-zone), όπου η προσθήκη από 100 έως 400 ορίζει ένα λευκό περίγραμμα από ένα έως τέσσερα στοιχεία. Η καθαρή ζώνη δεν είναι διακόσμηση. Ένας αποκωδικοποιητής χρειάζεται αυτό το καθαρό περιθώριο για να βρει το μοτίβο ανίχνευσης του συμβόλου, και ένα σύμβολο στριμωγμένο δίπλα σε άλλο μελάνι είναι ένα σύμβολο που αποτυγχάνει να ανιχνευθεί.
// 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) barcodes
Τα δισδιάστατα σύμβολα τραβούν την προσοχή, αλλά τα γραμμικά (linear) barcodes εξακολουθούν να κατέχουν μεγάλα τμήματα του λιανικού εμπορίου και της εφοδιαστικής, και ο λόγος είναι η εγκατεστημένη βάση σαρωτών λέιζερ που διαβάζουν με ένα μόνο πέρασμα. Το Code128 είναι ο βασικός εργάτης για αλφαριθμητικά δεδομένα, και η αποδοτικότητά του προέρχεται από τρία σύνολα χαρακτήρων. Το σύνολο A καλύπτει χαρακτήρες ελέγχου και κεφαλαία, το σύνολο B καλύπτει το πλήρες εκτυπώσιμο εύρος ASCII, και το σύνολο C είναι αυτό που έχει σημασία για τους αριθμούς. Το υποσύνολο C κωδικοποιεί ένα ζεύγος ψηφίων σε έναν μόνο χαρακτήρα συμβόλου, οπότε μια σειρά αριθμητικών δεδομένων παίρνει τους μισούς χαρακτήρες συμβόλου από ό,τι στο σύνολο A ή B. Αυτός είναι ο πιο συμπαγής τρόπος για να τοποθετήσετε ένα μακρύ αριθμητικό barcode, και η υλοποίηση Code128 του PDFlibPas συνδυάζει αυτόματα τα σύνολα B και C για να το επιτύχει.
Το GS1-128, το πρότυπο που παλαιότερα ονομαζόταν EAN-128, βασίζεται στο Code128 μεταφέροντας Αναγνωριστικά Εφαρμογής (Application Identifiers), τα προθέματα σε παρένθεση που λένε σε ένα σύστημα λήψης εάν τα ψηφία που ακολουθούν είναι σειριακός αριθμός, κωδικός παρτίδας ή ημερομηνία λήξης. Η δομή επισημαίνεται από το FNC1, έναν ειδικό χαρακτήρα μη-δεδομένων που επισημαίνει το σύμβολο ως κωδικοποιημένο κατά GS1 και διαχωρίζει πεδία μεταβλητού μήκους. Στο PDFlibPas σχεδιάζετε ένα σύμβολο GS1-128 με τη DrawBarcode χρησιμοποιώντας τον τύπο Code128 και τον κυριολεκτικό δείκτη [FNC1] τοποθετημένο στη συμβολοσειρά δεδομένων όπου ξεκινά κάθε αναγνωριστικό εφαρμογής.
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;
Για την αλληλογραφία, το USPS Intelligent Mail, που ονομάζεται επίσης OneCode, κωδικοποιεί δεδομένα δρομολόγησης και παρακολούθησης σε ένα ενιαίο barcode μεταβλητού ύψους (height-modulated) για ταχυδρομικό αυτοματισμό. Η DrawIntelligentMailBarcode λαμβάνει ρητή γεωμετρία για το πλάτος της γραμμής, το πλήρες ύψος της γραμμής, το ύψος του tracker και το πλάτος του διαστήματος, με τα δεδομένα να παρέχονται ως συμβολοσειρά μόνο ψηφίων 20, 25, 29 ή 31 ψηφίων. Τα ρητά ύψη γραμμής και tracker υπάρχουν επειδή το σύμβολο μεταφέρει πληροφορίες σχετικά με το αν κάθε γραμμή είναι πλήρης γραμμή, ascender ή descender, και ο ταχυδρομικός αναγνώστης εξαρτάται από το αν αυτά τα ύψη τηρούνται σύμφωνα με τις προδιαγραφές.
Σχεδίαση στη σελίδα και μέτρηση για τη διάταξη
Κάθε κλήση που εμφανίζεται εδώ σχεδιάζει στο περιεχόμενο της τρέχουσας επιλεγμένης σελίδας, στην ίδια επιφάνεια που δέχεται το κείμενο και τις εικόνες σας, οπότε ένα barcode παράγεται ως μέρος της κανονικής δημιουργίας εγγράφου αντί να εισάγεται ως ξεχωριστός πόρος (asset). Επειδή τα σύμβολα είναι διανυσματικό περιεχόμενο, τα δεδομένα που κωδικοποιούν και η γεωμετρία που καταλαμβάνουν είναι γνωστά κατά τον χρόνο σχεδίασης, κάτι που σας επιτρέπει να τα τοποθετήσετε με ακρίβεια.
Η διάταξη για τις γραμμικές οικογένειες επωφελείται από τη μέτρηση πρώτα. Η GetBarcodeWidth επιστρέφει το συνολικό σχεδιαζόμενο πλάτος ενός barcode για ένα δεδομένο πλάτος στενής γραμμής και τύπο barcode, ώστε να μπορείτε να δεσμεύσετε τον ακριβή οριζόντιο χώρο πριν προχωρήσετε στη σχεδίαση, αντί να μαντεύετε και να ανακαλύπτετε επικάλυψη μετά τη δημιουργία της σελίδας. Τα 2D σύμβολα είναι απλούστερα στην τοποθέτηση επειδή ορίζετε το σχεδιαζόμενο μέγεθός τους απευθείας μέσω του SymbolSize ή του ModuleSize, και το σύμβολο γεμίζει αυτό το αποτύπωμα. Σε κάθε περίπτωση, η πειθαρχία είναι η ίδια. Αποφασίστε το φυσικό μέγεθος από το περιβάλλον σάρωσης, επιβεβαιώστε ότι το σύμβολο χωράει στη θέση που διαθέτετε και αφήστε τη διανυσματική γεωμετρία να διατηρήσει κάθε άκρη καθαρή από την προεπισκόπηση της οθόνης έως την τελική εκτύπωση.
Για την ευρύτερη ροή εργασίας δημιουργίας σελίδων στην οποία εντάσσονται αυτά τα barcodes, οι τεχνικές στο άρθρο μας σχετικά με την εξαγωγή κειμένου, εικόνας και γραμματοσειρών καλύπτουν την ανάγνωση περιεχομένου από ένα PDF, και ο οδηγός για τη συγχώνευση και διαίρεση μεγάλων αρχείων PDF με άμεση πρόσβαση δείχνει πώς να συναρμολογείτε αποτελεσματικά έγγραφα μεγάλου όγκου. Και τα δύο συνδυάζονται φυσικά με το API σχεδίασης που περιγράφεται εδώ, το οποίο παρέχεται ως μέρος της Delphi PDF Library για Delphi και C++Builder μαζί με τα API κειμένου, γραφικών, φορμών και υπογραφών που καλύπτονται σε άλλα σημεία αυτού του ιστολογίου.