Technical Article

บาร์โค้ดใน PDF ด้วย Delphi: QR, PDF417, DataMatrix

บาร์โค้ดบนป้ายกำกับการขนส่งหรือใบแจ้งหนี้มีหน้าที่เพียงอย่างเดียวคือต้องการให้เครื่องสแกนอ่านข้อมูลได้สำเร็จในการสแกนรอบแรก การที่มันจะผ่านขั้นตอนนี้ไปได้นั้นถูกกำหนดไว้ล่วงหน้าก่อนที่กล่องสินค้าจะส่งถึงท่าเรือเสียอีก โดยกำหนดจากวิธีการวาดสัญลักษณ์บาร์โค้ดลงบนหน้ากระดาษ ข้อผิดพลาดทั่วไปในระบบรายงานของ Delphi คือการแปลงบาร์โค้ดให้เป็นรูปภาพบิตแมปจากแหล่งอื่นและนำรูปภาพนั้นไปวางในไฟล์ PDF รูปภาพจะดูคมชัดดีบนหน้าจอที่ระดับการซูมระดับหนึ่ง แต่จะสูญเสียความละเอียดไปทั้งหมดเมื่อแสดงผลที่ระดับการซูมแบบอื่น

ทางเลือกที่ดีกว่าคือการวาดสัญลักษณ์บาร์โค้ดในรูปแบบเนื้อหาเวกเตอร์ (vector content) ลงในหน้ากระดาษตรง ๆ PDFlibPas นำเสนอชุดคำสั่งวาดภาพเพื่อการนี้โดยเฉพาะ ครอบคลุมตั้งแต่สัญลักษณ์เมทริกซ์ 2 มิติอย่าง QR, PDF417 และ DataMatrix กลุ่มบาร์โค้ดแบบเส้นตรงอย่าง Code128 และ GS1-128 ไปจนถึงรหัสไปรษณีย์อัตโนมัติ USPS Intelligent Mail เหตุผลการเลือกใช้เนื้อหาเวกเตอร์ไม่ใช่เรื่องของความสวยงาม แต่เป็นเรื่องที่ว่าแถบข้อมูลเส้นจะไปวางอยู่ในตำแหน่งที่เครื่องสแกนคาดหวังได้ตรงจุดหรือไม่

ทำไมบาร์โค้ดแบบเวกเตอร์จึงเหนือกว่าการวางบิตแมป

บาร์โค้ดประกอบด้วยแถบเส้นสลับกับช่องว่าง หรือในรูปแบบ 2 มิติจะเป็นตารางของช่องสว่างสลับกับช่องมืด เครื่องถอดรหัสจะคำนวณข้อมูลโดยวัดสัดส่วนความกว้างเหล่านั้น สิ่งใด ๆ ที่มาบิดเบือนสัดส่วนความกว้างจะกลายเป็นสัญญาณรบกวนที่ทำลายความสามารถในการทนต่อข้อผิดพลาดของสัญลักษณ์ รูปภาพบาร์โค้ดที่ถูกแปลงเป็นพิกเซล (rasterized) จะมีความละเอียดพิกเซลคงที่ เมื่อไฟล์ PDF ถูกส่งไปสั่งพิมพ์ด้วยเครื่องพิมพ์ที่จุดหมึกพิมพ์ไม่สามารถแบ่งช่องได้ลงตัวกับตารางพิกเซลของรูปภาพ ระบบจะทำการสุ่มเลือกจุดสีใหม่ (resample) และขอบของบาร์โค้ดที่ควรจะคมชัดจะถูกเฉลี่ยจุดสีแผ่ออกไปบนพิกเซลของเครื่องพิมพ์สองจุด แถบเส้นบาร์โค้ดที่แคบอาจจะขยายหนาขึ้น ช่องว่างข้างเคียงอาจจะแคบลง และสัดส่วนความกว้างที่เครื่องถอดรหัสใช้คำนวณจะเพี้ยนไป

แต่เมื่อวาดบาร์โค้ดในรูปแบบเวกเตอร์ สัญลักษณ์เดิมนั้นจะถูกจำลองเป็นกลุ่มสี่เหลี่ยมผ้านทาสีทับที่อธิบายพิกัดในหน่วยพื้นที่ใช้งานของ PDF จึงไม่มีปัญหาเรื่องตารางพิกเซลคงที่ให้ต้องคัดง้างกัน เมื่อพิมพ์ออกเครื่องพิมพ์ ตัวเครื่องพิมพ์จะเรนเดอร์สี่เหลี่ยมแต่ละรูปที่ระดับความละเอียดจริงที่เครื่องพิมพ์ทำได้ ดังนั้นขอบของแถบเส้นบาร์โค้ดทุกจุดจะคมกริบที่สุดเท่าที่ฮาร์ดแวร์เครื่องพิมพ์จะเอื้ออำนวย ไม่ว่าจะพิมพ์ที่ระดับขนาดใดหรือขนาดกระดาษแบบใดก็ตาม การขยายบาร์โค้ดเวกเตอร์สำหรับป้ายพาเลทสินค้าขนาดใหญ่หรือการย่อขนาดสำหรับกล่องพัสดุขนาดเล็กจะยังคงเก็บความแม่นยำด้านพิกัดไว้ได้ครบถ้วน ความแม่นยำนี้คือหัวใจสำคัญที่ทำให้อัตราการสแกนผ่านในครั้งแรกอยู่ในระดับสูง ซึ่งเป็นเป้าหมายที่แท้จริงของการวางบาร์โค้ดไว้บนหน้ากระดาษ

รหัส QR และระดับการกู้คืนข้อมูลสี่ระดับ

รหัส QR คือสัญลักษณ์เมทริกซ์ 2 มิติที่เครื่องสแกนสามารถอ่านได้จากทั้งสองแกนพร้อมกัน ซึ่งช่วยให้มันสามารถบรรจุข้อมูลปริมาณมากไว้ในพื้นที่สี่เหลี่ยมขนาดเล็กได้ ความสามารถในการทนต่อความเสียหายของสัญลักษณ์มาจากการกู้คืนข้อผิดพลาดแบบ Reed-Solomon ซึ่งระบุไว้สี่ระดับด้วยกัน ระดับ L กู้คืนข้อมูลได้ประมาณ 7 เปอร์เซ็นต์ของรหัสข้อมูล ระดับ M ประมาณ 15 เปอร์เซ็นต์ ระดับ Q ประมาณ 25 เปอร์เซ็นต์ และระดับ H ประมาณ 30 เปอร์เซ็นต์ แต่ความสามารถในการกู้คืนข้อมูลที่สูงขึ้นไม่ได้มาฟรี ๆ เนื่องจากรหัสที่ใช้สำหรับกู้คืนจะต้องใช้พื้นที่ช่องตารางข้อมูลของบาร์โค้ด ดังนั้นหากปริมาณข้อมูลนำเข้ามีขนาดเท่าเดิม การเลือกใช้ระดับกู้คืนข้อมูลที่สูงขึ้นจะบีบให้สัญลักษณ์บาร์โค้ดต้องมีความหนาแน่นเพิ่มขึ้นหรือมีขนาดใหญ่ขึ้น

การตัดสินใจเลือกใช้งานจึงอยู่ที่สภาพแวดล้อมที่สัญลักษณ์บาร์โค้ดจะต้องไปใช้งานจริง เอกสารดิจิทัลที่สะอาดสะอ้านซึ่งมีวัตถุประสงค์เพื่อใช้สแกนจากหน้าจอเพียงอย่างเดียวสามารถตั้งระดับไว้ที่ L เพื่อให้มีขนาดเล็กและกะทัดรัดได้ ส่วนป้ายที่จะต้องพิมพ์ออกมา นำไปเคลื่อนย้าย เสียดสี หรืออาจมีเทปกาวมาปิดทับบางส่วน ควรเลือกใช้ระดับ Q หรือ H เนื่องจากข้อมูลสำรองกู้คืนที่เพิ่มเข้ามาจะเป็นส่วนที่ช่วยให้เครื่องถอดรหัสสามารถสร้างข้อมูลเดิมกลับคืนมาได้แม้สัญลักษณ์จะเสียหายไปบ้าง 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 symbol) แต่ละแถวคือบาร์โค้ดเส้นตรงสั้น ๆ และแถวหลาย ๆ แถวจะถูกวางซ้อนต่อกันจนได้รูปร่างบล็อก ซึ่งเป็นเหตุผลที่ว่าทำไมจึงพบบาร์โค้ดประเภทนี้บนใบอนุญาตขับขี่ บัตรขึ้นเครื่องบิน และป้ายกำกับการส่งของของผู้นำส่งพัสดุซึ่งมีข้อมูลปริมาณมากที่ต้องจัดวางไว้ในขอบเขตสี่เหลี่ยม การกู้คืนข้อผิดพลาดมีตั้งแต่ระดับ 0 ถึง 8 การปรับเพิ่มขึ้นในแต่ละระดับจะเพิ่มปริมาณคำรหัสสำหรับกู้คืนเป็นสองเท่า ดังนั้นระดับ 5 จึงมีข้อมูลสำรองสำหรับกู้คืนข้อมูลมากกว่าระดับ 1 มาก แต่ต้องแลกกับการใช้พื้นที่พิมพ์คำรหัสมากขึ้นบนหน้ากระดาษ

รูปร่างของบล็อก PDF417 สามารถปรับเปลี่ยนได้ ซึ่งมีความสำคัญมากเนื่องจากป้ายกำกับมักจะมีพื้นที่พิมพ์ที่จำกัดคงที่ ฟังก์ชัน DrawPDF417SymbolEx นำเสนอการควบคุมเพิ่มเติมที่ฟังก์ชันพื้นฐานไม่มีให้ พารามิเตอร์ FixedColumns และ 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 คือสัญลักษณ์บาร์โค้ดที่ควรเลือกใช้งานเมื่อต้องการให้มีขนาดพิมพ์ที่เล็กที่สุด มันคือตาราง 2 มิติขนาดกะทัดรัดที่ใช้มาตรฐาน ECC 200 ซึ่งเป็นระบบ Reed-Solomon สมัยใหม่ และยังคงความสามารถในการสแกนข้อมูลได้ดีในขนาดพิมพ์ที่สัญลักษณ์ QR ทั่วไปที่มีข้อมูลเดียวกันจะเริ่มมีขนาดใหญ่เทอะทะ ทำให้มันกลายเป็นตัวเลือกมาตรฐานสำหรับใช้พิมพ์ตราบนชิ้นส่วนโดยตรง การทำเครื่องหมายบนชิ้นส่วนอิเล็กทรอนิกส์ขนาดเล็ก และการพิมพ์ป้ายกำกับโลจิสติกส์ที่มีความหนาแน่นสูง

DrawDataMatrixSymbol จะรับค่า ModuleSize สำหรับกำหนดขนาดของจุดสี ค่า 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

จุดที่บาร์โค้ด 1 มิติยังคงมีบทบาทสำคัญ

แม้สัญลักษณ์แบบ 2 มิติจะได้รับความสนใจเป็นส่วนใหญ่ แต่บาร์โค้ดแบบเส้นตรงยังคงครองพื้นที่การใช้งานหลักในภาคค้าปลีกและโลจิสติกส์ เหตุผลคือความต้องการรองรับเครื่องสแกนเลเซอร์แบบกวาดเส้นเดียวที่มีใช้อย่างแพร่หลาย บาร์โค้ด Code128 คือหัวใจหลักสำหรับจัดการข้อมูลที่เป็นตัวอักษรปนตัวเลข ประสิทธิภาพของมันมาจากชุดตัวอักษรสามชุดด้วยกัน ชุด A ครอบคลุมอักขระควบคุมและตัวพิมพ์ใหญ่ ชุด B ครอบคลุมช่วงอักขระ ASCII ที่สามารถพิมพ์ได้ทั้งหมด และชุด C คือชุดที่มีบทบาทสำคัญสำหรับจัดเก็บตัวเลข ชุดย่อย C จะเข้ารหัสตัวเลขเป็นคู่ในสัญลักษณ์ตัวเดียว ทำให้กลุ่มข้อมูลตัวเลขยาว ๆ ใช้พื้นที่พิมพ์เพียงครึ่งเดียวเมื่อเทียบกับการเขียนผ่านชุด A หรือ B นี่คือวิธีการพิมพ์บาร์โค้ดตัวเลขยาวที่กะทัดรัดและประหยัดพื้นที่ที่สุด และตัวจัดการ Code128 ของ PDFlibPas จะผสานการทำงานชุด B และ C เข้าด้วยกันโดยอัตโนมัติเพื่อให้ได้โครงสร้างนี้

บาร์โค้ดมาตรฐาน GS1-128 (เดิมชื่อ EAN-128) พัฒนาต่อยอดขึ้นมาจาก Code128 โดยสามารถจัดเก็บข้อมูลตัวระบุแอปพลิเคชัน (Application Identifiers) ซึ่งก็คือรหัสคำนำหน้าในวงเล็บที่บอกให้ระบบปลายทางทราบว่าตัวเลขถัดไปคือหมายเลขซีเรียล รหัสชุดสินค้า (batch code) หรือวันหมดอายุ โครงสร้างนี้ระบุความเป็นสากลด้วยตัวอักขระพิเศษที่ไม่ใช่ข้อมูลจริงคือ 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) จะเข้ารหัสข้อมูลเส้นทางขนส่งและการติดตามพัสดุไว้ในบาร์โค้ดแบบปรับเปลี่ยนความสูงเส้นเดียวสำหรับการคัดแยกไปรษณีย์อัตโนมัติ ฟังก์ชัน DrawIntelligentMailBarcode รับพารามิเตอร์ด้านรูปทรงที่ละเอียด ทั้งความกว้างแถบเส้น ความสูงแถบเส้นทั้งหมด ความสูงของแถบสั้นคัดแยก (tracker height) และระยะความกว้างช่องว่าง โดยรับข้อมูลอินพุตเป็นสตริงตัวเลขล้วนที่มีความยาว 20, 25, 29 หรือ 31 หลัก สาเหตุที่มีการระบุรายละเอียดความสูงของแถบเส้นและแถบสั้นอย่างชัดเจนก็เพราะข้อมูลบาร์โค้ดจะถูกเก็บไว้ในระดับความสูงต่ำของเส้นพิมพ์แต่ละแถบ (เส้นเต็ม เส้นสูง หรือเส้นต่ำ) และเครื่องอ่านไปรษณีย์ต้องพึ่งพาความแม่นยำของความสูงเหล่านั้นให้ตรงตามข้อกำหนดมาตรฐาน

การวาดลงบนหน้ากระดาษและการวัดขนาดสำหรับจัดเลย์เอาต์

คำสั่งเรียกใช้งานทุกคำสั่งที่อธิบายในที่นี้จะใช้วาดลงบนเนื้อหาของหน้ากระดาษที่ถูกเลือกอยู่ ณ ปัจจุบัน ซึ่งเป็นระนาบแบนชุดเดียวกับที่ใช้วางตัวอักษรและรูปภาพ บาร์โค้ดจึงถูกสร้างขึ้นเป็นส่วนหนึ่งของกระบวนการผลิตเอกสารตามปกติ แทนที่จะถูกนำเข้าในรูปแบบรูปภาพประกอบภายนอก และเนื่องจากบาร์โค้ดนี้คือเนื้อหาเวกเตอร์ ข้อมูลที่มันเข้ารหัสและพิกัดขอบเขตจึงสามารถคำนวณและรับทราบได้ล่วงหน้าในขั้นตอนการวาด ช่วยให้คุณระบุตำแหน่งวางได้อย่างแน่นอนและแม่นยำ

การจัดเลย์เอาต์สำหรับบาร์โค้ดแบบเส้นตรงจะมีประสิทธิภาพมากขึ้นหากทำการวัดขนาดก่อนวาด ฟังก์ชัน GetBarcodeWidth จะคำนวณและส่งคืนขนาดความกว้างทั้งหมดของบาร์โค้ดที่แสดงผลจากความกว้างแถบเส้นแคบและประเภทบาร์โค้ดที่ระบุ ช่วยให้คุณสามารถเว้นระยะพื้นที่แนวนอนไว้ล่วงหน้าได้อย่างแม่นยำก่อนทำการวาด แทนที่จะคาดเดาและพบปัญหาสัญลักษณ์ทับซ้อนกันหลังจากสร้างหน้ากระดาษเสร็จแล้ว บาร์โค้ดแบบ 2 มิติจะวางเลย์เอาต์ได้ง่ายกว่า เนื่องจากคุณกำหนดขนาดการแสดงผลได้โดยตรงผ่านพร็อพเพอร์ตี้ SymbolSize หรือ ModuleSize และตัวบาร์โค้ดจะขยายเต็มพื้นที่พิมพ์นั้น ไม่ว่าจะจัดการในแบบใด ข้อควรปฏิบัติจะเหมือนกันคือ: ให้คำนวณขนาดที่ควรใช้จากสภาพแวดล้อมสแกนจริง ยืนยันว่าบาร์โค้ดมีขนาดพอดีกับช่องที่มี และปล่อยให้สถาปัตยกรรมเวกเตอร์ช่วยเก็บขอบแถบเส้นบาร์โค้ดให้คมชัดเสมอตั้งแต่พรีวิวบนหน้าจอไปจนถึงกระดาษจริง

สำหรับกระบวนการสร้างเอกสารในภาพรวมที่นำบาร์โค้ดเหล่านี้ไปประกอบรวมนั้น เทคนิคใน บทความการดึงข้อความ รูปภาพ และฟอนต์ของเรา จะครอบคลุมวิธีการดึงข้อมูลกลับออกมาจากไฟล์ PDF และ คู่มือการผสานและแยกไฟล์ PDF ขนาดใหญ่ด้วยวิธีเข้าถึงโดยตรง จะอธิบายวิธีรวบรวมเอกสารปริมาณมากอย่างมีประสิทธิภาพ ทั้งสองอย่างนี้ผสานเข้ากับ API การวาดภาพที่อธิบายไว้ที่นี่ ซึ่งพร้อมใช้งานเป็นส่วนหนึ่งของ Delphi PDF Library สำหรับ Delphi และ C++Builder ร่วมกับ API จัดการตัวอักษร กราฟิก แบบฟอร์ม และระบบลงนามดิจิทัลที่มีในบล็อกนี้