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

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

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

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) ไม่ใช่ด้านความสะดวกสบาย

การสนับสนุนลายเซ็นดิจิทัลใน 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 เดียวกับที่เอนจิ้นพื้นฐานทำงานอยู่ สิ่งนี้เหมาะสมเมื่อเอกสารต้นฉบับมีอยู่แล้วและคุณกำลังทำให้การเติมข้อมูลเสร็จสมบูรณ์โดยอัตโนมัติมากกว่าการสร้างฟิลด์ฟอร์มด้วยตัวเอง

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

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

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

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

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

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

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

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

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