ثلاث مكتبات، وثلاث مهام مختلفة. اختيار المكتبة الخطأ يكلفك أسابيع من الحلول الالتفافية، واختيارها كلها بينما تحتاج واحدة فقط يضيف عبء صيانة لم تحسبه. إليك وصفًا مباشرًا لما تفعله كل مكتبة من losLab PDF Libraries فعليًا، وأين تناسب، وأين تسلّم المهمة إلى شقيقاتها.
HotPDF: كتابة PDF من الصفر في Delphi
HotPDF مكوّن VCL أصلي لإنشاء مستندات PDF. نموذجه إجرائي ومتمحور حول الصفحة: تنشئ مثيل THotPDF، وتضبط خصائص المستند، وتستدعي BeginDoc، وترسم على CurrentPage، وتضيف صفحات عند الحاجة، ثم تنهي بـ EndDoc. الترتيب مهم لأن BeginDoc يثبت قاموس التشفير وإعدادات الضغط في اللحظة التي يعمل فيها، وأي قيمة تُسنَد بعد ذلك تُهمَل بصمت بدل أن تُطبَّق بأثر رجعي.
يغطي سطح الرسم مجموعة أوامر PDF كاملة على مستوى Delphi: TextOut للنص Unicode المتموضع، وSetFont مع تضمين TrueType، والعناصر المتجهة مثل الخطوط ومنحنيات Bezier والأهليلجات والمستطيلات، ووضع الصور من ملف أو من الذاكرة، وتوليد الرموز الشريطية. الإحداثيات بالنقاط من الزاوية السفلية اليسرى مع ازدياد المحور Y إلى أعلى، وهذا يفاجئ الجميع مرة واحدة. حالة الخط لا تبقى بعد AddPage، لذا يلزم استدعاء SetFont بعد كل فاصل صفحات.
حقول AcroForm مواطن من الدرجة الأولى. يمكنك إضافة حقول النصوص، ومربعات الاختيار، وأزرار الاختيار، ومربعات القوائم المنسدلة، ومربعات القوائم، وأزرار الإرسال مباشرة إلى كائن الصفحة باستدعاء واحد لكل عنصر. يمكن لـ HotPDF أيضًا تحميل PDF موجود عبر LoadFromFile وملء قيم الحقول أو قراءتها، مما يجعله مفيدًا في مسارين منفصلين: بناء النماذج وأتمتة تعبئتها.
يُدار التشفير أيضًا على مستوى المستند. يختار CryptKeyLength المخطط، من RC4 بطول 40 بت حتى AES-256، ويشغّل ActivateProtection الحماية، بينما يضبط ProtectOptions أعلام الأذونات وفق ISO. يوجد وضعا مراجعة AES-256، R5 وR6، ويُتحكم بهما عبر UseAES256R6، لأن المراجعة 6 تصلح ضعفًا معروفًا في المراجعة 5 لكنها تتطلب عارضًا قادرًا على PDF 2.0، والاختيار بينهما قرار توافق لا قرار راحة.
يدعم HotPDF التوقيع الرقمي وفق ملفات PAdES الأساسية، لذا فهو مناسب لسير العمل الذي يجب أن يلبّي فيه التوقيع متطلبات ETSI EN 319 142. إذا كانت حاجتك مجرد إنشاء المخرجات، فهذه هي المكتبة التي تبدأ بها أولًا.
PDFium VCL: عرض وقراءة ملفات PDF الموجودة
يربط PDFium VCL محرك PDFium من Google كمكوّن VCL، وهذا يمنحه دورًا مختلفًا جذريًا عن HotPDF. حيث يكتب HotPDF، يقرأ PDFium VCL ويعرض. الكائن الأساسي هو TPdf، وهو مدير مستند يفتح ملفًا عبر تعيين FileName ثم Active := True. أخطاء التحميل لا تُرمى كاستثناءات، بل يبقى Active ببساطة False، لذا ففحصه بعد الإسناد ليس خيارًا.
يتم العرض عبر TPdfView، وهو مكوّن بصري تضعه على نموذج وتربطه بمثيل TPdf عبر PdfView.Pdf := Pdf. التكبير ووضع الملاءمة يعيشان على العرض لا على المستند. وهناك تفصيل دقيق يوقع الناس: Pdf.PageNumber وPdfView.PageNumber خاصيتان مستقلتان. تعيين إحداهما لا يحدّث الأخرى، وواجهات الاستخراج المبنية على العرض، مثل صناديق الكلمات ووحدات القراءة، تستخدم الصفحة الحالية في العرض لا في المستند.
استخراج النص هو المجال الذي لا يملك فيه PDFium VCL منافسًا مباشرًا داخل مجموعة losLab. يعيد ReadablePageContent نصًا منظمًا مع وعي بترتيب القراءة، ويعطي PageWordBoxes مستطيلات الإحاطة على مستوى الكلمة، ويمسح DocumentReadingUnits المستند كله. ولأعمال إمكانية الوصول، يخبرك IsTagged بوجود شجرة بنيوية، بينما يشغّل ValidatePdfUa فحص التوافق مع UA. هذه الواجهات تجعل PDFium VCL الخيار الطبيعي لأي سير عمل يحتاج إلى فهم ما بداخل PDF موجود بدل إنشاء واحد جديد.
كما يعمل تعبئة النماذج أيضًا في جانب PDFium، عبر طبقة AcroForm نفسها التي يوفّرها المحرك الأساسي. وهو مناسب عندما يكون المستند المصدر موجودًا بالفعل وتقوم بأتمتة إكماله بدل إنشاء حقول النموذج بنفسك.
PDFlibPas: التلاعب، التوقيع المتوافق، والوصول المباشر إلى الملف
يقف PDFlibPas، الإصدار 3.73.0، في الطرف الآخر من طيف التعقيد. وهو يعرّض ثلاث طبقات API فوق نموذج المستند نفسه: واجهة مسطحة قائمة على المقابض (TPDFlib) متوافقة مع أسلوب استدعاء Quick-PDF، وطبقة شجرية كاملة للكائنات (TPDFDocument)، ومحللًا متدفقًا (TSmartPDFReader / TSmartPDFWriter) يعمل مباشرة على بايتات الملف من دون تحميل الرسم البياني الكامل للكائنات.
الطبقة المتدفقة هي ما يجعل PDFlibPas الخيار الصحيح للمستندات الكبيرة. يمكن لـ TSmartPDFWriter إلحاق تحديث تزايدي بملف على القرص من دون إعادة بناء جدول المراجع المشتركة بالكامل، وهي الآلية التي تقوم عليها كل من إعادة الحفظ الفعالة وختمات التحقق طويل الأمد في PAdES. وفي سير العمل الخاص بالتوقيع بدرجة الامتثال، حيث يجب أن يغطي التجزئة الموقعة نطاقًا محددًا من البايتات ويُطبَّق التوقيع من دون إعادة كتابة المستند، تكون هذه الطبقة المسار الوحيد العملي.
يشمل التلاعب بالمستند على مستوى TPDFDocument الدمج عبر Merge، ونسخ الصفحات الانتقائي عبر CopyPagesFromDoc باستخدام سلسلة نطاق، وحوكمة الإصدار عبر SetMinimumVersion وLockSaveVersion. ويُصدر قفل الإصدار الخطأ 602 إذا حاولت حفظ ميزة تدفع المخرجات فوق الإصدار المقفل، وهو أمر مفيد عندما تحتاج إلى ضمان بقاء المخرجات ضمن مراجعة PDF محددة للامتثال الأرشيفي.
يوجد دعم PDF/A (ISO 19005) في محطة الامتثال الخاصة بـ PDFlibPas. لاحظ أن التشفير وPDF/A متنافيان بحكم المواصفة: لا يمكنك جمعهما في ملف واحد. وسير العمل الذي يحتاج نسخة توزيع مشفرة ونسخة أرشيف PDF/A يجب أن ينتج مخرجين منفصلين.
الاختيار بينها
شجرة القرار المعتادة قصيرة. إذا كنت تنشئ مستندًا جديدًا من البيانات، فاستخدم HotPDF. إذا كنت تعرض أو تستخرج النص من مستند موجود داخل تطبيق Delphi VCL، فاستخدم PDFium VCL. إذا كنت تعدّل ملفات PDF موجودة أو تدمجها أو توقّعها وفق الامتثال وعلى نطاق واسع أو بدلالات الحفظ التزايدي، فاختر PDFlibPas. كثير من الأنظمة الإنتاجية تستخدم اثنتين من الثلاثة: مثلًا HotPDF لإنشاء المخرجات ثم PDFlibPas لإضافة ختم تحقق طويل الأمد قبل الأرشفة، أو PDFium VCL لمعاينة ما أنجزه HotPDF قبل إرساله إلى المرحلة التالية.
تُشحن المكتبات الثلاث جميعًا على هيئة مصدر باسكال أصلي لـ Delphi وC++Builder، بلا اعتماديات تشغيلية خارج VCL. ويضم PDFium VCL أيضًا ملف PDFium DLL، وهو ما يغطي أعمال العرض والتحليل الخاصة بالمحرك. وتحمل صفحة المنتج لكل مكتبة مرجع واجهاتها الكامل وسجل إصدارها الحالي.
تفاصيل المكتبات الفردية: مكوّن HotPDF، مكوّن PDFium VCL، وPDFlibPas.