مرجع HotPDF
يختار THPDFDocumentHandlerRegistry معالجات قابلة للاستبدال بناءً على فحص المحتوى قبل تلميحات الامتداد أو MIME الضعيفة، ثم يحوّل المصدر المختار إلى ذاكرة تخزين مؤقت PDF واحدة غير قابلة للتغيير يتشاركها التصدير والرسم
المعالجات الاختيارية المدمَجة
- يحافظ XPS وOpenXPS على أبعاد الصفحة الثابتة والترتيب البصري، ويحوّلان هندسة
Pathالمختصرة ذاتية الإغلاق أو الحاملة للخصائص إلى متجهات PDF أصلية، ويحافظان على فرش الألوان الصلبة الخاصة بالسمات وعناصر الخصائص، وأنماط التظليل متعددة النقاطLinearGradientBrushوالإهليلجيةRadialGradientBrush، ويملآن المسارات عبر مواردImageBrushمن نوع JPEG أو PNG أو TIFF أو JPEG XR داخل الحزمة بـTileMode=None - تدعم تعبئات صور XPS ربط
ViewboxوViewportمطلقًا أو بنسبة إلىRelativeToBoundingBox، وأنماط البلاطNoneوTileوFlipXوFlipYوFlipXY، والقص الأصلي للمسار وموضع الرسم، وخصائصTransformمحدودة من ستة معاملات أو عناصرMatrixTransformداخلImageBrush.Transform، وشفافية الفرشاة والمسار، وشفافية القناع الناعم لـ PNG، ودقة الصورة النقطية، والتخزين المؤقت لموارد الحزمة - يدعم
Path.OpacityMaskفي XPS أقنعة solid أو تدرجًا خطيًا متعدد المحطات أو تدرجًا شعاعيًا بيضاويًا أو أقنعةImageBrushمن PNG، بما في ذلك خلايا الصور المتكررة والمنعكسة؛ وتُطوى الشفافية الموحدة في حالات الرسومات الموجودة بينما تستخدم الشفافية المتغيرة مجموعات شفافية DeviceGray أصلية محدودة تتشارك أنماط التظليل وتدفقات الأقنعة الناعمة للصور - تركب قيم
Canvas.OpacityوCanvas.OpacityMaskفي Canvas الخاصة بـ XPS العناصر التابعة المتداخلة مرة واحدة عبر XObjects Form معزولة بمساحة DeviceRGB بدل إضعاف كل تابع على حدة؛ وتُطوى شفافية القناع الموحدة في حالة المجموعة، وتعيد الشفافية المتغيرة للتدرجات أو صور PNG استخدام موارد الأقنعة الناعمة الأصلية، وتحافظ المجموعات المتداخلة على القصاصات المحولة وملكية الموارد وتعليقات الروابط المقيدة ضمن حدود 4,096 مجموعة و16 MiB من المحتوى الملتقط لكل مجموعة - يحوّل
VisualBrushفي XPS تراجعيًا عناصرCanvasوPathوGlyphsالمضمّنة أو المدعومة بالمورد، ويحل نطاقاتResourceDictionaryالمتداخلة والبعيدة، ويربطViewboxمطلقًا بـViewportمطلق أو نسبي، ويعيد استخدام XObject Form محدود واحد في PDF عبر المواضع المباشرة والمبلطة والمنعكسة - يقبل
Canvas.Clipفي XPS هندسة مختصرة محدودة، وقيمPathGeometryمنStaticResourceمحلية أو بعيدة، وعناصر خصائص مباشرة بأشكال خطية وBézier وتربيعية وأقواس بنيوية، وتحويلات الهندسة، والهندسة الفارغة، وقواعد التعبئةEvenOddأوNonZero؛ وتصبح القصاصات المتداخلة مسارات قص أصلية في PDF بـW*أوW، وتتقاطع مستطيلات التنقل مع حدود القص المحولة النشطة، ويسقف التحليل عند 100,000 قيمة رقمية، وتفشل القصاصات التالفة أو المنفردة فشلًا آمنًا قبل رسم الـ visuals التابعة - يقبل
Glyphsفي XPS حتى 65,536 ربطًا صارمًا لقيمIndices، ويحافظ على تقدم العناقيد من واحد إلى كثير ومن كثير إلى واحد، والتقدمات الصريحة بمئات parts-per-em، والإزاحات الأفقية والرأسية، والتقدم المعكوس لقيمBidiLevelالفردية، وتعبئات الخصائص أو السمات solid، والشفافية، واستخراج Unicode، ورسائل تشخيص الفشل الآمن للمدخلات التالفة؛ وتستخدم النطاقات البسيطة مصفوفاتTJأصلية في PDF بينما تنمو مخازن الربط الكبيرة بكلفة خطية ممهّدة - تدعم موارد
FontUriالحزمية برامج TrueType وOpenType وقطع أعضاء TTC وخطوط XPS المشوشة بـ GUID، ويبقى معرّفات المحارف الدقيقة والنطاقات المشتقة من cmap والعناقيد والتقدمات والإزاحات ونقاط الأصل RTL وإعادة استخدام موارد الخط وأذونات التضمين والتجزئة الاختيارية وخرائط استخراجToUnicodeبيانات خطوط PDF أصلية دون إحلال GDI - يصبح
FixedPage.NavigateUriفي XPS على عناصرPathوGlyphsالمحولة تعليق رابط PDF أصليًا بحدود مشتقة من الهندسة أو المقاييس؛ وتبقى روابط HTTP وHTTPS والبريد إجراءات URI، بينما تصبح الصفحات الحزمية النسبية وقطعLinkTargetالمفكوكة من ترميز النسبة إجراءات GoTo أمامية أو خلفية بعد توفر كل الصفحات - يصبح
FixedPage.NavigateUriالخاص بالـ Canvas الهدف الموروث لكل عنصرPathوGlyphsأو Canvas متداخل تابع حتى يوفر تابعٌ ما URI الخاص به؛ وتُعاد الأهداف الخارجية بعد التجاوزات المتداخلة، ويتبع كل تعليق هندسة الـ visual وتحويله، ويبقى مقيدًا بقصاصات Canvas النشطة، ويبقى محفوظًا داخل مجموعات الشفافية المعزولة، ويبقى مكتومًا داخل نطاقاتVisualBrushالقابلة لإعادة الاستخدام - يسقف نظام التنقل عند 65,536 رابطًا وبحد أقصى 8,192 محرفًا لكل URI، ويُفحص للإلغاء أثناء النشر، ويُكتم أثناء التقاط
VisualBrushقابل لإعادة الاستخدام، ويُرفض عند محارف التحكم والمخططات غير الآمنة والأهداف المفقودة وعدم تطابق المسارات والقطع - قيم
RelativeTransformغير القياسية، وموارد المصفوفات غير المحلولة، وانتشار التدرج Repeat أو Reflect، والاستيفاء غير sRGB، وفرش الرسم بشفافية متغيرة، وتحويل الألوان، وحدود الصور، وصناديق عرضVisualBrushالنسبية، ومحاكاة الأنماط، والحروف الجانبية (sideways)، وخصائص الحدود المتقدمة تبقى تشخيصات صريحة - يحسم EPUB ملف
container.xmlوالبيان (manifest) وترتيب العمود الفقري (spine)، ثم يستخدم مستورِد الوسائط المُقسَّمة إلى صفحات (paged-media) من HTML5 المحدود مع موارد حزمة عبر الاستدعاءات فقط - يتعرّف CBZ على مدخلات الصور المدعومة، ويطبّق ترتيبًا طبيعيًا حتميًا لأسماء الملفات، وينشئ صفحة واحدة لكل صورة بدقة DPI المُهيَّأة للصورة
الميزانيات وعزل الأعطال
يفرض مسح وحيد متحقق منه لدليل ZIP المركزي حدودًا على المداخل والبايتات المضغوطة والبايتات الموسعة وحدود كل مدخل والمسارات المكررة والمسارات غير الآمنة ونسبة الضغط قبل التحويل
يمكن لمداخل ZipCrypto الكلاسيكية الخاصة بـ PKZIP طلب بيانات اعتماد عبر ArchivePasswordCallback؛ ويستقبل الاستدعاء اسم المصدر واسم المدخل ورقم المحاولة الذي يبدأ من 1، بينما تحصر MaxPasswordAttempts إعادة المحاولات في المدى من 1 إلى 16
تبقى بيانات الاعتماد والبايتات المفكوكة جزئيًا في الذاكرة وتُمسح بين المحاولات، ويتحقق الإلغاء قبل كل استدعاء وبعده، وتفشل الحالات فشلًا مغلقًا: غياب الاستدعاءات أو رفض بيانات الاعتماد أو استنفاد المحاولات أو تشفير غير مدعوم
يُعد ZipCrypto حماية كلمة مرور قديمة وليس تشفيرًا موثَّقًا حديثًا، ويمكن أن تختلف اصطلاحات بايتات كلمات المرور غير ASCII بين مُنتِجي ملفات ZIP
تحتاج المداخل المحمية بكلمة مرور إلى Delphi 12 أو أحدث، الذي يكشف System.Zip فيه خطاف فك التشفير؛ وعند البناء بإصدار Delphi أقدم، تظل المعالجات قادرة على قراءة المداخل غير المشفرة لكنها ترفض المداخل المشفرة باعتبارها غير مدعومة قبل استدعاء ArchivePasswordCallback
تحتاج المداخل التي تتطلب أحجامها أو إزاحاتها حقول ZIP64 إلى Delphi 11 أو أحدث؛ وترفض إصدارات Delphi الأقدم هذه المداخل باعتبارها غير مدعومة
تبقى حدود الموارد وإعادة التدفق (reflow) والصفحة والبكسل و DPI والمخرجات والإلغاء نشطة طوال عملية التحويل والعرض، بينما يستعيد فشل نشر المخرجات stream وجهة قابلة للبحث (seekable)
التسجيل والاستخدام
var
Registry: THPDFDocumentHandlerRegistry;
Options: THPDFDocumentHandlerOptions;
Handled: IHPDFHandledDocument;
Info: THPDFDocumentHandlerInfo;
begin
Registry:= THPDFDocumentHandlerRegistry.Create;
try
Registry.RegisterStandardHandlers;
Options:= THPDFDocumentHandlerOptions.Default;
if Registry.OpenFromFile('book.epub', '', Options, Handled, Info) then
Handled.WritePDF(OutputStream, Options, Info);
finally
Registry.Free;
end;
end;