پشتیبانی فیلترهای PDF

نمای کلی

جریان‌های PDF و تصویرهای توکار، کُدگذاری خود را از طریق نام فیلترها مشخص می‌کنند. HotPDF هنگام تولید سند یا رمزگشایی محتوای خارجی، عمدتاً با خانواده‌های فیلتر زیر کار می‌کند

فیلترهای رایج

  • FlateDecode: فیلتر فشرده‌سازی اصلی برای جریان‌های تولیدشده و مسیر اصلی بازفشرده‌سازی مبتنی بر zlib
  • LZWDecode: برای سناریوهای قدیمی و سازگاری از طریق HPDFLZW.pas پشتیبانی می‌شود
  • DCTDecode: برای داده‌های استاندارد تصویر JPEG که از مسیرهای بارگذاری تصویر HotPDF عبور می‌کنند استفاده می‌شود
  • CCITTFaxDecode: در تصویرهای تک‌رنگ TIFF و داده‌های تصویری سبک فکس رایج است
  • ASCIIHexDecode / ASCII85Decode / RunLengthDecode: کمک‌رویه‌های کدگذار که در HPDFTypes.pas (_ASCIIHexEncode, _ASCII85Encode, _RunLengthEncode) از HotPDF v2.4.0 در دسترس‌اند. هنگام بسته‌بندی محتوای دودویی دلخواه برای کانال‌های 7 بیتی یا برای پشتیبانی صریح round-trip PDF 1.7 7.4 مفید هستند
  • JBIG2Decode / JPXDecode: نام فیلترها طبق PDF 1.7 7.4.7 / 7.4.9 تعریف شده‌اند. کمک‌رویه‌های bundled JBIG2 و JPEG 2000 در HotPDF تا زمانی که یک backend واقعی OpenJPEG / JBIG2 لینک نشود، stub هستند و پشتیبانی‌نشده گزارش می‌شوند (False برمی‌گردانند). نسخه‌های قبلی یک موفقیت جعلی 100×100 برمی‌گرداندند که تصویرهای ناخوانا تولید می‌کرد؛ این رفتار اکنون اصلاح شده است

نکته‌های عملی

  • همه فیلترها از طریق یک API عمومی واحد در دسترس نیستند؛ برخی از آن‌ها از طریق واحدهای کمکی اختصاصی تصویر یا جریان قابل دسترسی‌اند
  • برای محتوای PDF تولیدشده، THotPDF.Compression همچنان تنظیم مرکزیِ قابل‌رویت برای کاربر است
  • هنگام بارگذاری داده خارجی، فیلتر قابل‌اعمال به قالب فایل منبع و کلاس کمکی مورد استفاده بستگی دارد
  • PDFهای رمزگذاری‌شده این فیلترها را با security handler ترکیب می‌کنند؛ برای گزینه‌های پشتیبانی‌شده AES‑128 (V=4 R=4 / CFM=AESV2) و RC4 (V=1/V=2) به CryptKeyLength مراجعه کنید
  • فیلدهای فرم تعاملی به‌صورت Widget annotation صادر می‌شوند که نمایشگر آن‌ها را ترسیم می‌کند؛ به پشتیبانی AcroForm مراجعه کنید
  • حاشیه‌نویسی‌های Text-markup (Highlight, Underline, Squiggly, StrikeOut) و پیوندهای پرش درون‌سندی (GoTo, GoToR, Launch) از HotPDF v2.6.0 به‌بعد به‌صورت متدهای جدید THPDFPage.Add*Annotation / AddGoToLink / AddGoToRLink / AddLaunchLink در دسترس‌اند
  • خروجی DeviceCMYK از طریق THPDFPage.SetCMYKColor / SetCMYKFillColor / SetCMYKStrokeColor در دسترس است؛ فضای رنگ‌های مدیریت‌شده با ICC با THotPDF.RegisterICCProfile ثبت می‌شوند و از طریق SetFillColorSpace / SetStrokeColorSpace + SetFillColor / SetStrokeColor اعمال می‌شوند. از HotPDF v2.7.0 در دسترس است
  • پیش از ذخیره، THotPDF.UseXRefStream را روی true بگذارید تا به‌جای دنبالهٔ متنی xref / trailer / startxref یک جریان cross-reference فشرده‌شده با FlateDecode و از نوع /Type /XRef صادر شود (PDF 1.7 7.5.8)؛ از HotPDF v2.8.0 در دسترس است
  • THotPDF.EnableXMPMetadata را روی true بگذارید تا یک جریان XMP /Type /Metadata /Subtype /XML به Catalog ضمیمه شود (PDF 1.7 14.3.2)؛ این جریان از فیلدهای Info dict به‌طور خودکار ساخته می‌شود، یا می‌توانید یک بستهٔ دست‌نویس را از طریق CustomXMP بدهید. از HotPDF v2.9.0 در دسترس است
  • دروازه‌بندی نسخهٔ PDF برای هر متد (از HotPDF v2.24.0). هر متد قابلیتی که از v2.4.0 به بعد معرفی شده پیش از صدور RequirePDFVersion را بررسی می‌کند؛ با StrictVersionLock=false (پیش‌فرض) مقدار Version سند بی‌صدا تا حداقل نسخهٔ لازم برای آن قابلیت بالا می‌رود و با StrictVersionLock=true فراخوانی رد می‌شود تا فایل ذخیره‌شده دقیقاً با spec مرجع 1.3 / 1.4 / 1.5 / 1.6 / 1.7 منطبق بماند
  • کدگذارهای predictor برای دادهٔ تصویر فشرده‌شده با FlateDecode در PNG و TIFF (PDF 1.7 7.4.4.4): _PNGPredictorEncode heuristic فیلتر minimum-absolute-difference libpng را اعمال می‌کند (Predictor=15)، و _TIFFPredictor2Encode horizontal differencing را اعمال می‌کند (Predictor=2). از HotPDF v2.10.0 در دسترس است
  • نقاط ورود tagged PDF (PDF 1.7 14.7-14.8): THotPDF.Lang مقدار /Lang را در Catalog پر می‌کند، EnableTaggedPDF /MarkInfo <</Marked true>> و یک /StructTreeRoot stub صادر می‌کند، و متدهای جدید THPDFPage.BeginMarkedContent / BeginMarkedContentMCID / EndMarkedContent عملگرهای BMC / BDC / EMC را در جریان محتوا می‌نویسند. از HotPDF v2.11.0 در دسترس است
  • گرادیان‌های محوری و شعاعی (PDF 1.7 7.10 / 8.7): THotPDF.RegisterAxialGradient / RegisterRadialGradient پشتهٔ کامل Function Type 2 / Shading Type 2-3 / Pattern Type 2 را می‌سازند و یک نام pattern پایدار برمی‌گردانند؛ THPDFPage.SetFillPattern / SetStrokePattern آن را روی صفحه نصب می‌کنند. تعداد مؤلفه‌های رنگ شروع / پایان DeviceGray (1) / DeviceRGB (3) / DeviceCMYK (4) را انتخاب می‌کند. از HotPDF v2.13.0 در دسترس است؛ گرادیان‌های محوری چندایستگاهی از طریق Function Type 3 از v2.18.0 با RegisterMultiStopAxialGradient در دسترس‌اند
  • تصویرهای درون‌خطی (PDF 1.7 8.9.7) از طریق THPDFPage.DrawInlineImage؛ وقتی Filter داده نشود، بایت‌های خام به‌طور خودکار با ASCIIHex wrap می‌شوند تا جریان محتوا 7-bit-clean بماند. از HotPDF v2.18.0 در دسترس است
  • OutputIntentها (PDF 1.7 14.11) از طریق THotPDF.AddOutputIntent؛ هر فراخوانی یک دیکشنری /Type /OutputIntent را همراه با /DestOutputProfile اختیاری که به یک ICC profile ثبت‌شده ارجاع می‌دهد به Catalog اضافه می‌کند. از HotPDF v2.18.0 در دسترس است
  • تولید خودکار appearance-stream در AcroForm (PDF 1.7 12.5.5 / 12.7.3.3 / 8.10): پیش از افزودن فیلدهای فرم تعاملی THotPDF.AutoFormAppearances را روی true بگذارید تا HotPDF برای هر ورودی /AP /N ویجت یک Form XObject از نوع /Subtype /Form از پیش بسازد (زیر‌دیکشنری‌های Yes / Off برای دکمه‌ها)، منابع پیش‌فرض /DR در AcroForm را با دیکشنری‌های فونت غیرمستقیم Helvetica / ZapfDingbats پر کند و /NeedAppearances را روی false بگذارد تا rendererها جریان‌های تعبیه‌شده را رعایت کنند. از HotPDF v2.28.0 در دسترس است
  • ViewerPreferences /ViewArea و /ViewClip (PDF 1.4 12.2 Table 152) اکنون از طریق propertyهای THotPDF.ViewArea / THotPDF.ViewClip (به‌همراه set memberهای متناظر vpViewArea / vpViewClip) در دسترس‌اند. هر دو مقدارهای THPDFPageBoundary (MediaBox / CropBox / BleedBox / TrimBox / ArtBox) را می‌پذیرند و پوشش HotPDF را برای چهار ViewerPreferences مرزی صفحه در PDF 1.4 کامل می‌کنند. از HotPDF v2.29.0 در دسترس است
  • گذارهای صفحه (PDF 1.1 / 1.5 12.4.4): THPDFPage.SetPageTransition یک دیکشنری /Trans روی صفحه می‌نویسد تا PDF readerها در /PageMode /FullScreen حرکت را متحرک کنند. styleهای PDF 1.1 (Split, Blinds, Box, Wipe, Dissolve, Glitter, R) و styleهای PDF 1.5 (Fly, Push, Cover, Uncover, Fade) از طریق enum THPDFTransitionStyle در دسترس‌اند؛ زیرگزینه‌های /Dm، /M و /Di نیز در دسترس‌اند. THPDFPage.SetPageDuration تأخیر auto-advance در /Dur را بر حسب ثانیه می‌نویسد. از HotPDF v2.30.0 در دسترس است
  • گروه transparency در سطح صفحه (PDF 1.4 11.6.6 / 7.5.5): THPDFPage.SetTransparencyGroup یک دیکشنری /Group (/Type /Group /S /Transparency) ضمیمه می‌کند تا rendererها محتوای دارای alpha را به‌صورت قابل‌پیش‌بینی compositing کنند. یک فضای رنگ دستگاه را از طریق enum THPDFGroupColorSpace (DeviceGray / DeviceRGB / DeviceCMYK یا omit) انتخاب کنید، یا THPDFPage.SetTransparencyGroupICC را با نام یک ICC profile که قبلاً از طریق THotPDF.RegisterICCProfile ثبت شده فراخوانی کنید. flagهای اختیاری /I (Isolated) و /K (Knockout) compositor را هدایت می‌کنند؛ THPDFPage.ClearTransparencyGroup یک ورودی ضمیمه‌شدهٔ قبلی را حذف می‌کند. از HotPDF v2.32.0 در دسترس است
  • به‌روزرسانی افزایشی (PDF 1.7 ISO 32000-1 7.5.6): THotPDF.BeginIncrementalUpdate(SourceFile) یک PDF موجود را در حالت append-only بارگذاری می‌کند؛ فراخوانی‌های بعدی CreateIndirect* به‌طور خودکار شیءهای جدید را dirty علامت می‌زنند و THotPDF.MarkDirty(Obj) شیءهای بارگذاری‌شدهٔ موجود را برای صدور دوباره برچسب می‌زند. THotPDF.SaveIncrementalUpdate(TargetFile) بایت‌های منبع اصلی را عیناً می‌نویسد، فقط شیءهای dirty را با حفظ شمارهٔ شیءهایشان اضافه می‌کند، یک زیر‌بخش جدید xref صادر می‌کند و در پایان trailerی با /Prev که به xref قبلی اشاره می‌کند می‌سازد. این متد را با pipeline موجود AddSignedSignatureField + PreparePDFForSigning + InsertSignatureHex ترکیب کنید تا بتوانید فیلدهای امضای بعدی را به سندی که قبلاً امضا شده اضافه کنید بدون این‌که امضاهای قبلی نامعتبر شوند (digestهای /ByteRange آن‌ها معتبر می‌مانند چون هیچ‌یک از بایت‌های اصلی تغییر نمی‌کنند). از HotPDF v2.35.0 در دسترس است
  • عادی‌سازی نام فونت Embedded TrueType: HotPDF جدول نام TrueType تعبیه‌شده را می‌خواند و /BaseFont، /FontDescriptor /FontName، /FontFamily و نام‌های فونت CID فرزند را با نام PostScript برنامهٔ فونت هم‌راستا می‌کند. این کار از شکست‌های Adobe Acrobat Font Capture که از ناهماهنگی بین دیکشنری فونت PDF و payload تعبیه‌شدهٔ TTF ناشی می‌شوند جلوگیری می‌کند. از HotPDF v2.35.1 در دسترس است
  • subsetting فونت TrueType (PDF 1.7 ISO 32000-1 9.6.4 / 9.8.2): پیش از BeginDoc، THotPDF.EnableFontSubsetting را روی true بگذارید تا HotPDF payload تعبیه‌شدهٔ TrueType را دوباره بسازد و فقط glyphهایی را نگه دارد که واقعاً در سند استفاده شده‌اند. در سندهای معمول لاتین، وزن فونت تعبیه‌شده حدود 90٪ کاهش می‌یابد (Arial یک مگابایتی -> حدود 70 KB برای یک "Hello, world." یک‌خطی)؛ وابستگی‌های composite-glyph به‌صورت بازگشتی دنبال می‌شوند، شماره‌گذاری GID حفظ می‌شود (پس جریان‌های محتوای Type0 / Identity-H موجود همچنان کار می‌کنند) و /BaseFont جدید به‌طور خودکار پیشوند شش‌حرفی الزام‌شده توسط spec به‌همراه علامت + را می‌گیرد (برای نمونه /BaseFont /AAAAAA+ArialMT). این گزینه به‌طور پیش‌فرض خاموش است؛ برای حفظ embedding کامل فونت در گردش‌کارهای ویرایشی آن را به‌صورت opt-in روشن کنید. از HotPDF v2.36.0 در دسترس است
  • subsetter فرمت Compact Font Format (CFF) (PDF 1.7 ISO 32000-1 9.7.4 / 9.9): همراه subsetting TrueType برای فونت‌های OpenType-CFF (.otf, sfntVersion OTTO) و فونت‌های Type 1 / Type 1C است. تابع صادرشده از واحد HPDFSubsetCFF(CFFBytes, KeepGlyph) فهرست CharStrings INDEX را دوباره می‌سازد و glyphهای نگه‌نداشته‌شده را با stub حداقلی یک‌بایتی endchar جایگزین می‌کند، در حالی که شماره‌گذاری GID را بایت‌به‌بایت حفظ می‌کند. از HotPDF v2.37.0 در دسترس است
  • مسیر embedding OpenType-CFF (.otf) به StoreFont وصل شده است (PDF 1.6+ 9.7.4 Table 117). وقتی باینری فونت بارگذاری‌شده از طریق GDI یک container sfnt OTTO باشد، HotPDF زیرجدول تعبیه‌شدهٔ 'CFF ' را از طریق HPDFSubsetOTFContainer subset می‌کند، برنامهٔ فونت را از طریق /FontFile3 /Subtype /OpenType صادر می‌کند و دیکشنری فونت فرزند را با /Subtype /CIDFontType0 به‌جای /CIDFontType2 می‌نویسد. فونت‌های TrueType همچنان از مسیر موجود /FontFile2 + /CIDFontType2 بدون تغییر رفتاری عبور می‌کنند. از HotPDF v2.38.0 در دسترس است
  • subsetting سرتاسری subroutineهای CFF (PDF 1.7 9.7.4 §6 / Adobe Tech Note #5177 §3.1): subsetter CFF اکنون ورودی‌های استفاده‌نشده را از هر دو فهرست Global Subr INDEX (بلافاصله پس از String INDEX در باینری CFF) و Local Subr INDEX (داخل Private DICT، قابل دسترسی از طریق operator 18 در Top DICT + operator 19 در Private DICT) حذف می‌کند. یک closure تک‌مرحله‌ایِ fixed-point به‌صورت transitive زنجیره‌های callsubr (op 0x0A) و callgsubr (op 0x1D) را دنبال می‌کند، بنابراین CharStringی که یک Local Subr را صدا بزند و آن Local Subr یک Global Subr را صدا بزند و آن هم یک Local Subr دیگر را صدا بزند، در یک iteration شناسایی می‌شود. هر ورودی استفاده‌نشده با یک stub یک‌بایتی return جایگزین می‌شود و INDEX درجا با صفرهای پُرکنندهٔ انتهایی بازنویسی می‌شود. این رفتار از طریق helperهای عمومی HPDFSubsetCFF و HPDFSubsetOTFContainer در دسترس است؛ scannerهای سطح پایین‌تر CFF همچنان داخلی می‌مانند. از HotPDF v2.39.0 در دسترس است
  • subsetting CFF با کلید CID (PDF 1.7 ISO 32000-1 9.7.4 / Adobe Tech Note #5176 §18-19): subsetter CFF اکنون operator ROS در Top DICT (12-30) را که یک فونت OpenType-CFF کلیدشده با CID را مشخص می‌کند تشخیص می‌دهد و INDEX دیکشنری‌های Font DICT در FDArray (12-36) را پیمایش می‌کند؛ هر کدام Private DICT و Local Subr INDEX خود را دارند. نگاشت glyph به FD در FDSelect (12-37) بایت‌به‌بایت حفظ می‌شود. اسکن closure برای subroutineها context هر CharString نگه‌داشته‌شده را دنبال می‌کند تا glyph در FD #5 فقط Local Subrهای FD #5 را علامت بزند و Global subrها بین همهٔ FDها مشترک بمانند. Local Subr INDEX هر FD درجا بازنویسی می‌شود و ورودی‌های استفاده‌نشده به stubهای یک‌بایتی return فرو می‌ریزند. فونت‌های OTF چینی / هندی / عربی (Adobe Fan/Gothic/Heiti/Ming/Myungjo/Song Std، Kozuka Pr6N، Source Han Sans و غیره) اکنون به‌جای embedding مستقیم از کل pipeline subsetting عبور می‌کنند. از HotPDF v2.40.0 در دسترس است
  • Object Streamها (PDF 1.5 ISO 32000-1 7.5.7): وقتی THotPDF.UseObjectStreams را علاوه بر UseXRefStream و SaveToStream روی true بگذارید، اشیای غیرمستقیم واجدشرایط (همه‌چیز به‌جز streamها، دیکشنری رمزگذاری، و دیکشنری‌های Catalog و Info که از trailer ارجاع می‌شوند) را در یک یا چند جریان ظرف /Type /ObjStm بسته‌بندی می‌کند. سپس cross-reference stream اشیای بسته‌بندی‌شده را از طریق entryهای type-2 ارجاع می‌دهد (field-2 = شمارهٔ شیء host ObjStm؛ field-3 = index entry داخل جریان). این کار حجم فایل را در PDFهایی با دیکشنری‌های کوچک زیاد به‌طور قابل‌توجهی کم می‌کند (سندهای چندصفحه‌ای، annotationها، widgetهای AcroForm، عناصر درخت ساختار، لایه‌های Optional Content) - یک smoke فقط‌گرافیکیِ 30 صفحه‌ای از 14502 به 8488 بایت می‌رسد (41.5٪ کوچک‌تر). وقتی UseXRefStream خاموش باشد (چون entryهای type-2 طبق spec در جدول متنی xref قابل نمایش نیستند) یا Version زیر PDF 1.5 باشد، بی‌صدا به false برمی‌گردد. از HotPDF v2.41.0 در دسترس است
  • تصویر soft-mask / SMask (PDF 1.4 ISO 32000-1 8.9.5.4): THotPDF.AddImageWithSMask(Width, Height, RGB, Alpha) یک XObject تصویر رنگی به‌همراه یک XObject تصویر soft-mask از نوع 8-bit DeviceGray صادر می‌کند و cross-reference مربوط به /SMask را به‌طور خودکار وصل می‌کند، بنابراین هر پیکسل می‌تواند transparency کامل در هر کانال داشته باشد به‌جای محدودیت دودویی روشن/خاموش مسیر قدیمی /ImageMask. overload راحت THotPDF.AddImageWithSMask32(Bitmap32) صفحه‌های RGB و alpha را از یک TBitmap 32-bit BGRA بیرون می‌کشد تا PNG با alpha تنها با یک فراخوانی تعبیه شود. هر دو نقطهٔ فراخوانی از RequirePDFVersion(pdf14) عبور می‌کنند تا خروجی strict-mode 1.3 همچنان منطبق بماند. از HotPDF v2.42.0 در دسترس است
  • رنگ‌آمیزی Tiling Pattern بدون رنگ (PDF 1.7 ISO 32000-1 8.6.6.1): THotPDF.RegisterTilingPattern از v2.19.0 هم /PaintType 1 (colored) و هم /PaintType 2 (uncolored) را صادر می‌کرد، اما دنبالهٔ operatorهای سمت صفحه فقط برای نسخهٔ رنگی درست بود. شش متد جدید THPDFPage - SetFillPatternRGB / SetStrokePatternRGB / SetFillPatternGray / SetStrokePatternGray / SetFillPatternCMYK / SetStrokePatternCMYK - اکنون مسیر uncolored را هدایت می‌کنند، چون فضای رنگ tinting متناظر [/Pattern /BaseCS] را به‌طور خودکار در دیکشنری Resources/ColorSpace صفحه ثبت می‌کنند و دنبالهٔ الزامی tint_components /Pn scn را صادر می‌کنند. برای نسخهٔ رنگی که tile رنگ خود را حمل می‌کند، از SetFillPattern / SetStrokePattern اصلی استفاده کنید. از HotPDF v2.43.0 در دسترس است
  • فضای رنگ CIELab (PDF 1.3+ ISO 32000-1 8.6.5.3): THotPDF.RegisterLabColorSpace(Xw, Yw, Zw, aMin, aMax, bMin, bMax) یک آرایهٔ فضای رنگ درون‌خطی [/Lab << /WhitePoint /BlackPoint /Range >>] می‌سازد، آن را زیر یک نام خودکار (Lab1، Lab2، ...) ذخیره می‌کند و آن نام را برای استفاده با pipeline معمول THPDFPage.SetFillColorSpace / SetStrokeColorSpace + SetFillColor([L, a, b]) / SetStrokeColor([L, a, b]) برمی‌گرداند. یک illuminant D50 [0.9505, 1.0, 1.089] برای گردش‌کارهای چاپ ICC یا illuminant D65 [0.95047, 1.0, 1.08883] برای نمایش معادل sRGB بگذارید، سپس با L* در [0..100] و a*، b* در بازهٔ انتخابی (معمولاً [-128..127]) رنگ‌آمیزی کنید. از HotPDF v2.44.0 در دسترس است
  • فضای رنگ Separation برای spot colorها (PDF 1.3+ ISO 32000-1 8.6.6.4): THotPDF.RegisterSeparation(ColorantName, AlternateCS, TintC1) یک جوهر spot تک‌مؤلفه‌ای اعلام می‌کند که operand tint واحد آن در [0..1] یک tint transform خطی Function Type 2 را که درون‌ساز ساخته می‌شود هدایت می‌کند. از نام برگردانده‌شده (Sep1، Sep2، ...) با pipeline معمول SetFillColorSpace / SetStrokeColorSpace + SetFillColor([tint]) / SetStrokeColor([tint]) استفاده کنید. AlternateCS مقدارهای DeviceGray، DeviceRGB یا DeviceCMYK را می‌پذیرد؛ TintC1 مؤلفه‌های alt-CS را در tint = 1.0 فراهم می‌کند. نام‌های Pantone و سایر جوهرها که فاصله دارند مستقیماً پذیرفته می‌شوند - HotPDF هنگام نوشتن نام فضای رنگ آن‌ها را طبق PDF 1.7 7.3.5 به #20 escape می‌کند. از HotPDF v2.45.0 در دسترس است
  • جریان‌های appearance متن چندخطی و comb در AcroForm (PDF 1.7 ISO 32000-1 12.7.4.3): وقتی THotPDF.AutoFormAppearances روشن باشد، فیلدهای متنی که Flags آن‌ها شامل ffMultiline است یک Form XObject در /AP /N با word-wrap دریافت می‌کنند (Td + T* + چیدمان leading /TL، با رعایت جداکننده‌های CR / LF / CRLF و برش در تعداد سطر قابل‌نمایش). فیلدهایی که Flags آن‌ها شامل ffComb و یک MaxLen مثبت است، هر نویسه را با استفاده از یک ماتریس مطلق Tm برای هر glyph در سلول هم‌عرض خودش رندر می‌کنند. چیدمان تک‌خطی نسخهٔ v2.28.0 برای فیلدهایی که چنین flagهایی ندارند بایت‌به‌بایت حفظ می‌شود. نویسه‌های بین‌المللی در مقدار اولیه همچنان به مسیر بازمحاسبهٔ viewer در /NeedAppearances می‌افتند - تولید appearance با فونت CID تعبیه‌شده هنوز کار آینده است. از HotPDF v2.46.0 در دسترس است
  • فونت Unicode برای /AP در AcroForm (PDF 1.7 ISO 32000-1 12.7.2 + 12.7.4.3): THotPDF.SetFormUnicodeFontDict(LogicalName, FontDict) یک فونت composite از نوع Type 0 / CIDFontType2 + Identity-H را که فراخواننده فراهم کرده در دیکشنری منابع پیش‌فرض /DR/Font در AcroForm ثبت می‌کند. پس از ثبت، /DA در سطح AcroForm، /DA هر widget متنی، و جریان /AP /N تولیدشده توسط AutoFormAppearances برای مقدارهای اولیهٔ غیر ASCII همگی به نام منطقی سوییچ می‌کنند؛ زیر‌دیکشنری /Resources/Font در Form XObject نیز به همان فونت غیرمستقیم ارجاع می‌دهد تا AP بدون وابستگی به resolution از /DR در زمان render خودبسنده باشد. helper همراه THotPDF.CreateIndirectFontDict یک THPDFDictionaryObject خالی تازه برمی‌گرداند که به‌صورت یک شیء PDF غیرمستقیم ثبت شده است تا فراخواننده‌ها بتوانند دیکشنری‌های فونت سفارشی (یا هر دیکشنری دیگری که به serialization غیرمستقیم "N G R" نیاز دارد) را بدون دست‌زدن به helperهای داخلی بسازند. برای برگشت به رفتار ASCII-only /Helv در v2.46.0، LogicalName خالی و FontDict برابر nil بدهید. فیلدهای ASCII Tx همچنان از /Helv با خروجی بایت‌به‌بایت یکسان با v2.46.0 / v2.55.0 استفاده می‌کنند. /AP چندخطی + comb غیر ASCII و shaping دوطرفهٔ RTL (UAX #9 + joining زمینه‌ای عربی) هنوز کار آینده است. از HotPDF v2.56.0 در دسترس است؛ پشتیبانی /AP غیر ASCII برای ffMultiline (hex UTF-16BE سطری Tj با leading Td / T* / /TL و word-wrap آگاه از CJK) از v2.57.0؛ پشتیبانی /AP غیر ASCII برای ffComb (سلول‌های مطلق هم‌عرض Tm به ازای هر CID + یک Tj تک‌سلولی برای هر code point با رسیدگی به surrogate-pairهای UTF-16) از v2.58.0؛ property THotPDF.FormUnicodeRTL برای جهت راست‌به‌چپ (معکوس‌کردن ترتیب UTF-16 در hexِ /AP Tj در حالی که /V را در ترتیب منطقی نگه می‌دارد؛ فراخواننده شکل‌های ارائهٔ Unicode عربی U+FB50..U+FDFF + U+FE70..U+FEFF را از پیش اعمال می‌کند؛ shaping کامل UAX #9 + GSUB خودکار در انتظار است) از v2.59.0
  • widget متنی rich-text در AcroForm (PDF 1.5+ ISO 32000-1 12.7.4.3 + Annex L): THPDFPage.AddRichTextField(FieldName, InitialValue, RichValue, DefaultStyle, Rectangle, [MaxLen], [Flags]) یک widget متنی با /RV (بدنهٔ XHTML rich-text)، /DS (style پیش‌فرض شبیه CSS)، flag bit 26 مربوط به ffRichText در /Ff که به‌طور خودکار OR می‌شود، و همچنین fallback سادهٔ /V + /DV که توسط readerهایی که /RV را parse نمی‌کنند استفاده می‌شود، صادر می‌کند. Acrobat و Foxit وقتی bit مربوط به RichText روشن باشد مستقیم از /RV render می‌کنند و fallback فونت را از فونت‌های Unicode نصب‌شده در reader می‌گیرند - بنابراین محتوای چندبایتی (CJK / Cyrillic / Arabic / Latin دارای accent) بدون embedding فونت CID در منابع /DR به‌درستی نمایش داده می‌شود. هم /V و هم /RV ورودی چندبایتی را به‌طور خودکار تشخیص می‌دهند و در صورت نیاز به encoding رشتهٔ hex با UTF-16BE (FE FF BOM + code unitهای big-endian) سوییچ می‌کنند. تولید appearance-stream برای فونت CID در مسیر /AP خود HotPDF هنوز کار آینده است؛ viewerهای آگاه از rich-text به آن نیاز ندارند. از HotPDF v2.55.0 در دسترس است
  • فضای رنگ DeviceN برای گردش‌کارهای spot-ink چندرنگ‌دانه‌ای (PDF 1.3+ ISO 32000-1 8.6.6.5): THotPDF.RegisterDeviceN(ColorantNames, AlternateCS, TintC1Matrix) RegisterSeparation را از یک جوهر spot واحد به N تعمیم می‌دهد. tint transform یک Function Type 4 از نوع PostScript-calculator است که روی ماتریس N در M داده‌شده یک weighted-blend خطی تولید می‌کند (سطر n ستون m سهم colorant n در کانال m از AlternateCS را وقتی colorant n به‌تنهایی 1.0 است مشخص می‌کند). یک نام فضای رنگ (DevN1، DevN2، ...) برمی‌گرداند که pipeline معمول SetFillColorSpace + SetFillColor([t0, t1, ..., t_{N-1}]) را هدایت می‌کند. AlternateCS مقدارهای DeviceGray، DeviceRGB یا DeviceCMYK را می‌پذیرد؛ نام جوهرها با فاصله طبق PDF 1.7 7.3.5 به #20 escape می‌شوند؛ نام ویژهٔ None یک slot رنگ‌دانهٔ استفاده‌نشده را مشخص می‌کند. از HotPDF v2.47.0 در دسترس است
  • mesh مثلثی Gouraud آزاد (PDF 1.3+ ISO 32000-1 8.7.4.5.4): THotPDF.RegisterFreeFormGouraudShading(XMin, YMin, XMax, YMax, NumComponents, Vertices) یک جریان /ShadingType 4 با /BitsPerCoordinate 16 + /BitsPerComponent 8 + /BitsPerFlag 8 اعلام می‌کند، آن را در یک ورودی inline از نوع Pattern Type 2 در دیکشنری Resources/Pattern صفحه بسته‌بندی می‌کند و نام pattern خودکار (Sh1، Sh2، ...) را برای pipeline معمول SetFillPattern / SetStrokePattern برمی‌گرداند. هر vertex به‌صورت 1 بایت flag (برای triangleهای مستقل همیشه 0) + 2 بایت X big-endian + 2 بایت Y big-endian + مؤلفه‌های رنگ 8 بیتی NumComponents بسته می‌شود. آرگومان NumComponents مقدارهای 1 (DeviceGray)، 3 (DeviceRGB) یا 4 (DeviceCMYK) را می‌پذیرد؛ هر vertex به ترتیب (X, Y, c1...cN) مقدارهای Extended با اندازهٔ 2 + NumComponents به Vertices اضافه می‌کند؛ تعداد vertexها باید مضربی از 3 باشد. /Decode مختصات 16 بیتی را به [XMin, XMax] x [YMin, YMax] و مؤلفه‌های رنگ را به [0, 1] نگاشت می‌کند. mesh shadingهای نوع 5 (lattice)، نوع 6 (Coons patch) و نوع 7 (tensor product) هنوز کار آینده هستند. از HotPDF v2.48.0 در دسترس است
  • mesh مثلثی Gouraud به‌صورت lattice (PDF 1.3+ ISO 32000-1 8.7.4.5.5): THotPDF.RegisterLatticeFormGouraudShading(XMin, YMin, XMax, YMax, NumComponents, VerticesPerRow, Vertices) یک جریان /ShadingType 5 اعلام می‌کند که vertexها را در یک lattice با M سطر و N ستون مرتب می‌کند و به renderer اجازه می‌دهد هر جفت سطر مجاور را خودکار به triangle strip triangulate کند. برخلاف RegisterFreeFormGouraudShading (Type 4)، برای هر vertex بایت flag جداگانه‌ای وجود ندارد؛ /BitsPerFlag در دیکشنری shading غایب است و هر vertex فقط 4 + NumComponents بایت اشغال می‌کند (2 بایت X big-endian + 2 بایت Y big-endian + N مؤلفهٔ رنگ). دیکشنری shading به‌جای آن ورودی لازم /VerticesPerRow N را حمل می‌کند. از آن برای دادهٔ منبعی استفاده کنید که از قبل روی یک grid نمونهٔ منظم قرار دارد (terrain، نتیجه‌های FEA، heatmapهای علمی) - برنامه vertexها را به ترتیب row-major می‌دهد و pipeline رندر topology triangle strip را به‌طور خودکار سرهم می‌کند. VerticesPerRow باید دست‌کم 2 باشد و تعداد کل vertexها باید مضربی از VerticesPerRow با حداقل دو سطر باشد. از HotPDF v2.49.0 در دسترس است
  • mesh shading از نوع Coons patch (PDF 1.3+ ISO 32000-1 8.7.4.5.6): THotPDF.RegisterCoonsPatchMesh(XMin, YMin, XMax, YMax, NumComponents, Patches) یک جریان /ShadingType 6 از Coons patchها اعلام می‌کند که هر کدام با چهار منحنی cubic Bezier محدود می‌شوند و برای هر گوشه یک رنگ دارند. renderer سطح Coons را بین چهار لبه fit می‌کند و یک quad دارای رنگ با انحنای دلخواه می‌دهد - مفید برای گرادیان‌های metallic و foil روی مسیرهای خمیده، meshهای گرادیان برگرفته از SVG و هر quad با لبه‌های خمیده‌ای که در غیر این صورت به triangleهای کوچک زیادی برای تقریب نیاز دارد. هر patch 12 نقطهٔ کنترل (24 مقدار Extended برای X+Y، به ترتیب c1..c12 در جهت ساعت‌گرد پیرامون مرز با c1 / c4 / c7 / c10 در چهار گوشه و 8 نقطهٔ باقی‌مانده به‌عنوان دسته‌های درونی Bezier) به‌همراه 4 رنگ گوشه (4 * NumComponents مقدار Extended) اضافه می‌کند، بنابراین stride برای Patches برابر 24 + 4 * NumComponents است. دیکشنری shading همان /BitsPerCoordinate 16 + /BitsPerComponent 8 + /BitsPerFlag 8 را مانند Type 4 حمل می‌کند (و برخلاف Type 5، /VerticesPerRow غایب است). هر patch صادرشده flag = 0 دارد (patch مستقل)؛ flagهای ادامه‌دار 1 / 2 / 3 (edge sharing) در این overload راحت در دسترس نیستند. از HotPDF v2.50.0 در دسترس است
  • فضای رنگ Separation با tint transform مبتنی بر LUT نمونه‌برداری‌شده (PDF 1.3+ ISO 32000-1 8.6.6.4 + 7.10.2): THotPDF.RegisterSeparationLUT(ColorantName, AlternateCS, Samples) RegisterSampledFunction را بسته‌بندی می‌کند تا فراخواننده‌ها بتوانند یک منحنی کامل non-linear از tint به alt-CS را به‌صورت یک جریان بایت تخت از sampleهای 8 بیتی (M-tuple) بیان کنند، بدون آن‌که دیکشنری Function Type 0 را دستی بسازند. وقتی گذار رنگ non-linear باشد از نسخهٔ LUT استفاده کنید - rampهای tint به سبک PANTONE Hexachrome، منحنی‌های density با gamma correction، منحنی‌های tone دست‌کشیده مطابق characterisation چاپخانه، LUTهای ICC برای تبدیل sRGB به spot بدون machinery کامل ICC profile؛ نقطهٔ ورود v2.45.0 RegisterSeparation همچنان حالت تک‌سرحد خطی را پوشش می‌دهد. AlternateCS مقدارهای DeviceGray، DeviceRGB یا DeviceCMYK را می‌پذیرد؛ طول Samples باید مضربی مثبت از M و دست‌کم 2 * M بایت باشد تا function بازهٔ قابل‌درون‌یابی داشته باشد، و شمار نقطه‌های شبکه S از Length(Samples) / M استنباط می‌شود. در PDF 1.7، درون‌یابی خطی پیش‌فرض /Order 1 است. نام فضای رنگ ثبت‌شده (Sep1، Sep2، ...) را برای استفاده با pipeline معمول SetFillColorSpace + SetFillColor([tint]) برمی‌گرداند. از HotPDF v2.53.0 در دسترس است
  • ثبت Function Type 0 (Sampled) (PDF 1.3+ ISO 32000-1 7.10.2): THotPDF.RegisterSampledFunction(Domain, Range, Size, BitsPerSample, Samples, [Order]) یک جریان غیرمستقیم /FunctionType 0 اعلام می‌کند که نگاشت دلخواه ورودی به خروجی را به‌صورت یک grid منظم N بعدی از sampleهای خروجی M بعدی بیان می‌کند و بین نقطه‌های grid درون‌یابی می‌شود. از آن‌جا استفاده کنید که machinery مربوط به ICC profile بیش از اندازه است اما یک LUT رنگی تنظیم‌شده با دست مطلوب است - منحنی‌های tone برای /TransferFunction (ExtGState /TR)، tint transformهای نمونه‌برداری‌شده برای /Separation / /DeviceN فراتر از مسیرهای Type 2 خطی / Type 4 حسابی، منحنی‌های آستانهٔ halftone یا هر سازهٔ PDF دیگری که دیکشنری Function می‌پذیرد. Domain شامل 2N ورودی است (یک جفت [min, max] برای هر بُعد ورودی)؛ Range شامل 2M ورودی است (یک جفت برای هر بُعد خروجی)؛ Size شمار نقطه‌های grid در N بُعد است؛ BitsPerSample مقدارهای 1، 2، 4، 8، 12، 16، 24 یا 32 را طبق جدول 38 PDF 1.7 می‌پذیرد؛ Samples جریان خام sampleهای bit-packed است (MSB-first در هر sample، بدون padding بین sampleها فراتر از zero-fill بایت نهایی، با ورودی 0 که طبق قواعد sample-order spec سریع‌تر تغییر می‌کند)؛ Order به‌طور پیش‌فرض 1 است (linear) و مقدار 3 را هم می‌پذیرد (درون‌یابی cubic-spline، از v2.54.0) طبق جدول 38 PDF 1.7. HotPDF شمار بایت‌های sample را در برابر ceil(GridPoints * M * BitsPerSample / 8) اعتبارسنجی می‌کند. THPDFStreamObject غیرمستقیم را برمی‌گرداند تا فراخواننده بتواند آن را هرجا که دیکشنری Function انتظار می‌رود وصل کند. از HotPDF v2.52.0 در دسترس است؛ /Order 3 cubic و پوشش سرتاسری multi-input / multi-output از v2.54.0
  • mesh shading ضرب‌در محصول tensor (PDF 1.3+ ISO 32000-1 8.7.4.5.7): THotPDF.RegisterTensorProductPatchMesh(XMin, YMin, XMax, YMax, NumComponents, Patches) یک جریان /ShadingType 7 از patchهای tensor-product اعلام می‌کند که هر کدام با یک grid کامل 4 در 4 از نقطه‌های کنترل bicubic Bezier p[i][j] به‌اضافهٔ یک رنگ برای هر گوشه تعریف می‌شوند. این متد RegisterCoonsPatchMesh (Type 6) را با افزودن 4 نقطهٔ کنترل درونی صریح (p[1][1]، p[1][2]، p[2][2]، p[2][1]) روی 12 نقطهٔ مرزی گسترش می‌دهد و نسبت به fit مبتنی بر Coons کنترل ظریف‌تری بر درون patch فراهم می‌کند. برای round-tripهای mesh گرادیان SVG و هر اثری که به سطح Bezier از نوع tensor-product نیاز دارد مفید است. هر patch 16 نقطهٔ کنترل (32 مقدار Extended برای X+Y، با ترتیب طبق جدول 88 spec: p[0][0..3]، p[1][3]، p[2][3]، p[3][3]، p[3][2..0]، p[2][0]، p[1][0] و سپس 4 نقطهٔ درونی p[1][1]، p[1][2]، p[2][2]، p[2][1]) به‌همراه 4 رنگ گوشه (4 * NumComponents مقدار Extended در p[0][0] / p[0][3] / p[3][3] / p[3][0]) اضافه می‌کند، بنابراین stride برای Patches برابر 32 + 4 * NumComponents است. هر patch صادرشده flag = 0 دارد (patch مستقل). با این انتشار، کل خانوادهٔ mesh shading ISO 32000-1 8.7.4.5 (Types 4 / 5 / 6 / 7) اکنون پوشش داده شده است. از HotPDF v2.51.0 در دسترس است
  • سبک border annotation و اتصال Popup (PDF 1.7 12.5.4 / 12.5.6.14): THPDFPage.SetAnnotationBorderStyle(Annot, Width, Style, DashPattern) یک دیکشنری /BS با THPDFAnnotBorderStyle انتخاب‌شده (absSolid / absDashed / absBeveled / absInset / absUnderline) ضمیمه می‌کند. THPDFPage.AddPopupAnnotationFor(ParentAnnot, Rect, Open) یک annotation از نوع /Popup صادر می‌کند که در هر دو جهت وصل شده است (parent /Popup -> popup، popup /Parent -> parent) تا viewer بتواند connector بالون گفت‌وگو را رسم کند. property جدید THPDFPage.LastAnnotation بدون تغییر امضای procedureهای موجود Add*Annotation هر یک از این helperها را تغذیه می‌کند. از HotPDF v2.34.0 در دسترس است
  • Public-Key Security Handler (PDF 1.7 7.6.5): THotPDF.EnablePubKeyEncryption(seed, KeyType, EncryptMetadata) + THotPDF.AddPubKeyRecipient(envelope) یک دیکشنری encrypt از نوع /Filter /Adobe.PubSec صادر می‌کنند (/SubFilter /adbe.pkcs7.s4 برای V=1 RC4-40 / /adbe.pkcs7.s5 برای V=2 RC4-128 / V=4 AESV2). فراخواننده seed تصادفی 20 بایتی و برای هر گیرنده یک blob دودویی PKCS#7 envelopedData فراهم می‌کند (که بیرون از برنامه با Windows CryptoAPI، OpenSSL یا pycryptodome ساخته شده باشد). HotPDF کلید رمزگذاری فایل را از طریق algorithm 9 مشتق می‌کند (SHA-1 از seed به‌همراه هر envelope) و از مشتق‌سازی استاندارد per-object برای جریان‌های AES-128 / RC4 استفادهٔ مجدد می‌کند. از HotPDF v2.33.0 در دسترس است

همچنین ببینید