Τεχνικό Άρθρο

Δημιουργία Γραμμωτών Κωδικών με Δυνατότητα Σάρωσης σε PDF με το HotPDF στο Delphi

Η σχεδίαση ενός γραμμωτού κώδικα (barcode) σε ένα PDF είναι κάτι περισσότερο από την απλή ρίψη μιας γραμματοσειράς γραμμωτού κώδικα (barcode font) στη σελίδα. Οι σαρωτές (scanners) χρειάζονται αντίθεση (contrast), ακριβείς αναλογίες πλάτους (width ratios), και επαρκή κενό χώρο και στις δύο πλευρές για να αναγνωρίσουν πού ξεκινά και πού τελειώνει το σύμβολο. Όταν χρησιμοποιείτε το HotPDF για την απόδοση γραμμωτών κωδικών στο Delphi, ελέγχετε απευθείας το Canvas, και το εξάρτημα (component) υπολογίζει τα γεωμετρικά σχέδια (patterns) και τα σχεδιάζει (draws) ως διανυσματικά (vector) ορθογώνια. Αυτό εγγυάται ότι οι γραμμές του γραμμωτού κώδικα (barcode) παραμένουν ευκρινείς (sharp) σε οποιαδήποτε ανάλυση, παρακάμπτοντας (bypassing) τα προβλήματα θολώματος (blurring) που συχνά προκαλούν οι γραμμωτοί κώδικες που βασίζονται σε εικόνες (image-based) όταν εκτυπώνονται

Συμβολολογίες (Symbologies) και Πλάτη (Widths)

Το HotPDF υποστηρίζει αρκετούς γραμμικούς (μονοδιάστατους) γραμμωτούς κώδικες. Επιλέγετε τη μορφή (format) με το DrawBarcode ή τη συνάρτηση (function) αδελφό (sibling) του, DrawBarcode2, η οποία προσθέτει κείμενο αναγνώσιμο (readable) από τον άνθρωπο από κάτω (underneath)

  • Code39: Αλφαριθμητικό, ευρέως χρησιμοποιούμενο (widely used) για απογραφή (inventory) και επισήμανση (labeling). Υποστηρίζει κεφαλαία (uppercase) γράμματα, αριθμούς, και μια χούφτα (handful) σύμβολα (symbols)
  • Code39Extended: Παραλλαγή (Variant) που υποστηρίζει (supports) το πλήρες σύνολο (full) χαρακτήρων (character) ASCII, με (using) ακολουθίες διαφυγής (escape sequences) κάτω από το (under the) καπό (hood)
  • Code128: Γραμμωτός κώδικας υψηλής πυκνότητας (High-density) ικανός να κωδικοποιήσει (encoding) και τους 128 (all 128) χαρακτήρες (characters) ASCII. Κατάλληλος (Appropriate) για καταναλωτικά είδη (consumer goods) και μεταφορές (shipping)
  • EAN13 / EAN8: Αριθμοί (Numbers) μόνο (only), αυστηρά μεγέθη (strict sizes). Το διεθνές (international) πρότυπο (standard) για σημεία (point) πώλησης (sale) λιανικής (retail)
  • UPCA / UPCE: Η παραλλαγή της Βόρειας Αμερικής (North American) του EAN
  • Interleaved2of5: Γραμμωτός κώδικας μόνο για αριθμούς (Numbers-only) που χρησιμοποιείται (used) συνήθως (usually) σε (on) κυματοειδή χαρτοκιβώτια (corrugated boxes) και (and) μεταφορές (shipping)
  • Codabar: Χρησιμοποιείται σε (Used in) βιβλιοθήκες, τράπεζες (blood banks), και ετικέτες (labels) FedEx, επιτρέποντας (allowing) αριθμούς (numbers) και ορισμένα (certain) γράμματα ελέγχου (control)
  • PostNet: Κωδικοποίηση της Ταχυδρομικής Υπηρεσίας των ΗΠΑ (US Postal Service) (δρομολόγηση με βάση το ύψος / height-based routing)

Κάθε κλήση σχεδίασης (drawing call) απαιτεί (requires) ένα (a) X και ένα Y (κάτω-αριστερή γωνία της πλοκής (plot), σύμφωνα με τις συντεταγμένες PDF), το ύψος του (its height), τη συμβολολογία (symbology), τα δεδομένα προς (to) κωδικοποίηση, και (and) —το πιο σημαντικό— το πλάτος της (its) λεπτότερης (thinnest) γραμμής, συχνά ονομαζόμενης (called) πλάτος μονάδας (module width) (LineWidth στο HotPDF). Αυτή (This) η τιμή υπαγορεύει (dictates) το συνολικό (total) πλάτος του (of the) γραμμωτού κώδικα (barcode), καθώς οι φαρδιές (wide) ράβδοι και τα (and) κενά είναι (are) σταθερά πολλαπλάσια (fixed multiples) αυτής της βασικής (base) μονάδας. Εάν (If) ορίσετε (set) το LineWidth πολύ μικρό (too small), ο εκτυπωτής σας (your printer) θα εμφανίσει τη (the) λεπτή γραμμή (thin line) μαζί (together) με (with) τη διπλανή της (its neighbor), και ο (the) σαρωτής (scanner) θα διαβάσει σφάλμα (an error). Ένα ασφαλές ελάχιστο (minimum) για τους (for) περισσότερους εκτυπωτές λέιζερ (laser printers) είναι γύρω στο 0.75 έως (to) 1.0 σημείο (points) (χονδρικά (roughly) 0.01 ίντσες)

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'shipping_label.pdf';
    Pdf.BeginDoc;
    
    // Set up standard black for the barcode
    Pdf.CurrentPage.SetRGBFillColor(0, 0, 0);
    Pdf.CurrentPage.SetRGBStrokeColor(0, 0, 0);

    // Draw a Code128 barcode at X=50, Y=700.
    // Height is 40 points, thin line width is 1.0 points.
    Pdf.CurrentPage.DrawBarcode(50, 700, 40, 1.0, bcCode128, 'TRACK-8472-ABC');
    
    // Draw the same barcode with human-readable text centered underneath.
    // The font is selected before drawing.
    Pdf.CurrentPage.SetFont('Helvetica', [], 10, DEFAULT_CHARSET);
    Pdf.CurrentPage.DrawBarcode2(50, 600, 40, 1.0, bcCode128, 'TRACK-8472-ABC');

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

Ήσυχες Ζώνες (Quiet Zones) και Κανόνες Διάταξης (Layout Rules)

Οι σαρωτές (Scanners) γραμμωτού κώδικα (Barcode) αναζητούν (look for) μια (a) σταθερή (solid) περιοχή με (of) λευκό χώρο (white space) και στις δύο πλευρές (both sides) του (of the) συμβόλου για (to) να καθορίσουν (determine) την αρχή (the start) και το τέλος (end). Αυτό (This) ονομάζεται (is called) η (the) "ήσυχη ζώνη" ("quiet zone"). Η αποτυχία (Failing) να παρέχετε (to provide) μια (a) επαρκή (sufficient) ήσυχη ζώνη (quiet zone) είναι ο υπ' αριθμόν ένα λόγος (the number one reason) που (that) τα σωστά αποδοσμένα (correctly rendered) σύμβολα δεν σαρώνονται (fail to scan). Μια καλή τιμή (rule) αναφοράς (of thumb) είναι (is) να αφήνετε τουλάχιστον δέκα (ten) φορές (times) το LineWidth σας κενό (empty) στα (on) αριστερά και στα δεξιά (right)

Επειδή το DrawBarcode χρησιμοποιεί την (the) κάτω-αριστερή (bottom-left) γωνία του (of the) συμβόλου ως τη συντεταγμένη (X, Y) του, η ήσυχη (quiet) ζώνη πρέπει (must) να υπολογιστεί από εσάς (you). Εάν (If) ο γραμμωτός κώδικας (the barcode) κάθεται (sits) δίπλα (next) σε (to) ένα ορθογώνιο περίγραμμα (bounding box) πλαισίου (frame) με αριστερό περιθώριο (left margin) 40, μην (don't) περάσετε (pass) το 40 στο DrawBarcode. Περάστε το 50 (υποθέτοντας ότι το LineWidth σας είναι (is) 1.0). Ομοίως (Likewise), αποφύγετε (avoid) τη σχεδίαση (drawing) πλαισίων (frames) ή κανόνων (rules) πολύ κοντά (too closely) στην (to the) κορυφή ή στο (or) κάτω μέρος (bottom) του (of the) συμβόλου (symbol)

Σφάλματα (Errors) Κωδικοποίησης (Encoding) και Δεδομένα (Data)

Εάν (If) περάσετε χαρακτήρες (characters) σε (to) μια (a) κλήση DrawBarcode που η (the) συμβολολογία (symbology) δεν υποστηρίζει (does not support) (όπως (like) γράμματα σε έναν γραμμωτό κώδικα (in an) EAN13), το HotPDF μπορεί (might) είτε να περικόψει (truncate) τα δεδομένα (data), είτε να αποτύχει αθόρυβα (silently), ή να δημιουργήσει (generate) ένα (an) άκυρο σύμβολο (invalid symbol). Είναι δική σας ευθύνη (responsibility) να καθαρίσετε (sanitize) την (the) είσοδο (input). Για αριθμούς EAN ή UPC, τα δεδομένα πρέπει επίσης να έχουν το σωστό μήκος (όπως (like) 12 ψηφία για (for) EAN13 (το HotPDF υπολογίζει το 13ο ψηφίο (digit) ελέγχου (check) για (for) εσάς (you))). Για Code39, τα δεδομένα (data) γίνονται αποδεκτά (is accepted) ως έχουν (as-is)

Τέλος (Finally), θυμηθείτε να ορίσετε (set) το FillColor και (and) το StrokeColor σε (to) μαύρο (μαζί με το SetFont αν χρησιμοποιείτε το DrawBarcode2) πριν τη σχεδίαση (drawing). Τα χρώματα (Colors) διαφορετικά από (other than) το (the) μαύρο, ειδικά (especially) τα ανοιχτά χρώματα (light) ή τα χρώματα χαμηλής (low) αντίθεσης (contrast), θα (will) εμποδίσουν την ικανότητα (ability) ενός σαρωτή (scanner's) να διαβάζει αξιόπιστα (reliably) τις ράβδους (the bars) εναντίον του λευκού φόντου (background)