Поддержка фильтров PDF

Обзор

Потоки PDF и встроенные изображения указывают свою кодировку именами фильтров. HotPDF в основном работает со следующими семействами фильтров при генерации документов или декодировании внешнего контента.

Распространённые фильтры

  • FlateDecode: Основной фильтр сжатия для генерируемых потоков и главный путь распаковки на базе zlib
  • LZWDecode: Поддерживается для legacy- и compatibility-сценариев через HPDFLZW.pas
  • DCTDecode: Используется для стандартных данных JPEG-изображений, обрабатываемых путями загрузки изображений HotPDF
  • CCITTFaxDecode: Загружаемые монохромные потоки изображений Group 3 и Group 4 поддерживают одно- и двумерные строки, расширения uncompressed T.4/T.6, обработку EOFB, выравнивание по байтам, полярность вывода и ограниченное восстановление повреждённых строк через стандартные записи DecodeParms
  • ASCIIHexDecode / ASCII85Decode / RunLengthDecode: Helper-ы энкодера, открытые в 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. HotPDF направляет потоки изображений JPXDecode и файлы JPEG 2000 через декодер JPEG2000 на базе OpenJPEG, затем встраивает результат с выбранным вызывающим сжатием. Двухуровневый вывод JBIG2 и пути загруженных изображений JBIG2Decode используют нативный конвейер JBIG2-энкодера и декодера, включая управление словарём символов, глобальными сегментами, уровнями потерь и фильтрацией чёрных точек

Практические замечания

  • Не каждый фильтр открыт через один универсальный API; часть достигается через специализированные юниты хелперов изображений и потоков
  • Для генерируемого контента PDF THotPDF.Compression остаётся центральной пользовательской настройкой
  • При загрузке внешних данных применимый фильтр зависит от формата исходного файла и используемого хелпер-класса
  • Шифрованные PDF комбинируют эти фильтры с security handler-ом; см. CryptKeyLength о поддерживаемых опциях AES‑128 (V=4 R=4 / CFM=AESV2) и RC4 (V=1/V=2)
  • Зарезервированные политики crypt-фильтров можно выбирать независимо для строк, обычных потоков и потоков встроенных файлов через ConfigureCryptFilterDefaults. Парольная безопасность принимает StdCF или Identity, а безопасность с открытым ключом принимает DefaultCryptFilter или Identity. SetStreamCryptFilter добавляет или убирает явный ведущий фильтр Crypt, не трогая существующий конвейер декодирования. Перегрузки на уровне потока требуют в словаре шифрования /V 4 или новее
  • Шифрованные обёртки полезной нагрузки держат обычные страничные потоки видимыми, защищая метаданные и байты встроенных файлов через EFOpen crypt-фильтр, с явными API инспекции и разблокировки загруженных документов, доступными с HotPDF v2.715.0
  • Защищённые паролем потоки вложений используют /EFF и получают явный Crypt фильтр всякий раз, когда /EFF отличается от /StmF. Явные потоковые фильтры с шифрованием по открытому ключу отказывают закрыто (fail-closed), потому что требуют конверт получателя, специфичный для потока
  • Загруженные документы открывают исходную политику /CF, /StrF, /StmF, и /EFF, включая чувствительные к регистру внешние именованные фильтры, явные или опущенные /CFM /None, события аутентификации и действующую длину ключа через THPDFCryptFilterInfo. Длины фильтров V2 стандартного обработчика читаются как байты, длины фильтров V2 с открытым ключом — как биты, а принимаются только 40-битные и 128-битные ключи V2. Контейнеры объектных потоков в открытом тексте всё ещё расшифровывают упакованные строки членов через /StrF, а шифрованные контейнеры избегают второй расшифровки члена. Инкрементные обновления сохраняют загруженную политику. Доступно с HotPDF v2.675.0
  • Интерактивные поля форм выводятся как Widget-аннотации, которые рисует viewer; см. Поддержка AcroForm
  • Text-markup аннотации (Highlight, Underline, Squiggly, StrikeOut) и внутридокументные jump-ссылки (GoTo, GoToR, Launch) открыты как новые методы THPDFPage.Add*Annotation / AddGoToLink / AddGoToRLink / AddLaunchLink с HotPDF v2.6.0
  • Вывод DeviceCMYK доступен через THPDFPage.SetCMYKColor / SetCMYKFillColor / SetCMYKStrokeColor; управляемые ICC цветовые пространства регистрируются через THotPDF.RegisterICCProfile и применяются через SetFillColorSpace / SetStrokeColorSpace + SetFillColor / SetStrokeColor с HotPDF v2.7.0
  • Задайте THotPDF.UseXRefStream в true до сохранения, чтобы выдать один /Type /XRef FlateDecode-сжатый поток перекрёстных ссылок вместо текстовой последовательности xref / trailer / startxref (PDF 1.7 7.5.8); доступно с HotPDF v2.8.0
  • Задайте THotPDF.EnableXMPMetadata в true, чтобы присоединить поток /Type /Metadata /Subtype /XML к Catalog (PDF 1.7 14.3.2); собирается автоматически из полей словаря Info, или передайте написанный вручную пакет через CustomXMP. Доступно с HotPDF v2.9.0
  • Шлюзование версии PDF на уровне методов (с HotPDF v2.24.0). Каждый метод-фича, появившийся в v2.4.0+, сверяется с RequirePDFVersion перед выводом; при StrictVersionLock=false (умолчании) версия документа Version молча автоматически поднимается до минимума, требуемого фичей, а при StrictVersionLock=true вызов отвергается, так что сохранённый файл строго соответствует выбранной эталонной спецификации 1.3 / 1.4 / 1.5 / 1.6 / 1.7.
  • Энкодеры PNG- и TIFF-предикторов для FlateDecode-сжатых данных изображений (PDF 1.7 7.4.4.4): _PNGPredictorEncode применяет эвристику фильтра минимальной абсолютной разницы libpng (Predictor=15), _TIFFPredictor2Encode применяет горизонтальное дифференцирование (Predictor=2). Доступно с HotPDF v2.10.0
  • Точки входа Tagged PDF (PDF 1.7 14.7-14.8): THotPDF.Lang заполняет /Lang в Catalog, EnableTaggedPDF записывает /MarkInfo <</Marked true>> и заглушку /StructTreeRoot, а новые методы 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 и возвращают стабильное имя паттерна; THPDFPage.SetFillPattern / SetStrokePattern устанавливает его на страницу. Число компонент стартового / конечного цвета выбирает DeviceGray (1) / DeviceRGB (3) / DeviceCMYK (4). Доступно с HotPDF v2.13.0; многостоповые градиенты Function Type 3 открыты через RegisterMultiStopAxialGradient с v2.18.0 и RegisterMultiStopRadialGradient с v2.686.0
  • Встроенные изображения (PDF 1.7 8.9.7) через THPDFPage.DrawInlineImage; сырые байты автоматически заворачиваются в ASCIIHex, когда фильтр не задан, так что контентный поток остаётся 7-бит-чистым. Доступно с HotPDF v2.18.0
  • OutputIntents (PDF 1.7 14.11) через THotPDF.AddOutputIntent; каждый вызов дописывает словарь /Type /OutputIntent в Catalog с опциональным /DestOutputProfile со ссылкой на зарегистрированный ICC-профиль. Доступно с HotPDF v2.18.0
  • Автогенерация appearance stream-ов AcroForm (PDF 1.7 12.5.5 / 12.7.3.3 / 8.10): установите THotPDF.AutoFormAppearances в true до добавления интерактивных полей формы, и HotPDF pre-build-ит /Subtype /Form Form XObject для записи /AP /N каждого widget-а (под-словари Yes / Off для кнопок), наполняет ресурсы AcroForm по умолчанию /DR косвенными шрифтовыми словарями Helvetica / ZapfDingbats и переключает /NeedAppearances в false так, что рендереры чтят встроенные потоки. Доступно с HotPDF v2.28.0
  • ViewerPreferences /ViewArea и /ViewClip (PDF 1.4 12.2 таблица 152) теперь открыты через свойства THotPDF.ViewArea / THotPDF.ViewClip (с соответствующими членами набора 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-ридеры в /PageMode /FullScreen анимировали навигацию. Стили PDF 1.1 (Split, Blinds, Box, Wipe, Dissolve, Glitter, R) и PDF 1.5 (Fly, Push, Cover, Uncover, Fade) открыты через перечисление THPDFTransitionStyle; сопутствующие под-опции /Dm, /M и /Di тоже открыты. THPDFPage.SetPageDuration записывает /Dur задержку авто-прокрутки в секундах. Доступно с HotPDF v2.30.0
  • Transparency group уровня страницы (PDF 1.4 11.6.6 / 7.5.5): THPDFPage.SetTransparencyGroup присоединяет словарь /Group (/Type /Group /S /Transparency) так, что рендереры предсказуемо компонуют контент с альфа-каналом. Выбирайте device-цветовое пространство через перечисление THPDFGroupColorSpace (DeviceGray / DeviceRGB / DeviceCMYK или опустите), или вызовите THPDFPage.SetTransparencyGroupICC с именем ICC-профиля, ранее зарегистрированного через THotPDF.RegisterICCProfile. Опциональные флаги /I (Isolated) и /K (Knockout) ведут компоновщик; THPDFPage.ClearTransparencyGroup убирает ранее присоединённую запись. Доступно с HotPDF v2.32.0
  • Инкрементное обновление (PDF 1.7 ISO 32000-1 7.5.6): THotPDF.BeginIncrementalUpdate(SourceFile) загружает существующий PDF в режиме только-дописывание; последующие вызовы CreateIndirect* автоматически помечают новые объекты грязными, а THotPDF.MarkDirty(Obj) помечает ранее существовавшие загруженные объекты к повторному выводу. THotPDF.SaveIncrementalUpdate(TargetFile) пишет исходные байты дословно, дописывает только грязные объекты с сохранёнными номерами объектов, выдаёт новую xref-подсекцию и завершает trailer-ом с /Prev на предыдущий xref. Комбинируйте с существующим конвейером AddSignedSignatureField + PreparePDFForSigning + InsertSignatureHex, чтобы добавлять последующие поля подписи к уже подписанному документу, не инвалидируя ранние подписи (их дайджесты /ByteRange остаются валидными, потому что ни один исходный байт не мутирует). Доступно с HotPDF v2.35.0
  • Нормализация имён встроенных шрифтов TrueType: HotPDF читает таблицу имён встроенного TrueType и выравнивает /BaseFont, /FontDescriptor /FontName, /FontFamilyи имена descendant CID-шрифтов по PostScript-имени шрифтовой программы. Это избавляет от сбоев Adobe Acrobat Font Capture, вызванных несовпадением словаря шрифта PDF и встроенной TTF-нагрузки. Доступно с HotPDF v2.35.1
  • Сабсеттинг шрифтов TrueType (PDF 1.7 ISO 32000-1 9.6.4 / 9.8.2): установите THotPDF.EnableFontSubsetting в true до BeginDoc, и HotPDF пересобирает встроенную TrueType-нагрузку так, что она содержит только глифы, реально использованные документом. Типичные латинские документы получают ~90% снижения веса встроенного шрифта (1 MB Arial -> ~70 KB на однострочном «Hello, world.»). Зависимости композитных глифов отслеживаются рекурсивно, нумерация GID сохраняется (так что существующие контентные потоки Type0 / Identity-H продолжают работать), а новое имя шрифта /BaseFont автоматически получает требуемый спецификацией префикс из шести заглавных букв с «+» (например /BaseFont /AAAAAA+ArialMT). По умолчанию выключено; включайте сознательно — для сценариев правки нужно полное встраивание шрифта. Доступно с HotPDF v2.36.0
  • Сабсеттер Compact Font Format (CFF) (PDF 1.7 ISO 32000-1 9.7.4 / 9.9): компаньон TrueType-сабсеттера для OpenType-CFF (.otf, sfntVersion OTTO) и шрифтов Type 1 / Type 1C. Экспортируемая юнитом функция HPDFSubsetCFF(CFFBytes, KeepGlyph) пересобирает INDEX CharStrings, заменяя не удержанные глифы минимальной заглушкой в 1 байт endchar с сохранением нумерации GID байт-в-байт. Доступно с HotPDF v2.37.0.
  • Путь встраивания OpenType-CFF (.otf) подключён в StoreFont (PDF 1.6+ 9.7.4 таблица 117). Когда бинарник шрифта, загруженного через GDI, — sfnt-контейнер OTTO, HotPDF сабсеттит встроенную под-таблицу 'CFF ' через HPDFSubsetOTFContainer, выдаёт шрифтовую программу через /FontFile3 /Subtype /OpenTypeи пишет словарь descendant-шрифта с /Subtype /CIDFontType0 вместо /CIDFontType2. Шрифты TrueType продолжают идти существующим путём /FontFile2 + /CIDFontType2 без изменения поведения. Доступно с HotPDF v2.38.0.
  • Сабсеттинг CFF-субрутин end-to-end (PDF 1.7 9.7.4 §6 / Adobe Tech Note #5177 §3.1): CFF-сабсеттер теперь вычищает неиспользуемые записи и из Global Subr INDEX (сразу после String INDEX в бинарнике CFF), и из Local Subr INDEX (вложенного в Private DICT, достижимого через оператор 18 Top DICT + оператор 19 Private DICT). Одно замыкание до неподвижной точки транзитивно идёт по цепочкам callsubr (op 0x0A) и callgsubr (op 0x1D), так что CharString, зовущий Local Subr, который зовёт Global Subr, который зовёт ещё один Local Subr, подхватывается за одну итерацию. Каждая неиспользуемая запись заменяется байтовой заглушкой return, а INDEX переписывается на месте с нулевым заполнением хвостового запаса. Это поведение открыто через публичные HPDFSubsetCFF и HPDFSubsetOTFContainer хелперы; низкоуровневые CFF-сканеры остаются внутренними. Доступно с HotPDF v2.39.0.
  • Сабсеттинг CID-keyed CFF (PDF 1.7 ISO 32000-1 9.7.4 / Adobe Tech Note #5176 §18-19): CFF-сабсеттер теперь распознаёт оператор Top DICT ROS (12-30), помечающий CID-keyed шрифт OpenType-CFF, и идёт по INDEX FDArray (12-36) из Font DICT, каждый со своим Private DICT + Local Subr INDEX. Карта FDSelect (12-37) глиф-в-FD сохраняется байт-в-байт. Скан замыкания субрутин отслеживает FD-контекст каждой удержанной CharString, так что глиф в FD #5 помечает Local Subr-ы только в FD #5 — глобальные субрутины остаются разделяемыми между FD. Local Subr INDEX каждого FD переписывается на месте со свёрнутыми в байтовые заглушки неиспользуемыми записями return. OTF-шрифты CJK / Indic / арабского (Adobe Fan/Gothic/Heiti/Ming/Myungjo/Song Std, Kozuka Pr6N, Source Han Sans и т.д.) теперь идут через полный конвейер сабсеттинга вместо встраивания как есть. Доступно с HotPDF v2.40.0.
  • Объектные потоки (PDF 1.5 ISO 32000-1 7.5.7): установите THotPDF.UseObjectStreams в true вдобавок к UseXRefStream и SaveToStream упаковывает подходящие косвенные объекты (всё, кроме потоков, словаря шифрования и Catalog и Info, на которые указывает trailer) в один или несколько потоков-контейнеров /Type /ObjStm. Xref-поток затем ссылается на упакованные объекты записями типа 2 (поле 2 = номер объекта-хоста ObjStm; поле 3 = индекс записи внутри потока). Существенно режет размер файла на PDF со множеством маленьких словарей (многостраничные документы, аннотации, AcroForm widget-ы, элементы дерева структуры, слои Optional Content) — 30-страничный чисто графический smoke сжимается со 14502 до 8488 байтов (на 41,5% меньше). Молча откатывается к прежнему режиму, когда false, когда UseXRefStream выключен (записи типа 2 непредставимы в текстовой xref-таблице по спецификации) или когда Version ниже PDF 1.5. Доступно с HotPDF v2.41.0.
  • Soft-mask изображение / SMask (PDF 1.4 ISO 32000-1 8.9.5.4): THotPDF.AddImageWithSMask(Width, Height, RGB, Alpha) выдаёт цветной image XObject плюс 8-битный soft-mask image XObject DeviceGray и связывает перекрёстную ссылку /SMask автоматически, так что каждый пиксель может нести полную поканальную прозрачность вместо бинарного предела вкл/выкл старого пути /ImageMask. Convenience-перегрузка THotPDF.AddImageWithSMask32(Bitmap32) вытягивает плоскости RGB и альфы из 32-битного BGRA TBitmap ради встраивания PNG с альфой одним вызовом. AddImageWithTransparency и AddImageWithTransparency32 открывают тот же сценарий с именованием от изображений. Обе точки вызова проходят шлюз RequirePDFVersion(pdf14) так что вывод в строгом режиме 1.3 остаётся соответствующим. Доступно с HotPDF v2.42.0
  • Convenience-хелперы image-масок: AddImageAsMask выдаёт бинарную /ImageMask, AddImageWithMask присоединяет полученную маску к цветному изображению через /Mask, и обе возвращают обычные индексы изображений для THPDFPage.ShowImage
  • Управление сжатием на изображение: AddImageWithJpegQuality применяет качество JPEG одним вызовом, не меняя JpegQuality, тогда как AddMonochromeImageAuto и icAutoMono выбирают Flate, CCITT Group 4 или JBIG2 для 1-битного битмап-входа
  • Отрисовка неокрашенных tiling-паттернов (PDF 1.7 ISO 32000-1 8.6.6.1): THotPDF.RegisterTilingPattern выдавал и /PaintType 1 (окрашенный), и /PaintType 2 (неокрашенный) с v2.19.0, но соответствующая последовательность операторов на стороне страницы была корректна только для окрашенного варианта. Шесть новых методов THPDFPage — SetFillPatternRGB / SetStrokePatternRGB / SetFillPatternGray / SetStrokePatternGray / SetFillPatternCMYK / SetStrokePatternCMYK — теперь ведут неокрашенный путь, автоматически регистрируя соответствующее подкрашивающее цветовое пространство [/Pattern /BaseCS] на странице Resources/ColorSpace и выдавая требуемую спецификацией последовательность tint_components /Pn scn. Для окрашенного варианта, где плитка несёт собственный цвет, используйте оригинальные SetFillPattern / SetStrokePattern. Доступно с HotPDF v2.43.0.
  • Полная отрисовка tiling-паттернов теперь применяет матрицу паттерна относительно системы координат по умолчанию родительского контентного потока, реализует все три правила размещения /TilingType, поддерживает отрицательные /XStep и /YStep, начинает каждую ячейку с изолированного пути, применяет базовую тонировку неокрашенного паттерна и к заливкам, и к штрихам, и удерживает ограниченное выполнение вложенных паттернов. Расширенная перегрузка RegisterTilingPattern и свойства THPDFTilingPatternBuilder.TilingType / Matrix открывают те же проверенные управления для генерируемых PDF. Доступно с HotPDF v2.542.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, ...) и возвращает это имя для использования с обычным конвейером THPDFPage.SetFillColorSpace / SetStrokeColorSpace + SetFillColor([L, a, b]) / SetStrokeColor([L, a, b]). Подставьте источник света D50 [0.9505, 1.0, 1.089] для печатных сценариев ICC или источник D65 [0.95047, 1.0, 1.08883] для показа, эквивалентного sRGB, затем рисуйте с L* в [0..100] и a*, b* в выбранном диапазоне (обычно [-128..127]). Доступно с HotPDF v2.44.0.
  • Цветовое пространство Separation для spot-цветов (PDF 1.3+ ISO 32000-1 8.6.6.4): THotPDF.RegisterSeparation(ColorantName, AlternateCS, TintC1) объявляет однокомпонентную spot-краску, чей единственный операнд тонировки в [0..1] ведёт встроенное линейное tint-преобразование Function Type 2. Используйте возвращённое имя (Sep1, Sep2, ...) с обычным конвейером SetFillColorSpace / SetStrokeColorSpace + SetFillColor([tint]) / SetStrokeColor([tint]). AlternateCS принимает DeviceGray, DeviceRGB или DeviceCMYK; TintC1 поставляет компоненты alt-CS при тонировке = 1.0. Pantone и другие имена красок с пробелами принимаются напрямую — HotPDF экранирует их в #20 по PDF 1.7 7.3.5 при записи имени цветового пространства. Доступно с HotPDF v2.45.0.
  • Многострочные и comb appearance stream-ы текста AcroForm (PDF 1.7 ISO 32000-1 12.7.4.3): когда THotPDF.AutoFormAppearances включён, текстовые поля, чьи флаги Flags включают ffMultiline получают Form XObject с переносом по словам /AP /N (Td + T* + /TL вёрстку с inter-leading, учитывающую разделители CR / LF / CRLF и обрезающую по числу видимых строк). Поля, чьи флаги включают Flags включают ffComb вместе с положительным MaxLen рисуют каждый символ в собственную равную по ширине ячейку абсолютной матрицей Tm на каждый глиф. Однострочная вёрстка из v2.28.0 сохраняется байт-в-байт для полей без таких флагов. Международные символы в начальном значении по-прежнему проваливаются в путь пересчёта /NeedAppearances viewer-а — полная генерация 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) регистрирует переданный вызывающим составной шрифт Type 0 / CIDFontType2 + Identity-H в словаре ресурсов по умолчанию /DR/Font AcroForm. После регистрации /DA, каждый Tx widget /DA, и /AP /N поток, производимый AutoFormAppearances для не-ASCII начальных значений Tx, все переключаются на логическое имя; под-словарь /Resources/Font Form XObject тоже ссылается на тот же косвенный шрифт, так что AP самодостаточен и не зависит от разрешения /DR при отрисовке. Сопутствующий хелпер THotPDF.CreateIndirectFontDict возвращает свежий пустой THPDFDictionaryObject, зарегистрированный как косвенный PDF-объект, так что вызывающие могут строить собственные шрифтовые словари (или любой другой словарь, требующий косвенной сериализации «N G R»), не трогая внутренние хелперы. Передайте пустое LogicalName и nil FontDict, чтобы откатиться к ASCII-only поведению /Helv версии v2.46.0. ASCII Tx-поля продолжают использовать /Helv с байт-идентичным выводом к v2.46.0 / v2.55.0. Многострочные + comb не-ASCII /AP и RTL bidi-шейпинг (UAX #9 + арабское контекстное соединение) остаются работой на будущее. Доступно с HotPDF v2.56.0; поддержка не-ASCII /AP для ffMultiline (построчный hex UTF-16BE Tj с Td / T* / /TL и перенос по словам с учётом CJK) с v2.57.0; поддержка не-ASCII /AP для ffComb (равные по ширине абсолютные ячейки Tm на CID + одиночная ячейка Tj на кодовую точку с обработкой суррогатных пар UTF-16) с v2.58.0; THotPDF.FormUnicodeRTL свойство для направления справа налево (разворачивает порядок UTF-16 в hex /AP Tj, сохраняя /V в логическом порядке; вызывающий пре-шейпит арабский в Unicode presentation forms U+FB50..U+FDFF + U+FE70..U+FEFF; полный UAX #9 + автоматический GSUB-шейпинг в ожидании) с v2.59.0.
  • Rich-text Tx widget в AcroForm (PDF 1.5+ ISO 32000-1 12.7.4.3 + Annex L): THPDFPage.AddRichTextField(FieldName, InitialValue, RichValue, DefaultStyle, Rectangle, [MaxLen], [Flags]) выдаёт текстовый widget с /RV (тело rich-text XHTML), /DS (умолчальный стиль в духе CSS), флаг ffRichText /Ff бит 26 автоматически OR-ится, плюс fallback обычного текста /V + /DV, которым пользуются ридеры, не разбирающие /RV. Acrobat и Foxit рисуют напрямую из /RV когда бит RichText включён, подхватывая шрифтовые fallback-и из установленных Unicode-шрифтов ридера — так многобайтовый контент (CJK / кириллица / арабский / латиница с диакритикой) показывается правильно без встраивания CID-шрифта HotPDF в ресурсы /DR. И /V и /RV автоопределяют многобайтовый вход и при необходимости переключаются на hex-строку UTF-16BE (BOM FE FF + big-endian кодовые единицы). Генерация appearance stream-ов с CID-шрифтами для собственного пути HotPDF /AP остаётся работой на будущее; rich-text-осведомлённым вьюерам она не нужна. Доступно с HotPDF v2.55.0.
  • Цветовое пространство DeviceN для сценариев с много-красочными spot-красками (PDF 1.3+ ISO 32000-1 8.6.6.5): THotPDF.RegisterDeviceN(ColorantNames, AlternateCS, TintC1Matrix) обобщает RegisterSeparation с одной spot-краски до N. Tint-преобразование — Function Type 4 на PostScript-калькуляторе, выдающий линейное взвешенное смешение по переданной матрице N x M (строка n столбец m — вклад краски n в канал AlternateCS альтернативного CS, когда краска n одна и равна 1.0). Возвращает имя цветового пространства (DevN1, DevN2, ...), которое ведёт обычный конвейер SetFillColorSpace + SetFillColor([t0, t1, ..., t_{N-1}]). AlternateCS принимает DeviceGray, DeviceRGB или DeviceCMYK; имена красок с пробелами экранируются в #20 по PDF 1.7 7.3.5; специальное имя None помечает неиспользуемый слот краски. Доступно с HotPDF v2.47.0.
  • Свободный Gouraud-затенённый треугольный меш (PDF 1.3+ ISO 32000-1 8.7.4.5.4): THotPDF.RegisterFreeFormGouraudShading(XMin, YMin, XMax, YMax, NumComponents, Vertices) объявляет поток /ShadingType 4 stream с /BitsPerCoordinate 16 + /BitsPerComponent 8 + /BitsPerFlag 8, заворачивает его во встроенную запись Pattern Type 2 в словаре Resources/Pattern страницы и возвращает автогенерированное имя паттерна (Sh1, Sh2, ...) для обычного конвейера SetFillPattern / SetStrokePattern. Каждая вершина упаковывается как 1 байт флага (всегда 0 для независимых треугольников) + 2 big-endian байта X + 2 big-endian байта Y + NumComponents 8-битных компонент цвета. Массив NumComponents принимает 1 (DeviceGray), 3 (DeviceRGB) или 4 (DeviceCMYK); каждая вершина даёт 2 + NumComponents значений Extended в Vertices в (X, Y, c1...cN) порядке; число вершин должно быть кратно 3. /Decode отображает 16-битные координаты обратно в [XMin, XMax] x [YMin, YMax], а цветовые компоненты в [0, 1]. Меш-затенения Type 5 (решётка), Type 6 (патч Coons) и Type 7 (тензорное произведение) остаются работой на будущее. Доступно с HotPDF v2.48.0.
  • Решётчатый Gouraud-затенённый треугольный меш (PDF 1.3+ ISO 32000-1 8.7.4.5.5): THotPDF.RegisterLatticeFormGouraudShading(XMin, YMin, XMax, YMax, NumComponents, VerticesPerRow, Vertices) объявляет поток /ShadingType 5, который раскладывает вершины решёткой M строк x N столбцов и позволяет рендереру авто-триангулировать каждую пару соседних строк в треугольную полосу. В отличие от RegisterFreeFormGouraudShading (Type 4), тут нет байта флага на вершину; /BitsPerFlag отсутствует в словаре затенения, и каждая вершина занимает только 4 + NumComponents байтов (2 big-endian X + 2 big-endian Y + N цветовых компонент). Вместо этого словарь затенения несёт требуемую запись /VerticesPerRow N. Используйте для исходных данных, уже лежащих на регулярной сетке выборок (рельеф, результаты FEA, научные тепловые карты) — приложение подаёт вершины построчно, а конвейер отрисовки сам собирает топологию треугольной полосы. VerticesPerRow должно быть не меньше 2, а общее число вершин — кратно VerticesPerRow минимум с двумя строками. Доступно с HotPDF v2.49.0.
  • Меш-затенение патчами Кунса (PDF 1.3+ ISO 32000-1 8.7.4.5.6): THotPDF.RegisterCoonsPatchMesh(XMin, YMin, XMax, YMax, NumComponents, Patches) объявляет поток /ShadingType 6 патчей Кунса, каждый ограничен четырьмя кубическими кривыми Безье и несёт по цвету на угол. Рендерер подгоняет поверхность Кунса между четырьмя рёбрами, давая произвольно изогнутый цветоносный четырёхугольник — полезно для фольгированных и металлических градиентов на изогнутых путях, градиентных мешей из SVG и любых четырёхугольников с кривыми рёбрами, которым иначе понадобилось бы много мелких треугольников. Каждый патч даёт 12 контрольных точек (24 значения X+Y Extended, упорядоченных c1..c12 по часовой вокруг границы, c1 / c4 / c7 / c10 в четырёх углах и оставшиеся 8 как внутренние рукоятки Безье), затем 4 угловых цвета (4 * NumComponents значений Extended), так что шаг Patches равен 24 + 4 * NumComponents. Словарь затенения несёт те же /BitsPerCoordinate 16 + /BitsPerComponent 8 + /BitsPerFlag 8, и как Type 4 (и в отличие от Type 5, /VerticesPerRow отсутствует). Каждый выданный патч несёт flag = 0 (независимый патч); флаги продолжения 1 / 2 / 3 (разделение рёбер) в этой convenience-перегрузке не открыты. Доступно с HotPDF v2.50.0.
  • Цветовое пространство Separation с табличным LUT tint-преобразованием (PDF 1.3+ ISO 32000-1 8.6.6.4 + 7.10.2): THotPDF.RegisterSeparationLUT(ColorantName, AlternateCS, Samples) оборачивает RegisterSampledFunction так, что вызывающие могут выразить полную нелинейную кривую тонов -> alt-CS плоским байтовым потоком 8-битных (M-кортежных) выборок без ручной сборки словаря Function Type 0. Берите LUT-вариант, когда цветовой переход нелинеен — тоновые рампы в духе PANTONE Hexachrome, гамма-скорректированные кривые плотности, нарисованные от руки тональные кривые под характеризацию печатной машины, ICC LUT конверсии sRGB-в-spot без полной машины ICC-профиля; точка входа RegisterSeparation из v2.45.0 по-прежнему покрывает линейный случай с одной конечной точкой. AlternateCS принимает DeviceGray, DeviceRGB или DeviceCMYK; Samples должна быть положительным кратным M минимум с 2 * M байтами, чтобы у функции был интерполируемый диапазон, а число узлов сетки S выводится из Length(Samples) / M. Линейная интерполяция — умолчание по PDF 1.7 /Order 1. Возвращает зарегистрированное имя цветового пространства (Sep1, Sep2, ...) для использования с обычным конвейером 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, выражающий произвольное отображение входа в выход регулярной N-мерной сеткой M-мерных выходных выборок с интерполяцией между узлами. Берите его там, где машина ICC-профиля избыточна, а нужна ручная цветовая LUT — тональные кривые для /TransferFunction (ExtGState /TR), выборочные tint-преобразования для /Separation / /DeviceN помимо линейных путей Type 2 / арифметического Type 4, пороговые кривые halftone или любой другой PDF-конструкт, принимающий словарь Function. Domain — это 2N записей (пара [min, max] на каждое входное измерение); Range — это 2M записей (пара на каждое выходное измерение); Size — это N чисел узлов сетки; BitsPerSample принимает 1, 2, 4, 8, 12, 16, 24 или 32 по таблице 38 PDF 1.7; Samples — это сырой бит-упакованный поток выборок (MSB-first внутри каждой выборки, без набивки между выборками помимо нулевого заполнения финального байта, вход 0 меняется быстрее всего по правилам порядка выборок спецификации); Order по умолчанию 1 (линейная) и принимает 3 (кубическая сплайн-интерполяция, с v2.54.0) по таблице 38 PDF 1.7. HotPDF сверяет число байтов выборок с ceil(GridPoints * M * BitsPerSample / 8). Возвращает косвенный THPDFStreamObject, так что вызывающие могут прикрепить его куда угодно, где ожидается словарь Function. Доступно с HotPDF v2.52.0; кубическая /Order 3 и сквозное покрытие многих входов / выходов с v2.54.0.
  • Меш-затенение патчами тензорного произведения (PDF 1.3+ ISO 32000-1 8.7.4.5.7): THotPDF.RegisterTensorProductPatchMesh(XMin, YMin, XMax, YMax, NumComponents, Patches) объявляет поток /ShadingType 7 патчей тензорного произведения, каждый определён полной сеткой 4 x 4 бикубических контрольных точек Безье p[i][j] плюс по цвету на угол. Расширяет RegisterCoonsPatchMesh (Type 6), добавляя 4 явные внутренние контрольные точки (p[1][1], p[1][2], p[2][2], p[2][1]) сверх 12 граничных точек, что даёт более тонкий контроль внутренней части патч-а, чем способна выразить подгонка со смешиванием Кунса. Полезно для round-trip SVG mesh-градиентов и любой графики, требующей бикубической поверхности Безье. Каждый патч даёт 16 контрольных точек (32 значения X+Y Extended в порядке потока из таблицы 88 спецификации: 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]), так что Patches равен 32 + 4 * NumComponents. Каждый выданный патч несёт flag = 0 (независимый патч). С этим релизом покрыто всё семейство меш-затенений ISO 32000-1 8.7.4.5 (Types 4 / 5 / 6 / 7). Доступно с HotPDF v2.51.0.
  • Стиль границы аннотаций и связка 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) выдаёт /Popup аннотацию, связанную в обе стороны (родительская /Popup -> popup, popup /Parent -> родитель), чтобы viewer мог нарисовать соединитель-облачко. Новое свойство THPDFPage.LastAnnotation кормит любой из хелперов, не меняя сигнатуры существующих процедур Add*Annotation. Доступно с HotPDF v2.34.0
  • Security handler с открытым ключом (ISO 32000-1 7.6.4, ISO 32000-2 7.6.5): THotPDF.EnablePubKeyEncryption(seed, KeyType, EncryptMetadata) + THotPDF.AddPubKeyRecipient(envelope) выдают словарь шифрования /Filter /Adobe.PubSec (/SubFilter /adbe.pkcs7.s4 для V=1 RC4-40 / /adbe.pkcs7.s5 для V=2 RC4-128 / V=4 AESV2). Вызывающий поставляет 20-байтную случайную соль и один бинарный блоб PKCS#7 envelopedData на получателя (собранный внешне Windows CryptoAPI, OpenSSL или pycryptodome). HotPDF выводит ключ шифрования файла, как описано в ISO 32000-1 7.6.4.3 (SHA-1 от соли, склеенной с каждым конвертом), и переиспользует стандартный вывод ключа на объект для потоков AES-128 / RC4. Доступно с HotPDF v2.33.0
  • Отрисовка загруженных страниц декодирует Shading Types 4-7 со всеми стандартными битовыми ширинами координат, компонент и флагов, байт-выровненными записями, флагами продолжения треугольников Type 4 и патчей Type 6 / 7, опциональными массивами Function, заявленной конверсией ColorSpace, обработкой BBox и Background, отсечением клипом, пакетными Gouraud-заливками и ограниченной адаптивной тесселяцией Кунса и тензорного произведения. Доступно с HotPDF v2.488.0

См. также