HotPDF Примечания к выпуску

История версий видимых пользователю возможностей, исправлений, обновлений совместимости и изменений документации HotPDF

Примечание: хранятся только последние 800 записей об изменениях

Last release

  • Последняя версия: 2.974.0; Дата выпуска: 2026-10-11

Version 2.974.0

Added

  • Удаляет аннотации страниц по точной странице и имени Unicode, включая каскады popup и reply, через ограниченные нативные API, транзакции Windows, JSON-задания и версионированные колбэки с аутентифицированными разрешениями и откатом публикации

Version 2.973.0

Added

  • Обменивается бинарными FDF-аннотациями с сохранением ресурсов appearance, разделяемых графов объектов и локальных назначений действий через нативные API, обмен Windows и версионированные колбэки

Version 2.972.0

Added

  • Рендерит default appearance аннотаций с сохранением состояния текста, автоматическим подгоном, интервалами rich-текста и клипом текста, включая режимы rendering с 4 по 7

Version 2.971.1

Fixed

  • Предотвращает сбои range-check в публичном shaped-run кэше на сборках FPC 3.3.1 Windows, сохраняя явное 32-битное модульное хеш-умножение, точную изоляцию ключей кэша и LRU-вытеснение

Version 2.971.0

Added

  • Сопоставляет корневой :scope и допускает статические pseudo классы hover, active и focus с неактивным состоянием взаимодействия, сохраняя отрицания, логические и относительные селекторы, запросы поддержки и сохранённые FDF/XFDF appearance

Version 2.970.0

Added

  • Вычисляет нативные группы @supports rich-текста и импорты supports() с запросами поддерживаемых объявлений и селекторов, ограниченными вложенными условиями, учитывающими namespace пробами, восстановлением после отмены и вычисленными сохранёнными FDF/XFDF appearance

Version 2.969.0

Added

  • Вычисляет конечные выражения calc, min, max и clamp, длины viewport относительно корня и явные, а также метрики строк и интервалов итогового шрифта в нативном декодировании rich-текста, сохранённых appearance полей и rich-импортах FDF/XFDF

Fixed

  • Единообразно допускает точные минимальные размеры media, разрешение и начальные размеры шрифта на всех целевых компиляторах, продолжая отклонять значения ниже поддерживаемой границы

Version 2.968.0

Added

  • Вычисляет явные preference rich-текста для цветовой схемы, reduced motion, прозрачности и данных, контраст, принудительные и инвертированные цвета и доступность scripting, сохраняя неизвестные опущенные preference и вычисленные сохранённые appearance

Version 2.967.0

Added

  • Применяет предоставленные вызывающей стороной связанные и импортированные таблицы стилей rich-текста с разделяемыми наборами заголовков preferred или alternate, ограниченным разрешением URI и базы документа и транзакционной публикацией FDF/XFDF в native, Windows и Linux

Version 2.966.0

Added

  • Вычисляет media queries нативного rich-текста с явными профилями print/screen, вложенными условиями и ограниченными диапазонами возможностей, удерживая вычисленные стили в сохранённых appearance и транзакционных импортах FDF/XFDF

Version 2.965.0

Added

  • Транзакционно создаёт, клонирует и редактирует нативные деревья форм XFA, сохраняя идентичности переживших узлов, откат событий, поддерживаемые случаи empty-merge и сохранённые пакеты форм независимо от исходных шаблонов

Version 2.964.0

Added

  • Генерирует нативные appearance plain, rich, shaped и family из полных шрифтов OpenType CFF2 в координатах вариаций по умолчанию, сохраняя идентичности глифов, Unicode, ширины и разрешения на встраивание в ограниченном статическом выводе CID-keyed CFF 1

Version 2.963.0

Added

  • Применяет объявления CSS namespace со scope и квалифицированные селекторы к нативным полям rich-текста и транзакциям форм Windows/Linux, сохраняя вычисленные appearance, ограниченный поиск namespace, точную no-op публикацию и совместимость с checked-сборками

Version 2.962.0

Added

  • Переносит сгенерированный текст аннотаций raw-шрифтов по границам пробелов и дефисов между стилевыми прогонами, сохраняя полные закодированные символы, жёсткие разрывы, автоматические размеры и ограниченную отмену

Version 2.961.0

Added

  • Рендерит отсутствующие текстовые appearance аннотаций исходными программами шрифтов Type1C, CIDFontType0C и чистым Type1, сохраняя отображения Unicode, автоматические размеры, интервалы, высоту строк и ограниченные неизменяемые ресурсы

Version 2.960.0

Added

  • Транспортирует стандартные Form appearance normal, rollover и down для Stamp XFDF с встроенными ресурсами шрифтов и изображений, ограниченными ациклическими графами, аутентифицированными нативными транзакциями и существующими колбэками Windows/Linux

Version 2.959.0

Added

  • Применяет сложные списки not, снисходительные списки is и where, заякоренные отношения has и отфильтрованные позиции nth-child к нативным внутренним таблицам стилей rich-текста, сохраняя специфичность селекторов, вычисленные значения, шрифты и транзакционные FDF/XFDF appearance

Version 2.958.0

Added

  • Обращается к live коллекциям детей нативного Data DOM через read-only числовые индексы в JavaScript и FormCalc, сохраняя текущий порядок детей, удерживаемые ссылки на script-объекты, независимые клоны, сохранённые значения и PDF appearance

Fixed

  • Отклоняет числовое присваивание, удаление и определение свойств как в текущих коллекциях, так и внутри удерживаемых лексических script-объектов, с ограниченным откатом событий и повтором

Version 2.957.0

Added

  • Применяет селекторы атрибутов, комбинаторы соседства, структурные и позиционные pseudo классы, унаследованное сопоставление языка и составное отрицание к нативным внутренним таблицам стилей rich-текста, сохраняя фактические вычисленные значения, шрифты, сохранённые appearance и транзакционные импорты FDF/XFDF

Version 2.956.1

Fixed

  • Разрешает пути списков детей узлов FormCalc через фактический компилятор событий, сохраняя live коллекции форм/свойств, доступ к item Data DOM, ограниченный replay, сохранённые нативные значения и PDF appearance

Version 2.956.0

Added

  • Генерирует нативные appearance полей plain, rich и shaped из полных шрифтов OpenType CFF, сохраняя идентичности глифов по имени, фактические CID-keyed наборы символов, отображения Unicode, разрешения на встраивание и разделяемые ресурсы шрифтов; отсутствующие FreeText appearance рендерятся встроенными значениями OpenType по умолчанию

Fixed

  • Ограничивает разбор CFF и метрики глифов, удерживает отмену и неизменяемые reader'ы на стиль и сохраняет поведение TrueType на шести нативных целевых компиляторах

Version 2.955.1

Security

  • Отклоняет полностью нулевые общие секреты X25519 и X448 после канонической сериализации байтов, включая low-order входы, слабые limb'ы поля которых ненулевые, и сохраняет результат соглашения ложным с пустым секретом и свежей диагностикой

Fixed

  • Сохраняет переносимые константы SHA3/SHAKE и намеренную арифметику согласования ключей по модулю 2^64 при включённых целочисленном переполнении и range check'ах, включая полноразмерные обмены P-256, P-384 и P-521 на 32-битном Free Pascal

Version 2.955.0

Added

  • Добавляет live коллекции детей form/property JavaScript с length, индексированным чтением, item, namedItem, итерацией и независимыми клонами; удерживает идентичность владельца между событиями, правками повторных экземпляров и неявным созданием свойств, с сохранёнными нативными значениями и PDF appearance

Fixed

  • Удерживает удерживаемые live списки привязанными к текущему владельцу события, отклоняет удалённых владельцев без переназначения на другой экземпляр и сохраняет нативные значения, удерживаемое состояние и откат журнала при сбоях выделения коллекций, операций и дедлайнов

Version 2.954.0

Added

  • Применяет внутренние таблицы стилей XHTML к нативным полям rich-текста и импортам FDF/XFDF с селекторами типа, класса и ID, комбинаторами потомка и ребёнка, сгруппированными селекторами, Unicode-эскейпами идентификаторов, специфичностью, важностью и порядком источника

Fixed

  • Сохраняет вычисленные стили в фактических сохранённых значениях и appearance виджетов, с ограниченным сканированием и сопоставлением, отменой, точными зафиксированными no-op байтами и транзакционным откатом колбэков

Version 2.953.0

Added

  • Добавляет независимые коллекции узлов запросов XFA с операциями all, classAll, classIndex, clone и принадлежности, стабильными удерживаемыми ссылками, ограниченным транзакционным replay и нативным потреблением сохранённого PDF

Fixed

  • Удерживает удерживаемые запрошенные instance manager'ы привязанными к текущему графу событий и вычисляет обычные SOM-пути и предикаты в исходных лимитах default-stack и операций

Version 2.952.0

Added

  • Сохраняет удалённые назначения аннотаций GoToR через нативный, обычный Windows и версионированный колбэк-обмен XFDF, включая точные координаты, файловые спецификации Unicode и необязательное поведение окна

Fixed

  • Аутентифицирует обычные импорты аннотаций загруженных документов против исходных разрешений шифрования, подписей и блокировок полей, удерживая разрешённые правки вызывающей стороны и независимое время жизни источника; читает целые ByteRange подписей без округления Single и отсоединяет разделяемое хранилище строк RC4 перед шифрованием

Version 2.951.0

Added

  • Ограниченные облачные рамки для аннотаций Square, Circle, Polygon и FreeText без normal appearance рендерятся с сохранением ширины, пунктира, прозрачности и исходных графов; неизменяемые сгенерированные байты шрифтов разделяются между представлениями FreeText без повторного начисления за декодированные байты, при этом бюджеты разбора и отмена сохраняются

Version 2.950.0

Added

  • Нативные узлы XFA Data DOM создаются, клонируются, переименовываются, вставляются и удаляются с ограниченным владением, унаследованными пространствами имён, стабильными импортированными ссылками, обновлением привязок и полным откатом события; атрибуты UTF-8 и удерживаемые ссылки FormCalc переживают сохранённый XML и нативных потребителей PDF

Version 2.949.0

Added

  • Различие между отсутствием выбранных вариантов choice и выбранным пустым export value сохраняется при нативном XFDF-обмене в Windows и Linux, с точной публикацией no-op, ограниченной валидацией и проверяемой загрузкой зашифрованного документа

Version 2.948.0

Fixed

  • Заполненные маски глифов рендерятся с захватом дробного покрытия клипа при сохранении PDF-путей, паттернов, альфы и операторов наложения, а ёмкость рабочей памяти растра проверяется до выделения

Version 2.947.1

Fixed

  • Явные пустые объявления XML-пространства имён по умолчанию сохраняются при разборе и сериализации XFA, чтобы неквалифицированные поддеревья данных не наследовали пространство имён предка после сохранения и перезагрузки

Version 2.947.0

Added

  • Рендерятся скошенные и вдавленные прямоугольные рамки аннотаций и измеренные подписи линий Unicode или rich text, с сохранением прозрачности, смещений конечных точек, существующих appearance, ограниченных ресурсов шрифтов и клипа аннотаций

Version 2.946.3

Fixed

  • xfa.host.resetData применяется через нативные события без ошибочного чтения его как импорта Data XML, с сохранением значений по умолчанию шаблона, связанных значений, повторных областей видимости, ожидающих правок и транзакционного отката

Version 2.946.2

Fixed

  • Словесная арифметика SHA-1, SHA-256, SHA-384 и SHA-512 исправлена при включённых проверках диапазона и переполнения компилятора, с сохранением корректных дайджестов и аутентификации паролей AES-256 без изменения публичных интерфейсов

Version 2.946.1

Fixed

  • Присутствующие-но-пустые атрибуты XFA и имена, значения, пространства имён и индексированные запросы UTF-8 сохраняются при нативной XML-сериализации, постоянных значениях свойств по умолчанию, повторных script-событиях и транзакционном откате

Version 2.946.0

Added

  • Временный rich-текст аннотаций рендерится с явными read-only разрешениями шрифтов Preview/Print и неизменными полными байтами шрифтов, с сохранением политик встраивания для редактирования и существующих Screen-appearance без неявных медиа-заглушек

Version 2.945.0

Added

  • Локальные страницы аннотаций и именованные destinations сохраняются при нативном и наследуемом XFDF-обмене, с точными ограниченными десятичными токенами, квалифицированным Adobe XML, проверкой дубликатов атрибутов и транзакционной публикацией callback Windows/Linux

Version 2.944.0

Added

  • Живые отображаемые и экспортные элементы XFA choice управляются через JavaScript и FormCalc, с сохранением выживших псевдонимов, точных дублирующихся или пустых выборов, нативных списков per-instance и сохранённых нативных или наследуемых PDF-appearance при ограниченных лимитах мутаций

Version 2.943.1

Fixed

  • Точные загруженные байты PDF сохраняются, когда нативные смешанные скалярные и типизированные rich-text транзакции или пустые батчи не вносят изменений, удерживая ожидающие правки графа, аутентифицированные политики подписи и шифрования, лимиты ресурсов и атомарную публикацию

Version 2.943.0

Added

  • Сопоставленный аннотационный XFDF обменивается через файловые jobs Windows и оригинальные V1-callbacks с аутентифицированными append-транзакциями, ограниченными бинарными и Unicode-данными, точными no-op байтами и атомарной публикацией

Version 2.942.0

Added

  • Поддерживаемые аннотации без normal-appearance рендерятся через ограниченную временную геометрию, окончания линий, иконки и Unicode FreeText, с удержанием ресурсов источника, rich text, флагов view/print и отмены

Version 2.941.1

Fixed

  • Проверка уникальности выбора в native XFA choice ведётся ограниченной сортировкой с возможностью отмены, сохраняя точные экспортные значения с учётом регистра, исходный порядок выбора и транзакционное поведение при сбое

Version 2.941.0

Added

  • Независимо каскадируемые нативные CSS и исходные типизированные межбуквенные и межсловные интервалы применяются к шейпированным ранам, физическим строкам, вёрстке и сохраняемым appearance, с сериализацией вычисленных значений в пунктах, точным десятичным округлением и транзакционной публикацией Windows/Linux JSON

Version 2.940.0

Added

  • Восемнадцать отображённых типов аннотаций обмениваются через ограниченные нативные XFDF- и Linux V1 JSON-операции с сохранением Unicode rich-содержимого, callout, прозрачных цветов, бинарных вложений, popup- и forward/reply-ссылок, аутентифицированных разрешений и транзакционной публикации в режиме добавления

Version 2.939.0

Added

  • Legacy XFA поля combo и list создаются с точными экспортными значениями повторяющихся экземпляров, отображаемыми подписями, выбранными индексами, позициями прокрутки и стилизованными Unicode-appearance; высокие флаги полей и откат по каждому полю сохраняются, с отсоединённой фабрикой choice на переданных шрифтах и режимом только метаданных

Version 2.938.0

Added

  • Четыре стандартных цветовых интента рендерятся сквозь графические состояния, формы, изображения, shadings, паттерны и группы прозрачности, с переопределениями на уровне изображений, относительным fallback для неизвестных имён и ограниченным кэшем ICC-преобразований с отменой

Version 2.937.0

Added

  • Независимые legacy XFA radio-группы создаются из фактических областей повторяющихся экземпляров с сохранением точных экспортных значений, выбранных состояний и стилизованных Unicode-подписей; откат принятия работает целой группой, плюс есть отсоединённый нативный API appearance членов группы на переданных шрифтах

Version 2.936.1

Added

  • Валидные PDF-словари и trailer разбираются с включённой проверкой арифметического переполнения за счёт явного удержания младших 32 бит умножения FNV-хэша

Version 2.936.0

Added

  • Явные типизированные высоты строк rich-text из JSON привязываются к сохраняемым appearance в Windows и Linux, с сохранением авторских ранов, переданных метрик родителя, ограниченного агрегатного планирования и транзакционных обновлений смешанных полей

Version 2.935.1

Added

  • Дополнительные Unicode-символы считаются один раз в переносимых XFA password-appearance, исходные значения удерживаются, а агрегатные бюджеты глифов соблюдаются до выделения масок, с отменой с точностью до скаляра

Version 2.935.0

Added

  • Высота строки rich-text, вычисленные CSS-длины, унаследованные коэффициенты и метрики родительского шрифта сохраняются сквозь нативную вёрстку, сохраняемые appearance, файловые задания и колбэки Windows, а также импорты FDF/XFDF JSON в Linux, с ограниченным планированием метрических шрифтов

Version 2.934.0

Added

  • Настоящие Unicode-appearance для legacy XFA полей text, numeric, date и password создаются с действующими на уровне экземпляра гарнитурой и стилем, редактируемыми встроенными шрифтовыми ресурсами, поскалярным маскированием пароля и транзакционным принятием ресурсов

Version 2.933.0

Added

  • Многомерные выборочные кубические цветовые функции вычисляются по существующей конвенции четырёх узлов для скаляров, с линейным fallback по короткому измерению, ограниченной тензорной работой, отменой и неизменной скалярной интерполяцией

Version 2.932.0

Added

  • Знаковые и беззнаковые компоненты JPEG 2000 декодируются до 26 бит со смешанной точностью, субдискретизацией и непрозрачностью, ограниченные отсчёты нормализуются, а объявления BitsPerComponent JPX-изображений игнорируются до рендеринга

Version 2.931.0

Added

  • Состояния экспорта on, off и neutral legacy XFA checkbox, стилизованные Unicode-подписи и нативные наборы appearance сохраняются, специальные PDF-имена кодируются единообразно, а прямые ресурсы страницы восстанавливаются после отменённого принятия виджетов

Version 2.930.0

Added

  • Автоматические применения optional content оцениваются с явным контекстом zoom, языка и пользователя, персистентными нативными ручными выборами и ограниченным состоянием операций Linux JSON; заимствованные контексты рендеринга инвалидируются после изменений документа

Version 2.929.0

Added

  • Скалярный текст, ячейки comb, подписи choice и отметки кнопок строятся из упорядоченных переданных основных гарнитур сквозь нативные сеттеры, задания Windows и версионированные колбэки Windows/Linux; обычные скалярные метаданные сохраняются, а пустой выбор choice отличается от выбранного пустого экспортного значения

Version 2.928.0

Added

  • Массивы штрихов и фазы из ExtGState рендерятся с ограниченным типизированным сканированием PDF-массивов, с сохранением комментариев, строгой валидацией операндов, унаследованной геометрией обводки, отменой и обычными текстовыми массивами

Version 2.927.0

Added

  • Скалярные и rich-подписи push-button исходного Windows ApplyXFAAsAcroForm рисуются реально установленными программами гарнитур и стилей, с персистентными переопределениями на экземпляр и нативными наборами appearance normal/down/rollover; подлинные шрифтовые ресурсы AcroForm регистрируются

Version 2.926.0

Added

  • Ограниченный встроенный CSS font-shorthand разворачивается в независимо каскадируемые кандидаты размера, насыщенности, курсива и переданных гарнитур, с сохранением унаследованных относительных размеров, сбросов пропущенного стиля, приоритетов important-компонент и фактических сохраняемых шрифтовых appearance

Version 2.925.0

Added

  • Упорядоченные переданные вызывающей стороной гарнитуры выбираются для полных стилизованных rich-text графем через файловые задания Windows и колбэки V1, с сохранением CSS- и типизированных кандидатов, настоящих транзакций пустых значений и агрегатных шрифтовых бюджетов

Version 2.924.0

Added

  • Группы optional content документа по умолчанию и выражения членства рендерятся сквозь помеченный контент страниц, Form XObjects и аннотации, скрытое графическое и текстовое состояние сохраняется, а явное применение view или print открывается через нативный интерфейс Linux V1 JSON

Version 2.923.0

Added

  • Упорядоченные списки кандидатов шрифтов rich-text сохраняются сквозь нативные appearance и Linux V1 JSON, а смешанные скалярные и исходные типизированные раны привязываются к файловым заданиям Windows и неизменённым колбэкам V1 с точной отрисовкой, переданными программами стилей и двухфазной публикацией

Version 2.922.0

Added

  • Видимость нативных аннотаций view или print выбирается по правилам Invisible из PDF 2.0, распознаются статические appearance RichMedia и Projection и неявные трансформации Text; ограниченная отменяемая атомарная замена Windows PNG сохраняется с реальной диагностикой ошибок ОС

Version 2.921.0

Added

  • Скалярные и XHTML-подписи push-button в native XFA рендерятся подлинными переданными программами гарнитур и стилей, с сохранёнными встроенными разделителями и авторскими отступами, фактическими appearance normal/down/rollover, видимостью подписей и персистентными переопределениями повторяющихся экземпляров

Version 2.920.1

Fixed

  • Успешные мутации PDF через нативный Linux C ABI остаются согласованными с зафиксированным снимком источника, поэтому последующие импорты FDF или XFDF с теми же значениями сохраняют точные опубликованные значения формы, типизированные appearance, нарисованный текст и импортированные страницы вместо восстановления устаревших входных байтов

Version 2.920.0

Added

  • Смешанные скалярные поля и исходные типизированные rich-text раны сохраняются одной независимой атомарной транзакцией документа, точные значения appearance и переданные шрифтовые программы удерживаются, аутентифицированные политики и текущие правки графа сохраняются, а подлинные no-op appearance полей только для чтения распознаются

Version 2.919.0

Added

  • Полные стилизованные Unicode-графемы разрешаются через явно переданные гарнитуры-кандидаты, авторские значения и точные стили appearance сохраняются, opt-in fallback нативного Linux JSON открывается через неизменённые колбэки V1, а фактический агрегатный шрифтовый лимит удерживается при загрузке сконфигурированных программ

Version 2.918.0

Added

  • Подписи Boolean в native XFA рендерятся из действующего XHTML и переданных именованных стилевых шрифтов, оверлеи повторяющихся экземпляров и сохраняемый runtime XML удерживаются, а автоматические резервы подписей измеряются финальными логическими размерами текстовых строк

Version 2.917.0

Added

  • Подлинные именованные программы гарнитур и стилей для импортов Windows FDF и XFDF выбираются через вложенные файловые пути или существующие версионированные шрифтовые колбэки, а синхронизированные чтения источника случайных значений изолируются от последовательной транзакционной публикации

Version 2.916.0

Added

  • 182 встроенных legacy CMap декодируются и рендерятся с ограниченными кодами от одного до четырёх байт, точными режимами записи родителя и потомка, Unicode-маппингами, детерминированным восстановлением после битых кодов, отменяемым наследованием и комплектными уведомлениями о редистрибуции

Version 2.915.0

Added

  • Выбранные опции нативных XFA list остаются видимыми благодаря окнам выбора по метрикам шрифта и сохраняемым верхним индексам, полные массивы опций и значений сохраняются, а шрифтовые изменения повторяющихся экземпляров и откат событий удерживаются с ограниченной подготовкой видимых глифов

Version 2.914.1

Fixed

  • Попадания в foreground-кэш памяти перекрываются с кооперативной отменой prefetch после захвата реального резервирования памяти, телеметрия кэша операций сохраняется, а отмена перепроверяется после ожидания блокировки кэша или резервирования — со строгим порядком промахов и ожиданием завершения потоков

Version 2.914.0

Added

  • Нативные Boolean-appearance XFA создаются с шестью пользовательскими отметками, круглыми или квадратными рамками, цветами и размерами отметок, пятью размещениями подписей и общими встроенными шрифтами подписей; обратимые Unicode-алиасы экспорта и различимые допустимые neutral-состояния сохраняются сквозь выполнение событий и перезагрузку сохранённого PDF

Version 2.913.2

Fixed

  • Полные повёрнутые матричные штрихкоды декодируются раньше несвязанных фрагментов, а точные несовпадения QR finder отвергаются до выборки полной сетки — с более плотной группировкой, исходным поведением линейных штрихов, атомарными бюджетами сканирования и неизменным двухсекундным дедлайном

Version 2.913.1

Added

  • Существующие неявные значения XFA разрешаются через ограниченные живые контексты данных без повторного разбора селекторов, списываемого на лимит скриптовых операций, с сохранением исходных дедлайнов транзакций и явного поведения привязки

Version 2.913.0

Added

  • Сконфигурированные нативные rich-гарнитуры выбираются через неизменённые колбэки Linux V1 JSON для типизированных заливок и импортов FDF/XFDF, реально требуемые программы гарнитур и стилей загружаются с агрегатными бюджетами, а оба реализованных rich-профиля объявляются в списке возможностей

Version 2.912.0

Added

  • Реальные FDF и XFDF импортируются и экспортируются через файловые задания Windows и колбэки V1 с неизменяемым собственным входом, подготовкой текущего несохранённого графа, настоящими rich-appearance на четырёх шрифтах, аутентифицированными подписанными AES-политиками и фиксацией контекста только после успеха обоих выходных колбэков

Version 2.911.0

Added

  • Нативные XFA-фигуры rectangle, line и arc и встроенные изображения PNG или JPEG создаются с реальным декодированием отсчётов, альфа-масками, подогнанными пропорциями и повёрнутым размещением, ограниченной подготовкой и транзакционным владением при отмене

Version 2.910.0

Added

  • Appearance аннотаций NoZoom и NoRotate подгоняются вокруг преобразованного якоря левого верхнего угла прямоугольника, с сохранением UserUnit, подогнанной геометрии формы, прозрачности и реального clip страницы при масштабировании и повороте

Version 2.909.0

Added

  • Фактические переданные именованные гарнитуры TrueType выбираются для каждого rich-рана и ограниченного XHTML-объявления font-family, метрики стилей и кэши отметок ведутся по каждой гарнитуре, а реальные rich-значения FDF/XFDF импортируются с каноническим сравнением с учётом гарнитур

Version 2.908.1

Fixed

  • Валидные встроенные rich-text объявления применяются с независимым приоритетом important, охватывающими вычисленными базами font-size и явными унаследованными свойствами, с сохранением границ CSS-комментариев и объявлений в кавычках и функциях

Version 2.908.0

Added

  • Подлинные нативные XFA combo boxes, list boxes, поля мультивыбора, checkbox и структурно ограниченные radio-группы создаются прямо из сохранённых runtime-данных, с парными display/export подписями, элементами на каждый экземпляр, флагами доступа и независимыми нативными состояниями appearance

Version 2.907.1

Fixed

  • Реальные PDF-шестнадцатеричные escape-последовательности и байты UTF-8 декодируются в полях с именными значениями и в унаследованных полях формы, с сохранением экспортных состояний кнопок с пробелами, пунктуацией и Unicode сквозь нативную перезагрузку сохранённого документа

Version 2.907.0

Added

  • Реальные идентичности глифов CID-keyed CFF и ограниченные подстановки notdef рендерятся через фактические CID-to-GID маппинги шрифтов, с сохранением независимого извлечения текста и проверок отмены на всём протяжении разбора escape-CMap

Version 2.906.0

Added

  • Комбинируемые отметки поперёк стилей позиционируются по фактическим границам выбранных глифов и каноническим классам комбинирования, когда якоря привязки отсутствуют, с независимыми масштабами шрифтов, стекированием на одной стороне и реальными разрешёнными направлениями элементов для двойных отметок

Version 2.905.1

Fixed

  • Escape-параметры предиктора разрешаются внутри фактического словаря DecodeParms, а реальный токен стрима ищется после сбалансированного синтаксиса внешнего словаря; бинарные xref-полезные нагрузки со значениями из пробелов сохраняются при обычной загрузке в Windows

Version 2.905.0

Added

  • Нативные деревья страниц PDF, повторяемые редактируемые поля, push-кнопки и статический Unicode-текст создаются прямо из XDP и сохранённых runtime-значений в Linux и Windows, с подлинными встроенными appearance и ограниченной подготовкой кандидатов до передачи вывода вызывающей стороне

Version 2.904.2

Fixed

  • Фактические внешние словари cross-reference stream читаются без путаницы с вложенными настройками шифрования, escape-имена записей разрешаются, а прямые словари шифрования сохраняются в обычных инкрементальных ревизиях Windows

Version 2.904.1

Fixed

  • Полные управляющие символы направления абзаца и парные скобки сохраняются сквозь автоматический автономный шейпинг и простой перенос строк многострочных полей, с контекстами соединения физических строк, неизменяемым кэшированием абзацев и ограниченным суммарным выводом глифов

Version 2.904.0

Added

  • Нативный рантайм XFA — JavaScript, журнал событий, Data DOM, XML, FormCalc и локали ICU — исполняется в Linux с собственными арендами общих модулей и настоящими монотонными часами, сохраняя существующую Unicode-инициализацию Windows

Version 2.903.1

Fixed

  • Unicode-кластеры шейпинга только с направленностью удерживают нулевой интервал символов, сохраняя логические управляющие символы, идентичности глифов и обычные интервалы видимых кластеров и слов

Version 2.903.0

Added

  • Направленные вложения, переопределения, изоляты и контекст абзаца с парными скобками сохраняются сквозь переносимые строки rich-стилей; ограниченные API порядка физических строк — производные от абзацев и кэшированные — открываются наружу, а реальные элементы строк шейпятся с разрешёнными уровнями и скриптами

Version 2.902.0

Added

  • Стилизованные FDF и XFDF импортируются и экспортируются через реальные колбэки Linux JSON C ABI, сконфигурированные подлинные font-face встраиваются, политики подписи и точные приватные байты источника сохраняются для no-op импортов, а текущее состояние документа публикуется только после успеха обоих выходов колбэков

Version 2.901.0

Added

  • Mesh-shadings Coons и tensor patch рендерятся с ограниченной кубической геометрией, интерполяцией цвета в пространстве источника, рёбрами продолжения, обработкой сгибов и транзакционными лимитами ресурсов и отмены

Version 2.900.0

Added

  • Чувствительный к namespace XML нативного XFA Data DOM загружается и сохраняется транзакционно, упорядоченное смешанное содержимое и идентичности привязок данных сохраняются, значения хоста квотируются за линейное время, а точная сессионная аренда JavaScript-модуля удерживается через ограниченный replay движка

Version 2.899.0

Added

  • Стилизованные комбинируемые отметки привязываются к фактическим якорям GPOS базовых, лигатурных и mark-глифов с независимыми масштабами шрифтов, контуры глифов с отрицательным началом координат сохраняются внутри rich-клипов виджетов, а подогнанные размеры строк резервируются под видимые стопки отметок

Version 2.898.0

Added

  • Ограниченный rich text в FDF и XFDF читается и пишется, нативные XHTML style-спаны декодируются в четыре подлинных встроенных шрифтовых стиля, а реальные appearance транзакционно импортируются в подписанные или зашифрованные PDF, включая каноническое сравнение существующих rich-значений только для чтения

Version 2.897.0

Added

  • Выбранные Unicode style-спаны шейпятся с подлинным окружающим контекстом HarfBuzz, нативные API порядка и направления абзацев открываются наружу, а типизированные rich-элементы размещаются в реальных переносимых физических строках с сохранением логических стилей и владения объектами

Version 2.896.0

Added

  • SOM привязки native XFA разрешается сквозь повторяющиеся области данных с ограниченным обходом потомков, escape-именами, сопоставлением Unicode, fallback-ами отсутствующих листьев на каждый экземпляр и транзакционной синхронизацией рантайм-значений

Version 2.895.1

Fixed

  • Поддержка статических событий native XFA компилируется один раз на собственный JavaScript-движок, а полные компактные аргументы динамических событий воспроизводятся в replay с сохранением замыканий, записанных ответов хоста, изоляции экземпляров, исходных бюджетов журнала и дедлайнов транзакций во время отката

Version 2.895.0

Added

  • Фактические байты FDF и XFDF импортируются и экспортируются через существующие версионированные нативные колбэки Linux JSON, Unicode-значения полей, AES-защита и аутентифицированные политики подписи сохраняются, а текущий документ откатывается после неудачного вывода или публикации результата

Version 2.894.0

Fixed

  • Слишком широкий типизированный rich text переносится по полным границам Unicode-графем сквозь шрифтовые и цветовые стили, фактические стилизованные диапазоны измеряются до распределения по строкам, а неделимые негабаритные кластеры, смешанные кегли и явные межбуквенные интервалы сохраняются

Version 2.893.1

Security

  • Требуемые подписанные Adobe доказательства CRL и OCSP аутентифицируются внутри подлинных RFC3161-меток времени документа до принятия защищённых политикой подписи обновлений формы, с сохранением транзакционного отказа при отсутствующих, отозванных, просроченных или недоверенных доказательствах

Version 2.893.0

Added

  • Ограниченные скалярные данные полей в нативных FDF и XFDF читаются и пишутся, а реальные Unicode-, choice- и button-appearance транзакционно импортируются в независимо публикуемые PDF с сохранением аутентифицированных политик подписи и AES-шифрования

Version 2.892.0

Added

  • Ограниченные треугольные mesh-shadings free-form и lattice рендерятся с подлинной семантикой координат, флагов, функций, цвета и прозрачности, а шестнадцатеричные стримы палитр Indexed декодируются ровно один раз

Version 2.891.0

Added

  • Упорядоченные XML-комментарии и инструкции обработки native XFA сохраняются сквозь импорт событий, сериализацию, клонирование и транзакционный откат, но исключаются из скалярного текста, rich text и выбора элементов SOM

Version 2.890.1

Fixed

  • Преходящие блокировки атомарной публикации в Windows восстанавливаются не более чем восемью отменяемыми попытками замены, с сохранением точных целей, подготовленных байтов, постоянных ошибок ОС и очистки собственного staging

Version 2.890.0

Added

  • Допустимые группы Unicode — слова, неразрывные пробелы, пунктуация и числа — сохраняются сквозь типизированные rich-style раны, целые группы подгоняются реальными метриками стилизованных шрифтов, смешанные базовые линии удерживаются, а CRLF сливаются на швах между стилями

Version 2.889.0

Added

  • Материализованные скрытые и невидимые скалярные алиасы XFA синхронизируются после фиксации видимых полей, с сохранением нативных повторяющихся областей данных, явных пустых значений и точного транзакционного отката

Version 2.888.0

Added

  • Полные свойства Unicode 17 и контекстный перенос строк применяются через существующие API документов, переносимые запросы свойств открываются в сыром или LB1-разрешённом виде, устоявшиеся порядки enum и контракты tailoring сохраняются, а запреты мягкого переноса соблюдаются

Version 2.887.0

Added

  • Персистентный exData XML native XFA импортируется и сериализуется с немедленным чтением из скриптов, сохранением namespace и смешанного содержимого, удержанием идентичностей повторяющихся экземпляров, транзакционным откатом и подлинным рендерингом сохранённого XHTML

Version 2.886.0

Added

  • Автономные RFC3161-метки времени PDF-документов создаются и аутентифицируются с ограниченной потоковой передачей, imprints SHA256, SHA384 или SHA512, доверенной идентичностью TSA и привязкой nonce, обязательными объявлениями расширений ESIC и аутентифицированными исключениями сертификации или блокировки полей

Version 2.885.0

Added

  • Возможности переноса строк по умолчанию из Unicode 17 открываются наружу и потребляются реальными нативными rich-полями, с сохранением групп неразрывных пробелов, дефисов и пунктуации, явных Unicode-разделителей и точных исходных значений V и RV

Version 2.884.0

Added

  • Переносимые границы расширенных графем по умолчанию из Unicode 17 открываются наружу, слишком широкие rich-слова переносятся по полным кластерам, фактическое Unicode-содержимое appearance сохраняется, а изменения ширины соединительных форм корректируются после шейпинга подстрок

Version 2.883.0

Added

  • Персистентные дочерние значения image и геометрии native XFA создаются, реальная PNG-альфа, DPI изображений и геометрия пропорций рендерятся с сохранением изоляции повторяющихся экземпляров и транзакционного отката; пиксели изображений FPC, раньше рисовавшиеся чёрными, исправлены

Version 2.882.0

Added

  • Фактические шрифтовые ресурсы дочерних стримов и PDF-параметры текста наследуются в рендеринге Form, Type3 и Pattern, сохранения текста в графическом состоянии удерживаются, невидимый текст Type3 соблюдается, а независимые дефолты appearance аннотаций сбрасываются

Version 2.881.0

Added

  • Стандартные отсоединённые CAdES-подписи аутентифицируются автоматически с обязательной привязкой сертификата подписанта, а подлинные шестнадцатеричные или escape-литеральные строки Contents читаются единообразно для верификации, разрешённых обновлений формы и доказательств долгосрочной валидации

Version 2.880.2

Fixed

  • Выравнивание rich-абзацев удерживается сквозь пустые начальные раны, встроенные смены стилей и явные разрывы строк, а запрошенные рамки прямоугольников или кругов и измеренные подсвеченные строки рисуются вместо молчаливого пропуска

Version 2.880.1

Fixed

  • Отмена отслеживается до аллокации рендерера страниц и установки контекста и во время инициализации, активный цветовой контекст вызывающей стороны сохраняется при первичном отклонении конструкции, а заимствованные display-списки освобождаются без публикации частичных битмапов

Version 2.880.0

Added

  • Фактические скалярные значения draw и подписей native XFA рендерятся после создания скриптами, явно пустые значения и изоляция повторяющихся экземпляров сохраняются, а точный откат удерживается, когда последующий нативный рендеринг исчерпывает свой бюджет

Version 2.879.0

Added

  • Персистентные скалярные дочерние значения native XFA создаются с немедленной синхронизацией полей, данных и общих алиасов, типизированной персистентностью формы, фиксациями виджетов, изоляцией повторяющихся экземпляров и точным транзакционным откатом

Version 2.878.0

Added

  • Фактические Windows-профили appearance подписи со встроенными Unicode-шрифтами генерируются для объединённых и отдельных виджетов, сценариев поворота, шифрования и сертификации, а обязательный AppearanceFilter сверяется с реально сгенерированным профилем

Version 2.877.0

Added

  • Фактические цветные и нецветные PDF-паттерны tiling и shading рендерятся с унаследованными началами паттернов, вложенными ячейками, перекрытием, stroke- и stencil-заливками, прозрачностью и ограниченной отменой на нативных целях Linux и Windows

Version 2.876.1

Fixed

  • Полная привязка XFA SOM и фактический выбор данных выпущенного экземпляра сохраняются при применении form- и template-дефолтов отсутствующих экземпляров, без заимствования значений из другого повторного вхождения

Version 2.876.0

Added

  • Аутентифицированные доказательства CRL и OCSP встраиваются в подписанные Windows-атрибуты Adobe RevocationInfoArchival, фактические seed-политики соблюдаются, а доверенный статус, авторизация ответа и свежесть проверяются до публикации подписей

Version 2.875.0

Added

  • Фактические дефолты XFA-полей разрешаются при чтении без изготовления данных, явные пустые значения экземпляров сохраняются, а правки пишут независимые данные экземпляров, не трогая общие шаблоны

Version 2.874.0

Added

  • Нативные rich-text поля редактируются типизированными Unicode style-ранами, реальными встроенными шрифтами regular, bold, italic и bold-italic, измеренными смешанными базовыми линиями appearance, декорациями и синхронизированными значениями V/RV сквозь виджеты и шифрованный вывод

Version 2.873.0

Added

  • Персистентные choice в UI XFA на каждый экземпляр создаются нативными скриптами, а реальные виджеты text, password и choice потребляются с многострочными и измеренными long-word appearance

Version 2.872.0

Added

  • Фактические Windows-подписи сертификации DocMDP создаются с разрешениями P1, P2 или P3 и аутентифицированными Unicode-правовыми аттестациями, обязательные seed-политики и FieldMDP-блокировки соблюдаются, а последующие подписи допускаются только там, где подписанная политика их разрешает

Version 2.871.1

Fixed

  • Тела XFA-событий исполняются в собственном лексическом и strict-охвате, с сохранением алиасов полей во внешнем охвате, значения this события, явных return и точного отката при сбое

Version 2.871.0

Added

  • Отсутствующие свойства XFA — шрифт, абзац, fill, цвет, рамка, edge и corner — создаются реальными нативными скриптами событий, стабильные привязки форм на экземпляр персистентны с точным откатом, а опциональные appearance виджетов пересоздаются после действенных смен стиля

Version 2.870.0

Added

  • Фактический нативный вывод Windows Cairo рендерится с явными GDI-контурами стандартных шрифтов и корректными Win32-конвенциями вызова OpenJPEG, на воспроизводимых зафиксированных нативных зависимостях и с независимым принятием вывода

Version 2.869.0

Added

  • Windows-документы подписываются реальными синхронными транспортными колбэками RFC 3161 через C ABI с imprints SHA256, SHA384 или SHA512, аутентифицированным доверием TSA и проверками CRL, обязательными seed-ограничениями метки времени и ограниченной транзакционной публикацией

Version 2.868.0

Added

  • Маскированные appearance полей password и literal file-select генерируются с сохранёнными Unicode-значениями и политиками AES-256, escape-дополнительный Unicode проносится через нативный JSON ABI, субнормальные десятичные исходные токены PDF удерживаются, а RGB prefetch-буферы создаются без экранного DC

Version 2.867.0

Added

  • Rich text XFA переносится сквозь встроенные стили с измеренными границами слов, явными разрывами строк, общими базовыми линиями и выравниванием, реальными промежутками выключки и геометрией фрагментных ссылок, с сохранением нативной персистентности повторяющихся экземпляров XDP

Version 2.866.1

Added

  • RFC 3161-токены сырых подписей аутентифицируются по их реально поддерживаемому алгоритму message imprint — SHA256, SHA384 или SHA512, — при сохранении существующего дефолта запроса SHA256 и полных проверок доверия и отзыва токена

Version 2.866.0

Added

  • Раны XFA rich text смешанных кеглей выравниваются по общей базовой линии сохранённого PDF, режим позиции текста вызывающей стороны сохраняется, а больший соседний отступ абзаца применяется, включая переходы через пустые абзацы

Version 2.865.0

Added

  • RFC 3161-метки времени запрашиваются и аутентифицируются для явных message imprints SHA256, SHA384 и SHA512 без повторного хэширования imprint, с сохранением строгих длин дайджестов, свежих nonce, ограниченного транспорта, цепочек доверия и валидации отзыва

Version 2.864.0

Fixed

  • Исходный дедлайн сканирования штрихкодов сохраняется за счёт приоритета полных линейных растров и групп кандидатов quiet-zone, а невалидные проективные границы finder у DataMatrix отвергаются до выборки внутренних модулей, без изменения допусков finder

Version 2.863.0

Added

  • Валидные унаследованные Windows-ограничения seed и сертификатов подписи соблюдаются с фактическим выбором дайджеста и CAdES, Unicode-информацией подписи, нормализованными косвенными блокировками полей, аутентифицированными историческими разрешениями блокировок, разрешёнными вторыми подписями и шифрованными политиками формы

Version 2.862.0

Added

  • Фактические нативные PDF-shadings function, axial и radial рендерятся с ограниченной геометрией и вычислением функций, унаследованным клиппингом, семантикой Domain, Matrix, Extend и BBox, калиброванными и специальными цветами, прозрачностью, soft mask, блендингом и knockout-группами

Version 2.861.0

Added

  • Фактические нативные PDF ревью договоров с аннотациями и явные Unicode-выделения экспортируются с видимыми normal-appearance, с сохранением контента источника и инкрементальных ревизий подписей, соблюдением аутентифицированных разрешений аннотаций P3 и шифрованных прав пользователя и ограниченной подготовкой выводов до публикации колбэками

Version 2.860.0

Added

  • Опции подписания и верификации native Linux привязываются к фактическому выбору дайджеста, Unicode-метаданным подписи, именованным профилям appearance, явным байтам доверия, идентичности транспорта метки времени и аутентифицированным доказательствам отзыва, с ограниченной приватной подготовкой до публикации

Version 2.859.0

Added

  • Живые переопределения XFA на уровне экземпляра — шрифт, абзац и скалярное тело — применяются к фактическому рисованию и измерению rich text, приоритет встроенного CSS и явное пустое содержимое сохраняются через нативную персистентность XDP, а точный транзакционный откат удерживается

Version 2.858.0

Added

  • Escape-имена PDF — шрифтов, кодировок, глифов, цветов и ресурсов — декодируются ровно один раз в нативном рендеринге и общем извлечении текста, литеральные hash-ключи ресурсов сохраняются, а эквивалентные имена остаются согласованными с фактическими контурами и метриками глифов

Version 2.857.0

Added

  • Нативные документы сравниваются по количествам страниц и объектов, Unicode-тексту, нормализованным структурным графам и фактическим отрендеренным пикселям RGB или яркости, с семантической эквивалентностью стримов, аутентифицированными шифрованными входами и ограниченной подготовкой до публикации колбэками

Version 2.856.0

Added

  • Фактические нативные пресеты appearance подписи выбираются по зарегистрированному имени профиля, генерируются различные раскладки approval, certification и compact, аутентифицированные метаданные профилей и шифрованные политики сохраняются, а неизвестные профили отвергаются до публикации

Version 2.855.0

Added

  • Дефолты схемы свойств native XFA применяются, а явные пустые значения, стили на каждый экземпляр и дробные пунктовые измерения шрифта, рамки и draw сохраняются сквозь фактический вывод AcroForm и flattened PDF

Version 2.854.0

Added

  • Объекты свойств и атрибутов native XFA открываются наружу с персистентными привязками форм на каждый экземпляр, синхронизированной записью value/data и фактическими эффектами шрифта, рамки, абзаца и UI-раскладки, с сохранением транзакционного отката и бюджетов фокуса без скриптов

Version 2.853.0

Added

  • Подлинные доказательства отзыва Adobe встраиваются как аутентифицированные подписанные атрибуты CMS, полные цепочки сертификатов и меток времени валидируются против явного доверия и актуальных доказательств CRL или OCSP до публикации, а обязательное встраивание отзыва из signature seed соблюдается

Version 2.852.0

Added

  • Аутентифицированные Unicode-правовые аттестации пишутся в подписи сертификации, требования Legal seed только для сертификации соблюдаются, существующая правовая статистика и разрешения каталога сохраняются, а шифрованные строковые политики удерживаются

Version 2.851.0

Added

  • Физические исходные цвета Lab ICC и ограниченные компатибильные входы XYZ рендерятся в путях, тексте, упакованных изображениях и палитрах Indexed, калиброванные и ICC-альтернативные оттенки сохраняются сквозь группы RGB или CMYK, а встроенные JPX-профили применяются с отдельной или связанной альфой

Version 2.850.0

Added

  • Совместимые документы с недостающими шрифтами конвертируются в текст с поиском и векторный PDF/A-4 с явным ограниченным встраиванием шрифтов Ghostscript, подлинной валидацией veraPDF и атомарной публикацией, а нативные Unicode-шрифты TrueType выбираются единообразно между дистрибутивами

Version 2.849.0

Added

  • Встроенные простые шрифты Type1 и Type1C рендерятся с точными объявленными или встроенными кодировками глифов Adobe, извлечение ToUnicode остаётся отдельным от отображаемых контуров, а валидированные нейтральные stroke adjustment и relative colorimetric в графическом состоянии принимаются

Version 2.848.0

Added

  • Полные суффиксы путей потомков XFA разрешаются внутри каждого wildcard-контекста, локальные границы вхождений сохраняются, а предикаты исполняются в текущем охвате события с точным транзакционным откатом

Version 2.847.0

Added

  • Унаследованные нативные ограничения seed и сертификатов подписи соблюдаются с реальными цепочками издателей, политиками subject и key usage, выбираемыми CMS-дайджестами, шифрованными Unicode-метаданными подписи и трансформациями заблокированного документа

Version 2.846.0

Added

  • Datasets и узлы данных native XFA открываются наружу с двунаправленными привязками форм, динамическим зеркалированием данных экземпляров, стабильными удерживаемыми ссылками, независимыми непривязанными значениями формы и транзакционным replay скриптов

Version 2.845.0

Added

  • Аутентифицированные ссылки FieldMDP выпускаются из существующих или унаследованных блокировок полей подписи, шифрованные Unicode-имена полей и ссылки сертификации сохраняются, а уровни разрешений блокировок применяются без ослабления исходных подписанных политик

Version 2.844.0

Added

  • Альтернативные оттенки Separation и DeviceN рендерятся с ограниченными векторными функциями, упакованными изображениями и блендингом групп CMYK, knockout-геометрия None сохраняется, а цвета registration All маппятся единообразно

Version 2.843.0

Added

  • Динамические пути XFA SOM разрешаются с выведенными и относительными вхождениями, ограниченными охватом предикатами, селекторами классов и потомков, wildcard-коллекциями и транзакционными присваиваниями свойств скрипт-объектов

Version 2.842.0

Added

  • Нативное семантическое сравнение договоров двух документов через C ABI и Pascal предоставляется общим переносимым ядром, с геометрией глифов источника, шифрованными и вложенными входами, подготовленным выводом ревью JSON или HTML и стабильным порядком блокировок при конкурентности

Version 2.841.0

Added

  • Исходные ревизии CMS и CAdES аутентифицируются до нативных обновлений формы, исходные разрешения DocMDP и FieldMDP и заблокированные поля соблюдаются, подписанное содержимое и ресурсы сохраняются, а метаданные подписей push-button синхронизируются атомарно

Version 2.840.0

Added

  • Калиброванные исходные цвета CalGray, CalRGB и Lab, калиброванный блендинг групп и страниц, базы Indexed, 16-битные отсчёты изображений и soft mask по яркости XYZ рендерятся с ограниченной конвертацией и безопасным вычислением гаммы

Version 2.839.0

Added

  • Копирование значений FormCalc и стабильные ссылки на узлы реализованы с присваиванием через ссылку, перепривязкой и null-отвязкой, равенством числовой идентичности, удерживаемыми хэндлами и транзакционным откатом

Version 2.838.0

Added

  • Сгенерированные в рантайме программы FormCalc Eval исполняются с изолированными охватами вычислений, вложенным вычислением, Unicode-источником, ограниченными повторами компиляции и транзакционным replay ответов хоста

Version 2.837.0

Added

  • Встроенные Unicode-appearance генерируются через нативное заполнение форм Linux JSON для полей text, choice и multiselect, состояний checkbox и radio и подписей push-button, с сохранением транзакционной публикации и шифрования

Version 2.836.0

Added

  • Синхронный транспорт RFC 3161-меток времени предоставляется через совместимое расширенное описание нативной операции подписания, с ограниченными ответами, общей отменой и явной валидацией доверия TSA и отзыва

Version 2.835.0

Added

  • Транзакционное состояние хоста XFA, флаги страниц и жизненного цикла, смены фокуса на каждый экземпляр, валидация ожидающих правок и операции сброса исполняются со стабильной идентичностью и replay лексического состояния

Version 2.834.0

Added

  • Идентификаторы сертификата подписанта CAdES валидируются против фактического подписанта независимо от опционального доверия сертификату, а встроенные стримы Encoding CMap разрешаются через нативный шрифтовый адаптер

Version 2.833.0

Added

  • Вертикальные Identity-V и предопределённые Unicode CMap рендерятся с реальными началами W2/DW2, матрицами, перемещением текста и клиппингом, а встроенные стримы Encoding CMap декодируются корректно

Version 2.832.0

Added

  • Подписание идёт через нативный callback ABI Linux с идентичностями PEM или ограниченным PFX, новыми полями Unicode appearance и сертификацией, а подготовленный подписанный документ удерживается как текущий контекст после успешной публикации

Version 2.831.0

Fixed

  • Ограничения signing seed, блокировок и только-чтение применяются единообразно к закодированным PDF-именам, семантически дублирующиеся ключи отвергаются, а унаследованные словари политик валидируются

Version 2.830.0

Added

  • Продвинутые picture-предложения XFA — числовые, календарные, текстовые и составные — исполняются через реальные события формы, с сохранением точности ввода, семантик локалей и транзакционного replay скриптов

Version 2.829.0

Added

  • Нативные графы ресурсов страниц и преобразованные appearance аннотаций импортируются в обычные или зашифрованные документы, а совместимые входы конвертируются в текст с поиском и векторный PDF/A-4 с подлинной валидацией до атомарной публикации

Version 2.828.0

Added

  • Четырёхкомпонентные группы прозрачности CMYK и ICC и группы страниц рендерятся со всеми режимами блендинга, вложенной knockout-геометрией и общими бюджетами цветовых профилей

Version 2.827.0

Added

  • Локале-зависимые picture XFA для даты, времени, чисел и текста исполняются со встроенными наборами локалей, ограниченными транзакционными запросами локалей и защищённой IEEE-арифметикой JavaScript

Version 2.826.0

Added

  • Выборы choice со значениями-массивами Unicode читаются и пишутся, отсортированные индексы опций поддерживаются, а согласованные appearance генерируются для видимых и прокрученных выборов list box

Version 2.825.0

Added

  • Зашифрованные документы подписываются через задания Windows JSON и C ABI с сохранением исходных ревизий, настроек безопасности AES, ID документа и разрешений подписи

Version 2.824.0

Added

  • Нативные HTML-документы Linux создаются, видимый или подогнанный текст с поиском на Unicode вставляется, ограниченный отменяемый OCR Tesseract запускается, а независимо валидированный растровый PDF/A-4 вывод собирается через Pascal- и callback-API
  • Маски Alpha/Luminosity из графического состояния, ограниченные передаточные функции, аддитивная прозрачность и группы страниц, knockout-фигуры и расширенные отсчёты JPEG 2000 со встроенным цветом и альфой рендерятся
  • Переданные доказательства сертификата, OCSP и CRL валидируются до инкрементальной публикации DSS/VRI с сохранением существующих подписей и AES-шифрования
  • Явные типизированные транспортные колбэки XFA host и FormCalc исполняются с ограниченными запросами, записанными ответами и транзакционным replay

Fixed

  • Unicode-значения и диагностика исключений, возвращаемые API Free Pascal QuickJS, сохраняются

Version 2.823.0

Added

  • Валидированные RFC 3161-метки времени встраиваются в headless CMS-подписи с проверками message-imprint, nonce, авторизации TSA, доверия и переданных доказательств отзыва; файлы назначения сохраняются при сбое обязательной метки времени
  • Лексическое состояние скрипт-объектов XFA, вложенные замыкания и независимые модули повторяющихся экземпляров удерживаются с детерминированным ограниченным транзакционным replay
  • Явные межбуквенные и межсловные интервалы применяются к измеренным и сгенерированным headless Unicode text-appearance

Fixed

  • Используется корректный по спецификации порядок аргументов source/search у FormCalc At, а для пустой строки поиска возвращается первая позиция

Version 2.822.0

Added

  • Общие события XFA через QuickJS и скомпилированный FormCalc исполняются с живыми DOM-операциями повторяющихся экземпляров, транзакционной персистентностью стандартного form packet, автоматическим жизненным циклом initialize/calculate/validate/ready, ограниченным исполнением и отменой

Fixed

  • Параметры финансовых функций XFA и формулы денежных потоков, начала григорианских дат и поведение отрицательного остатка приведены к спецификации, с сохранением двойной точности в Delphi и Free Pascal

Version 2.821.0

Added

  • Нативные headless-сценарии работы с документами расширяются версионированным Linux C ABI, реальными callback-операциями text/form/render/sign, ограниченной отменой и откатом при сбое, appearance multiline/comb/rotated/choice/button с шейпингом HarfBuzz/FriBidi, идентичностями PFX, новыми видимыми полями подписи и сертификацией DocMDP
  • Ограниченные image mask, soft mask, цвета Indexed/ICC, режимы блендинга PDF, изолированные группы прозрачности RGB, глифы Type3 и клиппинг текста рендерятся, а стримы изображений JPEG, JPEG 2000, CCITT, JBIG2 и RunLength декодируются через аутентифицированный нативный документный путь

Version 2.820.0

Added

  • Поддерживаемые нативные headless однострочные Unicode-поля AcroForm заполняются подлинными встроенными TrueType-appearance, точными ширинами глифов и маппингами CIDToGID/ToUnicode, транзакционными обновлениями нескольких виджетов, сохранённой защитой AES, управляемым встраиванием шрифтов и ограниченным атомарным сохранением в Linux и Windows

Version 2.819.0

Added

  • Поддерживаемые PDF-пути, горизонтальный текст, изображения, Forms и существующие appearance аннотаций рендерятся в PNG нативными CPU-поверхностями Cairo/FreeType в Linux, с соблюдением ограниченной работы и отмены, сохранением источников и атомарной публикацией PNG-файлов

Fixed

  • Канонические advance из Adobe AFM используются для двенадцати стандартных стилей Helvetica/Times/Courier при отсутствии ширин в PDF, что предотвращает накопительный дрейф текстовой позиции от метрик подменных шрифтов; явные и встроенные ширины шрифтов сохраняются

Version 2.818.0

Added

  • Подлинные нативные headless инкрементальные подписи PDF CMS/CAdES публикуются в Linux и Windows с использованием существующих неподписанных полей и явных PEM-учётных данных, предыдущие ревизии и защита AES-256 сохраняются, точные подписанные байты верифицируются, а существующие файлы назначения защищаются ограниченной атомарной публикацией

Version 2.817.0

Added

  • Ограниченные задания документов JSON и C ABI завершаются валидированным инкрементальным подписанием PFX, существующими полями подписи, сравнением двух документов, шестью нативными режимами сравнения и двусторонним ревью договоров в JSON/HTML/аннотированном PDF, включая кооперативную отмену, лимиты ресурсов и атомарную публикацию файлов

Version 2.816.0

Added

  • Нативные headless PDF-подписи верифицируются с точной привязкой ByteRange/Contents и потоковым OpenSSL 3, подлинные отсоединённые подписи CMS/CAdES генерируются из явных PEM-учётных данных, а доверие сертификату отчитывается отдельно от целостности в Linux и Windows

Version 2.815.0

Added

  • Ограниченный XFA-хелпер представления экземпляров используется для условных событий, явной повторной привязки, независимого присутствия и доступа экземпляров, стабильной персистентной идентичности, транзакционного reflow, рисования host canvas и записей доступности

Version 2.814.0

Added

  • Нативные headless документы AES-256 R5/R6 открываются в Linux и Windows, разрешения owner/user аутентифицируются, зашифрованные сжатые объекты декодируются, а зашифрованные инкрементальные значения формы сохраняются с точным сохранением префикса источника и ограниченным атомарным выводом

Version 2.813.0

Added

  • Текст переупаковывается в ограниченных прямоугольниках страниц сквозь базовые линии и выбранные вызовы общих Form, шрифты и ширина меняются, консервативные отчёты о коллизиях инспектируются, а запечатанные предпросмотры используются с транзакционным commit или rollback

Fixed

  • Правки загруженного документа сохраняются при повторных сохранениях после сериализации объектов, включая сохранения stream-to-file и повторы после сбоя вывода

Version 2.812.0

Added

  • Совместимые загруженные документы конвертируются в PDF/A-4 с сохранением исходного текста, векторов, изображений и встроенных ресурсов, видимые appearance аннотаций/виджетов собираются, текст с поиском через OCR удерживается или добавляется, явные потери отчитываются, а сохранность валидируется до атомарной публикации файла

Version 2.811.0

Added

  • Cross-reference stream, гибридные reference-секции и сжатые object stream загружаются через нативный headless API документов, ограниченные индексы членов и старшинство ревизий валидируются, точные широкие числовые исходные значения сохраняются, а сохраняющий источник независимый инкрементальный вывод пишется в Linux и Windows

Version 2.810.0

Added

  • Ориентация скана, перекосы под непрерывными углами, тени, рамки и явные перспективные четырёхугольники корректируются ограниченной обратимой геометрией, доверенные свидетельства ориентации Tesseract используются, а OCR-слова, базовые линии, четырёхугольники страниц и семантическая раскладка маппятся обратно на исходный скан для редактируемого структурированного вывода

Version 2.809.0

Added

  • Локальные движки Tesseract и RapidOCR — CLI или DLL — конфигурируются в OCR-заданиях JSON и C ABI, текст с поиском на Unicode и пиксели скана удерживаются, поддерживаемые адаптеры обнаруживаются, явные настройки валидируются, а бюджеты рендеринга и распознавания соблюдаются с атомарным выводом и откатом при сбое публикации

Version 2.808.0

Added

  • PDF с classic-xref загружаются в нативных консольных приложениях Linux, Unicode-текст страниц и вложенных Form извлекается с унаследованными ресурсами, текстовые значения AcroForm инспектируются и заполняются, а сохраняющий источник инкрементальный вывод публикуется с типизированной диагностикой, отменой, бюджетами ресурсов и атомарной заменой

Version 2.807.0

Added

  • Несколько разделённых нативных штрихкодов локализуются в одном растре, повторяющиеся полезные нагрузки удерживаются на различных позициях, повёрнутые и проективные символы Data Matrix ECC 200 декодируются с четырёхугольной геометрией по углам, а агрегатные бюджеты сканирования соблюдаются с отменой и атомарной публикацией результата

Version 2.806.0

Added

  • Сравнение абзацев договора и правок на уровне слов и предложений с записями вставок, удалений, замен и перемещений, позициями страниц для обеих сторон, сохранением повторяющихся клаузул, явным исключением шаблонных формулировок, ограниченным по ресурсам HTML-обзором и аннотированным PDF-результатом с проверкой по исходнику

Version 2.805.0

Added

  • Импорт бизнес-шаблонов HTML с вложенными flex/grid-панелями, переносимыми строками, колоночными span в grid, изображениями и элементами форм в параллельных блоках, плюс явно переданные ресурсы font-face, которые сохраняются при отложенном встраивании, и отдельный бюджет кэша декодированных изображений

Version 2.804.0

Added

  • Общий PDF-объект, Direct File I/O, декодирование контента и шрифтов, сжатие, криптография и ядро записи собираются как нативный код для Linux с отображением и синхронизацией на POSIX; Windows API сохраняются, а классические xref-записи сериализуются корректно

Version 2.803.0

Added

  • Регистрация версионированных слоёв профилей счетов и страновых правил, валидация явных CII XML и гибридных счетов с отчётами, учитывающими область действия, и выполнение официальных правил счетов XRechnung 3.0.2 и французского CTC через явно сконфигурированный движок Saxon — с выбором опубликованного профиля и диагностикой в режиме fail-closed

Version 2.802.0

Added

  • Экспорт типизированных таблиц в не зависящие от Office книги XLSX через нативные API, JSON-задания и C ABI с сохранением типов значений, денежных и процентных форматов, объединённых ячеек, точных больших целых и опциональных метаданных источника, с промежуточным размещением под бюджетом и безопасной при сбоях публикацией

Version 2.801.0

Added

  • JSON-задания и C ABI умеют экспортировать выбранные загруженные страницы в семантический HTML, XHTML, XML или JSON, а типизированные таблицы — в CSV или JSON, с нативными опциями, промежуточным размещением под бюджетом, отменой, совместимостью с полями подписи, сохранением состояния источника и атомарной публикацией файлов

Version 2.800.2

Fixed

  • Кэши связей загруженной формы сбрасываются перед откатом графа, так что задания подписания и неудачные правки документа оставляют исходный документ безопасным для запросов и повторного использования

Version 2.800.1

Fixed

  • Упорядоченный параллельный рендеринг теперь принимает резервирования памяти в порядке входа, поэтому поздние страницы не выедают весь бюджет, пока выдача ждёт более раннюю страницу; отмена и ограниченный вывод в Delphi и FPC сохраняются

Version 2.800.0

Changed

  • SVG-текст, загруженные appearance для FreeText и загруженные замены текста теперь сохраняют фичи шейпинга документа, флаги автошейпинга script и выборы script и языка в GSUB, опираясь на OpenType-данные каждого выбранного шрифта и удерживая Unicode-маппинги при смене шрифтов

Version 2.799.0

Changed

  • Векторный импорт SVG теперь сохраняет унаследованные массивы штрихов, смещения штрихов и пределы miter для сплошных и градиентных обводок, а нативный рендеринг удерживает фазированные и нулевой длины паттерны штрихов

Version 2.798.0

Changed

  • Стилизованный Unicode-текст теперь удерживает жирные и курсивные шрифты сквозь fallback-вёрстку; учитывающие стиль перегрузки ResolveFontForCodePoint и AnalyzeUnresolvedGlyphs сводят preflight с итоговым выводом, а символьные ссылки XML в FPC сохраняют Unicode-скаляры вместо порчи текста

Version 2.797.0

Fixed

  • Импорт SVG теперь сводит прозрачность объектов и групп через изолированные Forms векторной прозрачности, сохраняет независимые альфа-каналы заливки и обводки и удерживает вложенное поведение ресурсов, clip, mask и ссылок в рамках явных бюджетов

Version 2.796.0

Added

  • Ограниченная по ресурсам конвертация в архивный растровый PDF/A-4 теперь доступна через JSON-задания и C ABI, с явным принятием потери информации, структурированными отказами по бюджету, кооперативной отменой, восстановлением состояния источника и атомарной записью файлов

Version 2.795.0

Added

  • Загруженные PDF теперь можно нормализовать в валидированные растровые документы PDF/A-4 со строгим нативным рендерингом, проверенным цветом sRGB, ограниченными декодированием и растровыми ресурсами, отменой, защитой алиасов исходного файла и атомарной публикацией; отчёт о конвертации называет намеренно удалённый интерактивный и прикреплённый контент

Version 2.794.0

Changed

  • Импорт HTML5 теперь использует измеренные строки текста со смешанным направлением, пагинацию с учётом висячих строк, опциональные переносы, ограниченные flex- и grid-раскладки и наблюдаемую диагностику CSS; нативные bitmap в FPC синхронизируют прямую отрисовку GDI с кэшами изображений LCL

Version 2.793.0

Changed

  • Добавлены ограниченные по ресурсам динамические события добавления и удаления в instance-manager XFA и события присутствия шаблонов с перепривязкой раскладки, сохранением состояния правок, атомарным откатом, лимитами ресурсов и персистентным XDP-выводом

Version 2.792.0

Changed

  • Импорт SVG расширен измеренными встроенными Unicode-шрифтами, ресурсами PNG/JPEG, градиентными обводками и настоящими soft mask в режимах Alpha и Luminosity, плюс исправлены нативная альфа групп и композитинг bitmap-поверхностей FPC

Version 2.791.0

Changed

  • Добавлена замена загруженного Unicode-текста с предпросмотром, встроенными шрифтами, политиками переноса и ширины, диагностикой по каждому совпадению, детекцией устаревшего плана, ограниченными ресурсами, атомарными фиксациями и операциями предпросмотра и применения через JSON и C ABI

Version 2.790.0

Changed

  • В отрисовке глифов реализованы стандартные операции стека и transient-массивов CFF Type 2, а при сабсеттинге шрифтов сохраняются выведенные арифметикой зависимости локальных и глобальных subroutine

Version 2.789.0

Changed

  • Встроенное декодирование штрихкодов пополнилось Code 128, EAN/UPC, восстановлением QR с учётом перспективы, Data Matrix ECC 200 и PDF417 с коррекцией Рида — Соломона и ограниченным декодированием полезной нагрузки

Version 2.788.0

Changed

  • Windows FPC теперь поддерживает нативные TIFF, JPEG/JPX, конвертацию ICC, JBIG2 и Zopfli через ABI-валидированный мост кодеков и использует настоящие worker-потоки для рендеринга страниц, упорядоченных страниц, тайлов, полос и тайлов JPEG 2000 с бюджетами, упорядоченными колбэками, отменой и детерминированными пикселями

Version 2.787.0

Changed

  • C ABI и процессор JSON-заданий теперь используют общие операции над документами с версионируемой схемой для возможностей, рендеринга, Unicode-текста и форм, OCR-слоёв, redaction и подписания PFX — с явными бюджетами ресурсов, откатом при сбое колбэков и атомарной записью файлов; многостраничные входы колбэков загружаются корректно

Version 2.786.0

Changed

  • Редактирование загруженных FreeText теперь атомарно пересобирает встроенные appearance в Unicode и rich text, с переносом строк, выравниванием, прозрачностью, поворотом, callout, внутренними отступами и явными политиками переполнения; перезаписанные полезные нагрузки потоков снимаются до изменения, так что откат транзакции возвращает исходный текст

Version 2.785.0

Added

  • Консольный пример SearchableOCR добавляет встроенный OCR и движки Tesseract DLL или CLI рядом с RapidOCR, генерирует трёхстраничный образец скана и открывает выбор страниц, фильтрацию по уверенности, бюджеты распознавания и подробную статистику конвертации

Version 2.784.0

Changed

  • Пакетный импорт FDF и XFDF теперь откатывает более ранние обновления полей и аннотаций после сбоя импорта, сохраняет транзакции во владении вызывающего кода и очищает метаданные результатов неудавшегося обмена

Version 2.782.0

Added

  • Локальный адаптер Tesseract OCR через THPDFTesseractOptions принимает настраиваемую сегментацию страниц, режим движка распознавания, лимиты пикселей и таймауты для распознавания одиночных строк, одиночных слов, разреженного текста и вертикальных блоков

Fixed

  • Нативный адаптер Tesseract использует поперечный размер текстового блока для преимущественно вертикальных базовых линий, не давая длинам вертикальных слов раздувать размер текста в searchable PDF

Version 2.781.0

Changed

  • Коллекции примеров Delphi и C++Builder теперь содержат многостраничный справочник полей штрихкодов с бизнес-этикетками и полный навигационный справочник с иерархическими закладками, именованными destinations и рабочими ссылками на сопутствующие документы; минимальные рецепты PDF/A переехали в Miscellaneous, а избыточные отдельные проекты outline и метаданных выведены из состава

Version 2.780.1

Fixed

  • Страница аннотаций в Showcase разделяет подписи предпросмотра контента и живые appearance free-text и штампов, не давая подписям перекрываться в PDF-ридерах, но сохраняя узнаваемость примеров, когда appearance аннотаций скрыты

Version 2.780.0

Changed

  • Каталоги примеров теперь ставят во главу полные рабочие сценарии и разносят семнадцать минимальных, узкоспециализированных или устаревших примеров по подпапкам Miscellaneous; избыточные проекты ImageCompression и AddDelPages удалены, их функциональность осталась в основных примерах и регрессионных наборах

Version 2.779.0

Added

  • Showcase-примеры Delphi и C++Builder теперь открывают целую студию документов из десяти глав со встроенным предпросмотром, подсветкой поиска, персонализированными обложками, водяными знаками ревью в один клик, проверенным экспортом страниц и защищёнными по AES-256 R6 копиями, сохраняющими правки; оба примера используют один движок документов и поддерживают команду генерации без окна

Version 2.778.1

Removed

  • Избыточные GUI-примеры TestNumeric в Delphi и C++Builder выведены в пользу автоматических числовых регрессионных тестов, которые проверяют дробные размеры страниц и операнды рисования после сохранения и перезагрузки несжатых и Flate-сжатых PDF, с сохранённым покрытием числовых массивов

Version 2.778.0

Changed

  • Примеры работы со страницами и клиентскими отчётами теперь дают практичные сценарии: PageOperations правит настоящие PDF командами extract, delete, move, insert и append с проверкой после перезагрузки, а DBTable использует табличный движок для переносимых строк, повторяющихся заголовков и автоматической пагинации с образцом по умолчанию без базы данных

Version 2.777.1

Fixed

  • OCR отбраковывает битый UTF-8, неподдерживаемые управляющие символы и несовместимые выводы нативных detection-моделей до публикации текста, а при соблюдении межстраничных лимитов слов учитывает отброшенные результаты распознавания

Version 2.777.0

Fixed

  • Встроенный OCR считает пустые и нераспознанные страницы успешными пустыми результатами, чтобы пакетная обработка сканов могла продолжаться, сохраняет пиксели bitmap в Windows FPC и на протяжении всего анализа изображения проверяет отмену и лимиты времени
  • Классификация угла наклона в нативном RapidOCR сохраняет пропорции коротких строк и переворачивает вырезанные фрагменты текста только при уверенном предсказании «вверх ногами»
  • Локальный Python-адаптер RapidOCR сохраняет межстрочные интервалы и пунктуацию распознанного текста вместо выдачи отдельных символов, которые могут обрасти лишними пробелами, а адаптер Tesseract DLL отбраковывает управляющие символы C1 до публикации текста

Version 2.776.0

Added

  • Текстовые слои отсканированных PDF умеют атомарно заменять помеченные OCR-потоки HotPDF после сохранения и повторной загрузки, оставляют существующие слои при неудачном или пустом распознавании, сообщают о заменённых страницах, а для конвертации без перезаписи существующих файлов служит консольный пример с нативным многоязычным RapidOCR

Fixed

  • Между соседними латинскими и кириллическими OCR-словами с межсловным интервалом на одной строке вставляются явные пробелы Unicode, чтобы поиск фраз и копирование работали стабильно; соседние CJK-слова по-прежнему не разделяются
  • При рендеринге JPEG-сканов в Windows FPC декодированные пиксели сохраняются при конвертации в bitmap-формат OCR, так что смена пиксельного формата LCL больше не подаёт на распознавание пустоту

Version 2.775.0

Added

  • Нативный RapidOCR обзаводится пресетами локальных моделей для упрощённого и традиционного китайского, английского, французского, немецкого, испанского, португальского, итальянского, нидерландского, турецкого, японского, корейского, русского, арабского и хинди — с подобранными посимвольными словарями, проверкой установки моделей, горизонтальным порядком чтения и многоязычным выводом Unicode в Delphi, C++Builder и Windows FPC/Lazarus

Fixed

  • Локальные OCR-адаптеры, работающие в отдельном процессе, повторяют очистку временного вывода, когда диагностические файлы остаются заблокированными ещё короткое время после завершения рабочего процесса

Version 2.774.0

Added

  • Нативный DLL-адаптер RapidOCR держит локальные ONNX-модели внутри процесса, распознаёт bitmap-снимки без Python, поддерживает опциональную классификацию угла наклона и PDF с Unicode-текстовым слоем для поиска, а в сборках Delphi, C++Builder и Windows FPC/Lazarus проверяет лимиты результата с кооперативной отменой

Version 2.773.0

Added

  • Локальный адаптер RapidOCR получает явную конфигурацию ONNX-моделей, опциональную классификацию угла наклона, локальные посимвольные словари и шрифты, управление потоками CPU, офлайн-предпроверку и лимиты распознавания для PDF с Unicode-текстовым слоем для поиска в сборках Delphi, C++Builder и FPC/Lazarus

Version 2.772.1

Fixed

  • Адаптеры Tesseract DLL и CLI теперь работают в сборках Windows FPC/Lazarus Win32 и Win64, сохраняя Unicode-слова OCR и читая актуальные пиксели изображения LCL для текстовых слоёв PDF с возможностью поиска

Version 2.772.0

Added

  • Опциональный нативный адаптер Tesseract DLL добавляет многоязычный OCR с настраиваемыми режимами сегментации страниц и движка, выдачей Unicode-слов с уровнем уверенности, границами слов и базовыми линиями, плюс кооперативной отменой, сроками на распознавание и лимитами результата для отсканированных PDF с возможностью поиска

Version 2.771.1

Changed

  • Встроенный OCR распознаёт обычный, полужирный, курсивный и полужирный курсивный текст ASCII на светлом или преимущественно тёмном фоне, принимает выцветшие надписи с достаточным контрастом в градациях серого и опускает слова, содержащие сомнительные сохранённые глифы, вместо того чтобы молча терять отдельные символы

Version 2.770.175

Fixed

  • LoadedDocInspector и SignatureValidator возвращают код выхода с ошибкой для нечитаемых PDF и отвергают некорректные аргументы командной строки вместо рапорта об успешной пустой проверке

Version 2.770.174

Fixed

  • LoadedImageExport проверяет все целевые пути изображений до экспорта какой-либо страницы, не давая псевдонимам путей перезаписать входной PDF или другую выбранную страницу, и отвергает неподдерживаемые имена форматов

Version 2.770.173

Fixed

  • Дисковый кэш отрендеренных страниц больше не заходит в папки-ссылки на документы при восстановлении, поиске, записи, инвалидации и вытеснении — файлы за пределами кэша остаются нетронутыми

Version 2.770.172

Fixed

  • JSON-задания отвергают кривой синтаксис, хвостовой мусор, числа вне конечного диапазона Double и чрезмерную вложенность ещё до запуска любой операции, а при неудаче освобождают частично разобранные значения

Version 2.770.171

Fixed

  • PreflightCLI проверяет весь план вывода отчётов до записи, оберегая входные PDF от файловых псевдонимов и отвергая конфликтующие назначения отчётов; рекурсивное сканирование пропускает связанные дочерние каталоги, чтобы не зациклиться

Version 2.770.170

Fixed

  • CopyPage сверяет идентичность файлов перед экспортом и отвергает конфликтующие псевдонимы вывода, а автоматически именованный вывод для входных файлов без расширения в каталогах с точками в имени кладётся рядом с входным файлом

Version 2.770.169

Fixed

  • Значения JSON-заданий сохраняют экранированные нулевые символы, сериализуют конечные числа за пределами знакового 64-битного диапазона без целочисленного переполнения и возвращают значения по умолчанию для целочисленных параметров вне диапазона, не трогая локаль процесса

Version 2.770.168

Fixed

  • Восстановление парсера простых объектов останавливается на лишних закрывающих скобках в телах массивов без скобок и сохраняет корректные числа и ключи словарей, идущие сразу после искажённых разделителей

Version 2.770.167

Fixed

  • HotPDFCLI отвергает выходные пути, совпадающие с входными файлами, и проверяет все генерируемые пути до запуска пакетного экспорта — команды больше не обрезают и не подменяют свои исходные данные

Version 2.770.166

Fixed

  • Пример ExtractText защищает входной PDF, когда выходной путь ведёт через junction каталога или жёсткую ссылку, а LoadedImageExport сообщает об ошибке для нечитаемых документов или неполного экспорта страниц

Version 2.770.165

Fixed

  • Прямое чтение файлов инвалидирует незавершённые дозаполнения кэша после сбоя ввода-вывода и безопасно ограничивает диапазоны опережающего чтения у предела знакового 64-битного смещения

Version 2.770.164

Fixed

  • Декодирование RunLength выделяет память ровно под размер декодированных данных и проверяет искажённые последовательности до выделения выходного буфера, чтобы потоки с ранним терминатором не резервировали чрезмерную память

Version 2.770.163

Fixed

  • Примеры для Delphi и C++Builder находят комплектные изображения, метафайлы, цветовые профили и опциональные файлы для подписи как в папках проектов, так и во вложенных каталогах выходных файлов сборки

Version 2.770.162

Fixed

  • Примеры HugeFileBenchmark отвергают пути генерируемых PDF, совпадающие с любым входным документом, ещё до запуска пакетного тестирования
  • Пример для C++Builder сохраняет относительные подкаталоги входных файлов для генерируемых PDF, чтобы одноимённые входные файлы не писались в один выходной
  • Проваленные операции, превышение лимита памяти и некорректная загрузка документов без страниц теперь дают ненулевой код выхода, сохраняя отчёт о тестировании

Version 2.770.161

Fixed

  • Preflight CLI для Delphi и C++Builder отвергают пути отчётов и агрегированных результатов, совпадающие с входным PDF, чтобы отчёты не затирали исходные документы

Version 2.770.160

Fixed

  • Разбор ASN.1 отвергает кодировки high-tag-number, выходящие за поддерживаемый 32-битный диапазон тегов, вместо того чтобы принимать завёрнутый по кругу номер тега

Version 2.770.159

Fixed

  • Preflight CLI для C++Builder сохраняет относительные подкаталоги для рекурсивных отчётов и ссылок в дашборде, поэтому одноимённые PDF больше не затирают друг друга
  • Дашборды Preflight для Delphi и C++Builder правильно кодируют ссылки на отчёты со спецсимволами и не-ASCII именами каталогов
  • Провал стандартной валидации в C++Builder теперь возвращает код выхода 3 и помечает документ как невалидный в дашборде для всех форматов отчётов, включая входные файлы, которые не удалось загрузить

Version 2.770.158

Fixed

  • Пример слияния PDF для C++Builder разрешает относительные входные пути от каталога исполняемого файла и не даёт файловым диалогам менять рабочий каталог
  • Каждая созданная закладка теперь ведёт на первую страницу, скопированную из своего входного документа

Version 2.770.157

Fixed

  • Парсер объектов нормализует неэкранированные концы строк CR и CRLF внутри PDF-строк-литералов к LF, сохраняя при этом экранированные возвраты каретки и продолжения строк

Version 2.770.156

Fixed

  • LZW-сжатие потоков при пустом входе сообщает фактическое число записанных байтов
  • LZW-сжатие и распаковка корректно проходят полный цикл при InitialCodeSize равном 2, а сжатие отвергает литералы вне усечённого алфавита до записи результата

Version 2.770.155

Fixed

  • В сборках Win64 импорт SVG- или XPS-путей с числом, чей порядок близок к 100 — например 1e-100 или 5e99 — больше не вызывает переполнение с плавающей запятой, когда приложение не маскирует исключения плавающей запятой
  • Такие числа читаются по своему фактическому значению, поэтому длинная мантисса с большим отрицательным порядком импортируется корректно

Version 2.770.154

Fixed

  • DecodeLoadedPageBarcodes теперь сообщает корректные границы штрихкодов на страницах, где CropBox не совпадает с MediaBox, если область распознавания не задана; раньше позиции сдвигались на смещение crop box или масштабировались по неверной высоте страницы
  • Находки лиц от DetectLoadedRedactionFindings (при включённом распознавании лиц) на таких страницах теперь попадают точно в обнаруженные лица, а не смещаются относительно них
  • Обе функции рендерят видимую область страницы (CropBox, обрезанный по MediaBox) и отображают найденные позиции обратно через ту же область; page box, передаваемый кастомному IHPDFFaceDetector, теперь соответствует получаемому bitmap
  • Распознавание штрихкодов с явно заданной областью, а также страницы без CropBox или с CropBox, равным MediaBox, не изменились

Version 2.770.153

Fixed

  • ApplyLoadedOCRTextLayer теперь размещает невидимый текстовый слой на страницах, где CropBox не совпадает с MediaBox, в правильном месте; раньше текст для поиска сдвигался на смещение crop box или масштабировался по неверной высоте страницы, из-за чего выделения и совпадения поиска не сходились с видимыми словами
  • OCR-растр рендерится из видимой области страницы (CropBox, обрезанный по MediaBox), и позиции распознанных слов отображаются обратно через ту же область
  • Page box, передаваемый кастомному IHPDFOCREngine в THPDFOCRRequest, теперь равен отрендеренной видимой области и соответствует получаемому bitmap
  • Страницы без CropBox или с CropBox, равным MediaBox, не изменились

Version 2.770.152

Fixed

  • GetLoadedInvoiceSummary возвращает имя покупателя (BT-44) как декодированный текст — имена с не-ASCII буквами вроде «Müller & Söhne» больше не приходят сырыми байтами UTF-8 с XML-экранированием на месте
  • Имя покупателя теперь всегда читается из самой стороны-покупателя, как имя продавца и остальные поля сводки
  • Выигрывает и ValidateVisualXmlConsistency: имя покупателя с буквами под диакритикой или экранированными символами теперь сравнивается с видимым текстом страницы так, как оно написано

Version 2.770.151

Fixed

  • THPDFTable теперь удерживает строки, связанные RowSpan, на одной странице: если группа не помещается в оставшееся место, вся она уходит на следующую страницу вместе с повторяемым заголовком
  • Ячейка на несколько строк больше не залезает под нижнее поле, пока покрываемые ею строки продолжаются на следующей странице
  • Группа с RowSpan выше целой страницы по-прежнему разрезается построчно, а её составные ячейки обрезаются по нижнему полю каждой страницы
  • TotalHeightRendered отражает перенесённую группу на последней странице

Version 2.770.150

Fixed

  • Ячейки THPDFTable с ColSpan или RowSpan, равным нулю или меньше, теперь рисуются одиночными ячейками, как их уже расставила сетка таблицы, вместо того чтобы сдвигать следующие ячейки в чужие колонки
  • Отрицательные span больше не заставляют таблицу читать данные за пределами сетки, а span, выходящие за последнюю колонку или строку, обрезаются по краю таблицы — и при измерении, и при отрисовке
  • Ячейка, чьё первое слово шире колонки, больше не начинается с пустой строки, поэтому её строка не выше, чем требует переносимый текст

Version 2.770.149

Security

  • XFA-формы, объявляющие внутреннюю сущность в DOCTYPE, больше не могут взорвать память многократными ссылками на большую сущность: текст, подставляемый за внутренние сущности, ограничен 16 MB на документ
  • Значение одной внутренней сущности длиннее 1 MB отвергается
  • Документы, превысившие любой из лимитов, не загружаются с EHPDFXFAError вместо разрастания до гигабайтов текста; обычное использование сущностей не затронуто
  • Текст с множеством ссылок на сущности и символы тоже декодируется за линейное время

Version 2.770.148

Fixed

  • RecalculateLoadedFormFieldsIncremental теперь обрабатывает все переданные как изменённые поля одинаково, в каком бы порядке ни перечислялись имена
  • Вычисляемое поле, записанное напрямую вместе с одним из своих исходных полей, сохраняет записанное значение, а не пересчитывается лишь потому, что стоит в списке после этого источника
  • Поля, зависящие от изменённых, по-прежнему пересчитываются один раз в порядке вычислений

Version 2.770.147

Fixed

  • Штрихкоды GS1-128 со стартовым кодом A (THPDFBarcode тип 20) кодируют данные в наборе кодов A, как и Code 128 A
  • Строчные буквы в таких штрихкодах записываются с SHIFT в набор B, а не кодовым словом набора B, которое сканеры читают как управляющий символ набора A
  • Отсканированные символы GS1-128 A со строчным текстом теперь возвращают исходный текст

Version 2.770.146

Fixed

  • Дополнительные штрихкоды EAN-2 и EAN-5 (THPDFBarcode типы 18 и 19) больше не дописывают вычисленную цифру к Text при включённом Checksum
  • Повторная отрисовка такого штрихкода теперь каждый раз даёт один и тот же символ, а не приращивает текст по цифре за перерисовку, меняя рисунок штрихов
  • Дополнительные символы по определению не несут контрольной цифры, поэтому Checksum для них игнорируется; паттерн чётности по-прежнему выводится из значения, как и раньше

Version 2.770.145

Fixed

  • Экспорт XFDF декодирует значения полей форм и текст аннотаций как PDF-текстовые строки (ISO 32000-1 7.9.2.2): значения UTF-16BE, hex-строки и символы PDFDocEncoding вроде буллита записываются настоящим Unicode-текстом, а не hex-цифрами или мусором кодовой страницы
  • Содержимое, автор, тема, состояние и оверлейный текст аннотаций, экспортируемые в XFDF, сохраняют не-латинские символы — например, китайские или кириллические комментарии
  • Rich text (/RC, /RV), начинающийся с XML-декларации, встраивается без неё, чтобы экспортированный XFDF оставался корректным XML
  • Импорт XFDF больше не гоняет текст через системную ANSI-кодовую страницу: значения, представимые в PDFDocEncoding, хранятся как есть, всё остальное — как текстовая строка UTF-16BE, и для полей форм, и для текста аннотаций
  • Символы вне ANSI-кодовой страницы теперь проходят экспорт и импорт XFDF через ImportLoadedFormFromXFDF и ImportLoadedAnnotationsFromXFDF без превращения в вопросительные знаки

Version 2.770.144

Fixed

  • Имена и прочий текст в сводке счёта декодируются из UTF-8 XML счёта — продавец вроде «Müller GmbH» больше не возвращается кашей из многобайтовых символов
  • Экранированные символы разметки и символьные ссылки разрешаются, поэтому «A & B» в XML попадает в сводку как «A & B»
  • ValidateVisualXmlConsistency больше не сообщает, что имя продавца с диакритикой или амперсандом отсутствует в видимом тексте страницы, когда оно там напечатано
  • Текст сводки возвращается в системной ANSI-кодовой странице, потому что поля записи сводки — ANSI-строки; символы, которых в этой странице нет, становятся вопросительными знаками

Version 2.770.143

Fixed

  • GetLoadedInvoiceSummary берёт итоговую нетто-сумму счёта (BT-106) из суммирования денежных значений заголовка, а не из суммы первой позиции
  • Сумма налога, общая сумма и сумма к оплате тоже читаются из суммирования заголовка, в том числе для счетов ZUGFeRD 1.0
  • Дата выставления (BT-2) возвращается как чистое значение даты, например 20260305, без вложенной разметки DateTimeString
  • HPDFFacturXXMLElementText возвращает символьные данные всего элемента без дочерних тегов и больше не матчит элементы, чьё имя лишь начинается с запрошенного имени

Version 2.770.142

Fixed

  • Экспорт XFDF записывает символы вне Basic Multilingual Plane — эмодзи или редкие CJK-иероглифы — как корректный четырёхбайтовый UTF-8, а не кодирует каждую половину суррогатной пары отдельно, так что строгие XML-ридеры принимают файл
  • Импорт XFDF декодирует символьные ссылки выше U+FFFF, например 😀, в полный символ, а не обрезает его до постороннего символа BMP
  • Ссылки, не называющие скалярное значение Unicode, и непарные суррогаты при экспорте превращаются в U+FFFD вместо порчи текста
  • Файлы XFDF, записанные прежними версиями, по-прежнему импортируются корректно

Version 2.770.141

Fixed

  • Значения полей и текст аннотаций с обратными слэшами — например Windows-пути вроде C:\Data\2024\001 — проходят экспорт и импорт XFDF без изменений, вместо того чтобы превращать цифровые последовательности в управляющие символы
  • Когда обратный слэш при обратном чтении мог бы сойти за escape, экспорт XFDF записывает его восьмеричным экранированием \134, как в PDF-строке-литерале (ISO 19444-1 5.8.2)
  • Импорт XFDF декодирует только те восьмеричные escape, которые формат использует для управляющих символов и обратных слэшей; прочие backslash-последовательности из сторонних файлов сохраняются буквально
  • SVG-текст, читаемый тем же лёгким XML-ридером, тоже больше не теряет backslash-последовательности

Version 2.770.140

Fixed

  • Постоянный кэш отрендеренных страниц, включаемый RenderCacheFolder, теперь работает для документов, открытых через LoadFromFile, LoadFromStream и LoadFromRandomAccessSource; раньше дисковый уровень пропускался при обычной загрузке, так что ни одна страница не записывалась в папку и не читалась из неё
  • Документы, загруженные из файла, опознаются по размеру, времени последней записи и начальным и конечным байтам, поэтому повторное открытие неизменённого файла читает страницы из кэша, не хэшируя весь файл
  • Документы из потока или источника произвольного доступа опознаются по SHA-256 содержимого; чтобы такие документы использовали дисковый уровень, задайте RenderCacheFolder до загрузки
  • Документ, отредактированный после загрузки, больше не читает и не пишет дисковые записи до конца этой загрузки, так что отредактированные страницы никогда не выдаются из кэша и не сохраняются как кэшированные страницы исходного файла
  • Дисковые записи теперь зависят ещё и от бэкенда рендеринга страниц и ICC-воркфлоу цветопробы, поэтому другой бэкенд или выходной профиль не переиспользует страницы, отрендеренные с иными настройками; зашифрованные документы на дисковый кэш не пишутся никогда

Version 2.770.139

Fixed

  • Импорт больших XFDF-файлов больше не замедляется квадратично от размера файла: файл с тысячами полей или аннотаций разбирается за миллисекунды, а не за секунды или минуты
  • Значения полей со множеством переносов строк и прочих символьных ссылок декодируются за линейное время
  • Пиковая память при разборе XFDF больше не растёт как число элементов, умноженное на размер файла
  • SVG-вход, читаемый тем же лёгким XML-ридером, получает то же ускорение

Version 2.770.138

Fixed

  • Когда DecodeLoadedPageBarcodes повторяет попытку на странице, повёрнутой на 90 или 270 градусов, декодеру подаётся растр, повёрнутый по часовой стрелке, как и документировано в AttemptRotationDegrees
  • Символы, найденные только в таких повторных попытках, теперь репортятся в своей реальной позиции на странице, а не в зеркально отражённой
  • Ориентация таких символов теперь совпадает с направлением чтения на странице, а не сбита на 180 градусов
  • Кастомные декодеры штрихкодов, полагающиеся на задокументированный поворот по часовой стрелке, получают растры в правильном повороте

Version 2.770.137

Fixed

  • Копирование страниц между документами (CopyPageFromDocument, CopyPageByPhysicalIndex, методы импорта и слияния страниц) больше не превращает текстовые строки с «<<» и «>>» или «[» и «]» в словари и массивы; комментарий аннотации вроде «Read <<this>> [now]» копировался как битый словарь
  • Шестнадцатеричные строки — например имена и идентификаторы аннотаций — копируются в шестнадцатеричной форме, а не записываются как строковые литералы из своих hex-цифр

Version 2.770.136

Fixed

  • Аннотации, создаваемые на новых страницах (AddStampAnnotation, AddTextAnnotation и прочие методы аннотаций THPDFPage), записывают /Rect с нижним левым углом первым — [llx lly urx ury]; несколько методов писали верхний край раньше нижнего, например [395 712 575 652], — просмотрщики такое принимают, но валидаторы PDF/A и некоторые инструменты обработки отвергают или читают неверно

Version 2.770.135

Changed

  • THotPDF.RenderCacheFolder теперь имеет строковый тип (UnicodeString в Delphi 2009 и новее, UnicodeString в C++Builder), а не AnsiString, поэтому путь кэш-папки с символами вне системной кодовой страницы — скажем, китайское имя пользователя на английской Windows — используется как задан, а не превращается в вопросительные знаки
  • Код, присваивающий свойству AnsiString, по-прежнему компилируется; значение конвертируется в Unicode при присваивании

Version 2.770.134

Fixed

  • SetOptionalContentGroupUsage с категорией Zoom записывает диапазон масштабирования числами /min и /max, как это определено в спецификации PDF; раньше всё значение писалось текстовой строкой под /Min, которую просмотрщики игнорируют, поэтому диапазон масштабирования слоя не действовал
  • Значение Zoom — минимальное увеличение, за которым опционально следует максимальное через пробел (например '0.5 4'); значение, не начинающееся с числа, теперь бросает исключение

Version 2.770.133

Fixed

  • Сабсеттинг встроенных шрифтов CFF/OpenType больше не выбрасывает подпрограммы, которые всё ещё нужны глифам; глифы с более чем восемью хинтами, хинтами hstemhm или counter masks сканировались неверно, из-за чего используемая подпрограмма могла замениться пустой, а глиф — отрисоваться с отсутствующими или битыми контурами

Version 2.770.132

Fixed

  • RegisterNChannelColorSpace (перегрузка с определениями spot-красок) теперь корректно записывает имена красок с пробелами или разделителями — вроде «PANTONE 185 C» — как ключи словарей /Colorants, /Solidities и /DotGain; сырое имя ломало синтаксис файла
  • AddPDFX6ExternalOutputIntentSpotData записывает ключи красок для solidity и спектральных данных таким же образом

Version 2.770.131

Fixed

  • XMP-метаданные, записываемые с EnableXMPMetadata, несут Title, Author, Subject и Keywords как корректный UTF-8, когда в них текст в системной кодовой странице (например, символы с диакритикой или китайские, присвоенные как AnsiString); сырые байты кодовой страницы делали пакет невалидным XML, который отвергают валидаторы PDF/A и XMP-ридеры
  • Управляющие символы, недопустимые в XML 1.0, из этих XMP-значений исключаются

Version 2.770.130

Fixed

  • JBIG2-изображения, записанные с JBIG2Options.AccumulateGlobalsAcrossPages, снова декодируются правильно, когда поздняя страница добавляет символы, которых не использовали предыдущие; такие страницы продолжали ссылаться на globals-поток первой страницы, где новых символов нет, поэтому просмотрщики показывали их кашей или вовсе не показывали
  • Каждый раз, когда страница добавляет символы, записывается globals-поток со всем словарём на текущий момент и используется дальше; страницы без новых символов продолжают делить самый последний

Version 2.770.129

Fixed

  • Сохранение загруженного документа, чьи объекты имеют номер поколения не 0, теперь пишет согласованные номера объектов: полная перезапись (SaveLoadedDocument и связанные методы) записывает все объекты, ссылки и записи перекрёстных ссылок с поколением 0, тогда как раньше заголовки объектов и trailer хранили старое поколение, а ссылки и таблица перекрёстных ссылок использовали 0
  • Инкрементальные обновления (SaveIncrementalUpdate и связанные методы) ссылаются на существующие объекты их реальным номером поколения; ссылки всегда писались с поколением 0 и потому указывали на несуществующие объекты, когда оригинал использовал другое поколение

Version 2.770.128

Fixed

  • THPDFPage.TextOutHTML с MaxWidth больше не теряет форматирование на переносе строки: когда несколько фрагментов с разным стилем уходили на следующую строку вместе, они сливались в один, отрисованный стилем, действовавшим в момент переноса, — терялись цвет, полужирность или курсив, шрифт, размер, смещение sub/superscript и ссылка. Теперь каждый фрагмент сохраняет своё форматирование на новой строке

Version 2.770.127

Fixed

  • InvalidateRenderedPageCache теперь сбрасывает ещё и записи глифов Type 3 и полутонов, общие для параллельного рендеринга; после инвалидации всего документа следующий параллельный рендер мог переиспользовать глифы, кэшированные для прежнего содержимого
  • PreflightLoadedPAdES больше не опустошает общий кэш рендеринга как побочный эффект проверки уровня PAdES подписи, поэтому рендеры после предпроверки сохраняют свои кэшированные глифы

Version 2.770.126

Fixed

  • Анализ ревизий и изменений подписанных документов теперь корректно сообщает имена полей со скобками внутри или в конце — например «Total (net)»; последний символ обрезался
  • Имена полей, записанные восьмеричными escape или backslash-продолжением строки, тоже декодируются

Version 2.770.125

Fixed

  • SplitPDFToFiles больше не открывает каждый выходной файл в PDF-просмотрщике по умолчанию при записи; во внутренних создаваемых документах AutoLaunch теперь выключен

Version 2.770.124

Fixed

  • GetLoadedTrailerID возвращает постоянный идентификатор файла документа из массива /ID в trailer как hex-текст; раньше он искал /ID в каталоге документа, где его никогда нет, и потому не сообщал идентификатор практически ни для одного файла

Version 2.770.123

Fixed

  • SetLoadedOpenActionPage теперь записывает назначение, называющее запрошенную страницу; ссылка на страницу писалась как 0 0 R, и просмотрщики не могли открыть документ на ней
  • Назначение сохраняет текущую позицию просмотра (null left и top), а не принуждает 0 0, что прыгало в левый нижний угол страницы

Version 2.770.122

Fixed

  • SetLoadedViewerPreferences записывает HideToolbar, HideMenubar, FitWindow и DisplayDocTitle как булевы значения; раньше они писались именами /true и /false, которые просмотрщики булевыми не считают, поэтому настройки не действовали

Version 2.770.121

Fixed

  • CheckLoadedSignatureSeedValue теперь требует соблюдения seed-значения /Reasons у поля подписи, когда флаги /Ff помечают его обязательным (бит 4, значение 8); раньше проходила и причина вне списка
  • Причины сравниваются точно, как и положено текстовым строкам в PDF; «approved» больше не удовлетворяет seed-значению, в котором перечислено «Approved»

Version 2.770.120

Fixed

  • Многократное штампование загруженной страницы через StampLoadedPageText или StampLoadedPageShape теперь даёт каждому штампу свою прозрачность, а каждому текстовому штампу — свой стандартный шрифт; второй и последующие штампы переиспользовали прозрачность и шрифт первого штампа на странице
  • Штамп с той же прозрачностью и шрифтом, что у предыдущего, по-прежнему делит с ним ресурсы, поэтому повторяющиеся одинаковые штампы не раздувают ресурсы страницы

Version 2.770.119

Fixed

  • ExtractLoadedPageStructureText теперь идёт по элементам структуры, чья запись /K — обычный номер marked-content (например /K 3 или /K [0 1]), самый частый вид в тегированных PDF; такие элементы игнорировались, из-за чего метод не выдавал порядок структуры для многих тегированных документов или возвращал их текст в порядке отрисовки
  • Метод больше не читает невалидную запись каталога, когда у документа нет пригодного корневого объекта

Version 2.770.118

Fixed

  • StampLoadedPageText, StampLoadedPageImage, StampLoadedPageShape, StitchLoadedPage и FlattenLoadedAnnotations больше не ломают страницы, наследующие ресурсы от родительского узла /Pages; такой странице выдавался новый пустой словарь /Resources, прятавший унаследованные шрифты и изображения, из-за чего исходный текст и картинки страницы переставали отображаться
  • Теперь страница получает собственную копию унаследованных ресурсов прежде, чем к ней добавится новый шрифт, изображение или форма

Version 2.770.117

Fixed

  • ComposeLoadedPagesNUp, ImposeLoadedPagesNUp, ImposeLoadedPagesBooklet и методы сшивки страниц переносят ресурсы, которые исходная страница наследует от родительского узла /Pages; раньше такие страницы размещались без своих шрифтов и изображений, и их текст и картинки на сборном листе отсутствовали или искажались

Version 2.770.116

Fixed

  • SaveIncrementalUpdateAuthenticated теперь может записать инкрементальное обновление обратно в файл, с которого оно начиналось; принятое обновление не могло подменить цель, потому что документ держал исходный файл открытым, и вызов всегда падал с ошибкой доступа при коммите
  • Как и при инкрементальном сохранении на месте, исходник освобождается перед подменой, переоткрывается при неудаче, а перед следующим инкрементальным сохранением нужно снова вызвать BeginIncrementalUpdate

Version 2.770.115

Fixed

  • RepairPDFUA2Structure больше не тратит экспоненциальное время на деревьях структуры, где элементы перечислены более чем у одного родителя (или образуют цикл); починка наследования языка, починка порядка заголовков и сканирование marked-content за починкой альтернативного текста теперь проходят каждый элемент структуры один раз. Искусственное дерево из 24 элементов, каждый из которых дважды перечисляет следующий, раньше занимало около 40 секунд

Version 2.770.114

Fixed

  • HPDFPaginateTable больше не добавляет страницы до исчерпания памяти, когда неразрезаемая строка не помещается под повторяемыми строками заголовка; на странице, где только такие заголовки, строка теперь разрезается (а если заголовки заполнили страницу целиком — размещается с допустимым выходом за край)
  • HPDFLayoutFootnotes и HPDFLayoutEndnotes больше не крутятся вечно, когда разделитель не оставляет места на странице или минимальную высоту фрагмента сноски нечем обеспечить на пустой странице; сноска размещается на этой странице

Version 2.770.113

Fixed

  • HPDFBalanceColumns больше не подвисает, когда у разрезаемого элемента есть строка выше колонки; раньше он вечно уходил в следующую колонку. Такая строка теперь размещается одна вверху пустой колонки с выходом за её пределы, и вёрстка продолжается

Version 2.770.112

Fixed

  • Документы, зашифрованные стандартным security handler ревизии 4 (криптофильтры RC4 или AES-128), снова открываются, когда их словарь шифрования пропускает опциональную запись верхнего уровня /Length; загрузка падала с «Unsupported legacy Standard security handler V=4 R=4 Length=40»
  • Для таких документов принимается любое значение /Length верхнего уровня, ведь ключ файла всегда имеет размер 128 бит

Version 2.770.111

Fixed

  • ProcessObjectStreamsForDecompression и ExtractRawObjectFromStream больше не верят заявленному счётчику /N объектного потока: счётчик выше десяти миллионов отвергается, а само значение ограничивается числом пар «номер объекта», которое реально вмещает заголовок потока, так что поддельный файл больше не заставит их выделять память или перебирать миллионы пустых записей

Version 2.770.110

Fixed

  • Direct File API (DADirectEncryptFileAES256, DADirectDecryptFileAES256 и связанные методы) читает /Root, /Info, /Encrypt, /Prev и /XRefStm классической секции перекрёстных ссылок только из её собственного словаря trailer; на файлах с инкрементальными обновлениями он мог подхватить /Prev из объектов поздней ревизии (например элемента оглавления) или её trailer и упасть или прочитать не ту ревизию
  • Цепочка /Prev, замыкающаяся на уже прочитанную секцию, теперь останавливается, а не перечитывает те же секции

Version 2.770.109

Security

  • ApplyLoadedRedactions теперь удаляет текст под областью редактирования на страницах, чьё содержимое разбито на несколько потоков; когда один поток заканчивался оператором, а следующий начинался им же (например ET, за которым шёл BT), текст после стыка сопоставлялся с неверными операндами и оставался читаемым в сохранённом файле, хотя область была закрашена
  • Потоки содержимого без данных пропускаются согласованно, поэтому оставшиеся потоки сходятся с текстом, найденным на странице

Version 2.770.108

Changed

  • GetLoadedOCGCount, GetLoadedOCGName, GetLoadedOCGVisibility и SetLoadedOCGVisibility теперь используют один и тот же индекс — позицию группы необязательного содержимого в массиве /OCGs внутри /OCProperties документа. Count и name брали позицию в массиве /ON конфигурации по умолчанию, visibility — позицию в /OFF, а сеттер — в /OCGs, так что один индекс мог означать три разные группы; документы без /OCGs по-прежнему откатываются к массиву /ON
  • GetLoadedOCGVisibility сообщает о группе как о скрытой, когда она перечислена в /OFF, либо когда её нет ни в одном массиве, а /BaseState конфигурации по умолчанию равен /OFF

Fixed

  • SetLoadedOCGVisibility больше не кладёт один и тот же объект-ссылку и в /OCGs, и в /ON или /OFF (при освобождении документа он удалялся дважды) и больше не теряет записи, которые убирает

Version 2.770.107

Fixed

  • CopyLoadedPage больше не заставляет словари исходной и целевой страниц делить одни и те же объекты записей /Contents и /Resources; общие объекты удалялись дважды при освобождении документа или замене целевой записи, что могло портить память
  • Целевая страница теперь получает собственную ссылку на содержимое и ресурсы исходной (прямые значения копируются), а её запись в кэше отрендеренных страниц обновляется

Version 2.770.106

Fixed

  • Загрузка повреждённого PDF больше не течёт памятью на каждом нечитаемом объекте-потоке — например потоке без записи /Length и без ключевого слова endstream или с нечитаемым словарём либо данными; повторное открытие таких файлов заставляло процесс расти безгранично

Version 2.770.105

Fixed

  • Числа с пустой дробной частью вроде «21.» (спецификация PDF такое разрешает) больше не роняют загрузку; косвенный поток с записанным таким образом /Length раньше терялся целиком, оставляя страницу пустой
  • Числа с ведущим плюсом, пустой целой частью вроде «.5» или целой частью за пределами 32-битного диапазона тоже читаются правильно

Version 2.770.104

Fixed

  • Демо PDFmerge: при включённых закладках каждая закладка на источник теперь ведёт на первую влитую страницу этого источника; раньше все закладки указывали на первую страницу объединённого файла
  • Демо PDFmerge: исходные примеры, имя вывода по умолчанию и любые относительные имена, вписанные в форму, разрешаются относительно папки демо; добавление файлов или выбор вывода в диалоге больше не меняет текущий каталог и не ломает относительные пути

Version 2.770.103

Fixed

  • Демо TextOut: генерируемый TextOut.pdf теперь действительно использует сжатые потоки содержимого, как обещают комментарии демо; он задаёт Compression в cmFlateDecode, вместо того чтобы полагаться на аргумент BeginDoc, который сжатием не управляет

Version 2.770.102

Fixed

  • Изображения, нарисованные с AlphaBlend в enhanced metafile, сохраняют записанную прозрачность при конвертации метафайла через THPDFEmfPatcher.RenderEmfDirect; раньше они смешивались с нулевой прозрачностью и исчезали
  • Записанный альфа-формат тоже учитывается, поэтому изображения без альфа-канала смешиваются со своей постоянной прозрачностью, а не падают
  • Bitmap-записи, чьи заголовок или пиксельные данные указывают за пределы записи, а также записи с пиксельными данными короче объявленного bitmap, пропускаются вместо чтения за краем записи
  • Bitmap крупнее 32768 пикселей по стороне или 64 мегапикселей суммарно пропускается вместо выделения памяти под него целиком

Version 2.770.101

Fixed

  • StitchLoadedPage, StitchLoadedPageSideBySide и StitchLoadedPageSideBySideEx рисуют исходную страницу через Form XObject, несущий содержимое, page box и ресурсы страницы; раньше сам словарь страницы регистрировался как XObject, который просмотрщики нарисовать не могут, поэтому сшитая страница не показывалась
  • При сшивке нескольких страниц в одну целевую сохраняется каждая: каждая получает собственное имя XObject вместо одного общего имени, которым подменялась предыдущая страница

Version 2.770.100

Fixed

  • Form XObjects при рендеринге теперь обрезаются по своему /BBox, как требует ISO 32000-1; содержимое, которое форма рисует за пределами своего bounding box, больше не показывается на странице
  • Form XObjects с вложенностью глубже четырёх уровней теперь рисуются; раньше они отбрасывались, как будто это рекурсия. Вложенность допускается до 32 уровней
  • Form XObject, рисующий сам себя напрямую или через другие формы, обнаруживается, повторный вызов пропускается, а в диагностику рендеринга попадает запись о рекурсии

Version 2.770.99

Fixed

  • Демо PDFOptimize: ряд маленьких прямоугольников на каждой текстовой странице теперь обводится, так что полосы видны и каждый путь в потоке содержимого завершается оператором отрисовки, как требует ISO 32000-1 8.5.2; из-за этого сообщаемые размеры текстового PDF слегка меняются

Version 2.770.98

Fixed

  • Строки-литералы со сбалансированными скобками без обратных слэшей — вроде /Title (Report (draft) v2) — при загрузке документа читаются целиком; раньше строка заканчивалась на первой закрывающей скобке, и остаток словаря читался неверно
  • Экранированные скобки работают как прежде

Version 2.770.97

Fixed

  • Загрузка больше не путает объект-словарь с потоком, когда одно из его строковых или имённых значений содержит буквы «stream» в конце строки — например словарь Info с /Title (Livestream); объект читался как поток, и его записи терялись
  • Ключевое слово stream теперь распознаётся только как самостоятельный токен после закрывающего >> словаря и в конце строки, как спецификация PDF описывает потоковые объекты

Version 2.770.96

Fixed

  • Демо Stamp: файлы PNG и BMP из пикера изображений теперь можно использовать как штамп-картинку; раньше работал только JPEG, а прочие файлы падали с ошибкой invalid-bitmap
  • Демо Stamp: аннотация резинового штампа размещается как задумано в правом верхнем углу каждой страницы, под угловым штампом-картинкой сверху, а не в правом нижнем углу, где она перекрывалась со штампом-картинкой из того же угла
  • Демо Stamp: пути входа, выхода и изображения по умолчанию разрешаются относительно папки демо, а выбор файла в диалоге больше не меняет текущий каталог, поэтому относительные имена продолжают указывать на те же файлы

Version 2.770.95

Fixed

  • Запросы метки времени с policy OID (HPDFRFC3161BuildRequest и подпись с политикой службы меток времени) кодируют запрошенную политику как простой идентификатор объекта, как предписывает RFC 3161
  • Раньше политика заворачивалась в context tag, который RFC 3161 резервирует под расширения запроса, поэтому строгая служба меток времени отклоняла запрос или игнорировала политику
  • Запросы без policy OID не изменились

Version 2.770.94

Fixed

  • Демо ViewerPref: снятая галочка Initial Zoom теперь действительно означает «None (Default)»; сгенерированный PDF больше не открывается в режиме fit-height — это было умолчание компонента, которое демо не сбрасывало

Version 2.770.93

Fixed

  • Демо FileAttach: аннотации вложений уровня страницы теперь создаются, когда демо запускается из папки, чьё имя содержит символы вне системной ANSI-кодовой страницы; прикрепляемый файл передаётся простым именем файла, а не абсолютным путём

Version 2.770.92

Fixed

  • Демо HTMLText: выходной путь с символами вне системной ANSI-кодовой страницы (например, греческое или кириллическое имя папки) теперь записывается корректно, а не падает
  • Демо HTMLText: сгенерированный PDF больше не открывается автоматически во внешнем ридере — в согласии с остальными консольными демо

Version 2.770.91

Fixed

  • Импорт путей SVG и XPS больше не бросает EOverflow на числах с сотнями цифр или на длинных числах в сочетании с большим порядком; такие значения отвергаются, как любое другое число вне диапазона
  • Затрагивает SVG-изображения, размещаемые через API импорта SVG, и геометрию путей XPS на компиляторах, где исключения плавающей запятой не маскируются
  • Обычные числа, включая длинные мантиссы с отрицательными порядками, читаются как раньше

Version 2.770.90

Fixed

  • Демо EmfDraw: проваленная конвертация (например, отсутствующий входной метафайл) теперь завершается кодом выхода 1 вместо 0, так что скрипты и шаги сборки, запускающие демо, заметят сбой

Version 2.770.89

Fixed

  • Демо CJKAnnotations: когда Arial Unicode MS не установлен, демо действительно откатывается к Microsoft YaHei; оно проверяет установленные шрифты вместо ожидания исключения, которого отсутствующий шрифт никогда не бросал, поэтому CJK-текст больше не попадает в подставленный шрифт без CJK-покрытия

Version 2.770.88

Fixed

  • Потоки содержимого с вложенностью больше 32 операторов q больше не теряют окружающее графическое состояние: более глубокие сохранения игнорировались, но их парные Q всё равно восстанавливались, поэтому текст и графика после вложенного блока получали состояние ещё до внешнего q
  • Затрагивает извлечение текста через интерфейс content device и экспорт таких страниц в SVG
  • Сохранённые состояния теперь растут вместе с глубиной вложенности, и очень глубокая вложенность по-прежнему корректно закрывается

Version 2.770.87

Fixed

  • Демо ImageDemo: закладка «Image zoom» теперь ведёт к заголовку IMAGE ZOOM, а не к точке возле низа первой страницы

Version 2.770.86

Security

  • При открытии PDF, зашифрованного для сертификата получателя с ключом на эллиптической кривой (согласование ключей ECDH), сырой общий секрет и промежуточные буферы деривации ключа теперь затираются, как только становятся ненужными, — в том числе при повторной попытке с альтернативным порядком байтов и на каждом раннем пути отказа
  • Подпись сертификатом из хранилища сертификатов Windows больше не оставляет загруженными crypt32.dll и advapi32.dll, когда нужная функция CryptoAPI не найдена

Version 2.770.85

Security

  • Построение контуров глифа Type 1, чья charstring вызывает sbw со слишком малым числом операндов, больше не читает до дна стека операндов; искажённый оператор игнорируется
  • Charstring Type 1, заканчивающаяся escape-байтом двухбайтового оператора, больше не читает за концом charstring

Version 2.770.84

Fixed

  • Длина кодов символов в байтах для диапазона codespace в CMap теперь берётся из длины его hex-строк, как предписывает ISO 32000-1 9.7.6.2; диапазон вроде <0000> <00FF> считался однобайтовым, потому что верхняя граница умещалась в байт, из-за чего при рендеринге и извлечении текста двухбайтовые коды расщеплялись
  • Диапазоны codespace, загруженные из встроенных CMap, тоже несут свою длину кода

Version 2.770.83

Fixed

  • Встраивание сабсета установленного шрифта TrueType сохраняет все компоненты составных глифов (букв с диакритикой и подобных), чьи компоненты несут масштаб или трансформацию 2x2; компонент после такой трансформации читался неверно, поэтому мог пропасть из сабсета или получить ссылку на глиф, записанную поверх байтов трансформации
  • Составные глифы, чьи компоненты ссылаются друг на друга по циклу, указывают за пределы числа глифов шрифта или указывают на пустой глиф, больше не роняют и не подвешивают сабсеттинг шрифта
  • В сабсете ссылки на компоненты составного глифа, вложенного в другой составной, перенумеровываются один раз вместо двух

Version 2.770.82

Fixed

  • Вещественные числа в словарях шрифтов CFF (FontMatrix, FontBBox, значения blue и подобные) читаются правильно, когда в байте рядом с цифрой стоит знак, десятичная точка или порядок; раньше цифра в том же байте терялась, и -2.25 превращалось в -0.5
  • Эти значения разбираются с точкой в качестве десятичного разделителя, каковы бы ни были региональные настройки Windows; на системах с десятичной запятой разбор падал с ошибкой конвертации

Version 2.770.81

Fixed

  • Извлечение текста и поиск по ToUnicode больше не возвращают устаревшую многозначную строку для кодов из записи-массива beginbfrange, следующей за другой записью-массивом с многозначными целями; такие коды теперь отображаются в собственный одиночный символ

Version 2.770.80

Fixed

  • Инстанцирование вариативного шрифта TrueType по выбранным значениям осей (например через SetVariableFontAxis) больше не искажает глифы, чьи данные gvar содержат разреженный (sparse) кортеж после другого кортежа; разреженный кортеж стартовал от дельт предыдущего кортежа и двигал те же точки дважды
  • Точки, которые разреженный кортеж опускает, теперь интерполируются только по точкам, перечисленным в этом же кортеже, как требуют правила gvar из OpenType

Version 2.770.79

Security

  • AddTiffFromFile теперь отвергает страницу TIFF, чья ширина, умноженная на высоту, требует растра больше 2 GB, и бросает исключение вместо выделения буфера с завёрнутым размером и последующей записи декодером за его концом (heap overflow)
  • Страница TIFF с нулевой шириной или высотой отвергается так же
  • Высокие страницы TIFF (от 1200 строк) теперь сообщают об ошибке выделения памяти вместо декодирования в nil-буфер

Version 2.770.78

Fixed

  • Глифы шрифтов Type 3 теперь подчиняются горизонтальному масштабированию (Tz): фрагмент текста, набранный при 200% горизонтального масштаба, рисуется вдвое шире, а не в естественной ширине
  • Глифы шрифтов Type 3 теперь подчиняются text rise (Ts), поэтому над- и подстрочные знаки, набранные шрифтами Type 3, поднимаются или опускаются, а не остаются на базовой линии
  • Ширины продвижения глифов уже масштабировались; теперь с ними согласуются и формы глифов

Version 2.770.77

Fixed

  • Запросы отметок времени RFC 3161, собираемые HPDFRFC3161BuildRequest, всегда кодируют nonce как минимальный DER INTEGER; когда случайный nonce начинался с нулевого байта, запрос нёс избыточный ведущий ноль, который строгие серверы отметок времени отвергают как искажённый
  • Возвращённый nonce сохраняет запрошенную длину, поэтому вызывающие, которые сравнивают его с ответом отметки времени, не затронуты
  • Зашифрованные файлы PDF 2.0 (AES-256-GCM), чьи объектные потоки расшифровываются в пустое содержимое, больше не падают при загрузке с ошибкой аутентификации GCM; пустой объектный поток с корректным тегом аутентификации теперь принимается, а подделанный тег по-прежнему отвергается

Version 2.770.76

Fixed

  • Демо Hyperlink: подписи ссылок и URL с символами вне системной ANSI-кодовой страницы (греческие, кириллические или текст с диакритикой) больше не превращаются в вопросительные знаки; подписи рисуются как текст Unicode, поверх которого кладётся URI-ссылка
  • Демо Hyperlink: не-ASCII символы в URL процентно кодируются как UTF-8 перед записью в действие ссылки, поэтому ридеры открывают задуманный адрес

Version 2.770.75

Fixed

  • Цвета CalRGB с компонентами вне диапазона 0..1 больше не бросают исключение плавающей точки (EInvalidOp) при рендеринге; компоненты обрезаются до допустимого диапазона до применения гаммы
  • Такие цвета теперь рисуются ближайшим цветом в диапазоне, а не неопределённым, на компиляторах, где исключения плавающей точки замаскированы

Version 2.770.74

Fixed

  • Прямые перезаписи Direct File API (например DADirectEncryptFileAES256 и DADirectDecryptFileAES256), запущенные одновременно на нескольких потоках, больше не портят вывод друг друга; копирование по byte-range, которым они пользуются совместно, держало один буфер на весь процесс

Version 2.770.73

Fixed

  • Общий кэш отзывов THPDFSignatureValidationBatch теперь находит ответы OCSP для сертификатов подписанта, чей серийный номер имеет установленный старший бит; такие ответы сохранялись под серийным номером без ведущего нулевого байта, а искались с ним, поэтому каждая следующая подпись промахивалась мимо кэша
  • Ответы OCSP, подписанные делегированным ответчиком или идентифицирующие ответчика по ключу, теперь сохраняются под издателем сертификата и могут переиспользоваться следующими подписями в батче; раньше они сохранялись под именем ответчика или не сохранялись вовсе
  • Подписи, опирающиеся на свидетельства, закэшированные предыдущей подписью того же батча, в этих случаях теперь приходят к доверенному вердикту, а не к неизвестному статусу отзыва

Version 2.770.72

Fixed

  • Поиск встроенного файла по имени (GetLoadedEmbeddedFileSpec, ExtractEmbeddedFileBytes, SaveLoadedEmbeddedFileToDisk и связанные методы) больше не переполняет стек, когда в дереве имён /EmbeddedFiles документа есть узлы, перечисляющие друг друга или сами себя в /Kids
  • Каждый узел дерева имён просматривается один раз, поэтому имена, достижимые через общий узел, по-прежнему находятся

Version 2.770.71

Fixed

  • Демо PageSizes: страницы китайских форматов 8K и 16K теперь печатают своё полное описание на любой системе; китайские названия форматов даны в пиньине, потому что описания рисуются шрифтом Arial, в котором нет CJK-глифов, а не-ASCII текст превращался в вопросительные знаки на не-CJK кодовых страницах

Version 2.770.70

Fixed

  • Осевые (Type 2) затенения теперь покрывают всю закрашиваемую область, когда ось затенения лежит далеко от неё, например градиент, определённый за краем страницы с /Extend [true true]; такие области оставались незакрашенными
  • Касается оператора sh и паттернов затенения, используемых как цвет заливки или обводки

Version 2.770.69

Fixed

  • Демо Navigation: именованные назначения chapter-1 и chapter-2 теперь открывают свои страницы от верха, в 60 пунктах ниже верхнего края, вместо прокрутки к низу страницы; координаты назначения задаются в пользовательском пространстве PDF по умолчанию с началом в левом нижнем углу

Version 2.770.68

Fixed

  • Извлечение текста из PDF со встроенным шрифтом TrueType больше не замирает на минуты, когда cmap шрифта обрезан, но заявляет тысячи сегментов или групп; длина таблицы теперь проверяется до чтения сегментов и групп
  • Построение карты «глиф → Unicode» для встроенного шрифта TrueType проходит каждую подтаблицу cmap один раз по сегментам или группам вместо перебора всех 65 535 кодовых точек BMP по одной, что заодно ускоряет извлечение с крупными CJK-шрифтами
  • Поиск глифов через обрезанную подтаблицу cmap формата 4 или 12 останавливается на конце данных шрифта, а не сканирует несуществующие сегменты

Version 2.770.67

Fixed

  • Экспоненциальные (Type 2) и сшивающие (Type 3) функции теперь соблюдают одновходовый /Domain, например [0 0.5]; он игнорировался и заменялся на [0 1], поэтому входы обрезались до неверного интервала
  • Экспоненциальная функция без /C1 теперь использует значение по умолчанию [1.0]; цвета Separation и затенения, определённые так, рисовались чёрным
  • Экспоненциальные функции теперь вычисляют C0 + x^N (C1 - C0) от самого входа, а не пересчитывают его в 0..1, что соответствует ISO 32000-1 для доменов помимо [0 1]
  • Выходы экспоненциальных функций обрезаются до /Range только когда тот присутствует; плашечные цвета с альтернативным пространством Lab (L* до 100) обрезались до 0..1 и рисовались почти чёрными
  • Экспоненциальная функция, чей вход лежит вне области определения, отвергается вместо броска исключения плавающей точки

Version 2.770.66

Fixed

  • Файлы PKCS#12 / PFX, экспортированные без пароля инструментами, выводящими ключи из пароля нулевой длины, теперь открываются с пустым паролем в HPDFParsePFX, HPDFParsePFXByLocalKeyID, HPDFEnumeratePFXIdentities и методах подписи PFX; раньше они падали с ошибкой аутентификации
  • С пустым паролем сначала пробуется стандартная кодировка RFC 7292, затем форма нулевой длины — и для проверки целостности, и для расшифровки ключа, поэтому файлы, которые уже открывались, продолжают открываться так же

Version 2.770.65

Fixed

  • Верхний колонтитул страницы демо DBTable для C++Builder теперь читается «Page 1», а не «Page1»
  • Ошибка при записи таблицы демо DBTable для C++Builder теперь закрывает недостроенный документ, поэтому следующий клик стартует с чистого состояния

Version 2.770.64

Fixed

  • Консольные демо C++Builder AnnotationInteraction, FormFields, CanvasDraw, EmfDraw, FormXObject, GraphicDraw, ImageDemo, ImageMask, LineGraphicsState и RtLTextOut при запуске без аргументов переключаются в папку исполняемого файла, как демо Delphi, поэтому их входные файлы находятся, а PDF пишется туда же, даже когда запуск идёт из другого каталога
  • Демо Graphic для C++Builder больше не рассылают сообщение о закрытии каждому окну, чей заголовок содержит имя их выходного PDF, — это могло закрыть посторонние окна
  • Демо ImageMask для C++Builder теперь работает как версия для Delphi: проверяет существование Mask.bmp и Image.jpg, сжимает вывод, не открывает просмотрщик и сообщает об ошибках вместо завершения необработанным исключением
  • Демо EmfDraw для C++Builder сообщает об ошибке, например отсутствующем Sample.emf, и возвращает ненулевой код выхода вместо завершения необработанным исключением
  • Демо AddDelPages для C++Builder разрешает относительные имена входных и выходных файлов относительно папки исполняемого файла, как версия для Delphi

Version 2.770.63

Fixed

  • Демо FileAttach для C++Builder пишет FileAttach.pdf рядом с исполняемым файлом — имя, которое используют версия для Delphi и readme, — вместо Output.pdf в рабочем каталоге, и хранит своё вложение FileAttach.txt в той же папке

Version 2.770.62

Fixed

  • Direct File API (DADirectEncryptFileAES256, DADirectDecryptFileAES256 и прочие методы прямой перезаписи) теперь правильно читает смещения потока перекрёстных ссылок за 2 GiB; такие смещения усекались и становились отрицательными, поэтому объекты в верхней части большого файла не находились
  • Смещения /Prev и /XRefStm за 2 GiB в trailer или потоке перекрёстных ссылок теперь отслеживаются, а не читаются как 0, поэтому прежние ревизии и гибридные секции перекрёстных ссылок больших файлов больше не пропускаются
  • То же самое при загрузке большого файла и при осмотре его ревизий
  • Новые помощники HPDFDirectReadUIntBE64 и HPDFFindNameInt64 возвращают полное 64-битное значение

Version 2.770.61

Fixed

  • Поток перекрёстных ссылок, у которого ширины полей в /W отрицательны или больше 8 байт, теперь отвергается вместо декодирования; загрузка откатывается к сканированию файла в поисках объектов
  • Методы Direct File API (например DADirectEncryptFileAES256) больше не читают память за пределами декодированной таблицы и больше не могут упасть на таком файле; они его отвергают

Version 2.770.60

Fixed

  • Извлечение текста, поиск и позиции глифов теперь правильно читают текстовый оператор ": его первый операнд — межсловный интервал, второй — межбуквенный; раньше они менялись местами
  • Строки, записанные оператором " с ненулевым межсловным или межбуквенным интервалом, больше не сообщают сдвинутые позиции глифов, из-за которых слова в извлечённом тексте страницы могли слипаться или рваться, а попадания поиска оказывались не на месте
  • Рендеринг страниц это не затрагивало

Version 2.770.59

Fixed

  • Демо Table: строки, накрытые rowspan группы «Group A», теперь показывают свои поля item и note в колонках Item и Notes; раньше текст примечания съезжал на колонку и терялся
  • Демо Table: сгенерированный PDF больше не открывается автоматически во внешнем ридере, как у остальных консольных демо, а выходные пути с символами вне системной ANSI-кодовой страницы сохраняются как есть

Version 2.770.58

Fixed

  • Распаковка данных Flate в поток больше не течёт состоянием декодера (около 40 KB за раз), когда исходный или целевой поток бросает исключение на полпути, например при неудачной записи или достижении лимита размера
  • Сжатие строки больше не течёт временным буфером, если сжатие бросает исключение
  • Успешные сжатие и распаковка ведут себя в точности как раньше

Version 2.770.57

Fixed

  • Сертификаты, у которых расширение ограничений на имена (name constraints) не помечено как критическое, больше не отвергаются как нечитаемые при валидации сертификата подписи; сертификат CA такого рода раньше ломал построение любой цепочки через него
  • Ограничения такого сертификата теперь применяются к остатку цепочки как критические, поэтому имена подписантов вне разрешённых поддеревьев по-прежнему сообщаются как нарушение ограничения имён

Version 2.770.56

Fixed

  • Функции калькулятора PostScript (Type 4) с глубоко вложенными процедурами if или ifelse больше не переполняют стек при рендеринге; такая функция считается непригодной, и цвет откатывается, как для любой другой недопустимой функции
  • Вложенность ограничена 64 уровнями — куда больше, чем используют реальные калькуляторные программы; обычные преобразования оттенков Type 4 и затенения рендерятся как раньше
  • Вычисление калькуляторных функций требует меньше стека на уровень вложенности

Version 2.770.55

Fixed

  • Демо E-Invoice: извлечённый XML Factur-X / ZUGFeRD декодируется как UTF-8, поэтому буквы с диакритикой и прочие не-ASCII символы в именах и адресах больше не показываются искажёнными в панели XML
  • Демо E-Invoice: на Delphi XE2 и новее объединённый вердикт по e-invoice теперь определяет шаг бизнес-правил, поэтому сбой файла правил или движка проваливает валидацию, а не проходит молча
  • Демо E-Invoice: расхождение видимого текста с XML из эвристической проверки согласованности сообщается как предупреждение и само по себе больше не проваливает общую валидацию

Version 2.770.54

Security

  • Проверка подписи CMS (HPDFVerifyCMSSignature, HPDFVerifyCMSSignatureEx и подписи загруженных PDF) теперь сообщает об искажённой подписи, когда в подписанных атрибутах нет атрибута content-type или указан тип содержимого, отличный от подписываемого, как требует RFC 5652; такие подписи раньше проходили проверку как валидные, что позволяло выдать подписанные атрибуты, изготовленные для одного типа содержимого, за подписание другого
  • Подписи с повторным атрибутом content-type отвергаются, как и раньше
  • Контрподписи, которые по определению не несут атрибута content-type, и токены отметок времени RFC 3161 продолжают проверяться как раньше

Version 2.770.53

Fixed

  • Повторный клик по кнопке демо Annotations для C++Builder больше не выписывает предыдущий документ заново перед стартом нового
  • Ошибка при построении PDF демо Annotations для C++Builder теперь закрывает недостроенный документ, поэтому следующий клик стартует с чистого состояния

Version 2.770.52

Fixed

  • Несколько документов или экземпляров THotPDF в одном процессе, пользующихся одной папкой дискового кэша рендеринга, теперь делят единый индекс кэша; раньше каждый экземпляр держал свой индекс и затирал чужие при каждом сохранении, теряя порядок недавнего использования
  • Лимиты числа документов и суммарного размера дискового кэша рендеринга соблюдаются по всем экземплярам, делящим папку, поэтому папка больше не растёт сверх бюджета, когда несколько просмотрщиков или потоков рендеринга пользуются ею одновременно
  • Та же папка распознаётся независимо от регистра букв и хвостового разделителя пути

Version 2.770.51

Fixed

  • Передискретизация растра с ядром bicubic или Lanczos3 теперь работает для любого исходного пиксельного формата; источник 32, 8 или 1 бит читался так, будто содержит 3-байтовые пиксели, из-за чего цветовые каналы путались или чтение выходило за концы строк
  • Такие источники сначала конвертируются в 24 бита, поэтому передискретизированное изображение имеет те же цвета, что и источник; результат, как и раньше, остаётся 24-битным растром
  • 24-битные источники и ядро halftone не затронуты

Version 2.770.50

Fixed

  • Демо PreflightCLI: -d на одиночном PDF теперь пишет индекс dashboard, даже если файл проваливает preflight
  • Демо PreflightCLI: файлы, вызвавшие ошибку при preflight, значатся в индексе dashboard как проваленные, а код выхода отражает каждый проваленный файл
  • Демо PreflightCLI: с -r отчёты для одноимённых PDF в разных подкаталогах пишутся в соответствующие подпапки, а не затирают друг друга — и с -o, и в dashboard
  • Демо PreflightCLI: -f json и -f csv теперь дают одну и ту же схему с --profile / --preset / --aggregate и без, включая колонку spec в CSV
  • Демо PreflightReport: CSV-отчёты, сгенерированные с профилем, теперь заполняют колонку spec, как отчёты без профиля

Version 2.770.49

Fixed

  • Демо LargeFile для C++Builder теперь генерирует входной набор для бенчмарка, который описывает его readme, как версия для Delphi: LargeFile-Text.pdf, LargeFile-Image.pdf, LargeFile-Mixed.pdf и зашифрованный AES-256 LargeFile-Encrypted.pdf в папке BenchmarkInputs рядом с исполняемым файлом; раньше писался единственный 200-страничный LargeFile.pdf
  • Демо LargeFile для C++Builder принимает опции --output-dir, --scale (small, default, large, huge) и --pages и печатает команду HugeFileBenchmark для сгенерированной папки

Version 2.770.48

Fixed

  • Демо Outlines для C++Builder теперь пишет Outlines.pdf рядом с исполняемым файлом — файл, который называет readme, — вместо Output.pdf в рабочем каталоге и сообщает, куда он сохранён, вместо открытия просмотрщика
  • Демо Outlines для C++Builder теперь строит тот же 10-страничный документ с метками страниц Arial, что и версия для Delphi; метки у низа страницы при y = 830 обрезались краем страницы, а закладки «Bottom» последней страницы указывали ниже них
  • Ошибка при записи PDF демо Outlines для C++Builder больше не оставляет демо неспособным создать другой документ

Version 2.770.47

Fixed

  • Постоянный дисковый кэш рендеринга теперь работает в папках, чьи имена содержат символы вне системной ANSI-кодовой страницы (например папка профиля пользователя с не-латинскими символами); раньше там проваливалась каждая запись страницы, и кэш никогда не давал попаданий
  • THPDFDiskPageCache принимает корневую папку как строку Unicode и хранит все пути кэша в Unicode, включая атомарную замену файлов страниц и индекса кэша

Version 2.770.46

Fixed

  • Рендеринг областей и плиток (RenderLoadedPageRegionToBitmap, RenderLoadedPageTiles, прогрессивный рендеринг областей) больше не оставляет плитку пустой, когда всё её содержимое идёт из form XObject, смещённого от начала координат; форма теперь считается накрывающей свой /BBox, как он размещён её /Matrix и текущей трансформацией
  • Текст, размещённый операторами TD, T*, ' или ", теперь попадает на правильную строку при решении, каким плиткам он принадлежит, поэтому последующие строки абзаца больше не выкидываются из плиток, в которых видны
  • Смещения Td масштабируются текстовой матрицей и отмеряются от начала строки, как текст и рисуется
  • При оценке, где кончается фрагмент текста, учитываются межбуквенный и межсловный интервалы, горизонтальное масштабирование и text rise, а глифы больше не считаются уже одного em

Version 2.770.45

Fixed

  • Демо MemStream для C++Builder пишет MemStream.pdf рядом с исполняемым файлом — имя, которое использует версия для Delphi, — вместо Memory.pdf в рабочем каталоге
  • Демо MemStream для C++Builder теперь перечитывает PDF в памяти через LoadFromStream и перед сохранением проверяет, что страница одна
  • Ошибка при записи PDF демо MemStream для C++Builder больше не оставляет демо неспособным создать другой документ

Version 2.770.44

Fixed

  • Демо HelloWorld для C++Builder больше не рассылает при старте сообщение о закрытии каждому окну, чей заголовок содержит HelloWorld.pdf, — это могло закрыть посторонние окна вроде редактора или файлового менеджера
  • Демо HelloWorld для C++Builder пишет HelloWorld.pdf рядом с исполняемым файлом и открывает его только при переданном --open; как и версия для Delphi, демо принимает имя выходного файла или --output <file>

Version 2.770.43

Fixed

  • Загрузка PDF, чьё дерево страниц содержит промежуточные узлы /Pages, больше не теряет страницы под этими узлами; раньше такие документы сообщали только страницы, перечисленные прямо под корнем дерева
  • Страницы сохраняют порядок дерева страниц, поэтому индексы страниц, боксы страниц и содержимое совпадают с тем, что показывают другие просмотрщики
  • Страница, чей /Type хранится как косвенный объект, распознаётся как страница на этом шаге упорядочивания

Version 2.770.42

Fixed

  • Загрузка PDF, чьё дерево страниц ссылается само на себя (узел /Pages, перечисленный среди собственных /Kids, или два узла, перечисляющие друг друга), больше не падает с переполнением стека; каждый узел дерева страниц проходится один раз, а абсурдно глубокие деревья обрезаются
  • Узел дерева страниц, чей массив /Kids или имя /Type хранится как косвенный объект, теперь загружает свои страницы, а не падает и не читает невалидную память

Version 2.770.41

Fixed

  • THPDFPage.LastAnnotation теперь возвращает ссылку, созданную AddGoToLink, AddURILink, AddNamedDestinationLink, AddGoToRLink, AddLaunchLink, AddStructureDestinationLink и AddGoToRStructureDestinationLink
  • Вызов SetAnnotationFlags, SetAnnotationBorderStyle или AddPopupAnnotationFor с LastAnnotation сразу после добавления ссылки больше не молча ничего не делает и не меняет ранее созданную аннотацию

Version 2.770.40

Fixed

  • Job JSON, передаваемый в THPDFJobProcessor.Execute, HPDFDocRunJob и HPDFDocRunJobWithCallbacks, теперь читается как UTF-8 на всём протяжении: escape-последовательности \uXXXX больше не схлопываются в ANSI-кодовую страницу, а экранированные суррогатные пары вроде 😀 дают задуманный символ вместо двух поломанных
  • Имена входных и выходных файлов в задачах merge, split, optimise, encrypt и validate сохраняют символы вне системной кодовой страницы — записаны ли они сырым UTF-8 или escape-последовательностями \u, — поэтому такие файлы находятся и записываются под своими настоящими именами
  • Искажённый escape \u короче четырёх hex-цифр отбрасывается, не глотая следующие символы или закрывающую кавычку
  • UTF-8 BOM в начале текста задачи игнорируется

Version 2.770.39

Fixed

  • Идентификаторы объектов, передаваемые вызывающим при построении подписей и запросов отметок времени (политика подписи, тип обязательства, заявленная роль, политика отметок времени и подобные OID), теперь кодируются правильно, когда первая дуга равна 2, а вторая — 48 или больше; раньше объединённое первое значение обрезалось до одного байта, давая другой, неверный идентификатор
  • Дуга объектного идентификатора, слишком большая для представления, теперь отвергается с ошибкой, а не молча заворачивается в другое значение

Version 2.770.38

Fixed

  • Демо HugeFileBenchmark: с --recursive --keep-output PDF с одинаковым именем файла в разных подкаталогах больше не затирают сгенерированные файлы друг друга; рабочая папка теперь зеркалит дерево входной папки

Version 2.770.37

Security

  • Рендеринг PDF со встроенным шрифтом TrueType, чьи составные глифы перечисляют много компонентов, каждый из которых снова составной, больше не может подвесить рендерер или экспорт текста в кривые; один глиф теперь разворачивается максимум в 1024 компонента по всем уровням вложенности
  • Компонент составного глифа, ссылающийся на собственный глиф, пропускается вместо разворачивания до лимита вложенности

Version 2.770.36

Fixed

  • Сшивающая (Type 3) функция, ссылающаяся сама на себя — напрямую или через другие функции, — больше не уходит в рекурсию до переполнения стека; она считается непригодной функцией
  • Затрагивает преобразования оттенков Separation и DeviceN, функции затенения и передаточные функции в искажённых или враждебных PDF, рендеримых через RenderLoadedPageToBitmap и другие пути рендеринга
  • Вложенность функций ограничена 16 уровнями; легитимные документы вкладываются куда мельче

Version 2.770.35

Fixed

  • Демо PageOperations для C++Builder теперь выполняет тот же сценарий, что и версия для Delphi: вставляет пустую страницу произвольного размера через InsertLoadedBlankPage и печатает текст страниц 1-3 через ExtractLoadedPagesText
  • Переупорядоченный и извлечённый файлы демо PageOperations для C++Builder теперь содержат те же страницы, что и у версии для Delphi: последняя страница переносится на страницу 2, извлекаются страницы 2 и 5

Version 2.770.34

Fixed

  • Демо Hyperlink для C++Builder продолжает на новой странице, когда список ссылок не умещается на одной; ссылки ниже низа первой страницы писались за пределами страницы
  • Кнопки Add, Remove и Make PDF демо Hyperlink для C++Builder отключаются, пока PDF пишется, поэтому список ссылок больше не может измениться, а документ — начаться вторично, посреди генерации

Version 2.770.33

Fixed

  • Демо Stamp для C++Builder теперь размещает текстовый водяной знак и аннотацию печати относительно размера каждой страницы; на альбомных и прочих не-A4 страницах аннотация печати выпадала за страницу, а водяной знак уползал от центра

Version 2.770.32

Fixed

  • Каждая кнопка демо ViewerPref для C++Builder теперь стартует со свежего документа; направление чтения, начальный зум и другие настройки просмотрщика от предыдущего клика оставались в силе, поэтому Create PDF после Test Direction, например, всё ещё писал текст справа налево и настройки, которые уже не были выбраны
  • Демо PDF_INFO для C++Builder теперь пишет PDFInfo.pdf рядом с исполняемым файлом — имя файла, которое используют версия для Delphi и readme

Version 2.770.30

Security

  • Валидацию цепочки сертификатов (HPDFValidateCMSCertificatePath, онлайн-вариант и батчи подписей) больше нельзя застопорить подписью, встраивающей много сертификатов с одним именем и ключом; такой набор раньше заставлял поиск пути перебирать все возможные порядки — рост факториальный, и валидация могла крутиться часами
  • Каждая подпись издателя в цепочке-кандидате теперь проверяется один раз за валидацию, и результат переиспользуется, вместо повторной проверки для каждого пути, проходящего через неё
  • Поиск пути ограничен фиксированным объёмом работы; при достижении лимита валидация сообщает, что до якоря доверия не доходит ни один валидный путь, а обычные цепочки остаются далеко ниже лимита

Version 2.770.29

Fixed

  • ImportLoadedInterchangeFromFDF теперь сопоставляет имена ключей целиком при чтении аннотаций и статуса FDF: /T больше не останавливается на /Type или /Text, /F — на /FreeText, а /Status — на более длинном ключе с тем же началом, поэтому импортированные аннотации сохраняют автора и флаги
  • Ключи вложенных словарей внутри импортированной аннотации и похожие на ключи фрагменты внутри строк больше не принимаются за собственные записи аннотации
  • Строковые литералы в импортированных FDF-аннотациях и статусе декодируют все escape-последовательности, определённые ISO 32000-1: \t, \b, \f, восьмеричные \ddd и продолжения строки обратным слешем — в дополнение к \n, \r и экранированным скобкам

Version 2.770.28

Fixed

  • В сборках, сделанных Delphi старше XE2, которые используют комплектный PNG-ридер, загрузка PNG с чанком сжатого текста (zTXt) больше не читает за внутренним буфером; текст длиннее 256 байт выходил испорченным и куда длиннее положенного, а крупные чанки могли ронять программу
  • Метод сжатия чанка сжатого текста теперь читается из правильного байта, поэтому чанки с неподдерживаемым методом игнорируются, а не декодируются как deflate-данные
  • Обрезанный или искажённый сжатый текст больше не рискует бесконечным циклом декодирования
  • Сборки Delphi XE2 и новее используют системный PNG-ридер и не затронуты

Version 2.770.27

Changed

  • Демо SearchAndSelect для C++Builder теперь работает как версия для Delphi: создаёт образцовый PDF, загружает его, находит поисковый термин через SearchLoadedDocumentText и вешает аннотацию подсветки над каждым совпадением через AddLoadedHighlightAnnotation
  • Демо SearchAndSelect для C++Builder принимает входной PDF, поисковый термин, выходной файл и опции --case-sensitive и --whole-word, а затем проверяет сохранённую копию на новые аннотации

Fixed

  • Подсветки демо SearchAndSelect для C++Builder теперь накрывают найденные слова; они ставились строкой выше, потому что позиция текста принималась за базовую линию, а не за верх текста

Version 2.770.26

Fixed

  • Демо DigiPrint для C++Builder теперь стартует на системах, где десятичный разделитель — точка; десятичные запятые в demo.xml разбирались с системной локалью и бросали ошибку при создании формы
  • Демо DigiPrint читает demo.xml и его две JPEG-иконки из папки исполняемого файла и пишет туда demo.pdf, а проект теперь кладёт исполняемый файл в папку демо рядом с этими файлами
  • Иконки страниц в нижнем колонтитуле демо DigiPrint рисуются внутри строки колонтитула, а не под нижней линией страницы, а заголовок, год и текст колонтитула берут кегли из стиля отчёта
  • Повторные клики по кнопке DigiPrint больше не сдвигают левое поле правее с каждым кликом
  • Ошибка при построении PDF демо DigiPrint, например отсутствующий файл изображения, больше не оставляет демо неспособным создать другой документ

Version 2.770.25

Fixed

  • Демо Showcase: полосы заголовков, фон обложки, образцы градиентов и акцент задней страницы теперь совпадают с фигурами, которые они заливают; координаты градиентов задаются в пользовательском пространстве PDF по умолчанию (начало в левом нижнем углу), поэтому цвета больше не съезжают и не переворачиваются
  • Демо Showcase: Save Copy больше не переключает рабочий файл, поэтому Regenerate и Open External продолжают пользоваться основной галереей, а не последней записанной копией
  • Демо Showcase: когда генерация галереи падает, просмотрщик перепривязывается и продолжает показывать последнюю загрузившуюся галерею, а не остаётся пустым
  • Демо Showcase: выходные пути с символами вне системной ANSI-кодовой страницы проходят без изменений

Version 2.770.24

Fixed

  • Загрузка изображения JPEG 2000 с четырьмя компонентами (RGB плюс альфа или YCC плюс альфа) в TJpeg2000Bitmap теперь кладёт red, green, blue и альфу в правильные байты 32-битного растра; раньше цветовые каналы съезжали на байт, а альфа-канал затирал один из них
  • Это же чинит round trip 32-битного TJpeg2000Bitmap через SaveToStream и LoadFromStream, после которого цвета возвращались перепутанными
  • Цветные изображения из трёх компонентов, полутоновые изображения и CMYK-изображения из четырёх компонентов загружаются как раньше

Version 2.770.23

Security

  • Текстовая строка, чьё значение начинается с << и заканчивается >> (например заголовок, автор, значение поля формы или текст аннотации вроде «<<URGENT>>»), теперь всегда сохраняется как строка; она выписывалась дословно, что ломало синтаксис файла и позволяло подсовывать в сохраняемый документ словарь — например, действие
  • Касается новых документов и загруженных документов, сохраняемых через SaveLoadedDocument и связанные методы

Version 2.770.22

Fixed

  • Демо Barcodes для C++Builder пишет Barcodes.pdf рядом с исполняемым файлом, а не в текущем рабочем каталоге, и принимает необязательное имя выходного файла единственным аргументом
  • Демо Barcodes для C++Builder больше не открывает просмотрщик PDF после запуска и, как версия для Delphi, сжимает содержимое страницы и открывает файл с зумом «по высоте»
  • Ошибки демо Barcodes для C++Builder сообщаются своим текстом; раньше консоль показывала адрес памяти

Version 2.770.21

Fixed

  • В стабильном C ABI вызов hpdf_document_destroy, пока другой вызов на том же хэндле ещё исполняется (из другого потока или изнутри колбэка чтения, записи, прогресса или отмены), больше не освобождает документ под этим вызовом
  • Хэндл становится невалидным, как только hpdf_document_destroy возвращается; сам документ освобождается, когда последний исполняющийся на нём вызов завершится
  • Вызовы, ищущие хэндл одновременно с его уничтожением, получают HPDF_STATUS_INVALID_HANDLE вместо касания освобождённой памяти

Version 2.770.20

Security

  • Вёрстка текста шрифтом TrueType/OpenType, чьи контекстные поиски GSUB ссылаются сами на себя, больше не переполняет стек и не роняет программу; глубина вложенности теперь действительно накапливается между уровнями
  • Контекстное правило, запускающее много вложенных поисков, больше не может размножить их в почти бесконечный цикл: на каждый верхнеуровневый матч исполняется максимум 1024 вложенных поиска

Fixed

  • Цепочечная контекстная подстановка (GSUB lookup type 6), достижимая из другого контекстного поиска, теперь применяется; она читалась как простой контекстный layout и никогда не матчилась, поэтому некоторые лигатуры и контекстные формы отсутствовали
  • Обратная цепочечная подстановка (GSUB lookup type 8), на которую ссылается контекстное правило, пропускается, как требует спецификация OpenType, вместо неверного прочтения как контекстной подтаблицы

Version 2.770.19

Fixed

  • RenderLoadedPageToDC больше не бросает access violation, когда страница содержит image XObject или встроенное изображение; картинки рисуются в контекст устройства вызывающего
  • GetLoadedPageMetafile больше не падает на страницах с изображениями, и картинки попадают в возвращённый метафайл
  • Отсечение изображений по видимой поверхности теперь использует размер, переданный в RenderLoadedPageToDC, когда у контекста устройства нет региона отсечения

Version 2.770.18

Fixed

  • Полутоновые области JBIG2 с включённым пропуском ячеек сетки (grid skipping) больше не теряют ячейки, которые начинаются левее или выше области, но всё ещё пересекаются с ней; такие ячейки считались лежащими далеко снаружи, их серые значения пропускались, а оставшиеся ячейки области декодировались вразнобой
  • Отрицательные координаты сетки, не являющиеся целыми пикселями, теперь округляются к минус бесконечности, как требует спецификация JBIG2, поэтому частично видимые ячейки ложатся на правильный пиксель
  • Полутоновые области, чья сетка целиком лежит в неотрицательных координатах, не затронуты

Version 2.770.17

Fixed

  • Ответы OCSP, где ответчик идентифицируется хешем ключа в стандартной форме RFC 6960 (явный тег [2] вокруг хеша ключа), снова принимаются; валидация цепочки сертификатов раньше их отбрасывала, поэтому отзыв оставался неизвестным для каждого ответчика, называющего себя по ключу
  • Сопоставляются и прямые ответчики (издающий CA), и делегированные сертификаты подписи OCSP, идентифицируемые по ключу; старая форма с неявной тегированностью продолжает работать
  • HPDFDescribeValidationEvidence теперь ключует дескрипторы OCSP по DN издателя сертификата, названному в каждом ответе и вычисленному из хеша имени издателя в ответе, а не по DN ответчика; ответы делегированных ответчиков и ответы с идентификацией по ключу теперь дают дескрипторы, которые находит поиск по издателю сертификата
  • Добавлена перегрузка HPDFDescribeValidationEvidence, принимающая подпись CMS и дополнительные сертификаты издателя, — для ответов, где ответчик идентифицируется по ключу и не встраивает сертификат

Version 2.770.16

Fixed

  • Демо Viewer: форма больше не бросает access violation при старте; строка состояния теперь существует до привязки просмотрщика к документу и начинает сообщать о сменах страниц
  • Демо Viewer: Enter в поле поиска теперь активирует первое совпадение вместо перескока сразу ко второму
  • Демо Viewer: закладки без разрешимого адреса перехода перечисляются без ложного суффикса «(p0)», и клик по ним больше не бросает ошибку диапазона

Version 2.770.15

Fixed

  • Шаг расшифровки демо Security для C++Builder теперь действительно открывает зашифрованный образец с пользовательским паролем «user»; аргумент пароля принимался за флаг авторасшифровки, поэтому образец загружался без пароля, а Security-Decrypted.pdf не был расшифрованной копией

Version 2.770.14

Fixed

  • Путь отсечения, заданный W или W*, теперь вступает в силу после закраски пути, как требует ISO 32000-1, а не до неё
  • Обводка пути, который одновременно задаёт отсечение (re W S), теперь рисует всю ширину линии; внешняя половина штриха срезалась собственным отсечением пути
  • Заливка с обводкой и чётно-нечётным отсечением (W* B) теперь заливает по собственному правилу заполнения оператора рисования; чётно-нечётное отсечение раньше пробивало дыры в заливке
  • B* и b* теперь всегда заливают по чётно-нечётному правилу, независимо от правила заполнения, оставшегося от предыдущей операции

Version 2.770.13

Fixed

  • Полутоновые области JBIG2, чьи плоскости градаций серого закодированы MMR, теперь декодируются; раньше плоскости выходили инвертированными, читался лишь каждый восьмой столбец, а конец каждой плоскости находился по неверному байту, из-за чего следующие плоскости декодировались с неверной позиции
  • Маркер конца блока после каждой MMR-плоскости распознаётся и когда он идёт сразу за последней строкой, и когда после байтов выравнивания, и каждая плоскость теперь стартует со следующей границы байта
  • Полутоновые области с арифметическим кодированием не затронуты
  • Касается PDF-изображений с фильтром JBIG2Decode, которые загружаются, извлекаются или рендерятся встроенным декодером

Version 2.770.12

Fixed

  • JSON, выдаваемый обработчиком задач (THPDFJobProcessor.Execute, HPDFDocRunJob, HPDFDocRunJobWithCallbacks) и сравнением документов, теперь экранирует кавычки и обратные слеши как \" и \; прежние формы \x22 / \x5C — невалидный JSON, и стандартные парсеры отвергали результаты, содержавшие кавычку или путь Windows
  • Управляющие символы пишутся как escape-последовательности \uXXXX, а вывод всегда является корректным UTF-8: байты, не являющиеся валидным UTF-8, заменяются на U+FFFD вместо копирования в результат
  • Сообщения об ошибках в результатах задач и в объекте ошибки сравнения кодируются как UTF-8, поэтому текст неанглийских исключений и имена файлов больше не приходят в ANSI-кодовой странице

Version 2.770.11

Fixed

  • RedactLoadedRect, StampLoadedPageText, StampLoadedPageImage, StampLoadedPageShape, StitchLoadedPage и FlattenLoadedAnnotations больше не выбрасывают существующее содержимое страницы, когда её /Contents — массив потоков; новые операторы добавляются дополнительным потоком в конец массива или в начало для подложки
  • Штампы-подложки на странице, чьё содержимое разбито на несколько потоков, сохраняют каждый исходный поток
  • Страницы, чей единственный поток содержимого использует фильтр помимо простого FlateDecode (ASCIIHex, ASCII85, LZW, RunLength, цепочки фильтров или Flate с предиктором), теперь декодируются перед добавлением новых операторов, поэтому штамп, бокс редактирования или сплющенный вид реально рисуются, а исходное содержимое остаётся читаемым
  • Когда поток содержимого страницы вообще не поддаётся декодированию, он оставляется нетронутым, а новые операторы пишутся в отдельный поток вместо дописывания к закодированным байтам

Version 2.770.10

Security

  • Рендеринг PDF, чей встроенный шрифт CFF (FontFile3, Type1C или CIDFontType0C) хранит смещение INDEX 0x80000000 и выше, больше не читает память за пределами данных шрифта; такие смещения считались отрицательными и проходили проверки границ
  • Встроенные шрифты TrueType получают то же обращение для позиций глифов и длин таблиц 0x80000000 и выше: глиф или шрифт пропускается вместо чтения с неверного места
  • Глиф CFF, чьи сабрутины вызывают друг друга много раз подряд, больше не может подвесить рендеринг или экспорт текста в кривые; у каждого глифа теперь фиксированный бюджет операций charstring, многократно превышающий расход реальных шрифтов

Version 2.770.9

Fixed

  • Изображения JBIG2, чьи текстовые области используют кодирование Хаффмана вместе с уточнением символов (symbol refinement) в 13-пиксельном шаблоне, теперь декодируются; байты адаптивных пикселей уточнения в заголовке области пропускались, поэтому счётчик экземпляров и все следующие поля читались с неверного смещения, и изображение отвергалось
  • Текстовые области с арифметическим кодированием или с 10-пиксельным шаблоном уточнения не затронуты и декодируются в точности как раньше
  • Касается PDF-изображений с фильтром JBIG2Decode, которые загружаются, извлекаются или рендерятся встроенным декодером

Version 2.770.8

Security

  • При включённой изоляции кодеков размер декодированного изображения, возвращаемый изолированным воркером кодека, теперь сверяется с настроенным лимитом вывода и с разделяемой памятью, выделенной процессом-хозяином, а не с полем ёмкости, которое сам воркер может перезаписать
  • Скомпрометированный или сбойный воркер больше не может заставить хозяина копировать за пределами блока разделяемой памяти; такой ответ отвергается как ошибка протокола, и изображение из него не рисуется
  • Ответ воркера копируется один раз и проверяется по этой копии, поэтому его заголовок не может измениться между проверками и копированием пикселей

Version 2.770.7

Fixed

  • Запросы OCSP, собираемые для живой проверки отзывов (HPDFCollectCMSRevocationRequests и онлайн-валидация цепочки сертификатов), теперь правильно кодируют идентификатор алгоритма SHA-256 в CertID; раньше первые две дуги объектного идентификатора писались отдельными байтами, поэтому алгоритм хеширования получался некорректным
  • Ответчики OCSP, отвергающие искажённые запросы, теперь отвечают на такие запросы обычным статусом вместо ошибки, поэтому онлайн-проверки отзывов больше не откатываются к офлайн-свидетельствам из-за кодирования запроса

Version 2.770.6

Fixed

  • Рендеринг шрифта Type 3 теперь рисует каждое появление глифа; раньше глиф, повторённый в том же фрагменте текста или в любом другом месте страницы с тем же размером и ориентацией, рисовался только первый раз, а дальше оставался пустым
  • Касается RenderLoadedPageToBitmap, RenderLoadedPageToDC, метафайлов страниц и путей экспорта изображений, с общим кэшем рендеринга или без
  • Повторные глифы Type 3 продолжают пользоваться кэшем глифов, поэтому исправление не перечитывает процедуру глифа для каждого появления

Version 2.770.5

Fixed

  • Стабильный C ABI больше не освобождает входной источник дважды, когда hpdf_document_load_from_io падает во время разбора документа, например когда колбэк чтения сообщает об ошибке или операцию отменяют на полпути; такая загрузка могла попортить кучу или уронить процесс-хозяин
  • Неудавшаяся загрузка теперь возвращает статус колбэка или отмены вместо внутренней ошибки, и тот же хэндл документа можно после этого загрузить заново
  • Загрузка нового документа в существующий хэндл освобождает предыдущий входной источник только после того, как новая загрузка его подменила

Version 2.770.4

Fixed

  • Результаты штрихкодов из DecodeLoadedPageBarcodes на страницах с /Rotate 90 или /Rotate 270 теперь сообщают границы в реальном положении символа, а не в зеркально отражённом по странице
  • Ориентация штрихкода на таких страницах теперь совпадает с направлением, в котором символ реально читается в пространстве страницы
  • Невидимый текст, который ApplyLoadedOCRTextLayer кладёт на повёрнутые на четверть страницы, теперь лежит поверх распознанных слов, поэтому выделение и поиск подсвечивают правильное место
  • Находки лиц из детектирования для редактирования на повёрнутых на четверть страницах тоже отображаются обратно в правильную область страницы
  • Неповернутые и перевёрнутые вверх ногами страницы не затронуты

Version 2.770.3

Fixed

  • В 32-битных сборках загрузка или запись TIFF-изображения, сжатого PixarLog, больше не падает с переполнением стека; выбор кодека строит его companding-таблицы, которые попадали в бесконечно рекурсивный помощник возведения в степень
  • TIFF-изображения SGILog (LogLuv) в 32-битных сборках идут через те же исправленные математические помощники
  • 32-битный помощник округления вниз, которым пользуются кодеки TIFF, теперь округляет отрицательные значения к минус бесконечности и принимает большие величины без ошибки переполнения, как 64-битные сборки

Version 2.770.2

Changed

  • При рендеринге изображение, нарисованное в половину пиксельного размера или меньше, сразу после декодирования ужимается до точного размера рисования усреднением по площади, вместо хранения в полном размере и растягивания при рисовании
  • Ужатое изображение помещается в кэш декодированных изображений: группа прозрачности, которая рисуется дважды — на чёрном и на белом — ради восстановления альфы, теперь декодирует такое изображение один раз вместо раза на проход, и повторный рендеринг той же страницы тоже
  • Изображение с мягкой маской комбинируется со своей маской попиксельно в размере рисования, где маска тоже ужата; это избавляет от построения и premultiply полной копии большого изображения и его маски, а край маски больше не сэмплируется по ближайшему соседу
  • На образцовой странице с замаскированным изображением 4229 x 4629, нарисованным примерно в четверть размера внутри такой группы, рендеринг занял около 1,8 секунды вместо 4,5
  • Stencil-маски сохраняют полное разрешение, а публичные методы декодирования областей продолжают возвращать задокументированные размеры

Version 2.770.1

Fixed

  • В 64-битных сборках рендеринг страницы с группой прозрачности падал с ошибкой индекса списка, когда группа не задавала собственной мягкой маски, — это была регрессия версии 2.769.3; такие страницы снова рендерятся

Version 2.770.0

Added

  • Новое свойство RenderColorimetricLuminosityMasks выбирает, как светимостная мягкая маска превращает цвет в значения маски, когда её группа использует цветовое пространство на базе CIE (CalGray, CalRGB, Lab или ICCBased)
  • Значение true берёт CIE Y так, как описывает ISO 32000-1 11.5.3; растры, отрендеренные при двух настройках, кэшируются раздельно

Changed

  • По умолчанию светимостная маска теперь взвешивает разрешённый цвет своей группы как DeviceRGB, каково бы ни было цветовое пространство, — как поступают распространённые просмотрщики PDF. CIE Y измеряется по линейной шкале, поэтому серый середины шкалы в группе ICC или калиброванной маскировался лишь примерно на пятую часть, и спадающие тени и затухания выходили куда светлее, чем в других просмотрщиках
  • Фоновый цвет /BC маски следует той же настройке, что и закраска внутри группы маски
  • Маски, чья группа использует аппаратное цветовое пространство, рендерятся как раньше

Version 2.769.3

Fixed

  • Группа прозрачности, нарисованная с режимом смешивания помимо Normal — например Multiply-тени, которые экспортируют дизайн-инструменты, — теперь смешивает собственный цвет и альфу с фоном (ISO 32000-1 11.3.6 и 11.4.8). Там, где группа была частично прозрачной, её пиксели уже содержали фон, который затем смешивался сам с собой: Multiply-тень выходила слишком тёмной и в цвете фона
  • Содержимое группы прозрачности стартует с режима смешивания Normal, поскольку режим смешивания применяется к группе как к целому (11.6.6). Раньше сохранялся режим, которым группа рисовалась, поэтому изолированная группа умножала своё содержимое на пустое начало и рисовалась чёрным
  • Мягкая маска, заданная в том же состоянии графики, что и режим смешивания, рисует свою группу маски с нормальным смешиванием (11.6.5.2); режим смешивания делал белую группу маски чёрной и прятал то, что маска должна была показать
  • Чтобы найти альфу неизолированной группы, группа рисуется дважды — на чёрном и на белом, — когда её собственные состояния графики смешиваются нормально; такие страницы рендерятся несколько медленнее

Version 2.769.2

Changed

  • Изображение с мягкой маской декодируется в том размере, в каком рисуется, как уже было для изображения без маски, и его маска декодируется в том же размере; JPEG-маска идёт через JPEG-декодер уменьшенного размера вместо декодирования в полном
  • Изображение и его маска всегда декодируются целиком, поэтому маска не может съехать относительно изображения, а отсечение сохраняет нарисованное в видимой части
  • На странице с теневым изображением 4229 x 4629 и JPEG-маской 2114 x 2314, нарисованной шириной около 1000 пикселей, рендеринг при 72 dpi занял 1,6 вместо 3,7 секунды
  • DecodeLoadedImageRegionAtResolution возвращает целое изображение формата без регионального декодера как декодированное, без ещё одного копирования

Version 2.769.1

Changed

  • Мягкие маски строятся быстрее: построение маски больше не держит вторую копию всей страницы для сравнения, за которую страницы с множеством масок — вроде градиентов и спадающих теней, экспортируемых дизайн-инструментами, — платили по разу на каждую маску
  • Светимостные маски над калиброванным или ICC-пространством смешивания берут кривую sRGB из таблицы вместо вычисления её для каждого канала каждого пикселя, а серое содержимое маски, общий случай, конвертируется через единую таблицу
  • Страница 1125 x 1600 примерно с двадцатью мягкими масками рендерится примерно на пятую часть быстрее; отрендеренные пиксели не меняются

Version 2.769.0

Changed

  • Задание Width или Height страницы больше не прячет ошибки: неудача теперь бросает исключение, а не молча не применяет размер, а задание размера страницы, чей холст уже закрыт, бросает новый EHPDFPageClosedError с сообщением, объясняющим причину
  • После такой неудачи страница больше не остаётся в состоянии, где последующие смены размера обновляют только её MediaBox, а не размер страницы, используемый для рисования

Fixed

  • Изменение размера страницы загруженного PDF больше не затирает другие объекты: MediaBox, чьи числа — отдельные объекты, или массив MediaBox, разделяемый несколькими страницами, копируется для изменяемой страницы, поэтому прочие страницы сохраняют свой размер
  • Изменение размера загруженной страницы, чей MediaBox содержит меньше четырёх чисел, теперь записывает полный MediaBox с новым размером; раньше новый размер игнорировался

Version 2.768.20

Fixed

  • Извлечение текста больше не заходит в Form XObject, который рисует сам себя — напрямую или через другие формы; такая форма перечитывалась на каждом уровне вложенности, повторяя свой текст до двенадцати раз, а форма, рисовавшая себя дважды, требовала 4 096 проходов
  • Текст Form XObject, выходящий за ограничивающий бокс формы, который его обрезает, больше не является частью текста страницы

Version 2.768.19

Changed

  • Большие документы снова грузятся быстрее: обход дерева страниц больше не ищет все загруженные объекты для каждой страницы, а проверка шифрования в LoadFromFile с AutoDecrypt читает файл через тот же буфер, что и загрузка. 56-мегабайтный PDF Reference 1.7 теперь грузится около 8 секунд вместо 22

Version 2.768.18

Fixed

  • Рендеринг страниц теперь находит установленные шрифты, которые Windows сообщает под локализованным именем, например Microsoft YaHei на китайской Windows или Yu Mincho на японской; текст такими шрифтами рисовался подставным шрифтом, когда PDF не встраивал их
  • Имена шрифтов, записанные без пробелов, теперь совпадают с семействами Windows, склеивающими часть слов: MicrosoftYaHei для Microsoft YaHei, MicrosoftJhengHei для Microsoft JhengHei и MSPGothic для MS PGothic; они искались с пробелом перед каждой заглавной буквой и не находились никогда
  • Рендерер запоминает, какие имена шрифтов установлены, поэтому документы со многими неустановленными шрифтами больше не опрашивают Windows по каждому имени на каждой странице

Version 2.768.17

Changed

  • Большие документы грузятся намного быстрее: телеметрия операций теперь сэмплирует память не чаще раза в 10 мс внутри операции, а не на каждом объекте, который читает парсер, — а сэмпл обходил каждый блок менеджера памяти. 1 236-страничный PDF Reference 1.6 грузится около 2,5 секунды вместо 30, а 56-мегабайтный PDF Reference 1.7 — около 22 секунд вместо четырёх с лишним минут
  • Замедление росло с размером собственной кучи приложения, поэтому приложения, держащие много памяти, выигрывают больше всех
  • UpdateOperationTelemetrySample получает необязательный параметр Force, берущий сэмпл вне всякого интервала; конец каждой операции по-прежнему берёт один

Version 2.768.16

Fixed

  • Загрузка пустого файла больше не зависает; LoadFromFile раньше крутился вечно, читая назад от начала файла
  • Файл, в котором не находится ни одна страница, — пустой файл, простой текст или случайные байты, — больше не загружается как одна или три пустые страницы, угаданные по его размеру; LoadFromFile теперь возвращает 0 или бросает исключение, как для прочих нечитаемых файлов
  • Зашифрованный файл, чьи страницы лежат в зашифрованных объектных потоках, при загрузке без пароля теперь бросает исключение с сообщением о необходимости пароля вместо загрузки пустой страницей; загружайте его перегрузкой, принимающей пароль

Version 2.768.15

Fixed

  • Текст страницы больше не повторяет символы, которые закрашиваются повторно поверх себя, — как в логотипах с наложением красок и в псевдожирном, сымитированном двойной отрисовкой текста с малым смещением; такой текст извлекался дважды, например «Bold wordsBold words», и поиск по нему мог проваливаться
  • Все виды извлечения текста — текстовое, колонок, layout и семантическое — читают такой символ один раз; список глифов по-прежнему сообщает каждый нарисованный глиф

Version 2.768.14

Fixed

  • Имена глифов из полного Adobe Glyph List теперь разрешаются при извлечении текста и рендеринге, в том числе лигатуры fi, fl, ff, ffi и ffl и имена afii, которыми пользуются старые кириллические, еврейские и арабские шрифты; кодировка шрифта, называвшая такие глифы, давала неверные символы — например «defined» извлекалось как «deÞned»

Version 2.768.13

Changed

  • LoadFromFile читает файлы меньше LocalFileMappingThreshold (по умолчанию 8 MB), и все файлы при выключенном или недоступном маппинге, через 64-килобайтный буфер чтения; файлы с множеством объектов и классической таблицей перекрёстных ссылок грузятся куда быстрее — например 912-страничный PostScript Language Reference Manual примерно за секунду вместо почти трёх минут

Version 2.768.12

Fixed

  • Извлечение текста теперь расставляет глифы CID-шрифтов (Type 0), чей массив ширин /W не упорядочен по CID; большинство глифов получали полную ширину em по умолчанию, поэтому строки выезжали за край страницы, а их концы терялись из извлечённого текста и поиска

Version 2.768.11

Fixed

  • Буквы с диакритикой во встроенных шрифтах CFF (Type 1C), собранные из базовой буквы и акцента, — так устроены многие шрифты, конвертированные из Type 1, — теперь отрисовываются; ü и é раньше оставались пустыми, и в словах вроде «München» зияла дыра
  • В экспорте SVG со встроенными шрифтами эти буквы теперь тоже выводятся целиком

Version 2.768.10

Fixed

  • Составные глифы встроенных шрифтов TrueType теперь ставят каждую часть по её собственному смещению: раньше буквы с диакритикой вроде é и Å теряли акцент, а фигурные двойные кавычки выглядели как одинарная кавычка с дырой следом
  • В экспорте SVG со встроенными шрифтами эти глифы теперь тоже полные

Version 2.768.9

Fixed

  • Изображения с пометкой /Interpolate false при отрисовке мельче собственного разрешения теперь усредняются; раньше из них брали один пиксел из нескольких, поэтому диаграммы, вставленные картинками, показывали рваные тёмные подписи осей и ломаные тонкие линии там, где другие просмотрщики рисуют их гладкими
  • Увеличенные изображения с /Interpolate false сохраняют жёсткие пиксельные края, как и раньше

Version 2.768.8

Fixed

  • Текст, обводимый штрихом уже пиксела, — так документы изображают псевдожирный, — теперь отрисовывается заданной шириной; раньше штрих был всегда целый пиксел, и такие заголовки выглядели смазанными и куда жирнее, чем в других просмотрщиках
  • Малые глифы встроенных и установленных шрифтов в режимах отрисовки текста 1 и 2 обводятся со сглаживанием, цветом обводки и после заливки

Version 2.768.7

Fixed

  • Вызов ProcessObjectStreamsForDecompression для загруженного документа больше не выбрасывает объектные потоки, прочитанные при загрузке: сжатые объекты остаются доступны ExtractRawObjectFromStream и ExtractObjectFromStream, тогда как раньше не читался ни один
  • Когда метод сканирует файл сам — как для документа с классической таблицей перекрёстных ссылок, — он теперь находит объектный поток, идущий сразу за другим потоком, и берёт число объектов и смещения из его собственного словаря
  • ExtractRawObjectFromStream снова декодирует объектный поток, если кеш объектных потоков его уже вытеснил, вместо возврата пустого результата

Version 2.768.6

Fixed

  • Демка Stamp теперь успешно собирается под Win64

Version 2.768.5

Fixed

  • На китайских, японских и корейских редакциях Windows документы с потоками перекрёстных ссылок, чьи словари держат бинарные строки — например контрольные суммы вложенных файлов, — загружаются за доли секунды; портфель на 4 MB с девятью вложенными PDF открывался две минуты
  • Парсер теперь ищет ключевые слова в сырых байтах файла, а не в тексте, прогнанном через кодовую страницу Windows, поэтому бинарные данные рядом с ключевым словом больше не могут его спрятать или сдвинуть с места

Version 2.768.4

Fixed

  • Содержимое внутри Form XObject теперь отрисовывается с той непрозрачностью, soft mask и режимом смешивания, которые оно задаёт само; раньше всё внутри формы рисовалось с полной непрозрачностью, поэтому полупрозрачные водяные знаки и штампы выходили сплошными
  • Форма, задавшая собственную непрозрачность, по-прежнему компонуется один раз целиком, как и раньше

Version 2.768.3

Fixed

  • Текст страницы теперь включает текст, который страница рисует через Form XObject: колонтитулы, водяные знаки и штампы; раньше возвращался только текст из собственного содержимого страницы
  • Текст формы появляется там, где форма нарисована, размещается её матрицей и читается её собственными шрифтами; формы, вложенные в формы, тоже обходятся
  • Это касается обычного, layout-, колоночного и семантического текста страницы; извлечение на уровне глифов по-прежнему возвращает только глифы собственного содержимого страницы, чьи позиции указывают в это содержимое

Version 2.768.2

Fixed

  • EncryptFile и DecryptFile с AES-256 больше не портят встроенные файлы шрифтов, чей словарь перечисляет /Length1 раньше /Length, — так пишут Ghostscript и другие инструменты; раньше такие шрифты шифровались как один байт, и результат становился нечитаемым
  • Потоки, чья длина хранится в сжатом объектном потоке, проходят шифрование и расшифрование AES-256 со всеми своими данными; раньше у такого потока мог потеряться последний байт

Version 2.768.1

Fixed

  • Документы, чьи длины потоков спрятаны в сжатых объектных потоках, — так пишет Ghostscript, — теперь загружаются целиком; раньше каждый поток содержимого страницы такого файла отбрасывался, страницы рисовались пустыми и не давали текста
  • Поток, чья длина указывает на несуществующий объект или не задана вовсе, теперь читается до своего конечного маркера вместо отбрасывания

Version 2.768.0

Added

  • BuildLoadedPageSVG и SaveLoadedPageAsSVG принимают необязательный параметр EmbedFonts; по умолчанию он выключен, и существующие вызовы экспортируют в точности как раньше
  • При EmbedFonts = True текст в шрифтах, чья программа TrueType или CFF встроена в PDF, рисуется из собственных контуров глифов шрифта, поэтому SVG выглядит одинаково на системах, где этих шрифтов не установлено
  • Контур каждого глифа пишется один раз и переиспользуется везде, где символ встречается, — на насыщенных текстом страницах это сдержит размер файла
  • Текст остаётся в SVG прозрачным текстом поверх контуров, так что его по-прежнему можно выделять, искать и читать экранным диктором
  • Заливка, обводка и заливка с обводкой, ширины линий, повёрнутый или масштабированный текст и текст, работающий путём отсечения, выходят так же, как в отрисованной странице
  • Невстроенные шрифты, программы шрифтов Type 1 и вертикальный CJK-текст остаются обычным текстом SVG

Version 2.767.4

Fixed

  • Контурный текст и текст с заливкой и контуром (режимы отрисовки текста 1 и 2) в невстроенных шрифтах при отрисовке теперь соблюдают ширину линии; раньше каждый контур выходил шириной в один пиксел, какова бы ни была ширина линии
  • Такие контуры теперь рисуются из точных форм глифов установленного шрифта в их точных позициях — как уже было с заливаемым текстом
  • Символы, которых в установленном шрифте нет и которые Windows берёт из запасного шрифта, при обводке тоже держат ширину линии

Version 2.767.3

Fixed

  • Текст в невстроенных шрифтах теперь рисуется теми символами, которые называет его кодировка. Коды символов уходили в установленный шрифт без изменений, а тот читает их в собственном наборе, поэтому любая запись /Differences и коды, где StandardEncoding или MacRomanEncoding расходятся с набором Windows, рисовали неверные символы — например прямые кавычки вместо фигурных в шрифтах Type 1 без кодировки
  • На китайских, японских и корейских редакциях Windows буквы с диакритикой, фигурные кавычки, знак копирайта и прочие символы с кодом выше 127 в невстроенных шрифтах, начиная с версии 2.766.83, рисовались вопросительными знаками; теперь они снова читаются в наборе символов установленного шрифта
  • Символьные шрифты сохраняют собственное отображение кодов

Version 2.767.2

Fixed

  • Крупные глифы встроенных шрифтов теперь тоже отрисовываются со сглаживанием. Глифы крупнее 64 пикселов — например заголовки и титулы при печатных разрешениях — заливались без него и показывали рваные края; теперь они сглаживаются до 256 пикселов, а более крупный текст установленных шрифтов по-прежнему идёт через системный вывод текста со сглаживанием

Version 2.767.1

Fixed

  • Извлечение layout-текста, колоночного и семантического текста теперь меряет страницу в единицах страницы. Раньше позиции сравнивались с кеглем, заданным оператором Tf, и со сдвигами текстового пространства, которые во множестве документов, размеряющих текст через текстовую матрицу, составляют лишь малую долю реальных расстояний, — из-за этого layout-текст размазывал каждую букву на несколько колонок, колоночный терял все пробелы между словами, а семантический сажал чуть ли не каждое слово на отдельную строку
  • Все три теперь возвращают только текст внутри видимой области и разделяют слова, которые документ расставляет сдвигом текстовой позиции, — как обычный текст страницы
  • Layout-текст держит буквы слова вместе: раньше широкие буквы вроде m или W проталкивали пробел внутрь слова
  • Семантический текст больше не ставит пустую строку после каждой строки одноколоночной страницы: серия строк полной ширины образует одну зону, и смена зоны разделяет строки, только когда они отстоят друг от друга больше чем на межстрочный интервал
  • Справка по этим методам описывает, что они возвращают, а колоночный метод показывает свой полный синтаксис

Version 2.767.0

Added

  • У LoadFromFile и LoadFromStream появились перегрузки с параметром AutoDecrypt. При AutoDecrypt = True документ, зашифрованный пустым пользовательским паролем, — таковы документы, которые лишь ограничивают печать, копирование или редактирование, — открывается в памяти расшифрованным, как его открывают просмотрщики, поэтому текст можно извлекать, а страницы отрисовывать и экспортировать без ввода пароля
  • Документы, требующие пароль, и незашифрованные документы загружаются в точности как обычными перегрузками; открывает ли пустой пароль документ, проверяется по нескольким небольшим диапазонам файла ещё до загрузки
  • Как и с парольными перегрузками, документ, открытый таким способом, больше не зашифрован в памяти, а сохранение пишет незашифрованную копию

Version 2.766.83

Changed

  • Мелкий текст в невстроенных шрифтах — стандартных 14 шрифтах, установленных шрифтах Office и китайских — теперь отрисовывается из контуров глифов без хинтинга в точной позиции и с тем же сглаживанием, что и у встроенных шрифтов. Прежний системный вывод текста ставил каждый глиф на целый пиксел и подгонял его форму под пиксельную сетку, поэтому мелкий текст стоял неровно и выглядел кляксовидно; отрисованные страницы теперь заметно ближе к формам и межбуквенным расстояниям других просмотрщиков
  • Глифы, которых установленный шрифт не имеет, и крупные глифы по-прежнему рисуются системным выводом текста, который умеет доставать недостающие символы из связанных шрифтов

Fixed

  • Малые глифы встроенных шрифтов рисуются быстрее: растровые карты за их сглаживанием переиспользуются вместо создания новой на каждый глиф

Version 2.766.82

Fixed

  • Текст, рисуемый установленными шрифтами в отрисованных страницах, теперь использует полутоновое сглаживание. Раньше он следовал системной настройке ClearType, и чёрный текст в отрисованных битмапах нёс красно-синие ореолы, зависевшие от машины и остававшиеся в сохранённых, напечатанных или масштабированных изображениях

Version 2.766.81

Fixed

  • Мелкий текст во встроенных шрифтах CFF и OpenType CFF теперь отрисовывается со сглаживанием, как уже было с текстом TrueType. Эти глифы заливались без сглаживания, поэтому при малых кеглях и обычных экранных разрешениях штрихи уже пиксела исчезали, а основной текст распадался на фрагменты; формы и документы, набранные шрифтами вроде Helvetica Neue, теперь читаются при 72 DPI

Version 2.766.80

Changed

  • Извлечение текста страницы возвращает только текст, который страница показывает. Глифы за пределами видимой области — crop box внутри media box — пропускаются, поэтому типографские метки, служебные строки и прочее содержимое за границами обрезанной страницы больше не попадают в извлечённый текст. Извлечение на уровне глифов по-прежнему возвращает каждый глиф с его позицией

Version 2.766.79

Fixed

  • Извлечение текста страницы больше не рвёт строку на приподнятой надстрочной букве или чуть сдвинутой базовой линии в тексте, размер которого задаётся через текстовую матрицу. Новая строка начиналась всякий раз, когда текст сдвигался вверх или вниз на половину кегля, заданного оператором Tf, — в таких документах это часто 1, так что хватало сдвига на полпункта
  • Повернутый текст — подписи, бегущие вдоль края страницы, диагональные водяные знаки — больше не раскладывает каждый символ на отдельную строку. Строки теперь различаются по смещению поперёк направления текста, сравниваемому с половиной высоты текста на странице

Version 2.766.78

Fixed

  • Когда экспорт SVG отступает к обобщённому семейству шрифтов для неустановленного шрифта, он теперь сперва называет распространённую гарнитуру этого класса: Times New Roman перед serif, Arial перед sans-serif и Courier New перед monospace. Браузер выбирает гарнитуру для голого обобщённого семейства по собственным языковым настройкам, и китайские или японские браузеры брали CJK-шрифты, чьи широкие латинские буквы наезжали друг на друга в позициях, взятых из PDF

Version 2.766.77

Fixed

  • Экспорт SVG теперь называет установленные китайские семейства шрифтов для шрифтов, известных под legacy-именами GB2312, — например KaiTi_GB2312 или его китайское написание. Приложения Windows добираются до этих шрифтов через системные подстановки шрифтов, браузеры — нет, поэтому такой текст показывался шрифтом по умолчанию браузера
  • Шрифт, названный только на одном языке, получает и второе имя установленного семейства — например SimHei вместе с его китайским именем — и обобщённое семейство, совпадающее по стилю

Version 2.766.76

Added

  • У THPDFGlyphRecord появились GlyphEndX и GlyphEndY — конец собственной ширины глифа вдоль базовой линии в координатах страницы, без межбуквенных и межсловных интервалов

Fixed

  • Извлечение текста страницы теперь разделяет слова, которые документ расставляет сдвигом текстовой позиции вместо показа символа пробела. Многие производители пишут [(PDF)-240(Reference)] или ставят каждое слово собственным оператором позиционирования, и такие слова слипались в PDFReference
  • Пробел добавляется там, где зазор после собственной ширины глифа превышает 0,15 высоты текста; мера берётся в единицах страницы, чтобы текст, размеренный через текстовую матрицу, обрабатывался так же, как текст, размеренный кеглем
  • Кернинг, слегка ослабенный интервал, поджатый межбуквенный интервал, который позиционные корректировки возвращают обратно, текст с наложением красок и настоящие символы пробела остаются как есть, а между двумя китайскими, японскими или корейскими символами пробел не добавляется, как бы далеко их ни расставила выключка

Version 2.766.75

Fixed

  • Извлечение текста, экспорт SVG и отрисовка теперь распознают имена глифов шрифта Symbol — такие как copyrightsans, registerserif, trademarksans и части крупных круглых и фигурных скобок (parenlefttp, braceex, integralex, ...). Сабсетные шрифты Symbol обычно перекодируют эти имена, и символы выходили сырыми управляющими кодами
  • Распознаются и все имена глифов ITC Zapf Dingbats от a1 до a206, поэтому галочки, крестики, стрелки и обведённые в круг цифры, которые шрифт выбирает этими именами, — так часто делают поля форм и маркированные списки, — извлекаются своими символами Unicode
  • При подборе имени глифа для символа по-прежнему предпочитается общее имя — вроде arrowright или spade — имени из ZapfDingbats

Version 2.766.74

Fixed

  • HPDFExtractGlyphsViaDevice больше не падает с недопустимой операцией над указателем. Создаваемое им устройство извлечения текста живёт по счётчику ссылок, а функция вдобавок освобождала его явно, поэтому каждый вызов заканчивался вторым освобождением устройства

Version 2.766.73

Fixed

  • Извлечение текста теперь восстанавливает текстовое состояние по Q, как требует спецификация (ISO 32000-1 9.3.1). Раньше восстанавливалось только преобразование, поэтому шрифт, межбуквенный интервал или интерлиньяж, заданные внутри q ... Q, продолжали действовать для последующего текста
  • Если шрифт, выбранный внутри q ... Q, использовал двухбайтовые коды, а шрифт снаружи — однобайтовые, текст после Q декодировался как двухбайтовый и терялся. Word и подобные производители пишут страницы именно так; обычно при этом терялись отточия в оглавлении и латинские слова между китайскими фрагментами
  • Исправление покрывает и API текста страницы, и интерфейс устройства извлечения текста

Version 2.766.72

Fixed

  • Текст, нарисованный после RestoreState, теперь всегда получает выбранный шрифт. Страница пропускает выбор шрифта, повторяющий последний записанный, но не учитывала, что RestoreState (оператор Q) возвращает читателя к шрифту, действовавшему до SaveState. Текст после RestoreState в шрифте, выбранном внутри пары, выходил без шрифта или с чужим, поэтому просмотрщики могли его выбросить, а извлечение текста не могло его прочесть
  • Межбуквенный и межсловный интервал, горизонтальное масштабирование и интерлиньяж следуют SaveState и RestoreState тем же образом: значение, заданное заново после RestoreState, записывается, а не пропускается, хотя читатель уже вернулся к прежнему значению
  • Выбор шрифта Type 3 больше не приводит к пропуску следующего выбора предыдущего шрифта
  • Задевало документы XPS, конвертированные в PDF: каждая цепочка глифов рисуется внутри собственного сохранённого графического состояния

Version 2.766.71

Fixed

  • Извлечение текста и экспорт SVG читали коды простого шрифта (Type 1, TrueType или Type 3) как два байта, если его CMap /ToUnicode объявлял двухбайтовое кодовое пространство, — так некоторые производители пишут каждый шрифт. Коды простых шрифтов всегда однобайтовые (ISO 32000-1 9.6.6), поэтому каждая пара символов принималась за один неизвестный код, и большая часть текста исчезала, оставляя лишь цепочки одиночных символов

Version 2.766.70

Fixed

  • Экспорт SVG сдвигал текст на операнды Td, TD, T*, ' и " в единицах страницы вместо текстового пространства (ISO 32000-1 9.4.2). У текста, чей размер задаётся текстовой матрицей, — 1 Tf с масштабированной Tm, как часто пишут текстовые процессоры, — строки громоздились друг на друга у первой базовой линии; теперь он разложен как в PDF
  • Та же поправка относится к извлекателю текста на content-устройствах THPDFTextExtractDevice

Version 2.766.69

Fixed

  • Рендерер страниц передавал Windows имена шрифтов с escape-последовательностями #xx как есть, поэтому невстроенные шрифты с такими именами — обычное дело для CJK-шрифтов вроде KaiTi_GB2312, записанного китайскими иероглифами, — не совпадали ни с одним установленным шрифтом и рисовались подставной гарнитурой. Теперь escape-последовательности декодируются; имена в UTF-8 сохраняют свои символы, прочие байты читаются в системной кодовой странице

Version 2.766.68

Fixed

  • Экспорт SVG писал имена шрифтов с escape-последовательностями #xx самими этими последовательностями, поэтому CJK-имена, хранимые байтами UTF-8, — например имя KaiTi_GB2312 китайскими иероглифами, — доходили до font-family как #e6#a5#b7... и никогда не совпадали с установленным шрифтом. Теперь escape-последовательности декодируются; корректное UTF-8-имя сохраняется, байты других кодировок отбрасываются, как и раньше

Version 2.766.67

Fixed

  • Экспорт SVG не восстанавливал текстовое состояние на Q: шрифт, размер, интервалы, масштабирование, интерлиньяж, подъём и режим отрисовки, заданные внутри q ... Q, перетекали в следующий текст. Страницы, выделяющие заголовок через 2 Tr внутри сохранённого состояния, рисовали весь последующий основной текст обведённым и жирным. Теперь текстовое состояние сохраняется и восстанавливается вместе с остальным графическим состоянием (ISO 32000-1 9.3.1)

Version 2.766.66

Fixed

  • Экспорт SVG обводил текст в режимах отрисовки с обводкой (1, 2, 5 и 6) без ширины обводки, поэтому действовало умолчание SVG — одна единица текстового пространства; текст, который производители PDF делают жирным тонкой обводкой, например 2 Tr 0.25 w, выходил заметно жирнее. Теперь ширина линии переводится из пользовательского пространства в пространство текстового элемента, нулевая ширина даёт линию в один пиксел, а соединение линий сохраняется

Version 2.766.65

Fixed

  • Документы, чей trailer отдаёт /Encrypt прямым словарём вместо ссылки, — так пишут некоторые PDF-генераторы, — загружались как незашифрованные: даже с правильным паролем их страницы рисовались пустыми, извлечение текста и экспорт SVG не возвращали ничего, а SaveLoadedDocument писал повреждённый файл, который выбрасывал /Encrypt, но оставлял зашифрованные потоки. Теперь такие документы открываются, расшифровываются и сохраняются, как документы с косвенным словарём шифрования
  • Загрузчик перекрёстных ссылок обрезал trailer по первому >>, поэтому записи после вложенного словаря в trailer терялись; теперь он читает trailer до парной закрывающей границы

Version 2.766.64

Fixed

  • Отрисовка, экспорт SVG, просмотрщик и печать показывали весь /MediaBox загруженной страницы. Страница показывается и печатается через свой /CropBox, обрезанный до /MediaBox (ISO 32000-1 14.11.2), поэтому страницы с crop box выходили слишком большими, со смещением и с содержимым, которое должно было остаться скрытым
  • RenderLoadedPageToBitmap, тайловый, полосный, метафайлный рендереры и рендерер в контекст устройства, BuildLoadedPageSVG, геометрия страниц, подсветки и снимки областей в просмотрщике, а также печать теперь работают по видимой области; страницы без /CropBox не изменились

Added

  • THotPDF.GetLoadedPageVisibleBox возвращает видимую область загруженной страницы — её /CropBox, обрезанный до /MediaBox
  • THPDFPageDisplayList.CropBox даёт ту же область для скомпилированного display list

Version 2.766.63

Fixed

  • Встроенный список глифов искался на 13 записей короче таблицы, поэтому имена глифов, стоящие в конце сортировки, — y, z, zero, zeta, yen, ydieresis, zcaron и другие — не находились никогда. Извлечение текста игнорировало записи /Differences шрифта, называющие их, а рендерер страниц рисовал y, z и 0 во встроенных шрифтах CFF с WinAnsiEncoding или MacRomanEncoding подставным системным шрифтом
  • Подбор имени глифа для акцента вроде U+0060 возвращал имя капители из MacExpertEncoding (Gravesmall) вместо grave, поэтому во встроенных шрифтах CFF пропускались и эти акценты

Version 2.766.62

Fixed

  • Рендерер страниц принимал ширину линии и длины штрихов пунктира за пикселы устройства вместо единиц пользовательского пространства (ISO 32000-1 8.4.3.2 и 8.4.3.6); линии держали одну и ту же ширину в пикселах на любом разрешении и игнорировали любой масштабирующий cm. Слайды, экспортированные через macOS Quartz, — они обводят фигуры шириной в EMU при масштабе 1/12700 — полностью заливались цветом обводки
  • Ширина обводки и пунктир теперь следуют масштабу CTM, действующего в момент обводки пути, — в том числе для текста, нарисованного в режиме отрисовки с обводкой

Version 2.766.61

Fixed

  • Экспорт SVG пропускал function-based затенения Type 1 (ISO 32000-1 8.7.4.5.2) — и рисуемые оператором sh, и используемые в паттерне затенения; теперь он сэмплирует функцию затенения по её /Domain во встроенное PNG-изображение, размещаемое через /Matrix затенения и обрезаемое по его /BBox, с фоновым цветом паттерна под ним

Version 2.766.60

Fixed

  • Рендерер страниц красил цвет /Background mesh-затенения, показываемого оператором sh, — PDF его игнорирует (ISO 32000-1 8.7.4.5.1), — поэтому вся область отсечения вокруг сетки принимала этот цвет
  • Фоновый цвет function-based, осевых и радиальных паттернов затенения рендерер страниц не красил; теперь он заливает область паттерна до затенения, так что фон виден всюду, куда затенение не дотягивается
  • Экспорт SVG теперь красит фоновый цвет паттернов затенения так же и, как рендерер, игнорирует его для sh

Version 2.766.59

Fixed

  • Рендерер страниц игнорировал /BBox function-based, осевых и радиальных затенений (ISO 32000-1 8.7.4.5.1); растянутое затенение, нарисованное оператором sh или использованное в паттерне затенения, покрывало всю область отсечения вместо того, чтобы остановиться на своей рамке. Mesh-затенения её и так соблюдали

Version 2.766.58

Fixed

  • Экспорт SVG писал текст в шрифтах Type 3 как SVG-текст установленным шрифтом, поэтому страницы, рисующие свои тексты и символы глифовыми процедурами, показывали неверные формы; теперь он рисует процедуру каждого глифа, размещаемую через /FontMatrix шрифта, кегль и текстовую матрицу (ISO 32000-1 9.6.5)
  • Глифы Type 3, начинающиеся с d1, красятся текущим цветом заливки, а глифы, задающие собственные цвета, их сохраняют

Version 2.766.57

Fixed

  • Извлечение текста и экспорт SVG принимали /Widths шрифта Type 3 за тысячные доли em, хотя те лежат в глифовом пространстве и масштабируются /FontMatrix шрифта (ISO 32000-1 9.6.5); у шрифта с матрицей [0.01 0 0 0.01 0 0] глифы ставились на десятую долю своего продвижения, из-за чего в извлечённом тексте слипались и слова

Version 2.766.56

Fixed

  • Отрисовка загруженной страницы читала каждый шрифт Type 0 так, будто тот использует Identity-H: два байта на код и свой CID на каждый код. Шрифты, закодированные предопределёнными CMap UCS2 и UTF16 китайской, японской и корейской коллекций, например UniGB-UCS2-H, или встроенным CMap, теперь отображают коды в CID, поэтому ширины /W и встроенные глифы ищутся по правильным CID; раньше, например, строчные латинские буквы в тексте STSong-Light разъезжались на полный em
  • Коды читаются по диапазонам кодового пространства CMap, поэтому однобайтовые и четырёхбайтовые (суррогатная пара) коды читаются целиком, а имена с суффиксом -V включают вертикальное письмо

Version 2.766.55

Fixed

  • Отрисовка загруженной страницы рисовала невстроенные шрифты со стилевой частью или PostScript-написанием в имени — например TimesNewRoman,Bold, TimesNewRomanPS-BoldMT, Arial,BoldItalic или SegoeUI-Semibold — подставной гарнитурой; теперь семейственная часть имени ищется среди установленных шрифтов, в том числе с пробелами между словами (Times New Roman, Segoe UI), а стиль берётся из имени и дескриптора шрифта

Version 2.766.54

Fixed

  • Стандартные шрифты без массива /Widths — ISO 32000-1 9.6.2.2 разрешает это для стандартных 14 шрифтов — раскладывались с фиксированным продвижением в пол-em при отрисовке загруженной страницы, экспорте её в SVG или извлечении текста, поэтому буквы сбивались в кучу; семейства Helvetica, Times и Courier, в том числе под именами Arial, TimesNewRoman и CourierNew, теперь берут ширины из установленных Arial, Times New Roman и Courier New, у которых те же метрики
  • Стандартный шрифт Type 1 без /Encoding теперь декодируется через подразумеваемый StandardEncoding, поэтому, например, код 39 читается как правая одинарная кавычка

Version 2.766.53

Fixed

  • Отрисовка загруженной страницы игнорировала массив /Widths шрифта, когда тот был косвенным объектом, — так пишут многие производители, — и раскладывала текст с фиксированным продвижением в пол-em; теперь такой текст распределяется по своим ширинам
  • Дескрипторы шрифтов, заданные косвенными объектами, теперь читаются при отрисовке, поэтому флаги ForceBold и Italic и угол наклона невстроенных шрифтов вступают в силу
  • Флаг SmallCap больше не делает текст жирным: жирность теперь определяется флагом ForceBold (ISO 32000-1 Table 123)

Version 2.766.52

Fixed

  • Отрисовка загруженной страницы теперь строит отсечение по тексту в режимах отрисовки 4-7 (ISO 32000-1 9.3.6): глифы становятся частью пути отсечения в конце текстового объекта, пока графическое состояние не восстановлено. Раньше текст режима 7 игнорировался, и затенение или изображение, которые должны были проступать сквозь буквы, заливали всю область, а режимы 4-6 красили текст без отсечения
  • Текст отсечения берётся из тех же контуров глифов, что и крашеный текст, включая встроенные шрифты и глифы Type 3

Version 2.766.51

Fixed

  • Экспорт SVG теперь строит отсечение по тексту в режимах отрисовки 4-7 (ISO 32000-1 9.3.6): глифы становятся clip path SVG от конца текстового объекта до конца графического состояния, поэтому затенение или изображение, нарисованные через текст, видны только внутри букв
  • Текст в режиме отрисовки 7 больше не теряется безо всякого отсечения, а режимы 4-6 по-прежнему заливают или обводят текст, как режимы 0-2

Version 2.766.50

Fixed

  • Осевые, радиальные и function-based затенения, чей /Function — массив функций с одним выходом, по одной на цветовую компоненту (ISO 32000-1 8.7.4.5.1), не рисовались при отрисовке загруженной страницы; теперь рисуются — функции массива заданы и прямо, и косвенными объектами
  • Экспорт SVG пишет такие осевые и радиальные затенения градиентами, в том числе когда они заливают путь через паттерн затенения

Version 2.766.49

Fixed

  • Экспорт SVG писал жирный и курсивный текст прямым начертанием: теперь текст получает font-weight="bold" и font-style="italic" из стилевой части имени шрифта, например Arial-BoldMT, Helvetica-Oblique или MinionPro-It, и из веса, флагов и угла наклона в дескрипторе шрифта
  • Шрифты вне стандартных 14 семейств писались со стилевой частью прямо в имени семейства (SegoeUI-Semibold), с которым не совпадает ни один установленный шрифт; теперь семейство называется само по себе и с пробелами между словами (SegoeUI, Segoe UI), а следом идёт обобщённое семейство по флагам дескриптора или имени

Version 2.766.48

Fixed

  • Экспорт SVG рисовал содержимое Form XObject чёрным вместо цветов заливки и обводки, действующих там, где форма рисуется (ISO 32000-1 8.10.1); теперь Q внутри формы восстанавливает и эти цвета
  • Content-устройства могут начинать вложенное содержимое с цветов вызывающего через новый интерфейс IHPDFContentInheritedColorDevice

Version 2.766.47

Added

  • Экспорт SVG теперь заливает пути с мозаичным паттерном SVG-элементом <pattern>, повторяющим ячейку паттерна с шагами XStep и YStep и обрезанным по /BBox ячейки; раньше такие пути заливались чёрным или держали прежний цвет
  • Неокрашенные мозаичные паттерны (PaintType 2) красят ячейку цветом, заданным вместе с паттерном, — например компонентами в /CS0 cs 0 0 1 /P1 scn
  • Пути, залитые паттерном затенения, получают осевое, радиальное или mesh-затенение паттерна, обрезанное по пути
  • Матрица паттерна применяется в пространстве страницы или формы, использующей паттерн (ISO 32000-1 8.7.2), поэтому паттерны не масштабируются и не двигаются вместе с текущей матрицей преобразования, а Q возвращает паттерн, сохранённый оператором q
  • Content-устройства могут получать выборы паттернов через новый интерфейс IHPDFContentPatternDevice

Version 2.766.46

Added

  • Изображения с массивом цветоключевой маски /Mask (ISO 32000-1 8.9.6.4) теперь маскируются при отрисовке загруженной страницы: пикселы, чьи компоненты целиком попадают в ключевые диапазоны, остаются непрокрашенными, и сквозь них проступает страница
  • Экспорт SVG применяет те же цветоключевые маски и пишет такие изображения как PNG с альфа-каналом
  • Ключ сравнивается с отсчётами так, как они хранятся, поэтому Indexed-изображение маскируется по индексу палитры, даже когда две записи делят один цвет, а изображения с 1, 2 и 4 битами на компоненту покрыты
  • Новый метод DecodeLoadedImageColorKeyMask возвращает маску загруженного изображения чёрно-белым битмапом; он покрывает Flate, LZW и неотфильтрованные изображения, потому что кодеки с потерями точных отсчётов не хранят

Version 2.766.45

Changed

  • CompressDocument и CompressLoadedDocument позволяют каждому объектному потоку держать до 250 объектов вместо 100; меньше, но более крупные контейнеры сжимаются лучше и требуют меньше словарей
  • Загруженные PDF, уже записанные компактно с объектными потоками, теперь выходят примерно размером с оригинал, большинство — чуть меньше, а не чуть больше
  • Лимит, заданный через ConfigureAdaptiveObjectStreamPacking, сохраняется, CompressDocument возвращает лимит на EndDoc, а обычные сохранения с объектными потоками держат 100 объектов на контейнер

Version 2.766.44

Changed

  • Поток перекрёстных ссылок файлов, записываемых с объектными потоками, использует минимальную ширину поля, нужную каждому столбцу, поэтому смещения в файлах меньше 16 MB занимают 3 байта вместо 4 (ISO 32000-1 7.5.8.2), а его словарь записывается компактно
  • Файлы, записываемые с потоком перекрёстных ссылок, но без объектных потоков, не меняются

Version 2.766.43

Changed

  • Нешифрованные файлы, записываемые с объектными потоками, теперь упаковывают каталог документа и словарь информации о документе тоже в объектные потоки, где те сжимаются; ISO 32000-1 7.5.7 держит вне их только словарь шифрования
  • Зашифрованные файлы, как и раньше, держат оба словаря на верхнем уровне

Version 2.766.42

Changed

  • Файлы, записываемые с объектными потоками, включая вывод CompressDocument и CompressLoadedDocument, пишут словари и массивы компактно, без пробелов и переводов строк, которые синтаксису PDF не нужны (ISO 32000-1 7.2.2); больше всего выигрывают словари потоков — в объектные потоки они попасть не могут и остаются несжатыми
  • Словари подписей и словарь шифрования хранят разреженную компоновку, поэтому подписание документа, записанного с объектными потоками, работает как раньше
  • Файлы, записанные без объектных потоков, не меняются ни на один байт

Version 2.766.41

Fixed

  • PDF-файлы, записываемые с объектными потоками, больше не начинаются с дважды записанных заголовка %PDF- и строки бинарного комментария; это затрагивало каждое сохранение с UseObjectStreams, CompressDocument или CompressLoadedDocument
  • Просмотрщики терпели повторённый заголовок, но строгие валидаторы могли на него пожаловаться, и он стоил 15 байт на каждый файл

Version 2.766.40

Fixed

  • Загруженные PDF, хранящие в объектном потоке голое число — так многие производители записывают длины потоков, — теперь можно редактировать и сохранять; раньше любое изменение останавливало сохранение с ошибкой «Cannot rewrite compressed object N: the source member could not be loaded»
  • Такое число теперь читается как число; раньше парсер искал за концом члена косвенную ссылку и сдавался, так что член не загружался вовсе
  • Сохранение такого файла без изменений не было затронуто: неизменённый файл копируется как есть

Version 2.766.39

Fixed

  • Штампы-аннотации в документах PDF/A-2 и новее и PDF/X-6 показывали только рамку, без имени штампа вроде APPROVED или CONFIDENTIAL
  • Теперь имя рисуется текущим шрифтом страницы (он встраивается вместе с текстом страницы), заглавными буквами и цветом аннотации, по центру прямоугольника
  • Длинные имена вроде NOTFORPUBLICRELEASE набираются мельче, чтобы уместиться в ширину прямоугольника
  • Документы по-прежнему проходят валидацию PDF/A; штампы в остальных документах записываются как раньше

Version 2.766.38

Added

  • Перегруженный вариант CompressLoadedDocument с опциями делает загруженный PDF как можно меньше, не меняя его вида: отбрасывает неиспользуемые ресурсы страниц, сливает одинаковые шрифты и формы, строит сабсеты встроенных шрифтов, пережимает потоки Flate и пишет следующее сохранение с объектными потоками
  • Каждый шаг выполняется без потерь, изображения не пересэмплируются и не пережимаются; трёхстраничный документ со встроенными полными шрифтами Arial и SimSun худеет примерно с 10 MB до 20 KB, а три других образцовых PDF сжимаются на 15-50%
  • Документы с полями подписи по умолчанию отвергаются и остаются без изменений, потому что каждый шаг переписывает подписанные байты; AllowSignatureInvalidation сжимает их принудительно
  • SubsetLoadedFonts получает опцию CompactTrueTypeSubsets, по умолчанию выключенную: она строит компактные сабсеты TrueType-шрифтов, используемых через шрифты CIDFontType2 с тождественным CID-мэппингом; цветные шрифты и шрифты с /CIDSet сохраняют обычный сабсет
  • Вариант CompressLoadedDocument без параметров сохраняет прежнее поведение — рекомпрессию только нефильтрованных потоков

Version 2.766.37

Added

  • Новое свойство CompressDocument, по умолчанию выключенное: один переключатель, который записывает следующий документ как можно меньше, не меняя его вида
  • Для этого документа он включает сжатие Flate на максимальном уровне, поток перекрёстных ссылок с объектными потоками (ISO 32000-1 7.5.7 и 7.5.8), сабсеттинг шрифтов и компактные шрифтовые сабсеты; трёхстраничный документ со смесью английского и китайского текста худеет примерно с 10 MB до 20 KB
  • Объектным потокам нужен PDF 1.5, поэтому более старое значение Version поднимается до 1.5, если версия не заблокирована; вывод PDF/A-1 сохраняет классическую таблицу перекрёстных ссылок
  • Собственные настройки не трогаются: после EndDoc свойства Compression, CompressionLevel, UseXRefStream, UseObjectStreams, опции сабсеттинга шрифтов и версия читаются обратно такими, как вы их задали
  • Изображения не пересэмплируются и не пережимаются

Version 2.766.36

Added

  • Новое свойство CompactFontSubsetting, по умолчанию выключенное: шрифтовые сабсеты перенумеровывают удерживаемые глифы, поэтому встроенный шрифт больше не несёт запись на каждый глиф исходного шрифта; явный поток /CIDToGIDMap отображает коды глифов страницы в перенумерованные глифы (ISO 32000-1 9.7.4.2)
  • Больше всего худеют CJK-шрифты: два китайских иероглифа в SimSun занимают около 3 KB шрифтовых данных вместо примерно 25 KB, а документ с Microsoft YaHei сжимается со 114 KB до 6 KB
  • Действует на TrueType-шрифты, записываемые как шрифты Type 0 при включённом EnableFontSubsetting, и на шрифт, зарегистрированный через RegisterUnicodeTTF, — до сих пор компактные сабсеты он получал только под PDF/A
  • Содержимое страниц, ширины глифов и извлечение текста не меняются; шрифты OpenType-CFF сохраняют обычный сабсет, и шрифт, который не удаётся сжать, откатывается к нему

Version 2.766.35

Fixed

  • Текст, рисуемый с явным advance для каждого символа, больше не съезжает после символа за пределами Basic Multilingual Plane — например, музыкального знака или эмодзи, — когда зарегистрированный Unicode-шрифт его покрывает. Раньше каждый следующий символ получал advance соседа; теперь символ сдвигается на сумму своих двух записей
  • Блоки выключенного Unicode-текста с такими символами выравниваются по краю блока, а подчёркивание или зачёркивание такого текста получается длиной с сам текст

Version 2.766.34

Added

  • Экспорт SVG теперь рисует маски изображений (/ImageMask), включая inline, как трафареты текущим цветом заливки: части, которые не красятся, остаются прозрачными вместо отрисовки чёрно-белой картинкой
  • Изображения с soft mask /SMask или явным трафаретом /Mask экспортируются как PNG-изображения с альфа-каналом, поэтому скрытые маской части больше не перекрывают то, что лежит за ними
  • Массив /Decode [1 0] на маске или image mask учитывается, а маска, более мелкая, чем её изображение, сохраняет детализацию

Version 2.766.33

Fixed

  • Рендеринг страниц теперь учитывает явный трафарет /Mask изображения: покрытые маской части остаются непрокрашенными вместо отрисовки всего изображения, в том числе когда изображение повёрнуто или отражено
  • Массив /Decode [1 0] на маске меняет на обратное то, какие части остаются
  • Soft mask и маски, более мелкие, чем их изображение, применяются в разрешении маски, поэтому детальная 1-битная маска на низкоразрешённой фотографии сохраняет свои края

Version 2.766.32

Fixed

  • Рендеринг страниц теперь рисует изображения через полную матрицу преобразования: изображения, повёрнутые на четверть оборота или на любой другой угол, отражённые изображения и все изображения на странице с /Rotate больше не рисуются прямыми и неотражёнными в свой bounding box
  • Маски изображений (/ImageMask true) теперь красятся как трафареты текущим цветом заливки со сглаженными краями при уменьшении, вместо отрисовки серой картинкой
  • Маски изображений с /Decode [1 0] красят сэмплы со значением 1, как определяет PDF
  • Inline-маски изображений (BI /IM true) снова рисуются, и их массив /D учитывается
  • Изображения с soft mask сохраняют маску при повороте и отражении

Version 2.766.31

Added

  • Экспорт SVG теперь преобразует цвета, заданные операторами k/K (DeviceCMYK) и cs/sc/scn в любом именованном цветовом пространстве: цвета ICCBased, калиброванные, Lab, Indexed, Separation и DeviceN выходят такими, какими их показывает рендерер страниц, а не чёрными
  • Выбор цветового пространства операторами cs/CS теперь задаёт его начальный цвет, например полную краску для spot-цвета, а восстановление графического состояния оператором Q возвращает цвет, установленный таким образом
  • Цветовые пространства, ссылающиеся на ICC-профили, lookup-таблицы или tint-функции по ссылке, разрешаются через экспортируемый документ во время экспорта SVG
  • Перечисление путей теперь сообщает цвета заливки и обводки CMYK вместо сохранения предыдущего цвета

Version 2.766.30

Fixed

  • THPDFEmfPatcher.RenderEmfDirect рисует битмапы enhanced metafile одного и того же размера и в одном и том же месте при любом Resolution. При Resolution, отличном от 72, они выходили масштабированными на 72 / Resolution

Version 2.766.29

Added

  • Экспорт SVG теперь применяет пути отсечения W и W*: каждый превращается в clip path SVG, покрывающий то, что рисуется после него, пока графическое состояние не восстановлено, поэтому изображения, затенения и пути, которые PDF обрезает, больше не рисуются целиком
  • Form XObject в экспорте SVG обрезается по своему /BBox, а осевые и радиальные затенения — по своему /BBox
  • Отсечение по правилу чётности (W*) сохраняет своё правило заливки, а путь, закрашиваемый одновременно с W, рисуется до вступления нового клипа в силу, как определяет PDF

Version 2.766.28

Fixed

  • Диаграммы, нарисованные через DrawChart, сохраняют компоновку при любом Resolution. Их поля, заголовки, подписи осей и толщины линий — значения в пунктах, и они сжимались вместе с Resolution
  • Шрифт по умолчанию новой страницы — и страницы, снова ставшей текущей, — имеет размер 12 пунктов при любом Resolution вместо 12 единиц рисования
  • Диагностическая overlay компоновки сохраняет толщину линий и размер подписей при любом Resolution

Version 2.766.27

Fixed

  • DrawInlineImage и DrawFormXObject задают размер изображения или формы в единицах рисования, как и её позицию. При Resolution, отличном от 72, ширина и высота принимались за пункты, поэтому объект выходил слишком крупным

Version 2.766.26

Fixed

  • Страница, снова становящаяся текущей через CurrentPageNumber, продолжает рисоваться в тех единицах, в которых была свёрстана. При Resolution, отличном от 72, она переключалась на пункты, поэтому всё нарисованное на ней дальше выходило неверного размера и в неверном месте
  • При повторном обращении страница также сохраняет свой собственный Resolution

Version 2.766.25

Fixed

  • Изображения, размещённые через ShowImage, сохраняют размер на странице, размер которой задан через Width и Height, когда Resolution документа не 72. При Resolution 144 они выходили вдвое меньше и со сдвигом
  • ExtTextOut размещает каждый символ с заданными advance на такой странице вместо половины из них
  • Встроенные прогоны глифов сохраняют свои смещения и advance глифов на такой странице

Version 2.766.24

Added

  • Экспорт SVG теперь учитывает запись /Extend осевых и радиальных затенений: не продлеваемый конец (по умолчанию именно такой) остаётся непрокрашенным, как в PDF, вместо растекания своего конечного цвета по всему клипу
  • Для радиальных затенений это также оставляет внутренность стартового круга пустой, если начало не продлевается

Version 2.766.23

Fixed

  • Flattening вращения страницы теперь поворачивает appearance-потоки аннотаций вместе со страницей, поэтому запечённые или уплощённые аннотации выглядят так же, как на повёрнутой странице, а не сплющиваются боком в свой повёрнутый прямоугольник
  • Поворот виджетов (/MK /R) корректируется на поворот страницы, поэтому appearance полей форм, перегенерированные после flattening, сохраняют ориентацию
  • Аннотации с флагом NoRotate после flattening остаются вертикальными и сохраняют размер, прибитые за свой левый верхний угол — как их показывают просмотрщики на повёрнутой странице

Version 2.766.22

Fixed

  • Flattening вращения страницы в тегированном PDF больше не поворачивает прямоугольник аннотации дважды, когда дерево структуры достигается раньше дерева страниц
  • Flattening вращения страницы больше не вращает bounding box Form XObject, используемых на странице: их геометрия живёт в пространстве формы, и поворот страницы уже применяется к ним через преобразование контента
  • Компоновочные bounding box элементов структуры, принадлежащих другой странице, больше не меняются при уплощении одной страницы

Version 2.766.21

Fixed

  • Чтение bleed-, trim- или art-box загруженной страницы больше не подхватывает /BleedBox, /TrimBox или /ArtBox, размещённые на родительском узле /Pages; эти боксы в PDF не наследуются, поэтому страница без собственной записи теперь сообщает свой crop box, как того требует спецификация
  • Flattening вращения страницы больше не копирует такой родительский bleed-, trim- или art-box на страницу

Version 2.766.20

Fixed

  • Текст, нарисованный на Canvas страницы или в метафайле, размещённом через ShowMetafile, сохраняет размер, когда Resolution документа не 72. При Resolution 144 он выходил вдвое меньше, тогда как остальной рисунок был верным
  • Canvas страницы и ShowMetafile рисуются правильного размера на странице, размер которой задан через Width и Height и которая рисуется в пунктах. При Resolution 144 рисунок выходил вдвое крупнее
  • Canvas страницы и ShowMetafile также учитывают Resolution, заданный на самой странице, вместо сжатия рисунка на него

Version 2.766.19

Fixed

  • Блоки выключенного Unicode-текста при заданном межбуквенном интервале теперь заканчиваются у края блока. Каждый символ получал интервал поверх своей выключенной позиции, поэтому каждая строка уходила за правый край на интервал, умноженный на число символов
  • Блоки выключенного Unicode-текста с горизонтальным масштабированием снова заполняют всю ширину блока, а не останавливаются за коэффициент масштабирования до неё
  • Межсловный интервал теперь учитывается в естественной ширине выключенной строки — той же, по которой строка разбивалась
  • Текст, рисуемый с явным advance для каждого символа, попадает в эти позиции при любом действующем межбуквенном интервале и горизонтальном масштабировании

Version 2.766.18

Fixed

  • Flattening вращения страницы теперь поворачивает страницы с /Rotate 90 и /Rotate 270 по часовой стрелке, поэтому уплощённая страница выглядит в точности как повёрнутый оригинал, а не перевёрнутой относительно него
  • Аннотации, назначения ссылок и геометрия структуры движутся вместе со страницей тем же образом
  • Уплощение страницы без CropBox больше не добавляет бокс, обрезавший страницу до квадрата; вращаются только те боксы страницы, которые у неё действительно есть

Version 2.766.17

Fixed

  • Цепочки font fallback теперь находят начертания вроде SimSun и Microsoft YaHei в Windows-системах, сообщающих их локализованным именем, поэтому смешанный CJK-текст в WideTextOutBox, WideTextOutBoxEx и TextOutWithFallback рисуется запасным начертанием вместо пустых квадратов
  • Текст, чей собственный шрифт — одно из этих начертаний, больше не разбивается на fallback-прогоны и не сообщается диагностикой неразрешённых глифов как неразрешённый
  • Начертание может входить в цепочку под любым своим семейным именем на любом языке; начертание, которое Windows лишь подменяет другим шрифтом, по-прежнему пропускается

Version 2.766.16

Fixed

  • N-up-композиция теперь размещает страницы с /Rotate 90 и /Rotate 270 повёрнутыми по часовой стрелке внутри своих ячеек; раньше они поворачивались в другую сторону и выталкивались из ячейки, часто за пределы листа
  • Страницы с /Rotate 180 теперь поворачиваются на листе, а не компонуются прямыми
  • N-up-композиция теперь учитывает боксы страниц и /Rotate, унаследованные из дерева страниц, поэтому такие страницы больше не пропускаются и не компонуются неповернутыми
  • Пустые страницы, вставляемые в загруженный документ, включая составленные N-up-листы, больше не поворачиваются и не обрезаются унаследованными из дерева страниц /Rotate или /CropBox

Version 2.766.15

Fixed

  • HPDFTokenizeContentStreamAppend теперь может переиспользовать массив токенов после сброса его счётчика в ноль: токены, оставшиеся от прежнего прогона, сначала освобождаются, поэтому их строки больше не утекают, а их элементы массива или данные inline-изображений больше не всплывают на новых токенах
  • Добавление множества мелких контентных потоков в один массив токенов теперь растит массив минимум вдвое вместо перераспределения и перемещения его при каждом добавлении, из-за чего страницы из тысяч мелких потоков медленно компилировались

Version 2.766.14

Fixed

  • Страницы с /Rotate 90 или /Rotate 270 теперь рендерятся повёрнутыми по часовой стрелке, как определяет спецификация PDF, а не отражёнными по диагонали; раньше левый верхний угол 90-градусной страницы оказывался в правом нижнем
  • Исправление покрывает рендеринг страниц и областей, экспорт bitmap, метафайлов и полосатых PNG или TIFF, а также SIMD-бэкенд рендеринга
  • Преобразования координат страница-вид и вид-страница во вьюере, а также его overlay поиска и выделения следуют тому же повороту по часовой стрелке, поэтому попадания и hit-тестирование совпадают с отрендеренной страницей

Version 2.766.13

Fixed

  • Экспорт страниц в SVG теперь пишет текст в UTF-8, как объявляет документ, поэтому буквы с диакритикой и CJK выживают вместо вопросительных знаков или байтов, делающих файл нечитаемым; управляющие коды, запрещённые в XML, становятся U+FFFD
  • Текст после первого прогона строки и текст после кернинговой поправки TJ теперь размещается правильно, когда текстовая матрица масштабирует или поворачивает текст, — именно так многие производители PDF задают размер шрифта
  • Подъём текста и горизонтальное масштабирование теперь следуют масштабированной или повёрнутой текстовой матрице, а поправки TJ учитывают горизонтальное масштабирование
  • Текст, нарисованный в режимах рендеринга с 4 по 6 (paint и clip), экспортируется вместо отбрасывания, невидимый текст по-прежнему сдвигает текстовую позицию, а контурный текст сохраняет непрозрачность обводки
  • Межсловный интервал больше не применяется к двухбайтовым кодам, случайно равным 32, а последовательности пробелов сохраняются, поэтому каждый символ остаётся на своей позиции
  • Лигатурные глифы экспортируют все символы, которые представляют, а шрифты со смешанными одно- и двухбайтовыми кодами читаются код за кодом
  • Страницы, чей /MediaBox не начинается в начале координат, теперь попадают на холст SVG вместо сдвига за его пределы

Version 2.766.12

Fixed

  • Рисование на THPDFPage.Canvas и метафайлы, проигрываемые как векторная графика через ShowMetafile с позицией и масштабом, больше не теряют часть левой и верхней кромки при установке clip region. Каждый clip region сдвигался внутрь на одну единицу с этих двух сторон, поэтому рамка или заливка вдоль левого или верхнего края выходила тоньше такой же на правом или нижнем
  • Clip region теперь совпадают с теми же областями при заливке и покрывают ту же площадь при любом THotPDF.Resolution

Version 2.766.11

Fixed

  • Подчёркивания и зачёркивания Unicode-текста, нарисованного через TextOut, UnicodeTextOut, RtLTextOut и ExtTextOut, теперь покрывают ровно текст. Они измерялись по тексту, конвертированному в системную кодовую страницу, поэтому прогоны с кириллицей, ивритом, греческим, CJK или другими буквами вне этой страницы получали линии, не доходившие до текста или перескакивавшие через него
  • Линии также следуют межбуквенному интервалу, межсловному интервалу, горизонтальному масштабированию и смещениям, переданным в ExtTextOut

Version 2.766.10

Fixed

  • Аддоны экспорта отчётов и гридов (FastReport, QuickReport, ReportBuilder, DevExpress и DBGrid) больше не затирают вывод друг друга, когда несколько экспортов идут одновременно, например на сервере. Их временный файл назывался по таймеру, менявшемуся лишь каждые 10–16 мс, поэтому запущенные вместе экспорты писали один и тот же файл

Version 2.766.9

Fixed

  • TextWidth теперь измеряет текст так, как он рисуется, при заданном межбуквенном интервале, межсловном интервале или горизонтальном масштабировании. Интервал не масштабировался горизонтальным масштабированием, отрицательный межсловный интервал игнорировался, а замыкающий пробел не получал межсловного интервала, поэтому продолжение абзаца, прямоугольники ссылок и центрированный или выровненный вправо текст размещались мимо нарисованного текста
  • TextWidth и GetWideTextWidth возвращают одну и ту же ширину для одного и того же текста

Version 2.766.8

Fixed

  • Устройство ReportBuilder (TppHotPDFDevice) теперь рисует нативный текст внутри своего текстового бокса. Текст позиционировался так, будто его позиция — базовая линия, поэтому каждый текстовый объект начинал строку слишком низко, а его последняя строка вылезала из бокса
  • Центрированный и выровненный вправо нативный текст измеряется теми Unicode-ширинами, какими рисуется, поэтому текст с буквами вне системной кодовой страницы — например китайский на западной системе — выравнивается правильно

Version 2.766.7

Fixed

  • Экспорт FastReport теперь размещает текст memo внутри самого memo. Текст позиционировался так, будто его позиция — базовая линия, поэтому текст каждого memo начинался на высоту шрифта ниже, а выровненный по низу текст рисовался под memo, где обрезка его прятала
  • Вертикальное выравнивание по верху, центру и низу во всех случаях отмеряет от верха первой строки — для простых и HTML-размеченных memo

Version 2.766.6

Fixed

  • Фильтр экспорта FastReport (TfrxHotPDFExport) снова компилируется. Свойство NotEmbeddedFonts читало поле другого типа, а нативный экспорт картинок использовал свойство Clipped, которого у TfrxPictureView нет
  • Нативный экспорт картинок теперь обрезает каждую картинку по её view, как делает FastReport, поэтому картинка крупнее своего view больше не расползается на соседние объекты
  • Центрированная картинка сохраняет рамку и клип по границам view; центрируется лишь само изображение. Раньше рамка уезжала вместе с картинкой

Version 2.766.5

Fixed

  • Аддон DBGrid теперь измеряет текст ячеек теми Unicode-ширинами, какими рисует его, прежде чем укорачивать под колонку. Текст с буквами вне системной кодовой страницы — например китайский на западной системе — измерялся как вопросительные знаки и вылезал за ячейку; двухбайтовый текст на китайской, японской или корейской системе урезался задолго до заполнения ячейки
  • Урезание никогда не оставляет половину суррогатной пары перед ...

Version 2.766.4

Fixed

  • Аддон DBGrid (TDBGridHotPDFExport и DBGridHotPDFExportToFile/ToStream) теперь рисует текст ячеек внутри самих ячеек. Текст размещался так, будто его позиция — базовая линия, поэтому текст каждой строки сидел на нижней границе ячейки и срезался линией сетки следующей строки
  • Текст заголовков центрируется в строке заголовков, а заголовок таблицы больше не прилипает к её верху

Version 2.766.3

Fixed

  • GetLoadedPDFVersionString теперь возвращает %PDF-1.7 и подобные строки в системах, чья локаль пишет десятичную запятую; там он возвращал %PDF-1,7
  • Поле pdfVersion отчёта GetLoadedDocumentReport исправлено так же

Version 2.766.2

Fixed

  • Импорт HTML (RenderHTML и RenderHTML5) даёт одну и ту же страницу при любом THotPDF.Resolution. Длины CSS и импортерские Margin, BaseFontSize, ListIndent и BlockSpacing — в пунктах, но при Resolution 144 текст, поля, списки и таблицы выходили вдвое меньше
  • Текст и графика, которые вы рисуете до и после импорта, по-прежнему используют 1/Resolution дюйма
  • Документы, собранные при Resolution по умолчанию 72, выходят в точности как раньше

Version 2.766.1

Fixed

  • XFA-формы, уплощённые через ApplyXFAAsAcroForm или FlattenLoadedXFA, сохраняют позиции, размеры и кегли из шаблона при любом THotPDF.Resolution. При Resolution 144 вся форма выходила вдвое меньше в левом верхнем углу страницы
  • Текст и графика, которые вы рисуете до и после уплощения, по-прежнему используют 1/Resolution дюйма
  • Документы, собранные при Resolution по умолчанию 72, выходят в точности как раньше

Version 2.766.0

Added

  • THPDFPage.UserWidth и THPDFPage.UserHeight возвращают размер страницы в единицах, которыми вы рисуете, — 1/Resolution дюйма, поэтому код вёрстки может сравнивать его с координатами, полями и TextWidth при любом THotPDF.Resolution. Width и Height по-прежнему возвращают пункты, и существующий код читает те же значения, что и раньше

Fixed

  • При THotPDF.Resolution, отличном от 72, абзацы теперь переносятся по реальному пространству между полями и уходят на следующую страницу у нижнего поля. Они измеряли страницу в пунктах, поэтому при 144 абзац с широкими полями мог разрываться после каждого символа и расползаться на куда больше страниц, чем нужно
  • Абзац, продолжающийся на новой странице, сохраняет тот же размер страницы, координаты и кегль при любом Resolution. При 144 страница продолжения переключалась на пунктовые координаты, и текст на ней выходил вдвое меньше
  • THPDFTable начинает новую страницу, только когда строка доходит до нижнего поля; при 144 таблица в нижней половине страницы отправляла каждую строку на отдельную страницу
  • Импорт HTML раскладывает текст по всей ширине страницы при любом Resolution вместо левой половины
  • Метафайлы, рисуемые по центру страницы, и clip region метафайлов, покрывающие всю страницу, используют всю страницу при любом Resolution
  • Диагностика компоновки для слоёв страниц и сброшенных страниц сообщает размер страницы в единицах рисования
  • Документы, собранные при Resolution по умолчанию 72, выходят в точности как раньше

Version 2.765.52

Fixed

  • Пароли AES-256 с не-ASCII буквами теперь работают в других PDF-ридерах. HotPDF хешировал пароль в системной кодовой странице, тогда как ISO 32000-2 определяет его как UTF-8, поэтому другие ридеры отвергали пароль — китайский или с диакритикой; исправлены и revision 5, и revision 6
  • Пароли AES-256 длиннее 127 байт теперь урезаются до 127 байт, как определяет стандарт, поэтому следующие ему ридеры их принимают
  • HotPDF теперь открывает AES-256-файлы других производителей, чей пароль содержит не-ASCII буквы
  • Файлы, зашифрованные прежними версиями с такими паролями, по-прежнему открываются в HotPDF с тем же паролем

Version 2.765.51

Fixed

  • ANSI-текст, записанный после Unicode-текста тем же шрифтом, больше не показывается пустыми квадратами. Когда страница рисовала Unicode-текст через TextOut, а затем использовала TextBox или TextOutBoxEx тем же начертанием (например Arial другого кегля), ANSI-текст записывался в Unicode-шрифт, и просмотрщики не могли найти его глифы; теперь он получает собственный шрифтовый ресурс и корректно показывается и извлекается
  • Страницы, использующие только ANSI-текст или только Unicode-текст, дают тот же вывод, что и раньше

Version 2.765.50

Fixed

  • Документы, зашифрованные AES-256 revision 6 (UseAES256R6, а также PDF 2.0 AES-256), теперь открываются в других PDF-ридерах. Хеш пароля считался с солью в каждом раунде и без user-записи на стороне owner, поэтому qpdf, MuPDF и другие ридеры отвергали оба пароля; HotPDF принимал только собственные файлы
  • HotPDF теперь открывает revision 6 файлы других производителей с их user- или owner-паролем вместо сообщения о неверном пароле
  • Образец AES-256 R6 из демо Security открывается в других ридерах

Version 2.765.49

Fixed

  • Блоки выключенного Unicode-текста больше не растягивают буквы врозь и не убегают за правый край блока. С шрифтом, выбранным по имени, например Arial, каждая выключенная строка выходила примерно вдвое шире блока и налезала на то, что стояло рядом; теперь каждая выключенная строка заканчивается у края блока
  • Текст, рисуемый с явным advance для каждого символа, в том же сценарии теперь попадает туда, куда его просили, вместо сдвига каждого символа на лишнюю ширину символа вправо

Version 2.765.48

Changed

  • Демо HelloWorld, CJKAnnotations, TextOut и RtLTextOut для Delphi и C++Builder теперь встраивают только используемые глифы. Они встраивали целые системные шрифты вроде Arial Unicode MS, поэтому одностраничный hello world выходил около 15 MB, а образец письма справа налево — около 30 MB; те же страницы теперь весят от 80 KB до 650 KB и выглядят так же

Version 2.765.47

Fixed

  • Текст справа налево больше не выходит с буквами не в том порядке в некоторых шрифтах. Иврит в Arial Unicode MS менял соседние буквы местами во многих словах, а арабский в Microsoft Sans Serif вообще не разворачивался, потому что номера глифов этих шрифтов принимали за диакритические знаки при выстраивании строки в визуальный порядок
  • Ивритские строки демо RtLTextOut теперь читаются правильно

Version 2.765.46

Fixed

  • GetWideTextWidth теперь учитывает межбуквенный и межсловный интервал, с которыми рисуется текст, как и TextWidth. Unicode-текст с переносом по словам и центрированный с заданным интервалом измерялся слишком узким
  • TextOutHTML теперь показывает межсловный интервал, заданный через SetWordSpacing: он размещал каждый прогон по своей измеренной ширине, что не учитывало интервал. CSS-свойства word-spacing и letter-spacing импорта HTML идут через ту же раскладку

Version 2.765.45

Fixed

  • SetWordSpacing теперь работает со встроенными шрифтами. Текст встроенным шрифтом записывается двухбайтовыми кодами символов, а PDF применяет межсловный интервал только к однобайтовому коду пробела, поэтому интервал молча игнорировался всегда, когда был включён FontEmbedding или тексту требовался Unicode-шрифт
  • Интервал добавляется после каждого пробела как поправка позиционирования текста, которую учитывает каждый PDF-просмотрщик; текст без межсловного интервала записывается в точности как раньше
  • Строка word-spacing в демо TextOut теперь показывает добавленный пробел

Version 2.765.44

Fixed

  • Демо AnnotationInteraction для Delphi и C++Builder теперь умещают подпись каждой ссылки внутри её прямоугольника. Текст начинался слишком низко, поэтому рамка прямоугольника шла сквозь него, и он был шире прямоугольника

Version 2.765.43

Fixed

  • Зачёркнутый текст (fsStrikeOut) теперь перечёркивается посередине строчных букв. Линия рисовалась на полстроки ниже базовой линии, под подчёркиванием, поэтому зачёркнутый текст выглядел дважды подчёркнутым; это задевало и <s> в TextOutHTML
  • Повёрнутый текст теперь получает подчёркивание ниже базовой линии, а не вдоль верха букв, и зачёркивание сквозь буквы
  • Линии зачёркивания такой же толщины, как подчёркивания, на каждом текстовом пути; Unicode-путь и путь простой латыни рисовали куда более тонкую линию

Version 2.765.42

Fixed

  • Демо HTMLText теперь выдаёт одну страницу со всеми пятью образцами. Оно добавляло вторую страницу после той, с которой документ и так начинается, оставляя первую пустой, и начинало писать у низа страницы, поэтому образец сущностей и абзац с переносом по словам сваливались со страницы

Version 2.765.41

Fixed

  • Демо Layer для Delphi и C++Builder теперь показывают текст своих слоёв. Текст видимого слоя рисовался цветом прямоугольника под ним и был не виден, а текст скрытого слоя был почти белым
  • Подпись демо Patterns рисуется чёрным вместо заливки мозаичным паттерном, разбивавшим её на фрагменты паттерна
  • Подпись демо AlphaTransparency больше не рисуется полупрозрачным зелёным с режимом смешивания Multiply; прозрачные фигуры теперь держат прозрачность при себе

Version 2.765.40

Fixed

  • Демо GraphicDraw для Delphi и C++Builder теперь правильно рисуют касательные линии своих примеров кривых. Первая линия контрольной точки левой кривой не доходила до подписанной точки, а правая кривая показывала короткий горизонтальный штрих вместо линий от стартовой точки через контрольную к конечной
  • Заголовки секций страниц прямоугольника и эллипса снова чёрные, вместо того чтобы принимать цвет последней нарисованной фигуры

Version 2.765.39

Fixed

  • Текст и фигуры, нарисованные после PrintHyperlink, сохраняют цвета, заданные до него. Серый цвет возвращался другим (белый становился синим), а цвета, заданные в CMYK или через цветовое пространство, возвращались как более старый RGB
  • Цвет гиперссылки теперь применяется только к тексту ссылки, каким бы цветовым пространством страница ни пользовалась

Version 2.765.38

Fixed

  • TextOutOutline теперь рисует контуры глифов в размере шрифта при любом Resolution. При Resolution, отличном от 72, контуры масштабировались вниз ещё раз — например, до половины размера при 144
  • Контуры шрифтов с менее чем 1000 единиц на em, например SimHei, больше не рисуются в несколько раз крупнее

Version 2.765.37

Fixed

  • Демо CJKUnicode для Delphi и C++Builder теперь показывают свою корейскую строку в системах без Arial Unicode MS. Они рисовали её первым найденным китайским шрифтом, в котором нет хангыля, поэтому строка оставалась пустой; теперь при неспособности выбранного шрифта показать корейский используется Malgun Gothic

Version 2.765.36

Fixed

  • Китайский и японский текст, написанный шрифтами вроде SimHei, больше не наваливает иероглифы друг на друга. Когда тот же шрифт использовался для второго текстового прогона, многим иероглифам назначались ширины в несколько единиц вместо полного em
  • Затронутые шрифты хранят меньше advance-ширин, чем глифов; глифы после последней сохранённой ширины теперь используют её, как требует формат TrueType

Version 2.765.35

Fixed

  • Unicode-текст шрифтами, чья дизайнерская сетка имеет менее 1000 единиц на em — например SimHei и SimSun с 256, — теперь набирается с правильными интервалами. Ширины глифов, записываемые в PDF, были примерно вчетверо крупнее, поэтому просмотрщики оставляли широкие зазоры после пробелов и других впервые использованных символов

Version 2.765.34

Fixed

  • Сценарий отсканированных изображений в демо PDFOptimize теперь сжимает настоящую текстовую страницу. Его 1-битное тестовое изображение выходило полностью чёрным, поэтому CCITT G4 и JBIG2 сравнивались на сплошном прямоугольнике
  • Сценарии изображений демо PDFOptimize теперь встраивают только глифы своей метки страницы, поэтому сообщаемые размеры показывают разницу между методами сжатия изображений, а не определяются целым встроенным шрифтом

Version 2.765.33

Fixed

  • Демо E-Invoice теперь верстает видимую страницу счёта сверху: заголовок вверху страницы, а счёт, стороны и суммы идут под ним. Страница рисовалась в обратном порядке, с заголовком у нижней кромки и примечанием футера вверху

Version 2.765.32

Fixed

  • JBIG2-изображения, кодируемые строго без потерь (Lossless при LossyLevel = 0), теперь сохраняют каждый пиксель. Удаление крошечных чёрных точек как шума сканирования по умолчанию игнорировало эти настройки, поэтому точки и точки над i и j в мелком тексте пропадали с изображений, которые должны были быть без потерь
  • Дружелюбные к сканам значения по умолчанию (LossyLevel = 5 с RemoveIsolatedBlackPixels) по-прежнему убирают крапинки, как раньше

Version 2.765.31

Fixed

  • Экспорт загруженных страниц в PNG или TIFF больше не падает с «received too many rows» при разрешениях, где полоса рендеринга не составляет целого числа пунктов, — например при 150 DPI по умолчанию у SaveLoadedPagesAsImages со страницей Letter. Округление делало каждую полосу на пиксельную строку выше плана, поэтому полосы в сумме давали больше строк, чем в изображении

Version 2.765.30

Fixed

  • TextWidth, TextHeight, GetWideTextWidth и GetWideCharAdvances теперь отвечают в страничных единицах Resolution — тех, которыми рисуется текст. При Resolution, отличном от 72, они отвечали в пунктах, поэтому измеренный текст не совпадал с координатами, куда его помещали
  • При Resolution, отличном от 72, текст, нарисованный через TextOut, теперь начинается на своём Y, а не слишком высоко, а подчёркивания и зачёркивания покрывают весь текст на правильном расстоянии и толщине вместо доли его
  • При любом Resolution TextBox, TextOutBoxEx и WideTextOutBoxEx центрируют и выравнивают вправо строки по реальной ширине текста, ячейки таблиц и абзацы переносят текст по ней, а стилизованные прогоны TextOutHTML больше не налезают друг на друга
  • Fallback-прогон шрифта внутри WideTextOutBoxEx держит кегль при любом Resolution вместо сжатия
  • Вывод при Resolution 72 не меняется

Version 2.765.29

Fixed

  • Когда Windows не может сама применить world transform метафайла EMF, HotPDF комбинирует преобразования самостоятельно. Вертикальное смещение комбинированного преобразования использовало неверный член, поэтому содержимое таких метафайлов могло съезжать вверх или вниз

Version 2.765.28

Fixed

  • Показ метафайла EMF больше не печатает диагностические строки вроде [WMF_DEBUG] EMR_POLYGON16 record found в стандартный вывод консольных приложений. Трассировка метафайла осталась включённой в release-сборке

Version 2.765.27

Fixed

  • Текст в метафайлах EMF, показываемых через ShowMetafile, теперь сидит на той высоте, на которой его рисует Windows. Текст с выравниванием по верху — умолчание TCanvas.TextOut — рисовался на высоту строки слишком высоко, а выровненный по низу тоже был слишком высоко
  • Метафайловый текст с выравниванием по базовой линии и повёрнутый не меняются

Version 2.765.26

Fixed

  • ShowMetafile с позицией и масштабом теперь рисует метафайл с его левым верхним углом в заданной точке и с запрошенным масштабом. Раньше он игнорировал эти аргументы и всегда рисовал метафайл в левом верхнем углу страницы в натуральном размере
  • ShowMetafile без позиции не меняется

Version 2.765.25

Fixed

  • Рисунки AngleArc в метафайлах EMF, показываемых через ShowMetafile, теперь рисуют описанную ими дугу в любом направлении, за которой следуют линии, продолжающиеся от конца дуги. Вместо этого рисовался полный круг, и его размер был неверен, стоило метафайлу иметь смещение

Version 2.765.24

Fixed

  • Под PDF/A и PDF/X free text аннотации с простым ASCII-содержимым теперь показывают свой текст. Их appearance раньше рисовал только рамку и заливку, потому что Helvetica, названная в default appearance аннотации, не может использоваться там невстроенной
  • Текст рисуется кеглем 12 pt текущим шрифтом страницы — он встраивается вместе с текстом страницы, — переносится в блок аннотации и выравнивается выбранным способом, как уже делалось для не-ASCII содержимого
  • Вне PDF/A и PDF/X free text аннотации с одним лишь ASCII записываются в точности как раньше

Version 2.765.23

Fixed

  • С включённым AutoShapeArabic методы TextOut и UnicodeTextOut теперь соединяют арабские, персидские и урду буквы в их начальные, срединные и конечные формы и лигатуры, как уже делал RtLTextOut. Раньше каждая буква показывалась в изолированной форме
  • То же относится к AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam, AutoShapeHanifiRohingya и к переупорядочиванию огласовок иврита (sfHebrewReorder в ShapingFeatures)
  • С этими опциями текст, чьи номера глифов случайно попадали в диапазоны арабских или ивритских символов, мог показываться неверными глифами; больше этого не происходит
  • Free text аннотации, рисуемые шрифтом страницы, шейпятся так же, как текст страницы
  • Вывод при выключенных этих опциях не меняется

Version 2.765.22

Fixed

  • Криволинейные фигуры теперь учитывают значения Resolution, отличные от 72. Ellipse, Circle, Arc, DrawArc, Pie, DrawPie, Chord и ArcTo рисовались не в том месте и не того размера, тогда как прямые линии, прямоугольники и скруглённые прямоугольники были верны
  • Вывод при разрешении по умолчанию 72 не меняется

Version 2.765.21

Fixed

  • Куски пирога, нарисованные через Pie или DrawPie, теперь представляют собой одиночные замкнутые фигуры, поэтому их контур получает нормальные углы там, где прямые кромки сходятся с дугой, а не два болтающихся конца линий
  • Хорды в метафайлах EMF, показываемых через ShowMetafile, теперь замыкаются по прямой между концами своей дуги. Раньше линия уходила в точку далеко от фигуры

Version 2.765.20

Fixed

  • DrawArc и DrawPie теперь рисуют ту часть эллипса, которую описывает их документация: против часовой стрелки от стартовой точки к конечной, как делают вызовы Arc и Pie Windows GDI. Раньше они рисовали другую часть, поэтому четвертная дуга выходила в три четверти
  • Сектора пирога, хорды и дуги ArcTo в метафайлах EMF, показываемых через ShowMetafile, теперь совпадают с картинкой, которую рисует Windows, для обоих направлений дуги. Раньше они показывали противоположную часть эллипса; простые дуги уже были верны
  • Методы Arc, Pie, Chord и ArcTo, работающие по углам, не меняются

Version 2.765.19

Fixed

  • Повёрнутые прямоугольники, нарисованные через RectangleRotate, теперь замкнутые фигуры, как нарисованные через Rectangle. Обводка раньше пропускала четвёртую сторону, поэтому повёрнутый прямоугольник с одним лишь контуром показывал три ребра
  • Залитые повёрнутые прямоугольники, а также линии подчёркивания и зачёркивания повёрнутого текста выглядят как раньше

Version 2.765.18

Fixed

  • Отрицательные числа, записываемые в сгенерированные PDF, теперь округляются правильно. Значения вроде -50 записывались как -49.99, поэтому отрицательные координаты, смещения и позиции в контенте страниц, прямоугольниках аннотаций и подобных записях могли уходить до 0.01 единицы
  • Отрицательные значения теперь округляются по правилу half away from zero, в точности зеркаля положительные; отрицательное значение, округляющееся до нуля, записывается как 0
  • Вывод для нуля и положительных чисел не меняется

Version 2.765.17

Fixed

  • Free text аннотации с китайским, японским, корейским, арабским, кириллическим или другим не-ASCII содержимым теперь показывают свой текст в каждом просмотрщике. Они полагались на рисование текста просмотрщиком шрифтом Helvetica, который умеет представлять лишь западные символы, поэтому просмотрщики вроде Poppler показывали только ASCII-пунктуацию
  • Эти аннотации теперь несут собственный appearance (ISO 32000-1 12.5.5): текст рисуется текущим шрифтом страницы, встраивается и сабсетится вместе с текстом страницы, переносится в блок аннотации (по словам, а для текста без пробелов — по символам), выравнивается выбранным способом и кладётся поверх той же рамки и заливки, что и раньше
  • Appearance записывается и под PDF/A, где встроенный шрифт держит документ соответствующим стандарту, а текст аннотации теперь виден вместо пустого бокса
  • Free text аннотации с содержимым из одного ASCII записываются в точности как раньше

Version 2.765.16

Fixed

  • Пустые страницы, вставляемые в загруженные документы через InsertLoadedBlankPage, теперь несут словарь ресурсов, который требуется каждой странице (ISO 32000-1 Table 30), поэтому валидаторы вроде qpdf больше не считают дерево страниц повреждённым, а содержимое можно добавить на страницу позже

Version 2.765.15

Fixed

  • В демо Table сумма промежуточного итога теперь занимает колонки Qty и Price, как задумано; раньше использовался неверный индекс ячейки, из-за чего колонка Qty оставалась пустой ячейкой

Version 2.765.14

Fixed

  • Изображения в ячейках THPDFTable теперь рисуются внутри своей ячейки и учитывают вертикальное выравнивание; раньше они оказывались на высоту изображения ниже — под ячейкой и за пределами таблицы

Version 2.765.13

Fixed

  • Ширины Unicode-текста (GetWideTextWidth и мера выключки) теперь соответствуют шрифту; для шрифтов вроде Arial они выходили примерно вдвое завышенными
  • Таблицы, текст с переносом по словам и выровненный вправо, по центру или по ширине текст, построенные на этих ширинах, снова размещаются правильно: короткий текст ячейки больше не переносится, значения с выравниванием вправо доходят до края ячейки, а HTML-текст в ячейках таблицы больше не показывает больших промежутков между словами

Version 2.765.12

Fixed

  • Формы с флажками или переключателями теперь перечисляют шрифт ZapfDingbats (/ZaDb) в ресурсах по умолчанию формы. Просмотрщики, которые рисуют такие поля сами (поведение по умолчанию при выключенном AutoFormAppearances), находят этот шрифт там, чтобы нарисовать отметку; раньше просмотрщики на базе Poppler считали шрифт неизвестным и не показывали отметку

Version 2.765.11

Fixed

  • В демо CJKAnnotations первая иконка заметки в каждом языковом ряду теперь выровнена с остальными иконками ряда; раньше её размещали на 5 пунктов выше

Version 2.765.10

Fixed

  • Шрифты, запрошенные по английскому имени, теперь находятся и в Windows с другим языком системы. Запрос SimSun, Microsoft YaHei или MS Gothic на китайской, японской или корейской Windows считался отсутствующим шрифтом, потому что Windows сообщает имя на языке системы, и текст молча набирался Arial Unicode MS

Version 2.765.9

Fixed

  • Шрифты, которые Windows хранит в коллекциях TrueType (.ttc), — например SimSun, Microsoft YaHei и MS Gothic, — теперь встраиваются как корректные самостоятельные шрифты. Раньше каждая таблица встроенного шрифта указывала на неверные данные, поэтому просмотрщики отвергали его и откатывались к системному шрифту, а на компьютерах без этого шрифта текст показывался неверными глифами
  • Это касалось и документов, чей запрошенный шрифт отсутствовал и отображался Windows на шрифт из коллекции, — например Unicode-текст шрифтом Arial Unicode MS на системах, где был доступен только SimSun

Version 2.765.8

Fixed

  • Исходные файлы, содержащие не-ASCII текст, снова сохраняются как UTF-8 с byte order mark. Без неё Delphi читает исходник в кодовой странице собирающего компьютера, поэтому на китайской, японской, корейской и другой не-западной Windows текст CJK, арабский, иврит и текст с диакритикой в демо выдавался кракозябрами в сгенерированных PDF, а сообщения об ошибках библиотеки показывали неверные символы
  • Демо CJKAnnotations, Annotations, HelloWorld, RtLTextOut, PageSizes, TextOut, Showcase и ViewerPref снова дают задуманный текст, где бы их ни компилировали

Version 2.765.7

Fixed

  • Информация о документе, переданная как UTF-8 (Title, Author, Subject, Keywords, заголовки article threads и SetLoadedDocumentInfo с семейством SetLoadedTitle), теперь сохраняется как Unicode, поэтому просмотрщики корректно показывают текст с диакритикой и CJK, а информация о документе совпадает с XMP-метаданными
  • Текст в кодовой странице системы (например китайский заголовок на китайской Windows) тоже сохраняется правильно, поскольку байты, не являющиеся корректным UTF-8, читаются в этой кодовой странице

Version 2.765.6

Fixed

  • Начальный вид новых документов (InitialZoom) теперь записывает полные назначения fit-width и fit-height; отсутствовал операнд, которого требует ISO 32000-1 Table 151, поэтому просмотрщики вроде Poppler сообщали о слишком коротком массиве назначения для каждого документа, созданного с настройкой по умолчанию

Version 2.765.5

Fixed

  • Метки страниц, не начинающиеся на первой странице, теперь покрывают и страницы до первого диапазона, которые сохраняют простые номера; дерево меток страниц должно включать первую страницу (ISO 32000-1 12.4.2), иначе просмотрщики могли показать неверные метки
  • SetLoadedPageLabel теперь держит диапазоны в порядке страниц и замещает диапазон, начинающийся на той же странице, так что просмотрщики показывают задуманные метки; раньше новые диапазоны дописывались вне порядка и могли дублироваться
  • SetLoadedPageLabel больше не отбрасывает существующие метки документов, хранящих их в отдельном объекте, а также обновляет деревья меток, разбитые на несколько узлов
  • Префиксы меток страниц, переданные как UTF-8, теперь сохраняются как Unicode

Version 2.765.4

Fixed

  • Описания ссылок, переданные как UTF-8 (AddURILink, AddGoToLink, AddGoToRLink, AddLaunchLink, AddNamedDestinationLink и ссылки на structure-назначения), теперь записываются как Unicode, поэтому программы чтения с экрана и просмотрщики показывают текст с диакритикой и CJK вместо кракозябр
  • То же касается текста и автора аннотаций, добавляемых в загруженные документы методами AddLoaded...Annotation, — как у аннотаций, создаваемых в новых документах

Version 2.765.3

Fixed

  • AddGoToLink теперь может ссылаться на страницу, добавляемую позже в новом документе, так что оглавление на первой странице может ссылаться вперёд; раньше такие ссылки молча выбрасывались
  • Ссылка, чья целевая страница так и не добавлена, сохраняет свою область, но остаётся без действия, вместо того чтобы указывать на отсутствующую страницу

Version 2.765.2

Fixed

  • SetLoadedOutlineOpen теперь раскрывает и сворачивает закладки в загруженных документах; раньше он записывал ключ, который просмотрщики игнорируют, и закладка сохраняла своё состояние
  • AddLoadedOutline, SetLoadedOutlineURI и SetLoadedOutlineDestination теперь действуют на запрошенную закладку; при любом индексе выше 0 они меняли не ту закладку или не делали ничего
  • Добавление закладки в загруженный документ теперь обновляет счётчики видимых элементов родителя, его предков и оглавления, поэтому просмотрщики больше не показывают неверные состояния раскрытия или итоговые количества
  • Установка веб-ссылки на загруженную закладку теперь удаляет её назначение на страницу, а установка назначения удаляет её действие: закладка может нести лишь что-то одно
  • Заголовки закладок, переданные как UTF-8 в AddLoadedOutline и SetLoadedOutlineTitle, теперь сохраняются как Unicode, а не как искажённые байты

Version 2.765.1

Fixed

  • Закладки в новых документах теперь записывают, сколько записей видно, как того требует ISO 32000-1 12.3.3: раньше оглавление и каждая открытая закладка считали все вложенные записи, включая те, что внутри закрытых закладок
  • Установка Opened у закладки после добавления её дочерних элементов теперь раскрывает её в просмотрщике; раньше это изменение так и не попадало в файл
  • Присвоение Title существующей закладке теперь меняет заголовок, показываемый в документе
  • Заголовки закладок с не-ASCII текстом, переданные как UTF-8, теперь записываются как Unicode, поэтому текст с диакритикой и CJK показывается правильно, а не кракозябрами
  • Закладки теперь несут ссылку на родителя, которой требует спецификация

Version 2.765.0

Added

  • HPDFTokenizeContentStreamAppend токенизирует контентный поток сразу в существующий массив токенов, поэтому вызывающий код, объединяющий несколько потоков, обходится без временного массива на каждый поток

Changed

  • Компиляция страницы для рендеринга больше не выделяет память под каждое число и оператор в её контентном потоке, а контент страницы токенизируется прямо в display list страницы вместо копирования туда
  • Параллельный рендеринг страниц намного лучше масштабируется на холодном документе: на 128-страничном векторном тестовом документе 4 воркера теперь заканчивают примерно в 3–3,5 раза быстрее, чем 1 (раньше — примерно в 1,4 раза в 32-битных и в 1,7 раза в 64-битных сборках)
  • Однопоточные компиляция и рендеринг страниц на этом документе тоже примерно на 35% быстрее; токены, display list и результат рендеринга не меняются

Version 2.764.7

Changed

  • Рендеринг контента, часто сохраняющего и восстанавливающего графическое состояние (q/Q), больше не выделяет память на каждое сохранение, из-за чего рабочие потоки параллельного рендеринга страниц ждали друг друга внутри memory manager
  • Холодный параллельный рендеринг 128-страничного векторного тестового документа примерно на 7–10% быстрее с 4 воркерами и примерно на 5% быстрее на одном; результат рендеринга не меняется

Version 2.764.6

Fixed

  • Параллельный рендеринг страниц больше не сползает на одну страницу за раз, когда страницы уже рендерились и их display list всё ещё в кэше
  • Раньше каждая ожидающая отрисовки страница держала свой резерв памяти, пока за раз отрисовывалась только одна, и остальные воркеры застревали на общем бюджете памяти; теперь, когда ожидающих страниц становится столько, сколько воркеров, они отрисовываются параллельно
  • Первая страница по-прежнему приходит рано, а память, резервируемая пакетом, теперь остаётся пропорциональной числу воркеров, вместо того чтобы заполнить весь бюджет

Version 2.764.5

Fixed

  • SetStructureClassMapEntry теперь может зарегистрировать один словарь атрибутов под несколькими именами классов или повторно под тем же именем, не освобождая его
  • Раньше удаление или замена одной из таких записей освобождали общий словарь, из-за чего остальные записи /ClassMap указывали на освобождённую память, и сохранение документа могло записать мусор или выбросить access violation
  • Словарь атрибутов, созданный напрямую, теперь при регистрации становится indirect object, и каждая запись /ClassMap ссылается на него; документ владеет словарём, поэтому вызывающий код не должен его освобождать

Version 2.764.4

Fixed

  • RemoveUnusedLoadedPageResources больше не пишет в таблицу ресурсов после её удаления — когда таблица ресурсов /Font, /XObject или другая у страницы записана прямо внутри /Resources и все её записи не используются
  • Раньше такая запись попадала в освобождённую память, что обычно оставалось незамеченным, но могло повредить память или выбросить access violation позже в сеансе
  • Опустевшие таблицы ресурсов по-прежнему удаляются из /Resources, а сохранённый вывод не меняется

Version 2.764.3

Fixed

  • Открытие PDF, зашифрованного по публичному ключу (сертификату), с PubSecKeyMaterial — через LoadFromFile или BeginIncrementalUpdate — больше не читает конверты получателей из уже освобождённой памяти при восстановлении ключа файла
  • Сбой зависел от того, как память случайно переиспользовалась: документ обычно открывался, но мог быть отвергнут так, будто ключевой материал не назначался, или развернуть не те байты
  • Документы с несколькими получателями, callback выбора получателя и дополнительные ключевые материалы, зарегистрированные через AddPubSecKeyMaterial, используют один и тот же исправленный список конвертов

Version 2.764.2

Fixed

  • Appearance полей, создаваемые для загруженных форм через AddLoadedTextField и остальные методы полей AddLoaded*, EnsureLoadedFieldAppearanceStream или FlattenFormFields, теперь держат собственную ссылку на шрифт AcroForm /DR, а не делят запись /DR
  • Замена или удаление словаря AcroForm /DR, как и удаление последнего поля формы (которое заодно удаляет и сам AcroForm), больше не оставляют эти appearance указывающими на освобождённые объекты шрифтов
  • Раньше последующее освобождение документа могло наткнуться на скрытый access violation, из-за которого остаток документа не освобождался, или повредить память, чаще всего в 64-битных сборках
  • Шрифт, записанный прямо внутри /DR, при первом же использовании его каким-нибудь appearance становится косвенным объектом, так что appearance поля и /DR ссылаются на один и тот же объект шрифта в сохранённом файле

Version 2.764.1

Fixed

  • Вызов ProcessObjectStreamsForDecompression после LoadFromFile больше не читает файловый поток, который загрузка уже закрыла; вместо этого метод заново сканирует загруженный файл, так что элементы объектных потоков остаются доступными для ExtractObjectFromStream
  • Сбой зависел от случайной раскладки памяти: обычно он проходил незамеченным, но мог выбросить access violation или просканировать постороннюю память, чаще всего в 64-битных сборках
  • FindAllObjectStreams, ScanAndLoadReferencedObjects и ForceLoadMissingReferencedObjects теперь при вызове вне загрузки ничего не делают, вместо того чтобы трогать закрытый поток

Version 2.764.0

Changed

  • Один экземпляр THotPDF, например компонент, брошенный на форму, теперь может записывать сколько угодно документов подряд: BeginDoc после EndDoc стартует новый независимый документ, а не бросает исключение
  • EndDoc сбрасывает всё, что было зарегистрировано для записанного документа, — изображения, шрифты, поля форм, outlines, document JavaScript, именованные назначения, метки страниц, ICC-профили и output intents, — а следующий BeginDoc освобождает его страницы и объекты, так что ничто из этого не попадает в следующий файл; при включённом ReproducibleOutput второй документ переиспользованного экземпляра побайтово совпадает с тем же документом из нового экземпляра
  • Регистрации, сделанные между EndDoc и следующим BeginDoc, — например AddPDFAOutputIntent или скрипты, добавленные через Names, — относятся к следующему документу и больше не очищаются BeginDoc
  • Настройки свойств вроде FileName, Compression, PDFACompliance, Author и Title, а также слои страниц и цепочки font fallback переносятся на следующий документ; PDF-версия, автоматически поднятая для одного документа, возвращается к значению свойства Version
  • Записанный документ остаётся доступным после EndDoc до следующего BeginDoc, поэтому ValidatePDFUA2Structure, CurrentPageNumber, PagesCount и диагностика раскладки продолжают на нём работать
  • Поскольку пароли очищаются сразу после шифрования защищённого документа, BeginDoc бросает исключение, когда ActivateProtection всё ещё включён, а новый пароль не задан, — вместо того чтобы защищать следующий файл пустыми паролями
  • Начало нового документа после перезаписи загруженного на том же экземпляре тоже даёт чистый файл

Version 2.763.1

Fixed

  • Конвертация EPUB и импорт HTML с профилем HTML5 больше не рискуют получить access violation, когда абзац не помещается на текущей странице; теперь абзац всегда рисуется на новой странице
  • То же исправление касается абзацев, элементов списков и горизонтальных линеек в компактном блочном рендерере, который использует HPDFRenderHTMLDocument
  • Сбой зависел от случайной раскладки памяти, поэтому проявлялся лишь изредка, чаще всего в 64-битных сборках, и мог оставить конвертацию без результата или повредить её содержимое

Version 2.762.1

Fixed

  • Повторный вызов BeginDoc на экземпляре THotPDF, который уже записал новый документ, больше не заканчивается access violation; вместо него бросается исключение с требованием нового экземпляра, ведь экземпляр всё ещё держит объекты, изображения, шрифты и поля форм завершённого документа
  • Даже без краха второй документ унёс бы объекты первого, включая его содержимое и поля форм; принцип «один экземпляр на новый документ» удерживает каждый файл при собственном содержимом
  • Загрузку существующего документа через LoadFromFile с последующей перезаписью это не затрагивает

Version 2.762.0

Fixed

  • Аннотации Text, FreeText, Line, Square, Circle, Stamp и FileAttachment становятся видимыми в документах PDF/A-2, PDF/A-3, PDF/A-4 и PDF/X-6: раньше они несли пустой appearance stream, который лишь устраивал валидатор, а раз вьюеры рисуют именно appearance, ничего не отображалось
  • Теперь эти appearance рисуют аннотацию: рамки квадрата и круга, линию, иконку заметки и иконку вложения в цвете аннотации, рамку штампа и блок free text, залитый цветом фона
  • Вывод PDF 2.0 даёт appearance stream каждой из этих аннотаций, расширенным markup-аннотациям и новым полям форм, как того требует ISO 32000-2 Table 166, и записывает /NeedAppearances false; вне PDF/A и PDF/X free text и имя штампа рисуются шрифтом Helvetica
  • В PDF/A и PDF/X appearance free text и штампа не рисуют текст, потому что каждый используемый там шрифт должен быть встроенным; текст остаётся в аннотации, и его показывают вьюеры

Version 2.761.6

Fixed

  • Аннотации вложений файлов (AddFileAttachmentAnnotation) снова открываются и пересохраняются во вьюерах: file specification писала сам встроенный файловый поток как /EF, тогда как ISO 32000-1 Table 44 требует словарь /EF, держащий поток под /F, из-за чего ридеры сообщали об отсутствии файловой записи
  • Встроенный файловый поток такого вложения получает тип /EmbeddedFile, а текст аннотации дополнительно сохраняется как описание файла

Version 2.761.5

Fixed

  • Именованные назначения, document-level JavaScript и вложения документа записываются с ключами name tree в отсортированном порядке, как требует ISO 32000-1 7.9.6; раньше они писались в порядке регистрации, и ридеры, ищущие по дереву, могли пропускать записи (qpdf помечал такие деревья как несортированные)
  • Прикрепление двух файлов с одинаковым именем больше не создаёт две записи с одним ключом, из-за чего достижимой оставалась лишь одна; вторая получает нумерованный ключ вроде a (2).txt и сохраняет исходное имя файла
  • Изменения AddLoadedDocumentJavaScript и AddLoadedNamedDestination сохраняются; раньше отредактированное name tree не записывалось обратно, когда жило в прямом словаре, и новые записи терялись. Оба метода вставляют в отсортированную позицию, в том числе в деревьях, разбитых на узлы /Kids, и заменяют существующую запись с тем же именем
  • AddLoadedDocumentJavaScript сохраняет JavaScript action как значение name tree вместо голого потока скрипта, а AddLoadedNamedDestination записывает zoom-операнд своего назначения /XYZ
  • RemoveLoadedJavaScript и RemoveLoadedJavaScriptAll удаляют скрипты из самого документа; раньше менялся только список, возвращаемый геттерами, а скрипты оставались в сохранённом файле
  • SetDocumentAttachmentMetadata переименовывает переданное ему вложение; раньше метод переименовывал ключ последнего вложения в дереве, а теперь переименованная запись перемещается на свою отсортированную позицию

Version 2.761.4

Fixed

  • Новые AcroForms всегда определяют шрифт Helvetica, названный в строках default appearance полей, в ресурсах формы по умолчанию (/DR), как требует ISO 32000-1 12.7.3.3; без AutoFormAppearances шрифта не было, и вьюерам, строящим appearance полей, нечем было их строить
  • AddLoadedComboBox создаёт настоящий combo box; раньше выставлялся флаг Edit вместо флага Combo, так что поле было list box, который вьюеры показывали списком всех опций
  • Поля, добавляемые в загруженный документ, пишут /NeedAppearances как булево true вместо имени /true, а создаваемый для них AcroForm получает строку default appearance и ресурсы по умолчанию, на которые ссылаются их строки /DA
  • AddLoadedTextField, AddLoadedCheckBox, AddLoadedComboBox, AddLoadedListBox и AddLoadedPushButton дают новому полю appearance stream, так что поле видно во вьюерах, которые не строят appearance сами, и в документах, чья форма задаёт /NeedAppearances false
  • Appearance, генерируемые для loaded push buttons (при добавлении, перерисовке или flattening), рисуют подпись, тогда как раньше они оставались пустыми

Version 2.761.3

Fixed

  • Смена значения текстового или choice-поля в загруженной форме теперь перерисовывает поле: SetFormFieldValue, ResetLoadedFormField и обновления multi-selection list box регенерируют appearance stream, тогда как сохранённый файл продолжал показывать старый текст в любом вьюере и на печати — вьюеры рисуют appearance, а не сохранённое значение
  • Сгенерированные appearance текстовых полей пароля показывают по одной звёздочке на символ вместо пароля в читаемом виде (ISO 32000-1 Table 228) — как для новых полей с AutoFormAppearances, так и для загруженных полей при перерисовке или flattening
  • AnalyzeLoadedSignatureRevisions классифицирует новый словарь appearance, appearance stream и его ресурсы, добавляемые заполнением формы после подписания, как form filling — как уже делалось для самого поля, — поэтому заполнение сертифицированной формы инкрементальным обновлением больше не сообщается как изменение вне распознанных структур

Version 2.761.2

Fixed

  • 1-битные и 4-битные палитровые битмапы, добавленные со сжатием Flate, сохраняют свои цвета: раньше их перемапливали на 256-цветную системную палитру, из-за чего сдвигался каждый цвет, которого в ней нет. Теперь они встраиваются в собственной битовой глубине с собственной палитрой, что заодно уменьшает данные изображения
  • 1-битные битмапы, у которых белый в палитре стоит раньше чёрного, больше не выходят негативом при сжатии CCITT Group 3, CCITT Group 4 или JBIG2, включая batch- и cross-page ветки JBIG2; более тёмный цвет палитры всегда кодируется как чёрный
  • icAutoMono и AddMonochromeImageAuto оставляют 1-битный битмап с цветной палитрой на Flate вместо того, чтобы превращать его в чёрно-белый через CCITT или JBIG2
  • Двумерные изображения CCITT Group 3 (icCCITT32) теперь следуют своему параметру /K: первая и каждая вторая строка кодируются одномерно, когда /K равен 2, тогда как раньше при /K 1, который вообще не допускает двумерных строк, каждая строка кодировалась двумерно (ISO 32000-1 Table 11, ITU-T T.4)

Version 2.761.1

Fixed

  • JPEG-изображения, добавленные со сжатием DCT, сохраняют собственную цветовую модель: полутоновые JPEG записываются как DeviceGray, а CMYK JPEG — как DeviceCMYK, тогда как раньше любой JPEG объявлялся как DeviceRGB; из-за этого ридеры показывали полутоновые файлы искажёнными или обрезанными, а CMYK — в неверных цветах
  • CMYK JPEG с маркером Adobe (обычный вывод Photoshop) получают инвертированный массив /Decode, которого требуют их сэмплы (ISO 32000-1 8.9.5.2 and 7.4.8)
  • Проверки цветовых пространств PDF/A теперь трактуют полутоновые и CMYK JPEG-изображения как использование DeviceGray и DeviceCMYK вместо DeviceRGB
  • StampLoadedPageImage применяет ту же цветовую модель при штамповке JPEG на загруженную страницу
  • Файлы с именами вроде PHOTO.JPG или scan.jpeg теперь загружаются как JPEG с любым типом сжатия; файловая перегрузка AddImage распознаёт JPEG-данные по сигнатуре вместо чувствительного к регистру расширения .jpg и больше не пытается читать такие файлы как битмапы

Version 2.761.0

Added

  • Новый AddLoadedSignedSignatureField добавляет в загруженный документ поле подписи, готовое к подписанию, чтобы уже подписанный PDF мог принять вторую подпись (counter-signature или approval) инкрементальным обновлением
  • Поле резервирует место под подпись, которое затем заполняют SignPDFWithPFX, PreparePDFForSigning и InsertSignatureHex; после BeginIncrementalUpdate и SaveIncrementalUpdate новая подпись покрывает весь файл, а прежние подписи остаются валидными
  • Для каждого поля можно задать необязательные reason, location и контактную информацию, SubFilter и зарезервированный размер подписи; AcroForm помечается как подписанный и append-only, а флаг перегенерации appearance в подписанный документ не добавляется

Fixed

  • Задокументированный multi-signature сценарий для BeginIncrementalUpdate теперь описывает шаги, которые действительно работают; прежнее описание опиралось на текущую страницу, которой после загрузки не существует, и на поле подписи без зарезервированного места, из-за чего подписание падало

Version 2.760.1

Fixed

  • DrawQRCode, DrawDataMatrix, DrawPDF417 и DrawAztec восстанавливают цвет заливки страницы после отрисовки, как и задокументировано; раньше залитые после них фигуры перенимали цвет штрихкода
  • Эти штрихкоды рисуются одним путём, где каждая серия тёмных модулей в строке сливается в один прямоугольник, поэтому контент страницы компактнее, а вьюеры больше не показывают едва заметных швов между соседними модулями

Version 2.760.0

Changed

  • Установка CryptKeyLength в aes256 поднимает выходной формат до PDF 1.7, если тот ниже, — как уже делают другие зависящие от версии возможности, так что документы по-настоящему защищаются AES-256. При дефолтном выводе PDF 1.6 их раньше молча писали AES-128; при включённом StrictVersionLock более низкая версия по-прежнему откатывается к AES-128

Fixed

  • Справочные страницы свойств защиты показывали несуществующие имена разрешений; примеры и описания prPrint и prPrint12bit теперь соответствуют реальным опциям, а заметки о шифровании с открытым ключом перечисляют поддерживаемые типы ключей

Version 2.759.0

Fixed

  • Подписанные PDF теперь держат всю строку /Contents, включая её ограничители < и >, вне подписываемых диапазонов байт, как того требует ISO/IEC 32000-1 12.8.3.3; раньше ограничители попадали под подпись, и валидаторы, сверяющие диапазон байт со значением подписи, сообщали о неверном диапазоне байт
  • PDF MAC-валидация подписей с приложенным MAC принимает как стандартный диапазон байт, так и тот, что писали прежние версии

Security

  • Проверка подписи отклоняет документ, чей неподписанный зазор между двумя диапазонами байт содержит что-либо помимо собственной строки /Contents подписи, — закрывается брешь signature wrapping, при которой контент вне подписанных байт выдавался за покрытый подписью; подписи, сделанные прежними версиями, по-прежнему верифицируются

Version 2.758.1

Fixed

  • Default appearance, который AttachSignatureFieldAppearance выдаёт неподписанному полю подписи, снова рисует свой светло-серый фон: в прямоугольнике заливки не хватало двух операндов, а цвет задавался внутри пути — вьюеры такое отвергают
  • Аннотации FreeText, созданные на новой странице, несут требуемую ISO 32000-1 строку default appearance, поэтому вьюеры могут сверстать их текст сами, а не показывать пустую рамку

Version 2.758.0

Fixed

  • Встроенный декодер JBIG2 помещает каждый символ после первого в текстовой полосе туда, куда его ставит ISO/IEC 14492; раньше каждый следующий символ уезжал ещё на пиксель правее, из-за чего текст в JBIG2-сканах от чужих энкодеров расползался
  • JBIG2-изображения, записанные нативным арифметическим энкодером со словарём символов из одного глифа, теперь читаются другими PDF-вьюерами; идентификаторы символов кодировались одним битом вместо нуля, и эти вьюеры падали на первом же глифе
  • Словари символов, комбинирующие глифы через refinement и aggregation, декодируются со стандартными интервалами — как у других декодеров JBIG2
  • JBIG2-изображения с общим глобальным словарём символов записывают /DecodeParms массивом, соответствующим массиву /Filter; другие вьюеры игнорировали единственный словарь и не находили общие глифы, так что такие изображения не отображались

Version 2.757.0

Fixed

  • DirectDrawBarcode и bar-функции Simple* теперь рисуют настоящие штрихкоды для каждой симбологии; раньше большинство из них возвращало равномерно чередующиеся штрихи, не несущие никаких данных. GS1-128 с code set C (type 22) рисуется вместо отката к Code 39, а короткие штрихи POSTNET рисуются на 40 % высоты
  • DirectDrawBarcode масштабирует ширины и высоты штрихов по системе координат страницы, поэтому штрихкоды остаются читаемыми, когда масштаб документа — не один point на единицу
  • Code 128, Code 93 и семейство EAN / UPC держат точные ширины элементов в один-четыре модуля при любом Ratio; любое отношение, кроме 2, раньше делало их нечитаемыми
  • EAN-8, EAN-13, UPC-A и UPC-E, получившие только цифры данных, получают добавленную контрольную цифру; раньше последняя цифра данных считалась контрольной. При включённом Checksum UPC-A больше не теряет последнюю цифру данных, а контрольная цифра UPC-E (она же выбирает чётность штрихов) вычисляется из развёрнутого номера UPC-A
  • Контрольные цифры MSI теперь верны для чисел с нечётным числом цифр, коды POSTNET получают свою корректирующую цифру, а Interleaved 2 of 5 сохраняет последнюю цифру нечётной длины, дописывая ведущий ноль
  • Code 128 A кодирует строчные буквы через SHIFT вместо превращения их в пробелы или управляющие символы, Code 39 приводит нижний регистр к верхнему, а Codabar сохраняет переданные start- и stop-символы
  • Символы, которые симбология не может представить, теперь вызывают исключение; Code 39 и Code 128 раньше выкидывали или заменяли их, а Codabar читал за пределами своей таблицы символов
  • GS1-128 с включённым Checksum больше не дописывает ещё одну контрольную цифру к Text при каждом замере или отрисовке штрихкода

Version 2.756.0

Fixed

  • QR-коды, нарисованные через DrawQRCode или собранные через THPDFQRCode, теперь сканируются стандартными ридерами: форматная информация размещена, как предписывает ISO/IEC 18004, а структура блоков коррекции ошибок верна для каждой версии с 10 по 40 (и для версии 7-Q)
  • Автовыбор режима оставляет текст с нижним регистром в byte mode, поэтому URL вроде https://example.com больше не кодируется и не читается обратно в верхнем регистре
  • Для текста, чья длина оканчивается на одну-две цифры или одну буквенно-цифровую позицию, подбирается символ достаточного размера; раньше последние символы терялись
  • Повторное кодирование тем же экземпляром THPDFQRCode больше не примешивает прежний символ к новому
  • Encode возвращает False, когда явно запрошенная версия слишком мала или запрошенный numeric- или alphanumeric-режим не может представить данные, вместо усечённого символа
  • Выбор маски применяет штрафы ISO/IEC 18004 7.8.3 за finder-подобные паттерны и дисбаланс тёмных модулей
  • Встроенный декодер штрихкодов читает стандартные QR-коды: многоблочные символы с верификацией Reed-Solomon, сегменты numeric, alphanumeric, byte и ECI, payload в UTF-8 и версии с несколькими alignment-паттернами

Added

  • HPDFQRFunctionMap и HPDFQRExtractDataWords открывают раскладку модулей и de-interleaving блоков с детекцией ошибок для кода, читающего QR-символы

Version 2.755.9

Changed

  • Рендеринг soft mask изображений переиспользует точные горизонтальные индексы сэмплов и применяет SSE2-премультипликацию альфы на поддерживаемых Delphi-целях x86 и x64, сохраняя округление пикселей и отмену, с ограниченным временным хранилищем и scalar fallback

Version 2.755.8

Fixed

  • Передняя отрисовка может продолжиться, как только отменённая prefetch-загрузка страниц освободит ресурсы документа, не дожидаясь, пока фоновый поток-работник завершит выход; явная отмена, замена, перезагрузка и уничтожение по-прежнему дожидаются потока, а некорректные диапазоны страниц больше не приводят к утечке приостановленного воркера

Version 2.755.7

Fixed

  • Рендеринг страниц сохраняет текущий путь при восстановлении графического состояния и изолирует пути глифов Form XObject и Type3, клиппирование и сохранённое состояние, включая некорректные лишние восстановления и отмену

Version 2.755.6

Fixed

  • SIMD-рендерер прямоугольников теперь соблюдает составные even-odd и nonzero правила заливки, сохраняя отверстия, направление отражённых подпутей и дробное размещение краёв; отмена во время растеризации отбрасывает частичный битмап и корректно распространяется

Version 2.755.5

Fixed

  • Импорт форм с множественным выбором теперь резервирует точные значения опций перед интерпретацией шестнадцатеричных написаний для совместимости в XFDF, не позволяя литеральным значениям выбирать другую опцию и сохраняя согласованность хранимых значений с индексами выбора

Version 2.755.4

Fixed

  • Извлечение текста из вертикального (WMode 1) CID-текста теперь сдвигает перо на displacement из ISO 32000-1 9.4.4, поэтому межзнаковый интервал укорачивает шаг вниз по колонке, как того требует спецификация, а не удлиняет его
  • Корректировка позиции TJ в вертикальном тексте теперь сдвигает перо вниз или вверх по колонке, а не вбок, поэтому извлечённые колонки больше не разрываются и порядок чтения остаётся сверху вниз
  • Массив /DW2 CIDFont при извлечении читается в предписанном порядке [v1y w1y], поэтому глифы, полагающиеся на значения по умолчанию, продвигаются на полную em вместо 0.88 em
  • Начала извлечённых вертикальных глифов остаются на осевой линии колонки, а боксы глифов размещаются в вертикальном начале минус вектор позиции, причём горизонтальная компонента по умолчанию равна половине ширины глифа
  • Записи списка /W2, описывающие несколько подряд идущих CIDs, при извлечении теперь применяют свои метрики к каждому CID в серии, а не только к первому
  • Рендерер страниц и интерпретатор извлечения текста теперь используют одну реализацию правил displacement глифов и TJ, поэтому отрисованные и извлечённые позиции не могут разъехаться

Version 2.755.3

Added

  • THPDFQCStatementInfo получает HasPSD2Statement, PSD2RolesOfPSP, PSD2NCAName и PSD2NCAId; descriptor уровня CMS несёт те же поля
  • HPDFParsePSD2QcStatement разбирает уже имеющийся у вас PSD2 statement в виде DER и отклоняет любой некорректный вход

Deprecated

  • PSD2RolesPayer и PSD2RolesPayee остаются для совместимости исходного кода, но всегда пусты, поскольку спецификация не определяет списки ролей плательщика и получателя; используйте PSD2RolesOfPSP

Fixed

  • PSD2 statement квалифицированного сертификата теперь читается по своей структуре ETSI TS 119 495 и сообщает каждую роль провайдера платёжных услуг с её role OID и именем роли, название национального надзорного органа и идентификатор органа; реальные PSD2-сертификаты прежде вообще не сообщали ролей
  • Некорректный PSD2 statement — с выходящими за границы или неминимальными длинами, отсутствующими или лишними компонентами, неверными типами строк и именами, не являющимися корректным UTF-8, — игнорируется целиком, а не сообщается частично

Version 2.755.2

Fixed

  • Отрисовка вертикального (WMode 1) текста теперь продвигает каждый глиф на text-space displacement из ISO 32000-1 9.4.4: межсловный интервал больше не масштабируется размером шрифта и больше не добавляется к двухбайтовым CID-кодам, поскольку применяется только к однобайтовому коду пробела
  • Межзнаковый интервал в вертикальном тексте применяется вдоль направления письма в точности как определено спецификацией, поэтому колонки, набранные с ненулевым Tc, отрисовываются той же высоты, что и в других соответствующих спецификации viewers
  • Невидимый текст (режим отрисовки 3 и скрытый optional content) продвигает вертикальные колонки по тем же правилам, что и видимый текст, удерживая последующие видимые глифы на правильных местах
  • Массив /DW2 CIDFont читается в предписанном порядке [v1y w1y], поэтому шрифты, полагающиеся на значения по умолчанию, продвигаются на полную em вместо 0.88 em
  • Вертикальные глифы отрисовываются в вертикальном начале минус их вектор позиции, причём горизонтальная компонента по умолчанию равна половине ширины глифа, что центрирует колонки на позиции пера
  • Записи списка /W2, описывающие несколько подряд идущих CIDs, теперь применяют свои метрики к каждому CID в серии, а не только к первому

Version 2.755.1

Fixed

  • ExportLoadedFormToFDF теперь формирует полное тело FDF до создания целевого файла, поэтому сбой посреди экспорта больше не подменяет целевой файл обрезанным документом
  • Сканер обмена FDF stream отслеживает hexadecimal-строки и сохраняет словари полей целыми, когда hex-значение заканчивается прямо на терминаторе словаря
  • Согласование индексов выбора в choice-полях декодирует вперемешку PDFDocEncoding, UTF-16 и hexadecimal-написания одним сопоставителем, поэтому эквивалентные export-значения перестраивают /I согласованно
  • Импорт XFDF принимает hexadecimal-написание export-значения опции, переданное как обычный literal-текст, восстанавливая round trip с файлами, написанными сторонними инструментами
  • Экспорт FDF пропускает поля без имени, состоящие только из widget, — вровень с экспортёром XFDF и поведением всех импортёров
  • Демо Stamp для Delphi привязывает watermark и аннотацию печати к фактическому размеру страницы, так что они остаются видимыми на альбомных и не-A4 входных данных
  • Демо DigiPrint для C++Builder освобождает изображения и построчные списки страниц, инициализирует коэффициент межстрочного интервала заголовка и сообщает об отсутствии demo.xml вместо падения
  • Сценарии сборки Win64 ABI DLL и codec-воркеров находят dcc64 в bin64 в RAD Studio 12 и новее, а полные сборки библиотеки C++Builder обнаруживают и вычищают остатки trial-версии из общего выходного каталога

Version 2.755.0

Added

  • Загруженные choice-поля с множественным выбором теперь обмениваются отдельными выбранными значениями через файловые и stream API FDF и колбэки XFDF с поддержкой массивов, сохраняя границы опций и синхронизируя индексы выбора при импорте

Version 2.754.6

Fixed

  • SetLoadedFormFieldExportValue теперь идёт по обычному пути обновления значения поля, сохраняя типы значений кнопок, индексы выбора, состояния appearance, закодированные строки и отслеживание изменений для расчётов

Version 2.754.5

Fixed

  • Значения форм XFDF и текстовые элементы аннотаций теперь сохраняют точное содержимое без вставки форматировочных пробелов, включая начальные и конечные пробелы, табуляции и переводы строк

Version 2.754.4

Fixed

  • Helper значений, значений по умолчанию и максимальной длины загруженных форм теперь учитывают унаследованные и косвенные записи; сброс полей сохраняет типы значений по умолчанию, синхронизирует выбор choice и состояния кнопок и не трогает соседние поля; перегенерированные appearance кнопок удерживают выбранное состояние и корректные границы отрисовки

Version 2.754.3

Fixed

  • Именованные дочерние поля загруженных форм остаются адресуемыми по отдельности, когда их тип поля унаследован: унаследованные тип, флаги и опции доступны через field helper, а удаление сохраняет соседние поля и их widget

Version 2.754.2

Fixed

  • Перегенерированные appearance загруженных choice-полей теперь показывают Unicode-подписи опций, сохраняя export-значения, отрисовывают невыбранные пункты списка и подсвечивают одиночный или множественный выбор согласованно со значениями и индексами поля

Version 2.754.1

Fixed

  • Обновление загруженного choice-поля теперь держит индексы выбранных опций согласованными с новым значением, включая export-значения опций и редактируемые пункты вне списка опций, не трогая общие массивы выбора

Version 2.754.0

Added

  • Опциональные фабрики HPDFCreateTesseractOCREngine и HPDFCreateRapidOCREngine подключают локальные программы распознавания и модели, предоставленные вызывающим кодом, к ищущим текстовым слоям — с текстом Unicode, координатами слов, таймаутами, отменой и бюджетами вывода

Fixed

  • Исправлены advance текстовой матрицы, ширины косвенных CID-шрифтов, восстановление клипа q/Q и Form, ориентация reduced JPEG, soft mask изображений и палитры Indexed stream — на затронутых страницах вернулись вёрстка текста и содержимое изображений
  • Малые встроенные TrueType filled glyph теперь используют локальное coverage-сглаживание, улучшая тонкие штрихи при низком DPI; отменённые OCR-запросы сообщаются как отмена, даже если движок распознавания вернул отказ
  • RenderOutputDither теперь действует во всех render-бэкендах и при параллельной отрисовке страниц, с согласованной инвалидацией кэша и отменой

Version 2.753.0

Added

  • SetLoadedFreeTextPlainText явно конвертирует поддерживаемые загруженные аннотации FreeText в обычный текст ASCII Helvetica и перестраивает их видимый appearance для полных перезаписей и инкрементальных сохранений

Fixed

  • Конвертация загруженных страниц и валидация при сохранении теперь разрешают косвенные и унаследованные page box, сохраняя общие размеры страниц вместо подмены их на A4

Version 2.752.5

Fixed

  • Инициализация bitmap страницы теперь проверяет отмену при очистке ограниченных блоков, освобождает незавершённые bitmap и не задерживает переднюю отрисовку, пока отменённая prefetch-работа заканчивает инициализацию

Version 2.752.4

Fixed

  • Закрытие или перезагрузка документа теперь освобождает принадлежащие ему графы объектов PDF и payload stream, включая общее и циклическое владение, не освобождая связанные ссылки дважды

Version 2.752.3

Fixed

  • Изменения значения загруженного чекбокса теперь синхронизируют состояния appearance, даже когда словарь нормального appearance содержит только выбранное состояние

Version 2.752.2

Fixed

  • Включение воспроизводимого вывода после конструирования документа теперь фиксирует метку времени создания, поэтому эквивалентные сохранения остаются побайтово одинаковыми независимо от тиков часов

Version 2.752.1

Fixed

  • Имена полей загруженных форм теперь декодируют PDF-строки согласованно: поля с именами в UTF-16 находятся и обновляются без смены их идентичности

Version 2.752.0

Fixed

  • Перемещение загруженной аннотации без widget теперь сохраняет идентичность объекта аннотации и обновляет её необязательную ссылку на страницу, указывая на целевую страницу

Version 2.751.0

Fixed

  • Удаление загруженных страниц теперь сопровождает именованные назначения, назначения outline, деревья структуры, parent tree и ссылки на объекты аннотаций, устраняя достижимые null-ссылки как в полных перезаписях, так и в инкрементальных сохранениях

Version 2.750.0

Fixed

  • Полные перезаписи PDF теперь разворачивают непрочитанные сжатые объекты перед заменой контейнеров object stream, сохраняя шрифты, цветовые пространства и ActualText; это чинит искажённый китайский текст, изменившийся вид страниц и изменившийся текст извлечения
  • Зашифрованные документы с пустым пользовательским паролем теперь загружаются и сразу начинают перезапись, а заблокированные object stream отказывают с ясной ошибкой вместо выдачи неполного документа
  • Неизменённые числовые объекты сохраняют исходную точность, не допуская едва заметного дрейфа цвета и прозрачности после перезаписи
  • Скопированные страницы сохраняют валидированные имена ресурсов и ссылки; исправлены ошибки косвенных resource dictionary и неправильно привязанные изображения

Version 2.748.6

Fixed

  • Исправлена закольцовка подраздела cross-reference, объявляющего больше записей, чем вмещает таблица: он прокручивал всё объявленное количество, не оставляя данных для чтения, из-за чего отклонение битого файла в сорок байт занимало десятки секунд
  • Исправлена потеря всех уже полученных результатов в job runner при исключении в одной из операций, а также потеря объекта изображения при импорте HTML, когда окружающий его stream не удаётся создать

Version 2.748.5

Fixed

  • Исправлено открытие файлов PKCS#12 с не-ASCII паролем: пароль — это строка байтов UTF-8, но он расширялся по одному байту вместо декодирования, поэтому производный ключ был неверным для каждого символа вне ASCII. Файлы, защищённые современной схемой PBES2, не затрагивались — вот почему поведение двух вариантов различалось
  • Исправлено возникновение access violation вместо собственной ошибки у batch-валидатора подписей и кэша доказательств отзыва при конструировании с недопустимой опцией: деструктор выполнялся до создания освобождаемых им членов
  • Исправлен сбой задачи скачивания доказательств в деструкторе при отклонении её аргументов: проверки выполнялись до создания самого потока
  • Исправлено кодирование провайдером облачных подписей идентификатора алгоритма, у которого вторая дуга превышает 39; битый идентификатор теперь вызывает собственную ошибку провайдера, а не ошибку преобразования
  • Контейнеры сертификатов и подписей теперь отклоняют вложенный элемент, объявляющий длину, выходящую за пределы содержащего его элемента, так что проверяемое и покрываемое подписью больше не могут расходиться
  • Значения приватных ключей после подписания RSA затираются в памяти, а не остаются в куче до следующего выделения

Version 2.748.4

Fixed

  • Исправлено чтение загрузчиком шрифтов Type 1 всех свойств из первой строки программы шрифта: список токенов дозаполнялся без очистки, поэтому строки версии, семейства и насыщенности, stem hints и длина ключа charstring брались из устаревших токенов. Шрифты Type 1 теперь сообщают собственные метаданные
  • Исправлено хранение длины ключа charstring в виде указателя на уже освобождённую строку и её использование без проверки диапазона; теперь она хранится значением и ограничивается диапазоном, который допускает формат
  • Исправлен постоянный откат не встроенных шрифтов к системному шрифту по умолчанию: запрошенное имя начертания копировалось в wide-char запись шрифта побайтово, поэтому ни одно установленное семейство никогда не совпадало
  • Исправлено чтение за конец обрезанной программы шрифта при разборе встроенных TrueType и OpenType во время декодирования контуров глифов, аргументов составных глифов и таблицы CFF контейнера OpenType, а битая таблица символов больше не запрашивает отрицательный массив глифов
  • Исправлено переполнение объявленных номеров объектов в cross-reference таблицах и streams: запись с номером около целочисленного предела превращалась в отрицательный индекс и записывалась вне таблицы, а объявленное количество объектов или /Size, намного превышающее размер файла, задавало размер массивов загрузчика только по этому объявлению

Version 2.748.3

Fixed

  • Исправлено отклонение корректного ввода в Data Matrix: размер символа оценивался делением количества цифр пополам, но кодовое слово разделяют только соседние цифры, поэтому текст вроде 1a2a3a выбирал символ, слишком маленький для собственных данных, и не кодировался
  • Исправлено декодирование четырёхбайтовых символов UTF-8 в XFDF (например emoji) в неправильную суррогатную пару, и нераспознанный байт больше не проглатывает три следующих за ним символа
  • Region-записи enhanced-metafile теперь ограничивают количество прямоугольников размером записи, а не доверяют количеству из заголовка региона, которое могло увести чтение далеко за пределы записи
  • Изображения PNG, у которых заявленная ширина, умноженная на высоту, превышает адресуемый диапазон, отклоняются на этапе заголовка вместо выделения пиксельного буфера отрицательной длины
  • Высококачественный ресемплинг изображений теперь сообщает о запросе вне диапазона вместо переполнения размера промежуточного буфера
  • Изображение WebP meta prefix, заявляющее больше групп энтропии, чем у него пикселей, отклоняется вместо выделения сотен мегабайт таблиц префикса из нескольких сотен байт входных данных
  • Исправлены утечки на путях сбоя кодирования Aztec, декодирования bitmap WebP и пула воркеров декодирования object stream, где частично построенный объект бросался, когда исключение возникало на следующем шаге

Version 2.748.2

Fixed

  • Исправлена потеря последних битов кодового слова в символах QR Code: обход расстановки модулей пропускал самый левый столбец, поэтому хвост последнего блока коррекции ошибок никогда не записывался в символ
  • Исправлено заполнение терминатором QR остатка блока данных нулевыми битами целиком, из-за чего не оставалось места для кодовых слов заполнения 0xEC / 0x11, требуемых ISO/IEC 18004; символ версии 1 вместо них нёс шесть нулевых кодовых слов
  • Новый тест читает сгенерированный символ обратно из его модулей, так что блок данных, кодовые слова заполнения, блок коррекции ошибок, маска и расстановка сверяются со стандартом, а не с выводом самого кодировщика

Version 2.748.1

Fixed

  • Исправлено зависание трёх парсеров на битом вводе вместо сообщения об ошибке: парсер объектов — на >> внутри массива или ] внутри словаря, читатель CMap — на лишней скобке или фигурной скобке, читатель XFDF — на конструкции без имени тега (например, объявлении типа документа) или лишнем байте между атрибутами. Каждый из них переставал двигать курсор, поэтому один неожиданный байт превращал разбор в бесконечный цикл
  • Исправлено чтение секций CDATA в XFDF как разметки: их содержимое теперь берётся как текст элемента, а маркер секции измеряется корректно, без проглатывания первого символа
  • Исправлено переполнение проверки размера при длине chunk WebP около 2 ГБ, из-за чего копирование полезной нагрузки читало за конец буфера файла; длины chunk теперь проверяются в 64-битной арифметике
  • Исправлено освобождение буфера chunk при длине chunk PNG 0xFFFFFFFF, пока chunk продолжал сообщать заявленную длину, из-за чего последующие чтения указывали на освобождённую память; чрезмерно длинные chunk отклоняются
  • Исправлено переполнение вычисления размера буфера строк при декодировании факса CCITT для очень больших заявленных геометрий страницы, что могло приводить к записи за пределы буфера; хранилище строк теперь ограничено, и декодирование аккуратно останавливается на пределе
  • Исправлено чтение кодировщиком CCITT одного байта за концом строки развёртки для ширин, кратных восьми
  • Исправлено чтение comment-записей enhanced-metafile через усечённый до 32 бит указатель в 64-битных сборках, из-за чего каждый EMF с GDI-комментарием читал посторонний адрес
  • Исправлена публикация неинициализированной памяти в качестве хвоста таблицы цветов у 8-битных изображений с числом записей палитры меньше 256; таблица теперь объявляет своё реальное количество записей
  • Исправлено исчерпание стека глубоко вложенными структурами BER неопределённой длины при разборе контейнера подписи или сертификата; вложенность глубже 128 уровней отклоняется

Version 2.748.0

Fixed

  • Исправлена коррекция ошибок всех рисуемых библиотекой 2D-штрихкодов: QR Code, Data Matrix, PDF417 и Aztec строили порождающий полином от свободного члена вверх, но делили так, будто старший член идёт первым, поэтому каждый символ нёс контрольные слова, которые не принимает ни один соответствующий стандарту ридер. Контрольные слова теперь совпадают с разобранными примерами из ISO/IEC 18004, ISO/IEC 16022 и ISO/IEC 15438
  • Исправлена потеря полезной нагрузки у символов Aztec: кодировщик делит массив кодовых слов на месте, а вызывающий код выводит тот же массив, поэтому слова сообщения затирались делением, и символ не нёс ни данных, ни корректного mode message
  • Исправлена ошибка порождающего полинома Data Matrix, корни которого стартовали на одну степень ниже, из-за чего получался полином, отличный от предписанного в Приложении E ISO/IEC 16022
  • Исправлен finder-паттерн Data Matrix: сплошная L теперь это левый столбец и нижний ряд, а чередующаяся часовая дорожка — верхний ряд и правый столбец, каждая начинается тёмным в углу, общем с L. Раньше они были перепутаны местами, поэтому ридеры не могли установить ориентацию символа

Version 2.747.4

Fixed

  • Исправлена запись чисел PDF с системным десятичным разделителем при редактировании загруженных документов: при сшивке страниц, затирании прямоугольников, штампах текста и изображений, составных фигурах водяных знаков и appearance эллипсов теперь всегда используется точка, так что документы, отредактированные в локали с десятичной запятой (например, немецкая или французская Windows), больше не содержат content streams, которые отвергают просмотрщики
  • Исправлена загрузка шрифтов Type 1, зависевшая от системной локали: вещественные числа FontMatrix, BlueValues, stem hints и charstring разбираются как числа PostScript с точкой, так что шрифты PFB сохраняют свои метрики и контуры в системах с десятичной запятой вместо того, чтобы молча ломаться
  • Исправлено следование за локалью процесса при разборе размера шрифта и цвета default appearance (/DA), атрибутов HTML width и size, результатов FormCalc и чисел JSON задания; теперь во всех направлениях используется инвариантный формат
  • Исправлена отрисовка встроенных штрихкодов, записывавшая прямоугольники штрихов через зависящий от локали формат, что давало битый content stream в системе с десятичной запятой
  • Сборки Free Pascal теперь разбирают и форматируют операнды content streams, метрики извлечения текста и числа JavaScript в инвариантном формате, как сборки Delphi, вместо отката к зависящему от локали преобразованию
  • Писатель чисел больше не перезаписывает десятичный разделитель глобальных настроек форматирования приложения-хозяина при каждом вызове — это меняло то, как остальная часть программы форматирует собственные числа, и было небезопасно, когда документы одновременно создавали несколько потоков

Version 2.747.3

Fixed

  • Исправлено исчезновение правок на сжатых страницах: редактирование-закраска, сшивка страниц, составные фигуры водяных знаков и вписывание аннотаций добавляли свои операторы в всё ещё сжатый поток содержимого страницы, из-за чего полоса закраски, сшитая страница, фигура водяного знака или вписанная аннотация молча отсутствовали в сохранённом файле. Теперь содержимое страницы разворачивается перед любым добавлением
  • Исправлено сращивание добавляемого содержимого с последним оператором, уже имеющимся на странице, когда страница не заканчивалась пробельным символом: это давало нечитаемый токен вроде Q0.5 и могло привести к отказу читалки от всей страницы; теперь там, где это нужно, вставляется конец строки

Version 2.747.2

Added

  • Добавлена поддержка Free Pascal Win32: пакет Lazarus теперь собирается и для i386-win32, и для x86_64-win64 через отдельные точки входа сборки, smoke-наборы принимают аргумент архитектуры, а проблемы 32-битного компилятора и линковки C-символов исправлены; создание и загрузка PDF, сжатие Flate, шифрование AES и работа с документами CBZ покрыты на обеих целевых платформах

Version 2.747.1

Fixed

  • Исправлена повторная попытка с повёрнутой маской во встроенном декодере штрихкодов: устаревшие байты оставались в нетронутых ячейках повёрнутой маски, порождая фантомные штрихи и делая повёрнутые на четверть оборота символы Code 39 нечитаемыми; повёрнутый буфер теперь явно обнуляется, так что повёрнутые фотографии и сканы Code 39 декодируются через повтор с поворотом

Version 2.747.0

Added

  • Добавлен импорт изображений WebP: AddImageFromFile теперь принимает файлы .webp через встроенный декодер без потерь (VP8L), реализующий RFC 9649 — канонические префиксные коды, пространственные meta-префиксные коды, обратные ссылки LZ77 с картой соседних расстояний, кэш цвета и все четыре обратных преобразования (predictor, color, subtract-green, color indexing с упаковкой пикселей); кадры с потерями VP8 отклоняются с понятным сообщением

Version 2.746.0

Added

  • Встроенный декодер штрихкодов теперь читает QR-символы в любой из восьми ориентаций, в которой может прийти сфотографированная или отсканированная страница: finder-паттерны определяют недостающий угол, а сэмплированная матрица модулей поворачивается или зеркалится в ожидаемую раскладку перед декодированием, так что повёрнутые на четверть оборота и зеркальные снимки читаются без предобработки

Version 2.745.0

Added

  • Добавлена оценка квалифицированных сертификатов eIDAS для загруженных подписей: GetLoadedSignatureQCStatements сообщает QCStatements сертификата подписанта по ETSI EN 319 412-5 — значения QcCompliance, QcSSCD, QcType, валюту/сумму/экспоненту QcLimitValue и местоположения PDS — плюс роли плательщика и получателя PSD2 из TS 119 495 и поднимает эвристику квалифицированной подписи, когда QcCompliance и QcSSCD заявлены одновременно (решение о доверии QTSP остаётся за вызывающей стороной)

Version 2.744.0

Added

  • Добавлен N-up спуск полос для загруженных документов: ComposeLoadedPagesNUp переукладывает каждую страницу на собранные сеткой листы исходного формата бумаги (2-up, 4-up, 6-up, до 16x16) для вывода, готового к печати, поглощая /Rotate каждой страницы в матрицу размещения, разделяя ресурсы страницы с собранной формой и опционально рисуя волосяные рамки ячеек с настраиваемым промежутком

Version 2.743.0

Added

  • FlattenLoadedAnnotations теперь запекает аннотации без потока внешнего вида вместо молчаливого пропуска: виджеты сначала получают сгенерированный из значения поля внешний вид (случай /NeedAppearances, типичный для форм, распечатанных из браузера), так что введённое значение попадает в содержимое страницы
  • Разметочные аннотации без /AP получают синтезированный внешний вид, отрисованный из их собственных свойств — текст FreeText и Stamp со стилизацией /DA и выравниванием /Q, фигуры Square и Circle с цветом /C / /IC и толщиной /BS, штрихи Line и Ink, а также разметка Highlight / Underline / StrikeOut / Squiggly с учётом /QuadPoints и непрозрачности /CA
  • Скрытые аннотации (флаг hidden в /F) остаются аннотациями, когда у них нет внешнего вида, потому что запекание невидимой заметки сделало бы её видимой

Version 2.742.0

Fixed

  • Исправлена сборка пакета Free Pascal, ломавшаяся начиная с 2.738.0: объявления членов LTV-доказательств и seed-value попали внутрь условного блока только для Delphi, тогда как их реализации были безусловными, и пакет Free Pascal перестал компилироваться; реализации теперь несут то же условие, и пакет снова собирается

Added

  • Импорт HTML теперь раскладывает таблицы на полной сетке занятости, так что ячейки с rowspan и colspan корректно занимают свои колонки, а последующие строки пропускают занятые слоты вместо сдвига влево
  • Высоты строк таблицы берутся из переноса текста ячейки её собственным шрифтом вместо оценки по числу символов, так что смешанный узкий и широкий контент больше не создаёт переполняющих или раздутых ячеек
  • Ширины колонок следуют подсказкам ширины <col> и атрибутам ширины отдельных ячеек, а строки заголовка, размеченные <thead> (или ведущие строки из одних <th>), повторяются вверху каждой продолженной страницы, когда таблица переходит через разрыв
  • Группа rowspan сохраняется целиком через разрывы страниц: строки, соединённые растянутой ячейкой, уходят на следующую страницу вместе, так что растянутая ячейка никогда не разрезается

Version 2.741.0

Fixed

  • Исправлено завершение сборок Free Pascal вместо сообщения об ошибке, когда документу нужен один из кодеков, которые эти сборки не линкуют: открытие TIFF, декодирование изображения JPEG 2000 или JBIG2, чтение progressive или уменьшенного JPEG, применение цветового преобразования ICC или запрос пересжатия Zopfli убивали процесс целиком
  • Каждая из этих операций теперь падает так, как её вызывающая сторона уже ожидает, поэтому документ, использующий одну из них, загружается с пропущенной возможностью вместо того, чтобы уронить приложение

Added

  • Добавлено извлечение текста в порядке структуры: ExtractLoadedPageStructureText обходит дерево структуры документа в порядке авторства (ISO 32000-1 14.8.4) и склеивает фрагменты marked-content страницы по MCID, так что тегированные документы вроде правительственных форм и доступных публикаций извлекают свой канонический порядок чтения вместо геометрической догадки; глифы, которые дерево не заявляет, уходят в геометрический хвост и учитываются в отчёте по нетегированной части

Version 2.740.0

Fixed

  • Исправлена потеря прозрачности цветных глифов в сборках Free Pascal: встроенные цветные битмапы читались через путь, отбрасывающий альфа-канал, из-за чего каждый глиф эмодзи или цветного шрифта рисовался непрозрачным прямоугольником. Теперь битмапы сохраняют попиксельную альфу

Fixed

  • Включено соглашение ключей P-384 ECDH: финальное условное вычитание умножения Монтгомери в CIOS сравнивалось со значением P limb плюс заём, что оборачивалось в ноль на старших limb из всех единиц у простых P-384 / P-521 и молча брало заём неправильно; сравнение теперь обнаруживает заём без переполняющего сложения, и общий секрет P-384 совпадает с референсными векторами OpenSSL байт в байт

Version 2.739.0

Added

  • Сборки Free Pascal теперь шифруют и расшифровывают документы: точки входа AES обслуживаются собственной FIPS-197 реализацией библиотеки вместо ошибки unsupported-operation, так что защищённые файлы AES-128 и AES-256 можно создавать и открывать там
  • Шифрование и расшифровка AES-GCM, включая стриминговый контекст для больших полезных нагрузок, доступны в сборках Free Pascal
  • Smoke-тест Free Pascal теперь сверяет шифр с известным ответом FIPS-197, прогоняет туда-обратно PKCS#7 и GCM, а также создаёт и перечитывает защищённый AES-256 документ с отклонением неверного пароля

Added

  • В импортный движок HTML5 добавлена типографика абзацев CSS2.1: text-align (с маппингом устаревшего атрибута align и тега center), letter-spacing и word-spacing через PDF-операторы Tc / word-space, text-indent для красной строки и правила text-decoration underline / line-through, так что существующий веб- и email-HTML при импорте сохраняет центрированные заголовки, отступы и подчёркивания
  • Расширен встроенный QR-декодер за пределы версии 1: версия символа теперь выводится из геометрии finder'ов через делимость сетки (версии 2-40 с чистой сеткой модулей декодируются), лимит длины в byte-mode следует за ёмкостью ISO/IEC 18004 Table 7 для каждой версии, а карта функциональных модулей покрывает alignment-паттерны и блоки информации о версии для старших символов

Version 2.738.0

Added

  • Сборки Free Pascal теперь нативно сжимают и распаковывают документы: кодек deflate предоставляется встроенным бэкендом над Pascal-реализацией zlib, поставляемой с Free Pascal, так что содержимое FlateDecode больше не выдаёт ошибку unsupported-operation
  • Сжатые документы можно создавать и перечитывать под Free Pascal с настройкой сжатия по умолчанию, а потоки перекрёстных ссылок, объектные потоки, встроенные файлы и сжатое содержимое страниц там декодируются
  • Бэкенд покрывает обёртки zlib и сырой deflate, обёртку gzip с автоопределением заголовка, поэтому импорт SVG и fallback декомпрессии с несколькими размерами окна ведут себя как под Delphi
  • Smoke-тест Free Pascal теперь проверяет кодек через самотест обёртки и контрольной суммы плюс круговой прогон сжатого документа

Added

  • Добавлено достраивание цепочки по AIA caIssuers: HPDFFetchAIAIntermediates обходит endpoints метода доступа 1.3.6.1.5.5.7.48.2 набора сертификатов CMS через транспорт вызывающей стороны (голые DER- и PEM-тела декодируются оба), а опция валидации FetchMissingIntermediates подаёт полученные промежуточные сертификаты в построение пути, так что подписи облачных подписантов с единственным сертификатом конечного субъекта валидируются вместо провала построения пути
  • Добавлено включение LTV одним вызовом: PopulatePAdESLTVEvidence обходит каждую загруженную подпись, подтягивает её промежуточные сертификаты плюс доказательства OCSP/CRL онлайн и записывает материал в DSS документа, поднимая свежий документ с подписью B-B до B-LT без вручную собранных массивов доказательств
  • Добавлено принуждение seed-value при подписании: CheckLoadedSignatureSeedValue читает словарь /SV поля подписи и проверяет кандидатов SubFilter, DigestMethod, Reason и профиль DocMDP против его ограничений с семантикой force-битов ISO 32000-1 12.7.5.5, так что ограничения автора формы соблюдаются до постановки подписи

Version 2.737.0

Added

  • Добавлена строгая верификация сохранения через свойство VerifySavedOutput: после записи свежий экземпляр ридера с отключённым восстановлением перекрёстных ссылок перечитывает файл, так что повреждённая сериализация падает в месте вызова, а не всплывает у следующего потребителя
  • ReproducibleOutput расширен на зашифрованные документы: потоки AES-CBC используют статическую конвенцию IV 14*(1+i), ключевой материал и соли выводятся детерминированно, а канонический ID документа нормализует изменчивые timestamps в Info, что даёт побайтово идентичные зашифрованные сохранения для регрессионных pipeline

Version 2.736.0

Added

  • Добавлены высококачественный ресемплинг и монохромный дизеринг через новый юнит HPDFResample: разделимые бикубические ядра Catmull-Rom и Lanczos3 заменяют семантику растяжения GDI для даунсэмплинга изображений через свойство ImageDownsampleKernel, а RenderOutputDither применяет диффузию ошибок Floyd-Steinberg после компоновки страницы, так что вывод print-preview сохраняет фотографические детали в чистом чёрно-белом режиме

Version 2.735.2

Fixed

  • Исправлена передача адреса переменной буфера вместо самого буфера потоками распаковки Flate при дозаполнении из исходного потока: это портило память при каждом чтении и могло уронить процесс; затронуты загрузка сжатых документов, классы inflate-потоков и помощники потоков сжатия и распаковки

Version 2.735.1

Fixed

  • Исправлено схлопывание в одну строку при уплощении растущих XFA-полей без источника данных: их высота теперь измеряется по тексту, который объявляет сам шаблон — именно его такое поле и показывает. Поле, привязанное к пустым данным, по-прежнему измеряется как пустое

Version 2.735.0

Added

  • Сборки Free Pascal теперь покрывают всю библиотеку: каждый юнит компилируется с FPC 3.2.2 и Lazarus, тогда как раньше компилировалась только основная цепочка создания и загрузки
  • Контейнеры XPS, EPUB и CBZ импортируются под Free Pascal через встроенный ZIP-ридер только для чтения, который обрабатывает размеры ZIP64, записи stored и deflated, проверку CRC и традиционно зашифрованные записи с тем же callback'ом пароля, что и путь Delphi
  • Уплощение XFA-форм, вычислительный движок FormCalc, рантайм виджетов, компоненты просмотра документов, обработчики шрифтов Type 1, импорт HTML, проверка подписей и job runner — всё это компилируется в сборках Free Pascal; уплощение XFA-пакетов загруженного документа дополнительно требует кодек deflate, который эти сборки не линкуют

Fixed

  • Исправлен 64-битный байтовый своп в юните-помощнике PNG, который возвращал неверные значения на Win64, из-за чего юнит вообще не попадал в сборку

Added

  • Добавлено обнаружение отсутствующих глифов в момент отрисовки: свойство TrackUnresolvedGlyphs записывает каждую кодовую точку, которая отрисовалась бы tofu-боксом .notdef в активном Юникод-шрифте, поднимает событие OnUnresolvedGlyph по каждой находке и не трогает незарегистрированные чисто-GDI документы
  • Добавлена поддержка устаревшей таблицы kern: RegisterUnicodeTTF захватывает kern-таблицу эпохи Apple/GDI, а выдача кернинга откатывается к её бинарному поиску пар формата 0, когда в шрифте нет GPOS kern lookup'ов, возвращая классическую парную разрядку шрифтам вроде штатного Arial
  • Добавлен per-run font fallback внутри вёрстки абзацев: WideTextOutBox теперь разбивает каждую перенесённую строку в кодовых точках, которые текущий шрифт не может отобразить, и рисует каждый участок его разрешённым fallback-шрифтом, так что абзацы со смешанной латынью, эмодзи и CJK рендерятся без tofu при зарегистрированных fallback-цепочках

Version 2.734.0

Added

  • Добавлена обвязка запросов timestamp по RFC 3161: HPDFRFC3161BuildRequest выпускает DER TimeStampReq со свежим положительным INTEGER-nonce, опциональным policy OID и certReq, а HPDFRFC3161ParseResponse декодирует заголовок PKIStatusInfo и извлекает токен, так что транспортные callback'и к TSA занимают три строчки вместо изучения DER
  • Добавлено объявление developer-расширения ISO/TS 32002 (THotPDF.EnsureISO32002Extensions), покрывающее алгоритмы подписи EdDSA и дополнительные кривые ECDSA в документах PDF 2.0, идемпотентное и ограниченное версией, как объявление 32001 SHA-3

Version 2.733.0

Added

  • Добавлены переносимые X25519 и X448 соглашения ключей лестницей Монтгомери плюс ECDH на кривых NIST P-256 / P-521 с умножением Монтгомери CIOS, что позволяет создавать и разворачивать получателей с открытым ключом (KARI) целиком внутри процесса; RFC 7748 и референсные векторы, сгенерированные OpenSSL, запирают поведение лестницы в регрессионный набор
  • Добавлены HPDFUnwrapKeyAgreementRecipientEnvelope вместе с точками входа AddPubSecAgreementKeyMaterial и AddPubKeyAgreementRecipientWithSecret, так что документы, зашифрованные получателями ECDH / X25519 / X448, можно открывать с приватным скаляром получателя и шифровать без внешних ECDH-инструментов

Version 2.732.0

Changed

  • Сохранения теперь прогоняют вывод сериализатора через буферизованный поток записи на 1 МиБ, сворачивая поштучные вызовы Write заголовков объектов, ключей словарей и строк xref в пакетные отправки к файловым приёмникам
  • Полезные нагрузки потоков перекрёстных ссылок применяют PNG Up-предсказание (/DecodeParms /Predictor 12) перед FlateDecode и схлопывают дыры free-list через подсекции /Index, ужимая xref-контейнеры на каждом документе PDF 1.5+ и на разреженных диапазонах объектов
  • Свойство CompressionLevel теперь также выбирает усилие Flate для контейнеров потока перекрёстных ссылок и объектных потоков, так что clMaximum даёт меньшие структурные потоки при сохранении

Fixed

  • Ширины полей /W потока перекрёстных ссылок теперь адаптируются к фактическому диапазону смещений вместо фиксированной раскладки [1 4 2], чей каст в Cardinal молча обрезал смещения за 4 ГиБ в повреждённый вывод

Version 2.731.0

Changed

  • Встроенный OCR с сопоставлением шаблонов перестроен: глифы извлекаются связными компонентами, покрытие оценивается в градациях серого против кэшированных многошрифтовых шаблонов, бинаризация Отсу с fallback на локальное окно, разбиение на слова по бимодальным пробелам, базовые линии по словам, отсев точечного шума и расширенный алфавит на 62 символа, распознающий смешанный по регистру ASCII-текст через кластеризацию высот на уровне строки и предпочтение по контексту регистра

Version 2.730.0

Added

  • Добавлена поддержка Win64 для Free Pascal 3.2.2 и Lazarus 4.6, включая runtime-пакет, воспроизводимый build-скрипт, слой совместимости и не-GUI smoke-тест создания и перечитывания; нативные статические интеграции кодеков остаются только для Delphi и в сборках Free Pascal сообщают явную ошибку unsupported-operation

Version 2.729.0

Added

  • Добавлен нейтральный к хосту динамический рантайм XFA-виджетов с редактированием Юникода, focus и hit-тестированием, привязкой с учётом экземпляров, атомарной валидацией и вычислением, ограниченным reflow и read-only фабрикой загруженных документов, сохраняющей исходный XFA

Version 2.728.0

Fixed

  • Исправлены внутренние измерения XFA и продолжение текста, чтобы сохранять явные пустые и вычисленные значения, использовать контекст привязки каждого поля или повторяющейся строки, удерживать действия breakAfter, избегать коллизий синтетических имён и соблюдать кэшированный бюджет глобального измерения

Version 2.727.0

Changed

  • Вёрстка XFA теперь применяет внутренние минимальные и максимальные размеры, измеряет растущие поля по привязанному тексту и атомарно разбивает подходящий контент textEdit между областями содержимого и страницами с read-only полями-продолжениями и ограниченными бюджетами текста, фрагментов и измерений

Version 2.726.0

Added

  • Добавлены полные process- и spot-атрибуты NChannel, mixing hints, ограниченные спектральные потоки чернил CxF/X-4 для PDF 2.0 и проверки согласованности на уровне документа для определений tint spot-цветов и внешних таблиц colorant'ов output intent

Version 2.725.0

Added

  • Добавлен потокобезопасный детерминированный SIMD-бэкенд построчного рендеринга, который предварительно проверяет поддерживаемые прямоугольные display list'ы, пишет финальную битмап-поверхность векторными блоками без промежуточной копии битмапа и возвращает точные причины отказа по каждому запросу через существующий software fallback и pipeline телеметрии

Version 2.724.0

Changed

  • Ограниченный нативный вычислитель FormCalc расширен общими агрегатами по SOM node-set'ам, смешанными скалярными и node-set аргументами, вложенными числовыми и строковыми вызовами, а также детерминированными функциями выбора, строковыми, тригонометрическими, логарифмическими и функциями преобразования в рамках существующих бюджетов операций, массивов, глубины, времени и вывода

Version 2.723.0

Changed

  • SubsetLoadedFonts теперь безопасно выполняет поднабор встроенных программ Type 1 — PFB, а также split-бинарных и hex PFA, сохраняет рекурсивные зависимости композитных TrueType и закрывает зависимости контуров COLR v0/v1, сохраняя таблицы цвета, битмапов, вариаций и шейпинга

Version 2.722.0

Added

  • Добавлены ограниченные callback'и пароля для классически ZIP-шифрованных записей XPS, EPUB и CBZ, включая лимиты повторов на запись, проверки отмены, обработку учётных данных только в памяти и fail-closed отклонение недоступного, неверного или неподдерживаемого шифрования

Version 2.721.0

Changed

  • DownsampleLoadedImages теперь масштабирует поддерживаемые 8-битные сэмплы изображений Separation и DeviceN прямо в пространстве компонентов и сохраняет исходный граф цветовых пространств, tint-преобразование, colorant'ы, диапазоны /Decode и семантику overprint через сохранение и перечитывание

Version 2.720.0

Added

  • Добавлены ограниченные встроенные перегрузки распознавания для высококонтрастного прописного ASCII-OCR, горизонтального Code 39 и чистых выровненных по осям QR-символов версии 1 в byte-mode, что позволяет строить поисковые текстовые слои и декодировать штрихкоды загруженных страниц без движка от вызывающей стороны, а неоднозначный или неподдерживаемый ввод получает fail-closed отказ

Version 2.719.0

Added

  • Добавлена ограниченная дообработка JPEG 2000 по разрешению и слою качества через THPDFJpeg2000Decoder.LoadProgressiveFromByteArray плюс многослойное кодирование через TJpeg2000Bitmap.QualityLayers с идентичными финальными пикселями для порядков прогрессии LRCP, RLCP, RPCL, PCRL и CPRL

Version 2.718.0

Changed

  • Встроены полные CMaps UniJIS, UniGB, UniCNS и UniKS в вариантах UCS2 и UTF16, горизонтальных и вертикальных, включая дополнительные скаляры и стандартные вертикальные значения по умолчанию, так что извлечение CJK-текста и геометрия больше не зависят от внешних файлов Юникод-маппингов или догадок в пол-em

Version 2.717.0

Added

  • Добавлены явные диапазоны зависимостей shared-object у линеаризованных документов и планировщик перерисовки по факту прихода диапазонов, так что страницы могут отрисоваться до прибытия всех опциональных зависимостей и перерисовываются ровно тогда, когда вновь доступные данные меняют результат

Version 2.716.0

Added

  • Добавлен ограниченный ремонт графа объектов по actionable-находкам preflight xref, trailer, catalog, дерева страниц и дерева имён с проверенной фиксацией транзакции и полным откатом на небезопасном или неоднозначном вводе

Version 2.715.0

Added

  • Добавлены обёртки encrypted payload PDF 2.0, у которых видимое содержимое документа остаётся читаемым до аутентификации, пока имена, описания и байты встроенных файлов остаются защищёнными до явной разблокировки паролем

Version 2.714.0

Changed

  • Экспорт загруженных страниц в SVG теперь выдаёт осевые и радиальные градиенты, ограниченные PNG-представления mesh-заливок Type 4 - Type 7 и декодированные inline-изображения без инкремента соответствующих счётчиков пропуска

Version 2.713.0

Changed

  • Цветные глифы OpenType SVG теперь используют ограниченный pipeline Form XObject для дуг, векторных градиентов, прозрачности, геометрических масок и локального переиспользования #id, продолжая отклонять скрипты, внешние ресурсы, изображения и неподдерживаемый активный контент

Version 2.712.0

Changed

  • ReplaceLoadedPageText теперь заменяет совпадения, размазанные по строковым элементам и массивам TJ, через промежутки исходных глифов, сохраняя числа кернинга, несовпавшие префиксы и суффиксы, посторонние операнды и исходную структуру content stream

Version 2.711.0

Added

  • Добавлено разрешение SyntheticBase для CFF FontSet с унаследованными значениями Top и Private DICT, CharStrings, charset, Encoding и Local Subrs, плюс детерминированная семантика перекрытия и ограниченный отказ для неверного, циклического или чрезмерно глубокого наследования

Version 2.710.0

Added

  • Добавлен детерминированный ограниченный выбор Flate-предсказателя через HPDFSelectFlatePredictor с распределёнными строчными сэмплами, оценкой стоимости в байтах, настраиваемым весом CPU и явными бюджетами байтов, строк и работы

Version 2.709.0

Added

  • Добавлен опциональный нативный вывод symbol-словарей и текстовых регионов JBIG2 по Хаффману через THPDFJBIG2Options.UseHuffmanEncoding, включая стандартные таблицы DH, DW, BMSIZE, FS, DS и DT, сырые коллективные битмапы, таблицы symbol-ID, детерминированную нативную маршрутизацию и попиксельно точные круговые прогоны декодера при сохранении арифметики и MMR по умолчанию

Version 2.708.0

Changed

  • Обратные cmap-маппинги арабских и составных presentation-form глифов кэшируются по поколению зарегистрированного шрифта, что заменяет повторные сканы U+FB00..U+FDFF и U+FE70..U+FEFF в ApplyArabicGSUBRefinement, ApplyArabicGSUBContextualRefinement и общем контекстном пути GSUB с сохранением приоритета кодовых точек и шейпированного вывода

Version 2.707.0

Added

  • Добавлен кодер 2D-штрихкодов Aztec (ISO/IEC 24778) через THPDFPage.DrawAztec и отдельный юнит THPDFAztec: высокоуровневое кодирование динамическим программированием с mode-защёлками, сдвигами и binary-shift-сериями, битовая набивка, коррекция ошибок Рида-Соломона над GF(16) - GF(4096), автоматический выбор компактного символа 15x15..27x27 или полного 19x19..143x143 и управление принудительным слоем для фиксированных размеров символа
  • Добавлена сборка вертикального текста страницы: THotPDF.ExtractLoadedPageText и API агрегации по диапазонам и потокам теперь кластеризуют глифы WMode 1 в колонки по X начала глифа, упорядочивают колонки справа налево и идут по каждой колонке сверху вниз вместо того, чтобы шинковать вертикальный CJK-текст на построчные ряды глифов

Fixed

  • Исправлен провал параллельного экспорта полосами с несовпадением ширины PNG-полосы на страницах с дробными пиксельными размерами (A4 при 96 DPI): размер растра теперь округляется через Ceil единообразно с писателями полос, так что доставленные тайлы всегда совпадают с шириной кодера

Version 2.706.0

Added

  • Добавлен потоковый экспорт загруженных страниц в PNG и ленточный многостраничный экспорт в TIFF через THotPDF.SaveLoadedPageToPng, SaveLoadedPageToPngStream, SaveLoadedPagesToTiffBanded и SaveLoadedPagesToTiffStreamBanded с записью сжатых данных изображения строка за строкой через кодеры полос, так что очень большим страницам не нужен полный framebuffer; THPDFBandImageExportInfo сообщает телеметрию по страницам, полосам, строкам, воркерам, памяти, выводу, времени и отмене

Version 2.705.0

Added

  • Добавлена финализация PDF/A в пути сохранения загруженных документов: THotPDF.SaveLoadedDocument и SaveLoadedDocumentToStream теперь валидируют OutputIntent GTS_PDFA1 (унаследованный из исходного каталога или свежезарегистрированный) и выдают XMP-идентификацию pdfaid:part / pdfaid:conformance, когда установлен PDFACompliance, сохраняя существующий pdfaid-пакет побайтово при пересохранении
  • Добавлено потребление вертикального письма (WMode 1) на стороне загрузки: метрики ячеек /W2 и /DW2 CIDFont теперь ведут извлечение текста и рендеринг страницы, спускаясь по колонкам вдоль оси y текстового пространства с вектором позиционирования v1x/v1y вместо горизонтальных продвижений /W

Version 2.704.0

Added

  • Добавлен параллельный рендеринг тайлов и полос загруженных страниц через THotPDF.RenderLoadedPageTilesParallel и THotPDF.RenderLoadedPageBandsParallel с callback'ами вызывающего потока в порядке строк, заимствованными битмапами, кооперативной отменой, управляемым вызывающей стороной памятью in-flight, допуском по пиковой памяти и ограниченным неизменяемым кэшем глифов Type 3 и halftone-экранов, разделяемым между изолированными контекстами рендеринга

Version 2.703.0

Added

  • Добавлены ограниченные batch-прогоны digest для CSC multisign через THPDFCSCSignatureProvider.SignHashBatch: один привязанный к hash SAD и один запрос signatures/signHash на упорядоченный батч одним алгоритмом, при соблюдении локальных и учётных лимитов multisign, строгой кардинальности ответа, синхронном или асинхронном упорядочивании результатов, SHA-256 ключах идемпотентности по хешу контента и реплее завершённого батча

Version 2.702.0

Added

  • THotPDF.RenewPAdESLTATimestamp расширен передаваемыми вызывающей стороной доказательствами сертификата, OCSP и CRL, которые вливаются в существующий DSS до нового документного timestamp по RFC 3161, сохраняет каждую предыдущую редакцию побайтово и точно дедуплицирует валидационные потоки между последовательными продлениями

Version 2.701.0

Added

  • Добавлен адресуемый по пунктам preflight базового и расширенного профилей PAdES через THotPDF.PreflightLoadedPAdES, сообщающий каждое применимое требование со стабильным ID правила, профилем, нормативным уровнем, пунктом стандарта, PDF-путём, номером объекта, подписанной или текущей редакцией и статусом прохождения, при валидации кардинальностей CMS, ESS-ссылок сертификата подписанта, ограничений словаря подписи, покрытия byte-range, доверенного времени, доказательств DSS и покрытия документным timestamp

Version 2.700.0

Added

  • Добавлена сквозная загрузка приватных ключей ECDSA, Ed25519 и Ed448 из PFX / PKCS#12 и подписание документов CMS, включая ECDSA по именованным кривым через CNG, опциональный PureEdDSA через OpenSSL 3, декодирование ключей по RFC 8410, правила digest и параметров RFC 8419, SHAKE256 с выходом 512 бит для Ed448, автоматический выбор алгоритма ключа и строгое сопоставление сертификата с ключом

Version 2.699.0

Added

  • Добавлен детерминированный выбор учётных данных PFX / PKCS#12 среди нескольких идентичностей через HPDFEnumeratePFXIdentities, HPDFParsePFXByLocalKeyID и THPDFCMSSignOptions.PFXLocalKeyID, включая строгие однозначные атрибуты пакетов localKeyId и friendlyName, сопоставление открытых ключей, рекурсивные safe-content пакеты, ограниченную диагностику неоднозначности и циклов, а также автоматическое встраивание совпавших промежуточных и корневых цепочек сертификатов с точной DER-дедупликацией

Version 2.698.0

Added

  • Расширено внутрипроцессное расшифрование PFX / PKCS#12 PBES2 вариантами AES-128-CBC и AES-192-CBC плюс PRF PBKDF2 HMAC-SHA-384 и HMAC-SHA-512, включая специфичную для шифра опциональную валидацию keyLength и ограниченные проверки соли, итераций, IV и паддинга при сохранении совместимости с AES-256-CBC и HMAC-SHA-1 / SHA-256

Version 2.697.0

Added

  • Добавлено соответствующее спецификации наследование FixedPage.NavigateUri для Canvas в XPS и OpenXPS, так что потомки — визуальные элементы Path, Glyphs и вложенные Canvas — получают scoped URI, если не переопределяют его, с сохранением действий LinkTarget — внешних, почтовых, страниц пакета и percent-декодированных — сквозь трансформации, вложенные клипы, изолированные группы прозрачности, подавление переиспользуемых визуальных элементов, восстановление после вложенных переопределений и существующие лимиты ссылок, URI, отмены и небезопасных схем

Version 2.696.0

Added

  • Добавлены ограниченные нативные группы прозрачности для Canvas в XPS и OpenXPS, так что значения Opacity и Canvas.OpacityMask — сплошные, градиентные или изображения — композитят перекрывающиеся дочерние визуальные элементы однократно через изолированные DeviceRGB Form XObjects, со свёрнутой равномерной альфой, общими soft mask с переменной альфой, вложенными группами, трансформированными клипами, переносом ресурсов, сохранёнными ссылками и fail-closed отказом для кривого, неподдерживаемого, сингулярного или чрезмерно большого контента

Version 2.695.0

Added

  • Добавлена ограниченная нативная конвертация Canvas.Clip в XPS и OpenXPS для сокращённой геометрии, значений PathGeometry из локальных или удалённых StaticResource, прямых элементов-свойств, структурированных фигур из линий, Безье, квадратичных кривых и дуг, трансформаций геометрии, пустых клипов и вложенного клиппирования EvenOdd или NonZero через PDF W* или W, с клиппированными границами навигации, лимитом парсинга в 100 000 значений и fail-closed отказом на кривых или сингулярных трансформациях

Version 2.694.0

Added

  • Добавлена ограниченная нативная навигация для трансформированных визуальных элементов Path и Glyphs в XPS и OpenXPS: ссылки HTTP, HTTPS и почтовые сохраняются как PDF URI-аннотации, а страницы относительно пакета плюс percent-декодированные фрагменты LinkTarget разрешаются в прямые или обратные PDF GoTo-действия после появления всех страниц, с границами клика с учётом метрик, лимитами в 65 536 ссылок и 8 192 символа, подавлением захвата VisualBrush, отменой и fail-closed диагностикой небезопасных схем

Version 2.693.0

Added

  • Добавлена ограниченная нативная конвертация VisualBrush в XPS и OpenXPS для inline или ресурсных визуальных элементов Canvas, Path и Glyphs, иерархического и удалённого поиска в ResourceDictionary, абсолютного Viewbox, абсолютного или относительного Viewport, режимов мозаики None, Tile и отражённой, трансформаций, прозрачности, переиспользуемых Form XObjects, общих мозаичных паттернов, переноса ресурсов с учётом токенов и ограниченных бюджетов на циклы, кривой ввод, рекурсию, контент, кэш и размещение с fail-closed отказом

Version 2.692.0

Added

  • Добавлено нативное встраивание пакетных шрифтов XPS и OpenXPS для программ TrueType и OpenType, фрагментов членов TTC, обфусцированных GUID ресурсов, прямых или производных от cmap glyph ID, кластеров Юникода один-ко-многим, явных продвижений и смещений, корректных по ширине начал для RTL, общих шрифтовых ресурсов, разрешений на встраивание и запрет поднабора, опционального поднабора глифов, ограниченных карт ToUnicode и амортизированно-линейного вывода позиционированных прогонов без подстановки шрифтовых face'ов GDI

Version 2.691.0

Added

  • Добавлена ограниченная вёрстка Indices для Glyphs в OpenXPS со строгими количествами code unit и глифов кластера, явными продвижениями в сотых em, горизонтальными и вертикальными смещениями, обратным продвижением при нечётном BidiLevel, сплошными заливками из атрибутов или элементов-свойств, прозрачностью, нативной батчевой упаковкой PDF TJ, fallback позиционирования Юникод-кластеров, сохранённым извлечением текста, fail-closed диагностикой кривого ввода и амортизированно-линейными буферами с потолком в 65 536 маппингов

Version 2.690.0

Added

  • Добавлена поддержка Path.OpacityMask в OpenXPS для сплошных масок, многоточечных линейных и эллиптических радиальных градиентов с переменной альфой и обычных, мозаичных или отражённых PNG-масок ImageBrush через свёрнутую равномерную альфу, ограниченные нативные группы прозрачности DeviceGray, общие паттерны шейдинга и потоки image soft mask, fail-closed обработку неподдерживаемого контента и переиспользуемый конструктор RegisterLuminositySoftMaskState с привязкой ресурса альфа-изображения

Version 2.689.0

Added

  • Добавлены режимы Tile, FlipX, FlipY и FlipXY для ImageBrush в OpenXPS через нативные мозаичные паттерны PDF с одним, двумя или четырьмя независимо клиппированными размещениями, общими ресурсами изображений и PNG soft mask, композициями матриц fixed-page, path и brush и ограниченным API RegisterImageTilingPattern для переиспользуемых паттернов на основе изображений

Version 2.688.0

Added

  • Добавлена поддержка ImageBrush.Transform в OpenXPS для конечных матриц-атрибутов из шести параметров и элементов-свойств MatrixTransform, конкатенируемых после нативного клиппирования Path и перед клиппированием по viewport и размещением изображения, так что кисть может вращать, масштабировать, скашивать или сдвигать изображение без изменения содержащей векторной геометрии; нестандартный RelativeTransform и неразрешённые матричные ресурсы остаются явными диагностиками

Version 2.687.0

Added

  • Добавлено размещение image XObject с управлением матрицей через THPDFPage.ShowImageMatrix и расширенный импорт fixed-page XPS с заливками ImageBrush из пакетных JPEG, PNG, TIFF и JPEG XR, маппингом абсолютных или относительных границ Viewbox и Viewport, нативным клиппированием по path и одиночному viewport, прозрачностью изображений и путей, альфой PNG soft mask, размерами с учётом 96 DPI, общим кэшем декодированных ресурсов и fail-safe диагностикой для неподдерживаемой мозаики, трансформаций, цветовых преобразований и обводок изображений

Version 2.686.0

Changed

  • Добавлена переиспользуемая ограниченная регистрация многоточечных радиальных градиентов и расширен импорт путей XPS в нативные векторы значениями эллиптических RadialGradientBrush из элементов-свойств, распространением Pad, равномерной альфой точек, прозрачностью кисти, относительным или абсолютным маппингом центра, начала и радиуса, нативным шейдингом PDF Type 3 и восстановлением координат, оставляющим геометрию пути неизменной

Version 2.685.0

Changed

  • Расширен упорядоченный импорт путей XPS в нативные векторы: парсинг элементов-свойств с учётом кавычек и лимитов, сплошные и многоточечные линейные градиентные кисти, нативные паттерны шейдинга PDF, альфа кисти и точек, координаты градиента по умолчанию относительно границ или явные абсолютные, интерполяция выходящих за диапазон точек и fail-safe диагностика для неподдерживаемых трансформаций, режимов распространения, цветовой интерполяции, переменной альфы и вырожденных осей

Version 2.684.0

Changed

  • Добавлен упорядоченный импорт путей XPS в нативные векторы с ограниченной сокращённой геометрией, правилами заливки, сплошными RGB- и ARGB-заливками и обводками, прозрачностью пути, толщиной обводки, трансформациями из шести параметров и fail-safe диагностикой для неподдерживаемых возможностей отрисовки

Version 2.683.0

Changed

  • Усилена валидация PDF/X-6 по фактически нарисованному контенту: графическое состояние shadings-паттернов на момент определения, семантика ExtGState для nonstroking-паттернов, fail-closed проверки подтипа soft mask и фона, точные метрики глифов Type 3 и правила унаследованного цвета, строгая классификация альфы при комбинированной отрисовке, ограниченный вывод цвета JPX и композитинг аннотаций с учётом внешнего вида

Version 2.682.0

Added

  • Добавлена поддержка подписей ECDSA на brainpoolP256r1, brainpoolP384r1 и brainpoolP512r1 со стороны производителя и верификатора, включая матрицу digest SHA-2 и SHA3 для конкретных кривых, валидацию подписания с отказом до провайдера, строгие параметры сертификатов именованных кривых, идентификаторы алгоритма ECDSA без параметров, канонические значения подписи DER, импорт именованных кривых через Windows CNG и детерминированную диагностику явных, хвостовых, неизвестных или несовпадающих параметров

Version 2.681.0

Changed

  • Унифицировано исполнение контента непрогрессивных битмапов, прямого DC, Form и display list через HPDFInterpretContentTokensDevice и опциональное полное расширение IHPDFContentOperatorDevice, с одной точкой проверки отмены на оператор, кэшированием индексов операторов на этапе компиляции для replay display list'ов без сканирования операндов, публичными метриками OperatorCount, сохранённой совместимостью семантических устройств, исправленной семантикой операторов ", v и y и легальной обработкой терминатора EI без ложных fallback-диагностик

Version 2.680.0

Added

  • Добавлены ограниченные транзакционные перегрузки RepairPDFA4 с типизированными опциями, детальными отчётами о ремонте, общим происхождением находок, безопасной нормализацией заголовка PDF 2.0, trailer ID, метаданных, Catalog и представления, починкой идентификации PDF/A с учётом пространств имён, настраиваемой политикой фиксации частичной или полной конформности, детектированием регрессий ошибок, побайтово точным откатом графа и XMP и строгой границей, сохраняющей содержимое страниц, шрифты, цвет, прозрачность, изображения, графические операторы и извлечённый текст

Version 2.679.0

Added

  • Добавлена валидация PDF/X-6 по фактически нарисованному контенту с выбором правил ISO 15930-9:2020 или исправленных 2025, фактическими проверками заголовка ICC и каналов, обходом с учётом ресурсов массивов контента, Form XObjects, мозаичных и shadings-паттернов, изображений, глифов Type 3, soft mask и внешних видов аннотаций, диагностикой режима overprint и комбинированной отрисовки, стабильным происхождением правил и ограниченными бюджетами декодированных байтов, токенов, объектов, находок, рекурсии и графического состояния

Version 2.678.0

Added

  • Углублена ограниченная валидация PDF/A-4: кэшированные проверки заголовка ICC и компонентов, согласованность output intent документа и страницы, анализ фактически нарисованных device-цветов и прозрачности по массивам контента, вложенным Form XObjects, изображениям, image mask, шейдингам и внешним видам аннотаций, унаследованное графическое состояние, встраивание рендерящих шрифтов, связи CIDFont и CMap, строгие флаги и состояния внешнего вида аннотаций, валидация XMP-пакета UTF-8 и пространств имён, логические позиции в дереве страниц, стабильные диагностики с привязкой к пунктам стандарта и настраиваемые потолки декодированных байтов и контентных токенов

Version 2.677.0

Added

  • Завершена ограниченная валидация PDF/UA-2 для документа, человекочитаемых строк, optional content, аннотаций, AcroForm, структурных назначений, закладок, встроенных файлов и вложенных меток страниц, включая физическое владение ParentTree, скалярных потомков структуры, ограничения appearance stream, XMP-свойства по URI пространств имён, детектирование Unicode private-use и диагностики с привязкой к пунктам; структурированный экспорт в HTML, XHTML, XML и JSON теперь разделяет модель доступного чтения с приоритетом тегов: язык, заголовок, навигация, метки страниц, безопасные ссылки, аннотации, нечувствительные элементы форм, замены marked-content, артефакты, альтернативы изображений, геометрический fallback, независимые лимиты, отмена и атомарная публикация

Version 2.676.0

Added

  • Добавлено ограниченное минимальное планирование byte-range для каждой страницы линеаризованного PDF через PlanProgressiveLinearizedPageRanges, с декодированием первичных и overflow-подсказок в сыром и Flate виде, совместимыми byte-aligned раскладками комбинированных подсказок и непрерывных либо раздельных подсказок Annex F, точными зависимостями bootstrap, страниц, shared-group и традиционных или потоковых перекрёстных ссылок с префиксами LF или CRLF, легальным накоплением коротких чтений, потолком памяти планировщика 256 МиБ по умолчанию с fail-closed различением кодировок, слиянием с учётом перекрытий, строгими структурными перекрёстными проверками, типизированными лимитами и диагностикой доступности и единым путём первой страницы [0, /E)

Version 2.675.0

Added

  • Добавлены независимые соответствующие стандартам политики crypt filter для строк, обычных потоков и встроенных файлов через ConfigureCryptFilterDefaults и SetStreamCryptFilter, включая зарезервированные фильтры пароля и открытого ключа, /Identity, корректный для писателя /EFF парольной защиты и ведущие pipeline /Crypt, fail-closed границы получателей для потоков с открытым ключом, чувствительную к регистру загрузку и инспекцию внешних именованных фильтров, /CFM /None, отчёт по длине ключа V2, fallback Direct File для смешанных политик, раздельные политики контейнера объектного потока и строк-членов и сохраняющие политики зашифрованные инкрементные обновления

Version 2.674.0

Added

  • Добавлены инкрементные обновления с сохранением учётных данных для Standard и шифрования открытым ключом через учитывающую пароль перегрузку BeginIncrementalUpdate и назначенный ключевой материал получателей, с безопасно удерживаемыми файловыми ключами или FEK, раздельными политиками crypt filter для строк, потоков, метаданных и Identity, выводом legacy-ключей объектов с учётом поколения, точными унаследованными ссылками /Encrypt, побайтово идентичными исходными редакциями, исходным доступом пользователя, владельца или получателя и fail-closed отказом на изменениях шифрования или неподдерживаемых гетерогенных фильтрах

Version 2.673.0

Security

  • Добавлена ограниченная валидация графа сегментов JBIG2 перед декодированием полной страницы, региона, нативным или внешним и перед разделением глобального словаря, с индексированными проверками дубликатов и отсутствующих ссылок, итеративным детектированием циклов и глубины зависимостей, принуждением привязки встроенных потоков к страницам, отклонением запрещённых сегментов, бюджетами длинных ссылок и агрегатных рёбер, защитой выделения symbol-словарей и точной телеметрией отказов

Version 2.672.0

Added

  • Добавлены генерация и строгая валидация signature-policy-identifier PAdES E-EPES с явными policy OID, известными или ETSI-неизвестными hash'ами, квалификаторами SPuri, SPUserNotice и SPDocSpecification, ограниченным парсингом Unicode и коллекций, хешированием документа политики, закреплением OID и hash первичного подписанта до криптографической работы, выделенными статусами несовпадения и полным JSON-отчётом

Version 2.671.0

Added

  • Добавлены детерминированные контейнеры RFC 5652 с до 256 независимыми первичными записями SignerInfo через HPDFCMSBuildMultiSignedData и HPDFCMSMergeSignedData, включая предвалидацию всей партии до побочных эффектов подписантов, атрибуты, алгоритмы, сертификаты и провайдеры на подписанта, строгую валидацию контейнеров с definite length, DER-сортированные и дедуплицированные множества, независимые результаты верификации, байтовую совместимость с одиночным подписантом и sizing агрегатного placeholder'а без побочных эффектов

Version 2.670.0

Added

  • Добавлены опциональные идентичности подписанта RFC 5652 SubjectKeyIdentifier через THPDFCMSSignOptions.SignerIdentifier, включая компактное IMPLICIT-кодирование SID, автоматический выбор версии SignerInfo и SignedData, строгое извлечение расширений X.509, поддержку провайдеров и sizing placeholder'ов и fail-closed сопоставление SID, сертификата и версии при верификации

Version 2.669.0

Security

  • Добавлена fail-fast диагностика согласованности digest-алгоритмов CMS по SignedData.digestAlgorithms, SignerInfo, параметрам механизма подписи и CMSAlgorithmProtection из RFC 6211, с выделенным статусом верификации, кодом ошибки валидации, распространением на timestamp, детальными причинами находок и JSON-выводом

Version 2.668.0

Added

  • Добавлены генерация и верификация SHA3-256, SHA3-384 и SHA3-512 для отсоединённых CMS, RSA PKCS#1 v1.5, RSA-PSS и контрактов провайдеров ECDSA, контентных и подписных timestamp RFC 3161, продления PAdES-LTA, словарей Seed Value и объявлений developer-расширения PDF 2.0 ISO 32001, с ограниченным однопроходным хешированием byte-range, общим с соответствующими политиками PDF MAC

Version 2.667.0

Added

  • Добавлен THotPDF.ValidatePDFMACChain с валидацией инкрементных редакций от старейшей к новейшей, кумулятивной классической или xref-stream индексацией, точными местами отказов редакции и xref, детектированием подмены исторического MAC, стабильным принуждением KDFSalt, отклонением ослабления strength digest, аутентифицированными проверками /P и /Perms, отчётом preflight и ограниченным парсингом редакций без временных копий PDF

Version 2.666.0

Added

  • Добавлены THotPDF.SignPDFWithPFXAndAttachedPDFMAC и валидация с привязкой к подписи с прямым AuthCode активного трейлера, непрямым SigObjRef, полным покрытием подписанной редакции, привязкой digest к сырому значению подписи, политиками PDF MAC SHA-2 или SHA-3, однопроходным хешированием диапазонов подписания и MAC, отчётом preflight и атомарной заменой вывода

Version 2.665.0

Fixed

  • Исправлен THotPDF.RegisterNChannelColorSpace, чтобы выдавать пятиэлементную форму DeviceN по ISO 32000-2 с /Subtype /NChannel и метаданными process-компонентов, минимальная версия PDF поднята до 1.6, а luminosity soft mask теперь разрешают NChannel-краску через её альтернативное пространство с сохранением совместимости чтения с legacy-токенами семейства /NChannel

Version 2.664.0

Added

  • Завершён рендеринг режимов наложения PDF целочисленными реализациями горячего пути для Hue, Saturation, Color и Luminosity, и исправлен быстрый путь полной непрозрачности, так что каждый активный сепарабельный или несепарабельный режим наложения композитится против своего фона

Version 2.663.0

Security

  • Контейнеры PKCS#12 аутентифицируются до раскрытия зашифрованного safe-содержимого: опциональный внешний MacData проверяется с ограниченными итерациями KDF PKCS#12, HMAC SHA-1 или SHA-256, сравнением digest за константное время и fail-closed обработкой неверного пароля и подделки

Version 2.662.0

Added

  • Добавлены три команды HotPDFCLI: render растеризует каждую выбранную страницу в <prefix>-page<N>.png через pipeline битмапов загруженных страниц (--pages диапазон, --dpi 10..2400, по умолчанию 150), tables извлекает типизированные таблицы в CSV или JSON через ExportLoadedTypedTables (--json, -o файл или консоль), а compare печатает JSON-отчёт сравнения двух документов через HPDFDocCompareDocuments (--mode 0..5: количество страниц, текст страниц, количество объектов, отрендеренные изображения, полный и структурный)

Fixed

  • Исправлен pipeline ICC-преобразований Win64, выдававший сплошные нули из 8-битных батч-преобразований (TransformBytes): оптимизированный быстрый путь 1D-LUT внутри объектов lcms2 Win64 возвращает нули, тогда как общий pipeline ресемплинга корректен, поэтому 8-битное преобразование теперь собирается с cmsFLAGS_NOOPTIMIZE только на Win64; путь 16-битного одиночного цвета и все преобразования Win32 сохраняют оптимизированный быстрый путь (батч-прогоны primary sRGB теперь проходят туда-обратно на обеих платформах)

Version 2.661.0

Added

  • Добавлено настоящее бюджетируемое высокоэффективное Flate-сжатие Zopfli после существующей базовой линии zlib с четырьмя стратегиями, со строгим выбором без роста размера, лимитами ввода, итераций, блоков, вывода и затраченного времени, детальной телеметрией потоков и параллельных изображений и детерминированными порогами экономии на фиксированном корпусе

Version 2.660.0

Added

  • Добавлены детерминированные машиночитаемые XML-отчёты preflight и ABI-версионированные доверенные плагины для извлечения признаков и кастомных правил валидации, со стабильным порядком, интеграцией policy-бандлов, распространением отмены, fail-closed проверками возможностей и конечными бюджетами плагинов, находок, признаков, строк, вывода и времени

Version 2.659.0

Added

  • Ограниченный XFA FormCalc расширен условной логикой, повторяющимися числовыми агрегатами и валидируемыми callback'ами динамических экземпляров, а также добавлены отключённые по умолчанию sandbox-скрипты форм QuickJS с полным control flow, нативными типизированными массивами, изолированным доступом к данным, конечными бюджетами инструкций, времени, памяти, стека, значений и операций над экземплярами и телеметрией исполнения

Version 2.658.0

Added

  • Добавлены ограниченные редактируемые DOM XFA-пакетов для полных XDP-потоков и упорядоченных массивов пакетов с path-запросами по локальным именам, мутацией пакетов и узлов, точным сохранением нетронутых байтов, выборочной перезаписью на пакет, детерминированным выводом пространств имён и атрибутов, безопасным разрезанием CDATA, экранированием entity и конечными бюджетами ввода, вывода, пакетов, узлов, глубины, атрибутов, текста и запросов

Version 2.657.0

Added

  • Добавлено удалённое подписание по CSC API v2 через существующий pipeline провайдеров CMS с транспортом на стороне приложения, обновлением OAuth-токенов, ограниченным обнаружением цепочки учётных данных, явной обработкой authorization и SAD, синхронным или асинхронным подписанием digest, параметрами RSA-PSS, поллингом, timestamp RFC 3161, отменой, стабильными ключами идемпотентности и конечным кэшем завершённых операций

Version 2.656.0

Added

  • Добавлены ограниченные обработчики документов XPS, EPUB и CBZ с оценкой optional content, заменяемой потокобезопасной регистрацией, одной валидированной развёрткой архива, порядком fixed-page, spine и естественным для изображений, неизменяемым кэшем конвертации PDF, общими бюджетами архива, ресурсов, reflow, страниц, пикселей, DPI, вывода и отмены и публикацией PDF с безопасным откатом

Version 2.655.0

Added

  • Добавлено ограниченное извлечение типизированных таблиц и атомарный экспорт в CSV или JSON с каноническими колонками, слиянием фрагментов той же страницы и подряд идущих страниц, span'ами объединённых ячеек, повторяемыми заголовками, геометрией страницы, уверенностью, происхождением и управляемым локалью определением целых, чисел, boolean, дат, date-time, валют и процентов

Version 2.654.0

Added

  • Добавлен атомарный структурированный экспорт загруженных страниц в HTML, XHTML, XML и JSON через единую модель порядка чтения с блоками, стилизованными span'ами, обнаруженными таблицами, координатами, исходным порядком, опциональными ограниченными PNG-изображениями, Unicode-безопасным экранированием, отменой и конечными бюджетами ресурсов

Version 2.653.0

Added

  • Добавлена атомарная перезапись цвета загруженных страниц в DeviceGray, DeviceRGB или DeviceCMYK с сохранением векторного контента с возможностью поиска, конвертацией растра без потерь под управлением цвета для изображений и сложных ресурсов, безопасным при повороте выводом, явными бюджетами точности рендеринга и ресурсов и политиками preserve, process-convert или reject для spot-плашек

Version 2.652.0

Added

  • Добавлено review-first обнаружение redaction на загруженных страницах с PII-паттернами, учитывающими контрольные суммы, подключаемыми детекторами сущностей и лиц, находками в пространстве страницы с оценкой уверенности, ограниченной телеметрией работы, обязательной идентификацией проверяющего, атомарной постановкой утверждённых аннотаций и отдельной явной границей burn-in

Version 2.651.0

Added

  • Добавлено ограниченное декодирование штрихкодов на загруженных страницах и регионах с подключаемыми движками, прогрессивным рендерингом низкого разрешения, fallback-сканами с поворотом на четверть оборота, валидированными текстом и сырым payload, границами и ориентацией в пространстве PDF, фильтрацией по уверенности, дедупликацией перекрытий, отменой и телеметрией ресурсов

Version 2.650.0

Added

  • Добавлены ограниченные отменяемые слои текста OCR с возможностью поиска, подключаемыми движками распознавания, валидацией уверенности и геометрии, выровненным по повороту невидимым Unicode-текстом, группировкой optional content, телеметрией ресурсов и атомарной публикацией нескольких страниц

Version 2.649.0

Added

  • Добавлены полные round-trip графов объектов через версионированный JSON со потоковым снимком и инкрементальным экспортом, сырыми или декодированными встроенными и атомарными sidecar payload, ограниченным schema-совместимым импортом, валидацией структуры и длин потоков и транзакционной публикацией

Version 2.648.0

Added

  • Добавлен ограниченный ремонт вручную отредактированных диагностических документов QDF, который сохраняет байты объектов и потоков, исправляет прямые, косвенные, отсутствующие или протухшие длины потоков, пересобирает офсеты классических перекрёстных ссылок и trailer, отвергает небезопасную структуру и проверяет вывод обычным загрузчиком

Version 2.647.0

Added

  • Добавлен потокобезопасный реестр пользовательских stream-фильтров с ограниченными контрактами push и pull, общими бюджетами декодирования, кооперативной отменой, явными требованиями seek, изолированными сбоями пользовательских фильтров и телеметрией исполнения

Version 2.646.0

Added

  • Добавлены ограниченные visitor- и event-API контентных операторов с read-only представлениями операндов, детерминированными callback состояния, действиями inspect, measure, replace, delete, stop и reject, кооперативной отменой, валидированным выводом и атомарными обновлениями загруженных страниц

Version 2.645.0

Added

  • Добавлен контракт подключаемого бэкенда рендеринга загруженных страниц с доступом к скомпилированным display lists, нативной реализацией GDI, потокобезопасным параллельным диспетчеризированием, детерминированной fallback-политикой, инвалидацией кэша и телеметрией исполнения

Version 2.644.0

Added

  • Добавлены ограниченное обнаружение перекрытий вёрстки, пути элементов, опциональное сопоставление с источником, нативные векторные оверлеи переполнений и перекрытий, живые диагностические callback и статистика работы

Version 2.643.0

Added

  • Добавлены нативные ограниченные векторные диаграммы с сериями line, bar, area, pie и scatter, автоматическими или ручными осями, темами, легендами, подписями, альтернативами PDF/UA Figure и статистикой рендеринга

Version 2.642.0

Added

  • Добавлена ограниченная пагинация RichEdit и RTF в потоке GUI с векторным выводом EMF, изображениями, опционально поддерживаемыми OLE-представлениями, отменой, сохранением позиции потока и явными бюджетами ввода, символов, страниц и вывода

Version 2.641.0

Added

  • Добавлен ограниченный импорт SVG 2 как переиспользуемых PDF Form XObjects с нативной геометрией и дугами, каскадом CSS, векторными градиентами, поддержкой clip и mask, текстом Base 14, ресурсами непрозрачности, учитывающими размещение link-аннотациями и статистикой импорта

Version 2.640.0

Added

  • Добавлен версионированный профиль импорта HTML5 paged-media с толерантным разбором DOM, каскадом print CSS, блочной и табличной вёрсткой с пагинацией, опциональными контролами AcroForm, ограниченными ресурсами через callback и статистикой на операцию

Version 2.639.0

Changed

  • Отображения больших локальных файлов теперь адаптируют настроенный лимит отображаемых байтов между крупными последовательными окнами и до 16 меньшими окнами произвольного доступа MRU, сохраняют явную опцию фиксированной геометрии и сообщают активную геометрию, переходы, счётчики паттернов доступа и пиковые отображаемые байты

Version 2.638.0

Added

  • Добавлено ограниченное межстраничное обучение символов JBIG2 с внешним и нативным бэкендами, одним общим глобальным словарём, точным переиспользованием дублирующихся страниц, прямой пакетной вставкой изображений PDF, телеметрией бэкенда и размеров и измеренной экономией сжатия в 78.8 процента на 100-страничном регрессионном корпусе

Version 2.637.0

Changed

  • Параллельный рендеринг загруженных страниц теперь сокращает запрошенных воркеров по общему для процесса бюджету памяти, резервирует каждую заявленную страницу, удерживает резервы упорядоченного вывода до доставки через callback, будит ожидающих бюджета при отмене или сбое и сообщает телеметрию конкурентности, резервирования, допуска, задержек и ожидания

Version 2.636.0

Changed

  • Prefetch загруженных страниц теперь компилирует и рендерит вне блокировки кэша, кооперативно отменяется через токенизацию и проигрывание, уступает приоритетному рендерингу страниц и отдаёт телеметрию прогресса, сбоев, вытеснения и задержки отмены

Version 2.635.0

Added

  • Добавлен упорядоченный потоковый параллельный рендеринг страниц с callback в вызывающем потоке, ограниченной очередью готовых битмапов, backpressure продюсера, кооперативной отменой, заёмными временами жизни битмапов и телеметрией очереди, байтов, ожидания, завершения и доставки

Version 2.634.0

Added

  • Добавлен двухстадийный параллельный pipeline загруженных страниц, который компилирует display lists вне блокировки кэша рендеринга, запускает проигрывание до компиляции полного набора страниц, динамически балансирует ограниченных воркеров, сохраняет порядок ввода, сокращает аллокации контентных токенов и отдаёт телеметрию стадий, кэша, завершения и задержек

Version 2.633.0

Added

  • Добавлены иммутабельные подсчитываемые по ссылкам хэндлы декодированных битмапов с попаданиями в кэш без копирования, прямой потокобезопасной отрисовкой рендерера, изолированными мутабельными копиями по запросу, временами жизни, независимыми от выселения, и накопительной телеметрией хэндлов и копий

Version 2.632.0

Changed

  • Исполнение QuickJS теперь работает и через статические объекты, и через ABI-нейтральный мостовой DLL на Win32 и Win64, с Unicode-безопасными значениями, детерминированной отчётностью статусов, настраиваемыми лимитами памяти, стека, скриптов, времени и прерываний, безопасным обнаружением DLL, восстановлением после отвергнутых скриптов и воспроизводимыми кроссплатформенными сборками рантайма

Version 2.631.0

Changed

  • Валидация бизнес-правил Factur-X и ZUGFeRD теперь исполняет полную проверенную поверхность XPath 2 Schematron с внешними базами кодов, последовательными bindings, квантификаторами, суммами FLWOR, стабильными идентификаторами fallback-правил, безопасным ограниченным разбором XML, явными находками ошибок вычисления, нулём тихих пропусков и fail-closed комбинированной валидацией

Version 2.630.0

Added

  • Добавлен встроенный инстансинг вариативных шрифтов TrueType с отображёнными осями, общими и приватными кортежами gvar, интерполяцией IUP, обновлением простых и составных контуров, метриками фантомных точек, запеканием HVAR, VVAR и MVAR, компактной пересборкой статических глифов, корректной контрольной суммой вывода и регистрацией Unicode-шрифтов без callback

Version 2.629.0

Added

  • Добавлена оценка CMS-плейсхолдера без побочных эффектов из явных, provider- или RSA-размеров подписи сертификата, точное статическое формирование контейнера, консервативные резервы динамического payload, пересборки до подписи, повторные попытки провайдера с проверкой возможностей, строгие гарантии однократного вызова внешнего подписанта, ограниченный расчёт размеров и детальная диагностика попыток

Version 2.628.0

Added

  • Добавлен subsetting шрифтов на основе достижимости для шрифтов, встроенных в загруженные PDF, включая контент страниц, вложенные Form XObjects, состояния внешнего вида аннотаций, общие шрифтовые программы, форматы TrueType и CFF, выбор по закодированному размеру, стабильные маппинги CID и ToUnicode, детальные результаты и отказ по умолчанию при наличии подписей

Version 2.627.0

Added

  • Добавлена автоматическая генерация структуры PDF/UA для декларативных деревьев вёрстки, включая заголовки, списки, таблицы, рисунки, метаданные языка и альтернативного текста, артефакты пагинации, устойчивые к продолжению ссылки marked-content, сохранение порядка чтения, семантическую валидацию и статистику структуры

Version 2.626.0

Added

  • Добавлен декларативный DOM документа с наследуемыми стилями, переиспользуемыми фабриками компонентов, текстом, спейсерами, стеками, контейнерами, секциями, повторяемыми колонтитулами, взвешенными таблицами с повторяющимися строками заголовков, ограниченной глубиной продолжения, статистикой пагинации, некопирующими фрагментами текста и таблиц, линейным обходом верхнего уровня, немедленным сбросом страниц на диск и парными поверхностями Delphi и C++Builder

Version 2.625.0

Added

  • Добавлен воспроизводимый статистический performance gate для Win32 и Win64, который изолирует загрузку, сохранение, рендеринг и извлечение текста, записывает прогревы и 30 сырых сэмплов с p50, p95, выборочной дисперсией, RSS, процессным I/O, окружением и детерминированной идентичностью фикстур, затем сверяет со стабильными JSON-порогами и возвращает ненулевой код выхода при регрессии

Version 2.624.0

Changed

  • Переработан парсинг простых словарей и массивов вокруг иммутабельных исходных диапазонов, прямого числового преобразования, однопроходных вложенных контейнеров и индексированной вставки в словарь, с публичной телеметрией материализации; фикстура на 30 000 пар в Win32 сократила байты аллокаций пяти проходов на 64.7 процента, а время выполнения — с 3 656 ms до 46 ms

Version 2.623.0

Added

  • Добавлены настраиваемые лимиты парсера для байтов отдельного токена, суммарных токенов, записей массива или словаря и некорректных токенов, плюс строгий пресет недоверенного ввода, типизированные исключения лимитов и телеметрия на загрузку; regression-гейты отвергают токен в 2 MiB и контейнер из миллиона токенов быстрее чем за 250 ms и ниже пика процесса в 37 MiB

Version 2.622.0

Added

  • Добавлены явные API освобождения графа объектов загруженных страниц и телеметрии, которые отбрасывают чистые корни во владении страницы и кэши рендеринга, сохраняя разделяемые косвенные ресурсы и метаданные перезагрузки; последовательная обработка 100 000 страниц держится на стабильном пике 69.3 MiB, а освобождённые обычные или сжатые страницы материализуются снова с исходной идентичностью объектов

Version 2.621.0

Changed

  • Декодированные контейнеры object-stream теперь используют настраиваемый LRU-кэш с лимитом байтов, немедленным выселением per-container, перезагрузкой с опорой на источник после выселения, режимом нулевого удержания и телеметрией пиковых байтов, выселений и перезагрузок

Version 2.620.0

Changed

  • Большие обычные деревья страниц теперь открываются компактными плейсхолдерами, разрешают случайные страницы через обход с подсказкой по /Count и hash-индекс косвенных объектов, кэшируют разрешённые страницы, отдают телеметрию и управление материализацией и автоматически разворачиваются перед структурными мутациями или операциями сохранения

Version 2.619.0

Changed

  • Загруженные поля AcroForm, квалифицированные имена, виджеты, аннотации и страницы теперь разделяют ленивый двунаправленный кэш связей с обратным поиском аннотаций, поиском страницы по виджету, телеметрией активности, явной инвалидацией для сырых правок графа объектов и безопасной при мутациях автоматической поддержкой

Version 2.618.0

Changed

  • Поиск объектов страниц теперь использует лениво перестраиваемый реверс-индекс, учитывающий мутации, по номерам объектов и разрешённым указателям страниц, заменяя повторные сканы таблицы страниц при копировании страниц, outlines, именованных назначениях, actions, формах, доступности и сверке дерева страниц, с телеметрией валидности и активности

Version 2.617.0

Changed

  • Сравнение отрендеренных документов теперь поддерживает выбираемые вызывающей стороной DPI, допуск цвета RGB или яркости, гейты доли изменившихся пикселей и SSIM-подобной похожести, детерминированные связные изменённые регионы, опциональные PNG-оверлеи различий и fail-closed бюджеты пикселей по странице и в сумме с явной диагностикой рендеринга

Version 2.616.0

Changed

  • Сравнение документов теперь обходит графы косвенных объектов по детерминированным путям от каталога, хеширует значения и потоки в пределах явных лимитов ресурсов, выравнивает страницы перед классификацией вставок, удалений, перемещений и изменений, отличает перемещённые объекты от добавленных и убранных и сообщает о незавершённых сравнениях вместо того, чтобы считать ограниченные бюджетом результаты идентичными

Version 2.615.0

Changed

  • Декодирование загруженных изображений теперь использует 16 шардов метаданных кэша и точную per-key координацию singleflight, исполняет независимые дорогие декодирования параллельно, сохраняя один владеющий декод для дублирующихся запросов, соблюдает настроенные бюджеты байтов и записей по всем шардам и отдаёт точки входа кэшированного декодирования плюс телеметрию конкурентности; четыре независимых запроса JPEG на 12 000 пикселей масштабируются в 3.72 раза на четырёх воркерах Win64, а восемь запросов с одним ключом декодируются один раз

Version 2.614.0

Changed

  • Рендеринг JPEG в низком разрешении для градаций серого и RGB теперь выбирает ограниченный масштаб обратного DCT 1/2, 1/4 или 1/8, стримит масштабированные линии развёртки через fixed-point ресемплер прямо в точный целевой битмап, сохраняет бюджеты декодирования, отмену и изоляцию codec-воркеров и отдаёт телеметрию источника, масштаба, цели, линий развёртки и памяти через GetLastJPEGReducedDecodeInfo; регрессионная фикстура с 12 000 на 12 000 до 300 на 300 идёт в 24.05 раза быстрее полного декодирования, не аллоцируя исходный растр на 432 MB

Version 2.613.0

Changed

  • Массивы /Contents загруженных страниц теперь отдают ленивый seekable-поток с конкатенацией, удерживают нефильтрованные сегменты в хранилище с опорой на источник, декодируют не более одного фильтрованного сегмента за раз, используют амортизированно-линейное накопление токенов и байтов, при редактировании сохраняют исходные потоки, дописывая новый сегмент, и удерживают последовательность из 10 000 сегментов на 1 GiB ниже 64 MiB дополнительной рабочей памяти

Version 2.612.0

Changed

  • Инкрементальные обновления теперь держат исходный файл заблокированным на запись и подопорным на файле вместо удержания полных байтов источника, посещают и выдают только изменённые, новые и удалённые объекты в разреженных xref-подсекциях, стримят оригинальный префикс в новую цель и дописывают напрямую с откатом для сохранения в ту же цель; ревизия на 4 GiB с одним объектом укладывается в 128 MiB дополнительной рабочей памяти

Version 2.611.0

Added

  • Добавлен ограниченный кэш декодеров загруженных шрифтов в области документа с LRU-лимитом 32 MiB и 128 записей, переиспользованием парсинга в режиме singleflight между страницами, извлечением текста из загруженного документа, экспортом SVG и заменой текста, независимыми deep-copy результатами из GetLoadedFontDecoder, настраиваемым бюджетом памяти и API телеметрии, а также автоматической инвалидацией конфигурации graph, page, reload, JSON Patch и CMap; повторное использование одного общего косвенного шрифта теперь парсит его encoding, widths, ToUnicode, CIDToGIDMap и дочерние маппинги только один раз, пока кэш удерживается

Version 2.610.0

Changed

  • Ускорены импорт страниц и прививка объектов: линейный массив поиска чужих объектов с точным ресайзом заменён на open-addressed map со степенью двойки в области операции, с ключами по исходному документу, номеру и generation объекта; разделяемые косвенные объекты и циклические графы сохраняют прежнюю семантику идентичности при пакетных импортах, а большие графы объектов теперь используют амортизированно-константную регистрацию и ожидаемо константный поиск

Version 2.609.0

Changed

  • Повышена точность экспорта страниц в SVG: прямые операторы графического состояния w, J, j, M и d теперь сохраняют ширину линии, именованные стили концов и соединений, пределы miter, массивы штрихов и фазу штрихов; q/Q восстанавливает эти атрибуты во вложенном контенте и Form XObjects; even-odd операторы рисования f*, B* и b* выдают fill-rule="evenodd"; волосяные линии PDF нулевой ширины остаются видимыми через non-scaling SVG-штрихи

Version 2.608.0

Added

  • Добавлена инфраструктура статической линковки QuickJS: Lib/HPDFQuickJSStatic.pas линкует пять OMF-объектов QuickJS (собранных bcc32c из патченных исходников) через директивы {'$L'} — без зависимости от DLL — и объявляет полную поверхность C-рантайма (47 символов: математика C99 из msvcrt, 64-битная арифметика Borland, size-нейтральные atomic-заглушки, заглушки pthread); thirdparty/QuickJS/build-static.bat автоматизирует pipeline «патч и компиляция». Известное ограничение: JS_NewRuntime отрабатывает, но JS_NewContext ловит access violation, потому что удаление _Atomic меняет порядок инициализации структур; DLL-сборка из v2.607.0 остаётся рабочим путём для оценки

Version 2.607.0

Added

  • Добавлена генерация 2D-штрихкодов DataMatrix (Lib/HPDFDataMatrix.pas): кодирование в ASCII-режиме со сжатием пар цифр, Reed-Solomon ECC над GF(256) с примитивным полиномом DataMatrix $12D, квадраты от 10x10 до 144x144, размещение кодовых слов с чередованием направления и L-образный finder pattern; THPDFPage.DrawDataMatrix рисует закодированную матрицу сеткой залитых квадратов модулей
  • Добавлена генерация стэкового 2D-штрихкода PDF417 (Lib/HPDFPDF417.pas): кодирование в текстовом режиме с парованием символов по основанию 30, Reed-Solomon ECC над GF(929) с примитивом 3, кодирование дескриптора символа и раскладка по строкам/колонкам с паттернами start/stop; THPDFPage.DrawPDF417 рисует матрицу кодовых слов
  • Добавлен биндинг движка JavaScript QuickJS (Lib/HPDFQuickJS.pas плюс предсобранная quickjs.dll Win32/Win64 под thirdparty/QuickJS/bin/): динамическая загрузка DLL, жизненный цикл runtime+context и поверхность evaluation API (Eval/EvalInt/EvalFloat); кодовый путь Eval имеет известный краш при старте на Win32 при линковке в приложение, что задокументировано для дальнейшего разбора
  • Добавлена архитектурная цель извлечения THPDFWriter (Lib/HPDFWriter.pas): реестр записей xref (free/used/compressed), сериализатор классической таблицы xref и билдер словаря trailer, которым путь сохранения THotPDF делегирует инкрементально

Version 2.606.0

Added

  • Добавлены две команды HotPDFCLI: decrypt загружает зашифрованный PDF с заданным паролем, расшифровывает его через DecryptLoadedDocument и сохраняет незашифрованную копию (-o путь вывода, по умолчанию <input>-decrypted.pdf), а optimize пережимает каждый поток с FlateDecode через CompressLoadedDocument (-o путь вывода, по умолчанию <input>-optimized.pdf, отказывает шифрованному входу)

Version 2.605.0

Added

  • Добавлена генерация 2D-штрихкодов QR Code: новый Lib/HPDFQRCode.pas реализует полный QR-энкодер (режимы кодирования numeric, alphanumeric и byte; коррекция ошибок Reed-Solomon над GF(256); версии 1-40 со всеми четырьмя уровнями EC L/M/Q/H; все восемь масок с оценкой штрафа; корректное размещение модулей, включая паттерны finder, timing, alignment, format info и version info). Метод THPDFPage.DrawQRCode рисует закодированную матрицу сеткой залитых квадратов модулей на любой странице записи (ModuleSize в пунктах, настраиваемые уровень EC и цвет)

Version 2.604.0

Added

  • Добавлена полная таблица декодирования MacExpertEncoding: старшая 128-байтовая половина теперь отображает expert-глифы (капитель, старостильные цифры, надстрочные/подстрочные цифры, дроби, типографские символы) на ближайшую кодовую точку Unicode или суррогат Private Use Area, заменяя прежний fallback тождества сырых байтов, который давал кракозябры для документов со шрифтами Type 1 в expert-кодировке

Version 2.603.0

Fixed

  • Исправлен давний плавающий сбой в ConcurrentObjStmDecryptionMatchesSerial: глобальная переменная FRevision оставалась протухшей после понижения aes256 до aes128 под версией PDF 1.6 по умолчанию, что уводило CreateKeys в ветку V5, никогда не заполнявшую legacy-хеши паролей /O и /U — сериализованный словарь шифрования тогда нёс пустые или протухшие строки паролей, и файл не открывался. Фикс заново выводит FRevision из пониженного FCryptKeyType и в сеттере, и в двух местах согласования версии, а legacy-ветка словаря теперь поднимает внятную диагностику, если строки паролей не ровно 32 байта

Added

  • Добавлена команда html в HotPDFCLI: рендерит ограниченный HTML-файл (h1-h6, p, ul, ol, hr, inline-разметка) в PDF через HPDFRenderHTMLDocument

Version 2.602.0

Added

  • Добавлен блочный импорт HTML: THPDFHTMLImporter (и обёртка удобства HPDFRenderHTMLDocument) рендерит ограниченное подмножество HTML в пишущий документ — заголовки h1-h6 с размерами по уровням, абзацы p (голый текст тела становится неявными абзацами), списки ul/ol с отступами у элементов li (маркер или нумерация 1.), линии hr, автоматические разрывы страниц у нижнего поля и восстановление в браузерном стиле для незакрытых блоков p/li; регионы head/script/style пропускаются, а теги-контейнеры проходят насквозь прозрачно. Inline-разметка (b/i/u/font/a/sub/sup, entities, перенос слов) делегируется существующему рендереру TextOutHTML, поэтому блоки держатся вместе внутри страницы; таблицы, изображения, CSS и вложенные списки вне области

Version 2.601.0

Added

  • Добавлены три команды HotPDFCLI: merge дописывает каждую страницу дополнительных входов к первому документу и сохраняет объединённый файл (-o путь вывода, минимум два входа, коллизия вывод/вход под защитой), split пишет каждую выбранную страницу документа в собственный одностраничный файл (<prefix>-page<N>.pdf, диапазон --pages с единичной нумерацией, префикс по умолчанию из пути входа), а export-svg пишет SVG-экспорт каждой выбранной страницы (<prefix>-page<N>.svg, по умолчанию страница 1)

Version 2.600.0

Added

  • Добавлен экспорт страниц в SVG: BuildLoadedPageSVG возвращает автономный документ SVG 1.1 для любой загруженной страницы, а SaveLoadedPageAsSVG пишет его на диск; экспортируются пути (операторы рисования fill/stroke/fill-and-stroke с цветами DeviceRGB), текстовые прогоны (элементы <text> с позиционированием по символу, использующие ту же цепочку fallback декодирования шрифтов, что и извлечение текста, с учётом Tf/Tc/Tw/Tz/Ts и текстовой матрицы, включая поворот и масштабирование), image XObjects (декодируются и встраиваются как base64 PNG data URI, отображённые через единичный квадрат CTM) и Form XObjects (рекурсивная интерпретация с матрицей формы и собственными /Resources), а страницы /Rotate 90/180/270 экспортируются в геометрии повёрнутого холста
  • Известные ограничения, унаследованные от общего диспетчера устройств контентного потока: нет clipping W/W*, нет shadings sh, нет шрифтов Type 3, inline-изображения сообщают только метаданные, а параметры штриха, поддержанные ExtGState (LW/LC/LJ/ca/CA), учитываются, в то время как простые операторы w/J/j/d не диспетчеризуются

Version 2.599.0

Added

  • Добавлен консольный инструмент HotPDFCLI (tools/HotPDFCLI): консольный фронтенд с тремя командами — info (версия PDF, число страниц и размер первой страницы, метод шифрования, структура linearization и xref, счётчики аннотаций/шрифтов/изображений/форм/подписей, метаданные Info), extract-text (диапазоны --pages с единичной нумерацией, вывод в файл --out, режим монопространственной сетки --layout, совпадающий с визуальным порядком чтения) и verify (статус по каждому полю подписи, подписант, причина, hash, время подписания, покрытие всего документа и состояние сертификата, ненулевой код выхода при любой непрошедшей подписи); Build-HotPDFCLI.bat собирает бинарники Win32 и Win64

Version 2.598.0

Added

  • Добавлен SetRenditionMediaPlayParameters: подключает или обновляет словарь параметров воспроизведения /P у media rendition с целями must-honour /MH или best-effort /BE, несущими процент громкости, видимость контроллера, флаг autoplay, режим вписывания (meet/slice/fill/scroll/hidden), счётчик повторов и длительность — intrinsic, infinity или явный timespan
  • Добавлен SetRenditionMediaScreenParameters: подключает или обновляет словарь экранных параметров /SP у media rendition (тип окна floating/full-screen/hidden/прямоугольник screen-аннотации, цвет фона DeviceRGB, непрозрачность фона, индекс монитора)
  • Добавлен SetSoundAnnotationParameters: переписывает формат сэмплов потока /Sound аннотации Sound (частота, каналы, биты на сэмпл, кодирование Raw/Signed/muLaw/ALaw) за пределами жёстко заданных значений по умолчанию 22050 Hz, стерео, 16-бит Signed — и выставляет иконку /Name вроде Speaker или Mic

Version 2.597.0

Added

  • Добавлен SetMovieAnnotationParameters: переопределяет словарь /Movie movie-аннотации (пара аспектов, поворот 0/90/180/270, длительность в секундах, видимость постера), созданный AddMovieAnnotation с жёстко заданными значениями по умолчанию
  • Добавлен SetRichMediaPresentation: заполняет словари activation, deactivation и presentation в /RichMediaSettings аннотации RichMedia (имена условий вроде PO page-open, флаги toolbar / navigation UI / context click / transparency); пустое имя условия пропускает соответствующий словарь
  • Добавлен ResolveIndirectObject на THotPDF: разрешает косвенные ссылки, которые авторская сторона кладёт в записываемые словари, чтобы вызывающие могли перемещаться по свежепостроенным деревьям объектов; AddRichMediaAnnotation теперь также регистрирует свою аннотацию в LastAnnotation

Version 2.596.0

Added

  • Добавлен живой поиск revocation evidence: парсер сертификатов теперь читает URI-расширения AIA OCSP responder и CRLDistributionPoints, HPDFExtractCertificateRevocationURLs отдаёт их по каждому сертификату, а HPDFCollectCMSRevocationRequests превращает их в запросы evidence (GET pkix-crl на каждый distribution point, POST ocsp-request с минимальным телом RFC 6960 SHA-256 CertID, собранным из сертификата и его issuer, самоподписанные сертификаты разрешаются как собственный issuer)
  • Добавлен HPDFValidateCMSCertificatePathOnline: собирает эти запросы, исполняет их через предоставленный вызывающей стороной транспорт поверх существующей механики retry/worker (библиотека никогда не открывает сокеты) и скармливает каждый полученный ответ OCSP и CRL офлайн-валидатору; неудачные загрузки деградируют к семантике офлайн-evidence

Version 2.595.0

Added

  • Добавлено декодирование halftone-регионов JBIG2 (типы сегментов 22/23): словари pattern (тип 16) с коллективными битмапами MMR или arithmetic, стеки битовых плоскостей градаций серого как в форме MMR (выровненные по байтам цепочки плоскостей), так и в форме arithmetic (один общий MQ-декодер), размещение по сетке с fixed-point векторами 8.8 и опциональной пустой картой HSKIP
  • Добавлены автономные регионы generic-refinement JBIG2 (типы 42/43, GRTEMPLATE 0/1 с TPGRON), уточняющие заархивированный битмап указанного сегмента региона или буфер страницы
  • Добавлены AddPubSecKeyMaterial / ClearPubSecKeyMaterials: дополнительные приватные ключи получателя пробуются против каждого конверта /Recipients, когда основной PubSecKeyMaterial не подходит
  • Добавлены билдеры тестовых потоков HPDFJBIG2Codec_EncodeHalftoneRegionTestStream и HPDFJBIG2Codec_EncodeStandaloneRefinementTestStream, покрывающие новые типы сегментов от начала до конца

Fixed

  • Исправлена загрузка документов с AES-128 по публичному ключу: legacy-проход объектов оставлял FileKey, StringKeyType и StreamKeyType неинициализированными после разделения pubsec, поэтому каждый объект расшифровывался мусорным ключом (загрузка на Win64 падала целиком; на Win32 молча давала неверный открытый текст)
  • Исправлен round-trip зашифрованных строк: шифротекст теперь всегда сериализуется как hex-строка, потому что литеральные строки нормализуют CR, LF и CRLF в один LF, а обработка escape могла переворачивать произвольные байты шифра

Version 2.594.0

Added

  • Добавлена встроенная аппроксимация тождества для предопределённых CJK CMaps UCS2/UTF16 (UniJIS-UCS2-H, UniGB-UTF16-V и ещё 15): HPDFLoadStandardCMapFile отвечает из встроенной таблицы, когда на диске нет ресурсов CMap, поэтому извлечение текста Type0 больше не декодирует 2-байтовые коды по одному байту
  • Добавлена поддержка пользовательских таблиц Huffman JBIG2 (тип сегмента 53, форма дескриптора из Annex B.2): нативный декодер разбирает сегменты таблиц, а selector value 3 в словаре символов (SDHUFFDH/SDHUFFDW/SDHUFFBMSIZE/SDHUFFAGGINST) и текстовом регионе (SBHUFFFS/DS/DT/RDW/RDH/RDX/RDY/RDSIZE) разрешает их из указанных сегментов
  • Добавлен SetStructureClassMapEntry, регистрирующий общий словарь атрибутов имени класса в /ClassMap StructTreeRoot, завершая C API SetStructureElementClass

Fixed

  • Исправлено восстановление ключа при нескольких получателях по публичному ключу: конверты /Recipients хранились в несчитаемом списке, который алиасил один буфер между записями, поэтому документы с двумя и более получателями выводили неверный файловый ключ для каждого шифра; конверты теперь являются owned-копиями, а legacy-путь SHA-1 хеширует нетронутые байты конверта, как путь AES-256

Version 2.593.0

Added

  • Добавлен рендеринг Shading Type 1 (function-based): видимая часть прямоугольника домена дробится quadtree по ошибке цвета, и каждая ячейка-лист рисуется двумя градиентными треугольниками с цветами вершин, взятыми из функции двух входов, — вместо прежней диагностики fallback «not sampled»
  • Добавлено снисходительное вычисление функций с двумя входами: функция, объявившая лишь один вход, деградирует до f(x) (константа по второй координате домена) вместо отказа, поэтому sampled- и exponential-функции за shading Type 1 всё равно рисуются

Version 2.592.0

Added

  • Добавлен карантин object-stream: повреждённый контейнер /Type /ObjStm фиксируется с причиной (THPDFObjStmQuarantineReason: not a stream, bad dictionary, bad header, bad stream size, decrypt failed, decompress failed, /First out of range, header unparsable или container exception), строкой диагностики и номерами объектов-членов, которые он оставил неразрешёнными, при этом независимые контейнеры продолжают грузиться
  • Добавлен карантин на уровне членов (osqrMemberUnparsable): тело члена, не разобравшееся из успешно декодированного контейнера, фиксируется один раз, не затрагивая соседей, а GetLoadedQuarantinedObjStmCount / GetLoadedQuarantinedObjStmInfo отдают каждую запись; записи карантина переживают повторные попытки восстановления одной загрузки, дедуплицируются по контейнеру и очищаются при следующем входе в загрузку