บทความเทคนิค

ไลบรารี losLab PDF สำหรับ Delphi: HotPDF, PDFium และ PDF Library for Delphi

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

แผนภาพเปรียบเทียบไลบรารี PDF ของ losLab สามตัวสำหรับ Delphi: HotPDF สำหรับสร้างเอกสารใหม่, PDFium Component สำหรับเรนเดอร์และสกัดไฟล์ที่มีอยู่ และ PDF Library for Delphi สำหรับควบรวมกับการลงลายเซ็นตามมาตรฐาน
HotPDF เขียน PDF ใหม่จากโค้ด PDFium Component อ่านและเรนเดอร์ไฟล์ที่มีอยู่ และ PDF Library for Delphi รวม เซ็น และควบคุมกำกับสิ่งที่มีอยู่แล้ว

HotPDF: สร้าง PDF ขึ้นมาใหม่ใน Delphi

HotPDF เป็นคอมโพเนนต์ VCL แบบเนทีฟ (native) สำหรับการสร้างเอกสาร PDF รูปแบบของมันคือแบบเรียกใช้ตามคำสั่ง (imperative) และเน้นที่หน้ากระดาษเป็นศูนย์กลาง: คุณสร้างอินสแตนซ์ THotPDF ตั้งค่าคุณสมบัติของเอกสาร เรียก BeginDoc วาดลงบน CurrentPage เพิ่มหน้าตามต้องการ และปิดด้วย EndDoc ลำดับมีความสำคัญเพราะ BeginDoc จะคอมมิต (commit) พจนานุกรมการเข้ารหัส (encryption dictionary) และการตั้งค่าการบีบอัดในจังหวะที่มันทำงาน; สิ่งใดก็ตามที่ถูกกำหนดหลังจากจุดนั้นจะถูกเพิกเฉยไปอย่างเงียบ ๆ แทนที่จะนำไปใช้ย้อนหลัง

พื้นที่วาดเขียนครอบคลุมตัวดำเนินการของ PDF แบบเต็มชุดในระดับ Delphi: TextOut สำหรับข้อความ Unicode แบบวางตำแหน่ง, SetFont สำหรับฝังฟอนต์ TrueType, กราฟิกรูปทรง (เส้นโค้งเบซิเยร์ วงรี สี่เหลี่ยม), การวางรูปภาพจากไฟล์หรือหน่วยความจำ และการสร้างบาร์โค้ด พิกัดเป็นหน่วยพอยต์จากมุมซ้ายล่างโดยที่ Y เพิ่มขึ้นไปด้านบน ซึ่งมักจะดักทางทุกคนได้เสมอ สถานะของฟอนต์จะไม่คงอยู่หลังจาก AddPage ดังนั้นจึงจำเป็นต้องเรียก SetFont หลังจากการขึ้นหน้าใหม่ทุกครั้ง

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

การเข้ารหัสได้รับการจัดการที่ระดับเอกสารเช่นกัน CryptKeyLength จะเลือกโครงร่างการเข้ารหัส (ตั้งแต่ 40-bit RC4 ถึง AES-256), ActivateProtection จะเปิดการทำงาน และ ProtectOptions จะตั้งค่าแฟล็กการอนุญาตตามมาตรฐาน ISO โหมดการแก้ไข AES-256 สองโหมด (R5 และ R6 ซึ่งถูกควบคุมโดย UseAES256R6) มีอยู่เนื่องจากการแก้ไขระดับ 6 แก้ไขจุดอ่อนที่ทราบแล้วในระดับ 5 แต่จำเป็นต้องใช้โปรแกรมอ่านที่รองรับ PDF 2.0; การเลือกระหว่างสองสิ่งนี้คือการตัดสินใจด้านความเข้ากันได้ (compatibility) ไม่ใช่ด้านความสะดวกสบาย

แผนภาพวงจรชีวิตการสร้าง PDF ของ HotPDF ใน Delphi ตั้งแต่การสร้าง THotPDF ผ่าน BeginDoc, การวาด, AddPage และ EndDoc พร้อมกฎว่าออปชันของเอกสารถูก commit ที่ BeginDoc
ตัวเลือกระดับเอกสารล็อกเมื่อ BeginDoc ทำงาน พิกัดเติบโตจากซ้ายล่าง และสถานะฟอนต์รีเซ็ตทุกครั้งที่ AddPage

การสนับสนุนลายเซ็นดิจิทัลใน HotPDF ครอบคลุมโปรไฟล์พื้นฐานของ PAdES ดังนั้นจึงเหมาะสมสำหรับกระบวนการทำงานที่ลายเซ็นจะต้องเป็นไปตามข้อกำหนด ETSI EN 319 142 หากความต้องการของคุณมีเพียงแค่การสร้างผลลัพธ์ HotPDF คือไลบรารีตัวแรกที่คุณควรมองหา

PDFium Component: การเรนเดอร์ การดู และการอ่าน PDF ที่มีอยู่

PDFium Component ครอบเครื่องยนต์ PDFium ของ Google ไว้เป็นคอมโพเนนต์ VCL ซึ่งทำให้มันมีบทบาทที่แตกต่างจาก HotPDF โดยพื้นฐาน ที่ที่ HotPDF เป็นตัวเขียน PDFium Component จะเป็นตัวอ่านและเรนเดอร์ ออบเจกต์หลักคือ TPdf ซึ่งเป็นตัวจัดการเอกสารที่จะเปิดไฟล์โดยตั้ง FileName และจากนั้นจึง Active := True ความล้มเหลวในการโหลดจะไม่ถูกรายงานเป็น exception; Active เพียงแค่ค้างอยู่ที่ False ดังนั้นการตรวจสอบค่าหลังจากการตั้งค่าจึงเป็นสิ่งจำเป็น

การเรนเดอร์ทำงานผ่าน TPdfView ซึ่งเป็นคอมโพเนนต์การมองเห็นที่คุณวางลงในฟอร์มและเชื่อมต่อเข้ากับอินสแตนซ์ TPdf ผ่าน PdfView.Pdf := Pdf การซูมและโหมดพอดีจอ (fit mode) มีอยู่บนการมองเห็น ไม่ใช่อยู่ที่เอกสาร ความละเอียดอ่อนข้อหนึ่งที่ทำให้คนพลาด: Pdf.PageNumber และ PdfView.PageNumber เป็นคุณสมบัติอิสระ การตั้งค่าหนึ่งไม่ได้อัปเดตอีกสิ่ง และ API การสกัดข้อมูลที่ขึ้นอยู่กับการมองเห็น (กล่องคำ, หน่วยการอ่าน) จะใช้หน้าปัจจุบันของมุมมอง ไม่ใช่ของเอกสาร

การดึงข้อความออกคือจุดที่ PDFium Component ไม่มีคู่แข่งโดยตรงในชุดของ losLab ReadablePageContent ส่งคืนข้อความที่มีโครงสร้างโดยรับรู้ถึงลำดับการอ่าน, PageWordBoxes ให้กรอบสี่เหลี่ยมระดับคำ และ DocumentReadingUnits เดินผ่านเอกสารทั้งหมด สำหรับงานความสามารถในการเข้าถึง (accessibility) IsTagged จะบอกให้คุณทราบว่ามีต้นไม้โครงสร้างอยู่หรือไม่ และ ValidatePdfUa จะเรียกใช้การตรวจสอบความสอดคล้อง (conformance) แบบ UA API เหล่านี้ทำให้ PDFium Component เป็นตัวเลือกตามธรรมชาติสำหรับกระบวนการทำงานใด ๆ ที่จำเป็นต้องเข้าใจสิ่งที่อยู่ภายใน PDF ที่มีอยู่มากกว่าการสร้าง PDF ขึ้นมาใหม่

การกรอกแบบฟอร์มยังทำงานบนฝั่ง PDFium ด้วย ผ่านเลเยอร์ AcroForm เดียวกับที่เอนจิ้นพื้นฐานทำงานอยู่ สิ่งนี้เหมาะสมเมื่อเอกสารต้นฉบับมีอยู่แล้วและคุณกำลังทำให้การเติมข้อมูลเสร็จสมบูรณ์โดยอัตโนมัติมากกว่าการสร้างฟิลด์ฟอร์มด้วยตัวเอง

PDF Library for Delphi: การจัดการ, การเซ็นเอกสารเพื่อ compliance และการเข้าถึงไฟล์โดยตรง

PDF Library for Delphi (เวอร์ชัน 3.73.0) ตั้งอยู่ที่อีกฟากของคลื่นความซับซ้อน มันเปิดเผยเลเยอร์ API 3 ระดับที่ด้านบนของโมเดลเอกสารเดียวกัน: Facade ตาม handle ที่แบนราบ (TPDFlib) ซึ่งทำงานร่วมกับแบบแผนการเรียกของ Quick-PDF, เลเยอร์ออบเจกต์ทรีแบบเต็ม (TPDFDocument), และตัวแจงส่วนการสตรีม (TSmartPDFReader / TSmartPDFWriter) ที่ทำงานโดยตรงกับไบต์ของไฟล์โดยไม่ต้องโหลดกราฟออบเจกต์ที่สมบูรณ์

เลเยอร์สตรีมมิ่งคือสิ่งที่ทำให้ PDF Library for Delphi เป็นตัวเลือกที่ถูกต้องสำหรับเอกสารขนาดใหญ่ TSmartPDFWriter สามารถผนวกการอัปเดตส่วนเพิ่มลงในไฟล์บนดิสก์ได้โดยไม่ต้องสร้างตารางอ้างอิงข้าม (cross-reference table) ขึ้นใหม่ทั้งหมด ซึ่งนี่คือกลไกพื้นฐานที่รองรับการบันทึกซ้ำอย่างมีประสิทธิภาพและแสตมป์การตรวจสอบความถูกต้องระยะยาว (long-term validation stamps) ของ PAdES สำหรับเวิร์กโฟลว์การลงนามระดับ compliance ซึ่งแฮชที่ลงนามจะต้องครอบคลุมช่วงไบต์เฉพาะและการลงนามถูกนำไปใช้โดยไม่มีการเขียนเอกสารใหม่ เลเยอร์นี้คือเส้นทางเดียวที่ใช้งานได้จริง

การจัดการเอกสารที่ระดับ TPDFDocument ครอบคลุมการผสานรวม (merge) ผ่าน Merge, การคัดลอกหน้าบางส่วนแบบเลือกผ่าน CopyPagesFromDoc ด้วยสตริงกำหนดช่วง, และการควบคุมเวอร์ชันผ่าน SetMinimumVersion และ LockSaveVersion การล็อกเวอร์ชันจะแสดงข้อผิดพลาด (error) 602 หากคุณพยายามบันทึกฟีเจอร์ที่จะผลักดันผลลัพธ์ให้สูงกว่าเวอร์ชันที่ล็อกไว้ ซึ่งมีประโยชน์เมื่อคุณต้องรับประกันว่าผลลัพธ์จะอยู่ภายในการปรับปรุงแก้ไขระดับ PDF ที่เจาะจงเพื่อสอดคล้องกับการเก็บรักษา

การสนับสนุน PDF/A (ISO 19005) มีอยู่บนเวิร์กเบนช์ความสอดคล้องของ PDF Library for Delphi โปรดทราบว่าการเข้ารหัสและ PDF/A นั้นไม่สามารถใช้งานร่วมกันได้ตามข้อกำหนด: คุณไม่สามารถมีทั้งสองอย่างในไฟล์เดียวได้ กระบวนการทำงานที่จำเป็นต้องมีสำเนาแจกจ่ายที่เข้ารหัสและสำเนาเก็บถาวร PDF/A จะต้องสร้างอาร์ติแฟกต์แยกกันสองชิ้น

การเลือกระหว่างไลบรารี

ต้นไม้การตัดสินใจแบบทั่วไปจะสั้นนิดเดียว: หากคุณกำลังสร้างเอกสารใหม่จากข้อมูล ให้ใช้ HotPDF หากคุณกำลังเรนเดอร์หรือดึงข้อความจากเอกสารที่มีอยู่ในแอปพลิเคชัน Delphi VCL ให้ใช้ PDFium Component หากคุณกำลังจัดการ ผสาน หรือเซ็นชื่อรับรองตามมาตฐานของเอกสาร PDF ที่มีอยู่ในระดับมาก หรือด้วยการบันทึกส่วนเพิ่ม (incremental-save) ให้ใช้ PDF Library for Delphi ระบบในขั้นตอนการใช้งานจริงจำนวนมากใช้สองในสามตัวร่วมกัน: ใช้ HotPDF เพื่อสร้างผลลัพธ์ และ PDF Library for Delphi เพื่อนำแสตมป์การตรวจสอบความถูกต้องระยะยาวไปใช้ก่อนทำการเก็บถาวร เป็นต้น หรือใช้ PDFium Component เพื่อดูตัวอย่างผลลัพธ์ที่ HotPDF สร้างขึ้นก่อนส่งต่อไปยังปลายทาง

ทั้งสามตัวนี้จัดจำหน่ายในรูปแบบซอร์สโค้ด Pascal เนทีฟสำหรับ Delphi และ C++Builder โดยไม่มีการอ้างอิงรันไทม์ใด ๆ นอกเหนือจาก VCL PDFium Component ยังมี DLL ของ PDFium มาให้ด้วย ซึ่งครอบคลุมงานเรนเดอร์และแจงส่วนของเอนจิ้น หน้าผลิตภัณฑ์ของไลบรารีแต่ละตัวมีการอ้างอิง API ฉบับเต็มและประวัติเวอร์ชันปัจจุบัน

รายละเอียดเกี่ยวกับไลบรารีแต่ละตัว: HotPDF Delphi Component, PDFium Component และ PDF Library for Delphi

แผนภาพสถาปัตยกรรมของ PDF Library for Delphi แสดง facade TPDFlib, ต้นไม้ออบเจ็กต์ TPDFDocument และ parser แบบสตรีมของ TSmartPDFReader กับ TSmartPDFWriter อยู่เหนือไฟล์เอกสารหนึ่งไฟล์
facade แบบแบนเหมาะกับลำดับการเรียกสั้น ๆ แผนภูมิออบเจกต์รับมือการแก้ไขเชิงโครงสร้าง และตัวแยกวิเคราะห์แบบ streaming ต่อยอด incremental update และตรา PAdES โดยไม่ต้องโหลดใหม่ทั้งหมด