Примечания к выпускам PDFium Delphi Component
История версий пользовательских возможностей PDFium Delphi Component, исправлений, улучшений просмотрщика, генерации документов, вывода PDF/A, рендеринга и обновлений документации
Последний выпуск
- Последняя версия: 3.137.1; Дата выпуска:
Version 3.137.1
Исправлено (Fixed)
- Онлайн-проверки отзыва OpenSSL сохраняют предыдущий статус CRL, причину, нативную ошибку и затронутый сертификат, когда доказательства OCSP или ответчик недоступны, удерживая точную диагностику истёкших CRL
Version 3.137.0
Добавлено (Added)
- Нативные сборки Free Pascal/LCL поддерживают Linux Qt6 и macOS Cocoa с разрешением платформенных шрифтов, приватным временным хранилищем, загрузкой и редактированием документов, формами, сохранением и рендерингом
- Подписание через macOS Keychain поддерживает локальный для запроса путь к Keychain и ограниченный офлайн-экспорт цепочки сертификатов, с нативными транспортами подписи и меток времени для Free Pascal и Delphi
- Параллельный рендеринг сообщает фактический путь модуля, адрес инициализации и результат выгрузки каждого воркера, отклоняя нативные загрузчики, переиспользующие уже загруженный образ PDFium
Исправлено (Fixed)
- Привязки PDFium для Unix сохраняют ширину callback-ов и буферов LP64 unsigned-long, включая чтения пользовательских потоков свыше 4 GiB
- Нативный рендеринг LCL учитывает порядок байтов bitmap и раскладку каналов, сохраняя цвета в выводе Cocoa и при рендеринге в контекст устройства
- Рендеринг bitmap, тайлов и прогрессивный рендеринг сохраняют альфу прозрачного фона для clNone и clDefault независимо от нативного запроса прозрачности страницы
- Подписание корректно определяет алгоритмы открытого ключа сертификата, включая ключи EC; проверка CMS на macOS сохраняет независимые результаты внешней подписи и метки времени и явно сообщает о неподдерживаемой проверке RSA-PSS
- Валидация метки времени PAdES требует критического и исключительного EKU id-kp-timeStamping; OpenSSL оценивает базовые цепочки TSA, не применяя ошибочно назначение сертификата S/MIME
- Атомарная фиксация файлов в Unix сохраняет новую инкрементальную базовую линию, когда после замены не удалось сбросить каталог на диск, открывая исключение зафиксированного вывода и признак неполной сохранённости
Изменено (Changed)
- Futures Delphi для POSIX принимают приоритет потока по умолчанию и отклоняют неподдерживаемые запросы приоритета до запуска воркера
Version 3.136.0
Добавлено (Added)
- Опциональные ICC-преобразования LittleCMS и цветовое преобразование документа используют исходные текстовые, векторные и 8- или 16-битные компоненты изображений, сохраняют выбранные spot-цвета и явно сообщают о неподдерживаемом содержимом
- Сложное редактирование сохраняет поддерживаемое содержимое во вложенных Form XObject, заполненных криволинейных контурах и повёрнутых, отражённых или сдвинутых изображениях — с конечными бюджетами геометрии и подробными отчётами об удалении
- Чтение активных объектов открывает независимые бюджеты тела объекта и сжатого объектного потока до материализации и декодирования
Безопасность (Security)
- Редактирование отклоняет замещающий текст Tagged, XFA, слои optional content, клиппинг текста и непроверяемые состояния отрисовки, включая операторы, разнесённые между потоками содержимого, — чтобы неподдерживаемая семантика чувствительного содержимого не попала в вывод
Version 3.135.0
Добавлено (Added)
- Сравнение аннотаций и виджетов AcroForm сообщает об изменениях свойств независимо от пикселей страницы, используя стабильные имена, явные сопоставления страниц, отчёты о неоднозначностях и границы наложений «до/после»
- Ячейки таблиц поддерживают смешанные стили текста и изображения с альтернативным текстом, опциональное продолжение объединённых ячеек между страницами, строки промежуточных итогов и метки продолжения, сохраняя связи Tagged PDF
Исправлено (Fixed)
- Генерация Tagged-вёрстки инициализирует нативную библиотеку до проверки возможностей, так что её можно вызывать первой операцией на новом компоненте документа
- Множественные замены в одном текстовом объекте подгоняются одним проходом к его исходным границам — с соблюдением общего минимального горизонтального масштаба и без лишних промежуточных правок
Version 3.134.0
Добавлено (Added)
- Слияние навигации сохраняет именованные назначения и внутренние ссылки на страницы при выборе, переупорядочивании и повторении страниц, с явными политиками коллизий и транзакционной проверкой
- Замена стилизованного текста добавляет проверенные планы источника, независимые предпросмотры, повторное использование нативных шрифтов, явный fallback, ограниченную горизонтальную подгонку и откат после неудачных или отменённых правок
- Подписание OpenSSL принимает явно настроенные приватные ключи и цепочки сертификатов для RSA-PSS, RSA PKCS#1 v1.5 и ECDSA, включая разрешение подписанта по умолчанию вне Windows
- Проверка OpenSSL добавляет аутентифицированные офлайн- и ограниченные онлайн-доказательства OCSP, отказные идентичности сертификатов и опциональную диагностику для каждого подписанта CMS
- Верификатор FPC Security.framework для macOS сообщает независимые результаты криптографии, доверия к цепочке и отзыва — с явными якорями доверия и переданными доказательствами OCSP
Исправлено (Fixed)
- Извлечение URI из аннотаций-ссылок передаёт полный нативный буфер, включая его терминатор, поэтому корректные цели возвращаются правильно
Version 3.133.0
Добавлено (Added)
- Транзакционное слияние AcroForm поддерживает выбранные страницы, отклонение полей, переименование, пространства имён и совместимые общие текстовые поля и списки — с изолированными ресурсами, отображениями и порядком вычислений
- Опциональный провайдер штрихкодов генерирует Code128, QR, DataMatrix и PDF417 и распознаёт полутоновые изображения — с явными нативными зависимостями и конечными бюджетами обработки
Исправлено (Fixed)
- FormField читает унаследованные родительские значения и единообразно фиксирует правки текста для общих виджетов — с сохраняющимися при сохранении и повторном открытии значениями и проверками только для чтения
- Регенерация отображений для унаследованных текстовых виджетов восстанавливает их родительские значения, не оставляя теневого значения виджета, а успешное присваивание поля сбрасывает общие кеши страниц
Version 3.132.0
Добавлено (Added)
- Опциональное выравнивание страниц определяет вставленные, удалённые и перемещённые страницы — с ограниченными изменениями Unicode-текста, связными визуальными областями и экспортируемыми наложениями сравнения
- Транзакционное слияние навигации сохраняет иерархию оглавления, стили, URI-действия и переназначенные места назначения при выборочном, повторном и переупорядоченном импорте страниц
- Опциональный провайдер Tesseract OCR поддерживает явную диагностику зависимостей, геометрию слов Unicode, отмену и бюджеты распознавания — с сохранением поискового слоя и проверкой при повторном открытии
Безопасность (Security)
- Политика RSA-PSS оценивает полные параметры подписи и ограниченного открытого ключа, отклоняя искажённый DER и несовместимые ограничения хеша, маски, соли или трейлера
Исправлено (Fixed)
- Проверка при сохранении оглавления больше не отклоняет листовые закладки из-за различий в раскрытости, возможных только у ветвей
Version 3.131.0
Добавлено (Added)
- WatermarkStamp теперь принимает целевой и штамповый PDF, интервал целевых страниц и вывод только номеров страниц — с пропорциональным размещением для смешанных размеров страниц
- MergePDF теперь предварительно показывает выбранные страницы каждого входа и целевой интервал перед слиянием, а также поддерживает единственный вход для извлечения страниц
Исправлено (Fixed)
- MergePDF проверяет каждый источник перед импортом и останавливается при нечитаемых входах, недопустимых диапазонах, неудачном импорте или отмене — вместо сохранения неполного слияния
- WatermarkStamp сохраняет исходный файл и файл шаблона и надёжно записывает номера страниц, даже когда отключены оба наложения штампа
Изменено (Changed)
- Каждый каталог нативных демо сфокусирован на 22 полных рабочих процессах; SecurityAudit и XfdfLab перенесены в Miscellaneous, исправлены пути проектов и навигация
Удалено (Removed)
- Удалён фиксированный тур AnnotationsLab; создание, инспекцию и обмен аннотациями по-прежнему покрывают примеры XFDF и извлечения содержимого, а также API-тесты
Version 3.130.0
Изменено (Changed)
- Каждый каталог нативных демо собран вокруг 24 полных рабочих процессов: девять сфокусированных API-тем живут внутри Miscellaneous, а для выбора первого демо есть отдельное руководство
- Сфокусированные примеры аннотаций, доступности, шрифтов, навигации, экспорта текста, рендеринга изображений страниц, настроек печати, взаимодействия и XFA остались на месте со своим исходным кодом и комплектными входными файлами
Удалено (Removed)
- Удалены минимальные проекты CJKTextLab и RTLTextLab; создавать Unicode-текст по-прежнему можно в CreatePDF, а API шейпированного текста остались задокументированными в справочнике API
Исправлено (Fixed)
- Исправлен сбой обхода API доступности в C++Builder при экспорте speech-скрипта
- Исправлены неверные смещения массива для координат подсветки в примере аннотаций C++Builder
Version 3.129.0
Изменено (Changed)
- Каждое нативное демо стало самодостаточным: логика образцов переехала в использующие их проекты, демо просмотра и извлечения несут собственные PDF-витрины в комплекте, а каталог Demo/Shared удалён
- Туры по функциям офлайн, живые предпросмотры, редактируемые формы, наполненные отчёты, вложения, навигация, настройки печати и инспекция статического XFA остаются доступны при самостоятельном копировании проектов
- FontProperties теперь открывается с уже показанными реальными метриками шрифта и символов, а после открытия другого документа сразу анализирует первый текстовый объект
Исправлено (Fixed)
- Панель функций PDFViewer выровнена по положению и фону во всех нативных вариантах, а FontProperties освобождает связь с просмотрщиком перед завершением работы
Version 3.128.0
Добавлено (Added)
- Добавлена автономная шестистраничная демо-витрина с живым текстом, векторными диаграммами, встроенными изображениями, таблицей, полями AcroForm, закладками, ссылками, аннотациями и вложениями
- Все нативные варианты PDFViewer получили сценарии просмотра в один клик: поиск текста, двухстраничные макеты, ночное чтение, инспекция документа и изучение форм
Изменено (Changed)
- CreatePDF теперь открывает живой двухстраничный предпросмотр с редактируемыми метаданными и опциями содержимого, настоящими объектами изображений и аннотаций и опциональной Unicode-страницей перед сохранением
- Сфокусированные образцы просмотра, поиска, извлечения, форм и навигации открываются с уже наполненными рабочими процессами; образцы вложений, настроек печати и статического XFA содержат реальные данные конкретной функции
Исправлено (Fixed)
- Исправлены жизненный цикл просмотрщика и обработка фокуса при запуске, замене документа, перегенерации предпросмотра и завершении работы
- Редактор значений FormFill для Lazarus больше не остаётся неактивным после выбора первого поля при запуске
- Исправлены привязка документа в SearchAndSelect и отчёты извлечения, которые пропускали поля форм на дальнейших страницах или запрашивали недоступные заголовки файлов у сгенерированных образцов в памяти
Version 3.127.0
Изменено (Changed)
- Демо MultiPageViewer используют встроенные в просмотрщик API выделения текста и работы с буфером обмена, сохраняя одинаковое выделение во всех макетах страниц и убирая отдельный режим выделения по двойному щелчку
- Руководство по примерам сопоставляет все 35 тем демо их собственным рабочим процессам, а консольные примеры доступности, приёма документов и препроверки для Delphi и Lazarus используют общие реализации на Pascal
Добавлено (Added)
- XfdfLab умеет сохранить PDF после импорта XFDF: GUI Delphi предлагает кнопку Save PDF, а консольные варианты принимают явный второй путь вывода
Исправлено (Fixed)
- Демо MultiPageViewer для C++Builder и Lazarus открываются без неподдерживаемых свойств форм, а все демо MultiPageViewer отключают свой документ перед закрытием
- Workbench доступности для Lazarus генерирует JPEG-миниатюры страниц для своего HTML-отчёта обзора
- Демо ExtractImages создают двухстраничный образец с настоящими встроенными объектами изображений, поэтому процесс извлечения по умолчанию выдаёт четыре изображения
- Консольный образец round-trip XFDF сохраняет содержимое аннотаций и данные авторов и отвергает конфликтующие или уже существующие пути вывода PDF перед записью результата
Version 3.126.2
Исправлено (Fixed)
- Просмотр полных XFA работает с настройками выделения текста по умолчанию, заменяет выделенный текст при вводе с клавиатуры, учитывает поля только для чтения и отключённые события форм, а после динамических изменений макета обновляет отображаемые дескрипторы страниц
- Библиотеки V8 для Windows отвергают некорректные атрибуты XDP, дублирующиеся атрибуты, недопустимое использование пространств имён и несогласованные XML-декларации ещё до изменения сохраняемого потока XFA
Безопасность (Security)
- Анализ ревизий подписей сохраняет владение содержимым страницы, когда виджеты и объекты внешнего вида ссылаются на один и тот же граф объектов, поэтому более поздние правки страниц не принимаются за разрешённые обновления форм или аннотаций в рамках DocMDP
- Блокировки FieldMDP продолжают действовать, когда заблокированное поле и аннотация делят один косвенный объект значения
Version 3.126.1
Исправлено (Fixed)
- Динамическая переразбивка XFA теперь обновляет
TPdf.PageCountиOnXfaPageCountChangedфактическим общим количеством страниц после добавления или удаления страниц, держа навигацию хоста в синхроне с макетом формы - Обновлённые библиотеки V8 для Windows обновляют геометрию загруженных виджетов ввода после динамических изменений макета XFA, сохраняя выравнивание текста и областей попадания ввода при переносе полей на другую страницу
Version 3.126.0
Добавлено (Added)
- Обновлённые библиотеки V8 Win32 и Win64 сохраняют XML-комментарии и инструкции обработки вне живых datasets и пакетов форм при сохранении поддерживаемых XFA-документов с одиночным потоком, включая входные данные в UTF-8 и UTF-16
Исправлено (Fixed)
- Сохранение XFA с одиночным потоком отвергает недопустимую кодировку UTF-8 или UTF-16, незавершённые теги, некорректные ссылки на сущности и искажённые инструкции обработки вместо тихой перезаписи таких входных данных; неподдерживаемые конструкции в живых пакетах данных, объявления DTD и XMLDSig по-прежнему дают явные ошибки сохранения
- Копирование, вырезание и вставка в формах в просмотрщике коротко повторяют попытку, когда буфер обмена Windows удерживает другой поток или приложение, позволяя мимолётной конкуренции рассосаться; при неудачном вырезании исходный текст поля всё равно сохраняется
Version 3.125.3
Исправлено (Fixed)
- Обновлённые обычные библиотеки
pdfium.dllдля Win32 и Win64 теперь сообщают об ошибке, когда финальная буферизованная запись PDF завершается неудачей, повторяя исправление, ранее поставленное в библиотеки V8
Version 3.125.2
Исправлено (Fixed)
- Обновлённые библиотеки V8 для Windows сохраняют отредактированный текст XFA через сохранение и повторное открытие, включая пустые значения, исходные пробельные символы, переводы строк и дополнительные символы Unicode, для массивов пакетов и поддерживаемых XDP-документов с одиночным потоком
- Ошибки экспорта пакетов XFA и сбои финального буферизованного писателя теперь сообщают об ошибке сохранения в обновлённых библиотеках V8, не очищая состояние изменённости документа; документы с одиночным потоком, содержащие неподдерживаемые конструкции XML или XML-подписи, отвергаются
- Обновлённые библиотеки V8 сохраняют явно переданные хост-приложением платформу V8 и isolate на протяжении инициализации и уничтожения PDFium
- Явный путь в
LibraryNameтеперь выбирает именно этот runtime в любом режиме движка, включаяEnableV8Engine=True; отсутствующий явный путь даёт ошибку вместо загрузки другой библиотеки из комплекта
Version 3.125.1
Исправлено (Fixed)
ValidatePdfFilesParallelбольше не разрушает общий движок PDFium: раньше рабочие потоки открывали и проверяли документы одновременно, из-за чего часть документов падала с ошибками загрузки или access violations и могла уронить процесс или сломать последующие операции PDF; теперь PDFium-часть каждого документа обрабатывается по одной, а вычисление правил по-прежнему выполняется параллельно- Документ, который не удаётся открыть при пакетной валидации, теперь сообщает фактическую ошибку загрузки вместо последующего сообщения "no active PDF document"
Version 3.125.0
Добавлено (Added)
PdfLibraryConfigurationSupportErrorсообщает, можно ли использоватьTPdfLibraryConfigurationсо сборкой PDFium с заданными возможностями Skia и Fontations
Исправлено (Fixed)
- Запрос
prpSkiaу сборки PDFium без Skia илиpfbpFontationsу сборки без Fontations теперь заставляет загрузку библиотеки возбуждатьEPdfErrorвместо нативной проверки, останавливавшей процесс или оставлявшей PDFium полуинициализированным; конфигурация остаётся незафиксированной, поэтому приложение может выбрать другие настройки и загрузиться снова
Version 3.124.0
Изменено (Changed)
- Валидация PAdES теперь применяет наборы подписей ETSI TS 119 312 к подписям RSA вместо принятия любого RSA-алгоритма:
AlgorithmPolicyStatusравенpcsInvalidдля дайджестов MD2, MD4 и MD5 иpcsIndeterminateдля SHA-1 и 112-битных дайджестов вроде SHA-224, которые больше не считаются согласованными для текущей валидации; подписи SHA-1 сохраняют общий результат целостности и помечаются для проверки, а не отвергаются - RSA-подпись, у которой
digestAlgorithmотличается от дайджеста, фиксированного её алгоритмом подписи (например sha256WithRSAEncryption поверх дайджеста SHA-1), теперь сообщается какppeiSignatureAlgorithmMismatchи не проходит проверку целостности — как и RSA-алгоритмы подписи на ключе подписанта, не являющемся RSA-ключом - RSA-подписи, для которых не удаётся найти сертификат подписанта, теперь сообщают
pcsIndeterminate, в тон существующему поведению ECDSA; нераспознанные дайджесты и OID RSA, не относящиеся к подписям, сообщаютpcsUnsupported - Подписи RSA PKCS #1 v1.5 с дайджестами SHA3 и устаревший идентификатор OIW sha1WithRSASignature теперь распознаются как RSA
Version 3.123.0
Добавлено (Added)
PdfNativeRendererTypeсообщает, какой рендерер выбираетTPdfRendererPreferenceдля заданной сборки PDFium:prpDefaultразрешается в Skia для runtime с поддержкой Skia и в AGG в остальных случаях
Исправлено (Fixed)
- Включение
BrotliEnabledилиIsolatePerDocumentвConfigurePdfLibraryбольше не переключает рендеринг со Skia на AGG, когда предпочтение рендерера оставлено равнымprpDefault; поставляемые runtime с поддержкой Skia теперь сохраняют свой рендерер по умолчанию, поэтому вывод страниц больше не меняется от этих несвязанных опций
Version 3.122.2
Исправлено (Fixed)
- Сборки Free Pascal и Lazarus теперь передают имена файлов и пароли в PDFium как UTF-8 во всех путях загрузки (файл, память, пользовательский поток и прогрессивная загрузка), поэтому документы в папках с китайскими, японскими и другими не-ASCII именами и зашифрованные документы с не-ASCII паролями открываются, даже если программа не использует строковый режим UTF-8 в Lazarus
Version 3.122.1
Исправлено (Fixed)
LastLoadReportтеперь заменяется при каждой неудачной загрузке: неудачноеActive:= True, оставляющее компонент неактивным без исключения, и неудачные обычные вызовыLoadDocumentилиLoadCustomDocumentсообщаютplsFailedс текстом ошибки, поэтому пакетный код, повторно использующий одинTPdf, больше не видит предыдущий файл как успешно загруженный- Страница справки
Activeтеперь описывает фактическое поведение при сбое (без исключения, компонент остаётся неактивным, детали вLastLoadReport) и то, чтоFileNameможно менять только пока компонент неактивен
Version 3.122.0
Добавлено (Added)
EPdfAssocFilesErrorвFPdfAssocFilesсообщает, почемуInjectAssociateFilesне смог внедрить файлы: в источнике нет читаемого trailer или каталога либоTargetPageотрицателен или указывает на несуществующую страницу; целевой поток остаётся неизменным
Изменено (Changed)
SaveAsWithAssociateFilesиSaveAsWithAssociateFilesToStreamтеперь возбуждаютEPdfError, когдаTAssocFilesOptions.TargetPageвыходит за пределы0..PageCount; раньше такие значения молча прикреплялись к каталогу документа вопреки задокументированному поведению
Исправлено (Fixed)
SaveAsWithAssociateFilesиSaveAsWithAssociateFilesToStreamтеперь возвращаютFalse, когда сохранённый документ не удаётся разобрать для внедрения, вместо записи его без изменений и возвратаTrueбез запрошенных файловSaveAsWithAssociateFilesбольше не обрезает существующий целевой файл до того, как вывод сформирован; отвергнутое или неудачное сохранение оставляет файл нетронутым
Version 3.121.4
Исправлено (Fixed)
- Связанные файлы уровня страницы (
TAssocFilesOptions.TargetPage) теперь прикрепляются к странице в этой позиции порядка страниц документа; раньше файлы могли попасть на другую страницу, если объекты страниц хранились в файле в порядке, отличном от отображаемого — например после перестановки или вставки страниц
Version 3.121.3
Исправлено (Fixed)
- Связанные файлы, сохранённые через
SaveAsWithAssociateFiles, теперь сохраняют китайские, японские и другие не-ASCII имена файлов и описания:/UFи/Descзаписываются как Unicode текстовые строки PDF вместо преобразования через системную ANSI-кодовую страницу (Delphi) или вывода сырыми байтами UTF-8 (Free Pascal) - Устаревшее имя файла
/Fтеперь всегда переносимый печатный ASCII с заменой не-ASCII символов на_, поэтому ридеры, декодирующие/Fсвоей кодовой страницей, больше не показывают кракозябры
Version 3.121.2
Исправлено (Fixed)
- Связанные файлы теперь кодируют MIME-типы как корректные имена PDF, поэтому значения вроде
text/plainбольше не порождают некорректные словари встроенных файлов и не блокируют валидацию PDF/A-3
Version 3.121.1
Исправлено (Fixed)
- Чтение аннотации и запись изменений обратно больше не создают пустые потоки внешнего вида rollover и down, когда эти потоки отсутствуют, что сохраняет требования PDF/A к внешнему виду аннотаций
Version 3.121.0
Добавлено (Added)
- Проверка CMS через OpenSSL умеет извлекать промежуточные сертификаты AIA и CRL по HTTP(S), когда включён
OnlineRetrieval, с общим таймаутом и лимитами на число запросов и размер ответов; загруженные сертификаты остаются ненадёжными, пока их не подтвердит настроенная цепочка доверия - Сетевое извлечение использует WinHTTP на Windows и доступный libcurl на FPC Unix, сохраняет проверку сертификатов HTTPS, а о неподдерживаемых конфигурациях транспорта сообщает через уже имеющуюся диагностику возможностей
Исправлено (Fixed)
- Классическое перестроение перекрёстных ссылок выделяет выходную таблицу один раз и заполняет слоты объектов напрямую, что убирает квадратичный рост работы при больших разреженных номерах объектов и сохраняет ресурсные ограничения парсера и последние поколения объектов
- Для вывода PDF/X-1a требуется структурно корректный ICC v2 CMYK-профиль принтера вместо тихого встраивания RGB-профиля по умолчанию; недопустимые профили дают ошибку до того, как существующий целевой файл будет открыт для замены
- Валидация PDF/X-1a проверяет встроенный профиль и его объявление о четырёх компонентах, а preflight-отчёты выявляют недопустимые выходные профили; метки output-condition по умолчанию берутся из предоставленного профиля, при этом явно заданные вызывающим метки сохраняются
Version 3.120.4
Исправлено (Fixed)
- Пакетный режим демо распознавания таблиц снова обрабатывает каждый PDF в папке: общий экземпляр документа оставался активным между файлами, из-за чего второй и последующие файлы падали с ошибкой присваивания и помечались как необработанные; теперь каждый документ получает собственный экземпляр в редакциях для Delphi, Lazarus и C++Builder
- Образец документа демо водяных знаков хранит страницы в порядке создания (1, 2, 3, 4), а не ротирует первую страницу в конец вызовом вставки по индексу
- Демо XFA и XFDF сообщают о неудачном открытии документа сообщением, а не необработанным исключением, демо вложений может начать новый документ, пока уже загружен другой, а просмотрщик Lazarus освобождает bitmap, который сохраняет
- Демо печати для Delphi теперь применяет к заданию печати настройки ориентации, дуплекса, оттенков серого, качества и DPI, учитывает количество копий, выбранное в диалоге печати, пропускает страницы, которые не удалось отрендерить, и восстанавливает предпросмотр после печати
- Интерактивные демо, чьи загрузчики проглатывают ошибки открытия, больше не показывают вводящее в заблуждение состояние «загружено», выходные файлы извлечения несут BOM UTF-8, консольные демо CJK и RTL переключают консоль в UTF-8 перед печатью извлечённого текста, а поле ввода уверенности разбирает десятичные дроби независимо от системной локали
- Тест метки времени PAdES теперь действительно проверяет, что валидатор достигает уровня B-T после внедрения метки времени подписи, причём на самосогласованном тестовом документе с ByteRange
- Тесты покрытия API и PDF/A больше не засчитывают любой сбой загрузки как пропуск из-за окружения, когда pdfium.dll загружен, а новый регрессионный тест покрывает расшифровку документов, чьи строковые значения сторонние генераторы сериализуют как literal strings
Version 3.120.3
Исправлено (Fixed)
EncryptDocumentBytesбольше не выбрасывает все объекты базовой ревизии, когда исходный PDF был сохранён инкрементально: классическая цепочка перекрёстных ссылок теперь обходится по/Prevот новых записей к старым с приоритетом более новых, источник отвергается, если уже зашифрован, ключевое словоstreamобязано закрыть словарь, прежде чем данные посчитаются содержимым потока, а границы последнего объекта ограничиваются исходным xref, а не первымendobjв его байтах- Зашифрованные документы, чьи строковые значения сериализованы как literal strings (так пишут некоторые сторонние генераторы), теперь расшифровываются вместо ошибки аутентификации
- Внедрение маркеров PDF/E больше не нумерует синтезированный словарь Info тем же номером, что и поток встроенного ICC-профиля, когда в исходном trailer нет
/Info— из-за этого инкрементальный xref указывал/DestOutputProfileна чужой объект - Валидация PDF/X сравнивает значение XMP
pdfxid:GTS_PDFXVersionс обрезанными краевыми пробелами, поэтому легально дополненный XMP в элементной форме больше не даёт ложного несовпадения Info - Валидация PDF/UA распознаёт XMP
pdfuaid:partв атрибутной форме, разворачивает object streams перед побайтовым сканированием, как соседние валидаторы стандартов, проверяет бит шифрования/Pи для документов с cross-reference streams и требует непустое значениеdc:title; внедрение маркеров больше не выдаёт пустую запись заголовка - Внедрение маркеров PDF/VT больше не собирает и не переписывает каждый объект страницы дважды, когда в источнике сломана иерархия DPart, не прошедшая валидацию уже после заполнения списка страниц
- Подписание на уровне PAdES B-T и выше без
TsaUrlтеперь бросает исключение вместо тихой выдачи подписи B-B, а метка времени документа B-LTA генерирует собственный nonce вместо повторной отправки nonce вызывающего - Внедрение метки времени подписи CMS отвергает вход с несколькими подписантами вместо того, чтобы молча выбрасывать все SignerInfo после первого, версия SignedData становится 3 при sid из subjectKeyIdentifier,
certReq FALSEв запросах метки времени опускается по правилам DER, а сбой транспорта WinHTTP посреди тела сообщается как транспортная ошибка, а не как обрезанное тело DER - Встраивание системных шрифтов находит реальное начертание в TrueType Collection для запрошенного семейства и извлекает его как отдельный шрифт, поэтому запрос неначального начертания
.ttc(например NSimSun) больше не встраивает и не рендерит начертание 0 BuildToUnicodeCMapправильно сопоставляет глифы символам из суррогатных пар и выдаёт дополнительные отображения записями bfchar, вместо того чтобы сдвигать все записи после первого астрального символа- Вставка shaped-текста, CID-текста и OCR проверяет результат вставки на страницу, прежде чем регистрировать объект для отката, поэтому неудачная вставка больше не оставляет висячий дескриптор, который уничтожался бы дважды
- Детекция ключевого слова stream в компрессоре и починке ToUnicode принимает одинокий CR как конец строки, разрешённый ISO 32000-1 7.3.8.1
Изменено (Changed)
- Сборка пробного пакета Win64x для C++Builder удаляет устаревший COFF
PDFiumPas.lib, оставшийся от предыдущей полной сборки, чтобы два варианта import library не уехали в поставку вместе, установщик FULL исключает локальные файлы разработки (packagefiles.xml, служебные документы) из своей всеохватывающей выборки, а демо-сборки после установки фиксируют корень IDE через переменнуюPDFiumPas_BDS_ROOT, которую сценарии сборки реально читают
Version 3.120.2
Исправлено (Fixed)
- Текст, размещённый через
AddText,SetText, генерацию раскладки и поисковый слой OCR, теперь извлекается с точными code points и из живого документа, и после сохранения: пробелы больше не возвращаются как U+00A0, а дефисы — как U+00AD на текущей сборке PDFium - Системные шрифты встраиваются как CID-шрифты с ключом по code point: один CID на символ Unicode и явный
CIDToGIDMap, поэтому глиф, общий для нескольких символов (пробел и неразрывный пробел, дефис и мягкий перенос, Омега и знак Ома), корректно проходит туда и обратно для каждого из них в любом просмотрщике; шрифты без subtable Unicode cmap идут прежним путём встраивания
Version 3.120.1
Исправлено (Fixed)
- Документы, сохранённые с subset-шрифтами, больше не портят извлечённый текст при перезагрузке: ToUnicode CMap, который сериализует pdfium, мог отображать один CID в два разных code points (пробелы как U+00A0, дефисы как U+00AD), и каждое полное сохранение теперь чинит эти противоречивые отображения на месте, оставляя структуру CMap побайтово той же, так что ридер PDFium, MuPDF и qpdf извлекают исходные символы
- Инкрементальные сохранения, sparse updates и документы с cross-reference streams починка никогда не перезаписывает — они проходят без изменений; файлы без противоречивых отображений копируются байт в байт
- Тестовый файл
sample.pdfперегенерирован через починенный путь сохранения, а тесты политики загрузки теперь находят записи xref динамически вместо зашитых смещений фикстуры
Version 3.120.0
Добавлено (Added)
- Закладки сообщают текстовый стиль элемента оглавления:
TBookmark.Styleнесёт флаги курсива и жирного, прочитанные через новую привязкуFPDFBookmark_GetStyle, аBookmarkStyleFeaturesAvailableговорит, экспортирует ли загруженный pdfium.dll эту функцию - Вложения раскрывают связку associated-file из PDF 2.0:
AttachmentRelationship[], полеRelationshipвTPdfAttachmentMetadataи вTPdfAnnotationAttachmentчитают имя/AFRelationshipчерез новую привязкуFPDFAttachment_GetAFRelationship, под страховкойAttachmentRelationshipFeaturesAvailable GetObjectRenderedStrokePatternрастеризует tiling pattern, которым обводится объект-путь, в bitmap во владении вызывающего кода через новую привязкуFPDFPageObj_GetRenderedStrokePattern; о наличии экспорта сообщаетStrokePatternRenderingFeaturesAvailableTPdfLibraryConfiguration.IsolatePerDocumentотображается на флагm_IsolatePerDocumentверсии 7 структурыFPDF_LIBRARY_CONFIG, так что сборки с V8 могут выделить каждому документу собственный isolate;ConfigurePdfLibraryотвергает этот флаг в паре с явнымV8Isolate
Изменено (Changed)
- Связаны все 476 публичных экспортов текущих заголовков PDFium; три новые точки входа загружаются толерантно, поэтому развёртывания со старым pdfium.dll продолжают работать, а соответствующие возможности сообщают пустые результаты или
nil
Version 3.119.1
Исправлено (Fixed)
- Оффлайн-валидация доверия в Windows теперь тоже ограничивает получение отзывов сертификатов кэшированными данными, не допуская неявных сетевых запросов CRL или OCSP, когда онлайн-получение выключено
- Сбои проверки отзывов в Windows сохраняют самостоятельную ошибку доверия к цепочке и отдают причины отзыва и нативную диагностику в результаты PAdES и evidence-отчёты
Version 3.119.0
Добавлено (Added)
- Валидация доверия PAdES и evidence-отчёты отдают отдельные причины отзыва и нативные ошибки для подписей документа и меток времени, включая поля JSON и добавляемые столбцы CSV
Version 3.118.0
Добавлено (Added)
- Результаты проверки CMS раскрывают
RevocationReasonиRevocationErrorс диагностикой OpenSSL для просроченных, недоступных и некорректных локальных CRL
Исправлено (Fixed)
- OpenSSL помечает явно отозванные сертификаты как недействительные, когда доверие к цепочке прошло, а проверка локального CRL подтвердила отзыв, сохраняя раздельные результаты подписи и доверия
Version 3.117.1
Исправлено (Fixed)
- Сохранения с явной версией принимают корректные многостраничные формы с cross-reference streams, сжатыми предиктором, вместо ложного сообщения о повреждённой секции перекрёстных ссылок
Version 3.117.0
Добавлено (Added)
- Распознавание таблиц читает границы и заливку, нарисованные заполненными прямоугольниками: заполненный прямоугольник не толще нового
MaxRulingThicknessсчитается линией сетки, а более крупный заполненный прямоугольник отдаёт свои края, поэтому таблицы, экспортированные из Word, Google Docs и браузеров, теперь находятся как сетки с линиями и объединёнными строками подписи, а не как фрагменты пустого пространства.DetectFilledRulingsвыключает это поведение - Координаты линий сетки притягиваются в пределах
RulingSnapToleranceдо сборки сеток, из-за чего обрывки границ отдельных ячеек, двойные границы и залитые ячейки, разделённые небольшим зазором, складываются в одну таблицу - Линии сетки внутри form XObjects участвуют в распознавании через объединённые матрицы объектов, управление —
IncludeFormXObjects ExtractDocumentTablesсвязывает фрагменты продолжения, которые заканчиваются там, где заканчивается содержимое страницы, и возобновляются там, где начинается содержимое следующей, а не только фрагменты, касающиеся краёв страницы, и держит одну перетёкшую строку частью своей цепочки- TableExtractionLab показывает
DetectFilledRulingsна своей панели параметров в вариантах для Delphi, Lazarus и C++Builder
Изменено (Changed)
- Распознавание по пустому пространству игнорирует слова, которые уже принадлежат сетке с линиями, и требует, чтобы каждая граница столбца была свободным от текста коридором через все разделяемые им строки, поэтому выключенные по ширине абзацы и маркированные списки больше не сообщаются как таблицы
- Кандидат в продолжения, у которого первая строка — одна ячейка на всю ширину, трактуется как новая таблица с подписью, а не как продолжение предыдущей
MinRowsпринимает 1 для сеток с линиями; распознавание по пустому пространству сохраняет свой минимум в две строки, а бюджетMaxRulingSegmentsпо умолчанию поднимается до 16384, потому что прямоугольники границ по ячейкам приходят в куда большем количестве, чем нарисованные линии сетки- Текст ячейки собирается строка за строкой из перекрывающихся прямоугольников слов, поэтому слова, чьи прямоугольники глифов различаются по высоте, сохраняют порядок слева направо
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика сообщают 3.117.0
Version 3.116.4
Добавлено (Added)
- TableExtractionLab получает пакетную обработку папок:
Batch folderпрогоняетExtractDocumentTablesпо каждому PDF в выбранной папке, перечисляет количество таблиц по документам, помечает документы без текстового слоя для OCR и не даёт повреждённым или заблокированным файлам прервать прогон Export all CSVзаписывает каждую найденную таблицу как<document>-<n>-page<p>-t<i>.csvв подпапкуtablesпри пакетных прогонах или рядом с загруженным документом для одиночного файла- Переключатель пресетов распознавания открывает настроенные
TPdfTableExtractionOptions: Default, Compact columns (MinColumnGap4 сAlignmentTolerance5 для плотных экспортов из текстовых процессоров) и Compact + wide rows (MaxRowGapFactor6 для межстрочного интервала 1.5-2x) - Документы, не давшие таблицы с пресетом Default, один раз повторяются с Compact columns и при извлечении из одиночного документа, и в пакетном режиме, а строки пакета сообщают, какой пресет дал результат
Исправлено (Fixed)
- Пакетное извлечение открывает каждый документ в собственном экземпляре
TPdfвместо перезагрузки одного общего компонента, что убирает тихие сбои загрузки, которые проявлялись как ошибки неактивного компонента посреди прогона по папке
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика сообщают 3.116.4
Version 3.116.3
Изменено (Changed)
- Пример TableExtractionLab во всех трёх инструментариях теперь записывает сгенерированный образец документа в
TableExtractionSample.pdfрядом с исполняемым файлом демо, а не держит его только в памяти; если папка недоступна для записи, лаборатория откатывается к прежнему поведению в памяти и сообщает об этом в строке состояния TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика сообщают 3.116.3
Version 3.116.2
Исправлено (Fixed)
- Библиотека перестала компилироваться на старых выпусках Delphi. Помощник тиков 64 бит и кодеки XML trusted list и производства вызывали
GetTickCount64иCP_UTF8из модулей RTL, которые носят их только новые компиляторы, писатель HTML переформатирования встраивал строковый литерал CSS за пределом в 255 элементов, который эти компиляторы накладывают на один литерал, а слияние наборов данных XFA присваивало междуTBytesи полем обычного динамического массива, что компиляторы до XE7 отвергают. Старые компиляторы теперь привязываютGetTickCount64из kernel32 и объявляютCP_UTF8локально, если RTL его не даёт, таблица стилей поставляется склеенными короткими литералами, а полезная нагрузка пакета копируется поэлементно
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика сообщают 3.116.2
Version 3.116.1
Добавлено (Added)
Demo\Delphi\TableExtractionLab,Demo\CBuilder\TableExtractionLabиDemo\Lazarus\TableExtractionLabпревращают распознавание таблиц в единый рабочий процесс. Лаборатория строит образец документа с таблицей на линиях с объединёнными ячейками заголовка, таблицей, выровненной по пустому пространству без линий, и длинной таблицей, разрывающейся через границу страницы, затем запускаетExtractTablesилиExtractDocumentTablesи перечисляет строки, столбцы, объединения, флаги заголовков, режим распознавания, уверенность и группы продолжения- Лаборатория экспортирует выбранную таблицу через
TPdfTable.ToCsvиTPdfTable.ToJson, настраиваетDetectRuledTables,DetectWhitespaceTables,DetectContinuationsиMinConfidenceс панели параметров и копирует полный отчёт в буфер обмена TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика сообщают 3.116.1
Version 3.114.21
Исправлено (Fixed)
- Валидация PDF/A сообщала внешнюю ссылку на файл у любого документа с аннотацией. ISO 19005-1 §6.1.7 запрещает
/F,/FFilterи/FDecodeParmsв словаре объекта stream, но проверка искала эти имена по всему файлу, а/F— это ещё и ключ флагов аннотации, который §6.5.3 требует у каждой аннотации. Проверка теперь заглядывает только внутрь словарей объектов stream
Version 3.114.20
Исправлено (Fixed)
- Подписи RSASSA-PSS несли искажённые параметры алгоритма во всех трёх бэкендах подписывания. RFC 4055 размечает все четыре поля RSASSA-PSS-params; длина salt записывалась как голое целое, которое парсер читает как начало другого поля, а замыкающее поле выписывалось, хотя его значение равно умолчанию, которое DER требует опускать. Проверяющая сторона либо не могла разобрать параметры, либо сходилась на умолчательном salt в 20 байт, тогда как подпись использовала 32, поэтому подписи PSS отвергались. Подписи PKCS#1 v1.5 и ECDSA не пострадали
Version 3.114.19
Исправлено (Fixed)
- Запрос метки времени с дайджестом, отличным от SHA-256, строил запрос, который объявлял этот алгоритм, неся дайджест SHA-256, — центр меток времени такое либо отвергает, либо, что хуже, ставит метку как есть. Вычисляется только SHA-256, так что любой другой идентификатор теперь отклоняется сразу; пустой идентификатор по-прежнему выбирает умолчание SHA-256. Пример PDF Viewer для Lazarus и C++Builder к тому же привязывал обработчик разворачивания закладок, который называет его файл формы, но не определяет его код, а это падает при загрузке формы; обработчик перенесён из примера Delphi
Version 3.114.18
Исправлено (Fixed)
- Примеры XFA Lab и XFDF Lab для Delphi, а также пример XFA Lab для Lazarus падали при запуске. Каждый строит свои элементы управления из обработчика создания своей формы, но ресурс формы не присутствовал и не был связан, поэтому создание главной формы вызывало ошибку «ресурс не найден», и обработчик не выполнялся никогда. Все три теперь несут файл формы и директиву, встраивающую его
Version 3.114.17
Исправлено (Fixed)
- Два нативных ресурса обрабатывались неправильно, когда операция падала на полпути. Неудавшийся рендер миниатюры освобождал целевой bitmap до закрытия нативного рендера, и когда рендер рисовал прямо в пиксели самого bitmap, разборка затем читала память, которая уже была освобождена. Неудавшееся выделение bitmap в
AddBitmapоставляло только что созданный объект изображения без владельца и без способа добраться до него снова
Version 3.114.16
Исправлено (Fixed)
- Чтение текста FDF давало неверные символы выше
0x7E. Таблица PDFDocEncoding в Приложении D.2 ISO 32000-1 начинается с0x80с bullet, но отображение начинало её с0x7F, поэтому весь блок до0x9Fбыл сдвинут на одну позицию: dagger читался как bullet, длинное тире — как многоточие, и так далее до zcaron, который вовсе выпадал с конца. Евро на0xA0к тому же отсутствовал и возвращался как неразрывный пробел. Имена и значения полей в импортированном FDF теперь декодируются правильно
Version 3.114.15
Исправлено (Fixed)
- Проверка доверия на документе, чей trailer или каталог не удаётся прочитать, писала за конец массива. Проход соответствия в этом случае сдаётся, не записав ни одной подписи, а сборщик, который идёт следом, работает прямо по байтовому потоку и всё ещё может найти словари подписей, поэтому одна запись писалась за каждый найденный словарь в массив, не вместивший ни одной. Количество теперь ограничивается тем, что дал проход соответствия
Version 3.114.14
Исправлено (Fixed)
- Выполнение плана восстановления PDF/A применяло шаги, которые планировщик заблокировал. Шаг блокируется, когда документ несёт подписи, шаг сделал бы их недействительными, а вызывающий этого не разрешил; исполнитель проверял только уровень безопасности шага, который это условие не выражает, поэтому подписанный документ мог лишиться подписей из-за автоматического восстановления, которое план уже отверг. Заблокированные шаги теперь пропускаются и учитываются как пропущенные
Version 3.114.13
Исправлено (Fixed)
- Добавление метки времени подписи к значению CMS, чей набор сертификатов был больше 127 байт — а это любой настоящий сертификат, — портило результат. Помощник, отыскивающий начало вложенной структуры, шёл назад по октетам длины и принимал последний за первый, поэтому отрезанный им кусок начинался задолго до запрошенной структуры. Длина заголовка теперь выводится из длины содержимого, что DER утверждает недвусмысленно. Самопроверки пропустили это, потому что их тестовые сертификаты были достаточно малы для короткой формы
Version 3.114.12
Исправлено (Fixed)
- Подписанные атрибуты выписывались в порядке построения, а не сортировались по своим кодированиям, чего требует X.690 §11.6 для DER SET OF. Проверяющая сторона, перекодирующая набор атрибутов перед вычислением дайджеста, — а так делают и OpenSSL, и BouncyCastle, — считала поэтому другой дайджест и сообщала исправную подпись PAdES как недействительную. Подписи, которые производит эта библиотека, теперь проходят проверку в этих стеках; валидация через слой Windows не пострадала, потому что она считает дайджест байтов как полученных
Version 3.114.11
Исправлено (Fixed)
- Отрицательный DER INTEGER шириной больше двух байтов содержимого кодировался с неверным значением. Писатель эмулирует арифметический сдвиг, повторно впрыскивая знак после логического сдвига, но маска, которую он использовал, выставляла каждый бит выше младшего байта вместо единственного байта, освобождённого сдвигом, поэтому величина, всё ещё державшаяся в оставшихся байтах, перезаписывалась. Значение -100000, например, кодировалось как -34464. Одноразовые числа запросов меток времени и любые другие целые со знаком такого размера теперь кодируются правильно
Version 3.114.10
Исправлено (Fixed)
- Валидация PDF/A никогда не сообщала константную альфа-часть правила прозрачности из ISO 19005-1 §6.4. Помощник строит свой поисковый ключ, добавляя косую черту в начало, и вызывающий передавал её тоже, поэтому искалось
//CAи ничего не находилось. Обе альфа-проверки к тому же принимали только точные тексты1и1.0, из-за чего полностью непрозрачный/CA 1.00помечался как нарушение; значение, равное единице, теперь распознаётся в любом написании
Version 3.114.9
Исправлено (Fixed)
- Действие URI на уровне страницы возвращало изуродованный текст. Путь приходит из нативного слоя байтами UTF-8 и записывался прямо в широкую строку, что спаривает байты в 16-битные кодовые единицы, а остаток буфера оставляет с тем, что было в памяти.
GetPageActionURIтеперь декодирует байты так же, как уже делал путь действия на уровне документа
Version 3.114.8
Безопасность (Security)
- На платформах помимо Windows случайные байты за каждым ключом шифрования, salt и вектором инициализации брались из ПСЧ среды исполнения, чья затравка постоянна, если программа не вызывает
Randomize. Каждый процесс, таким образом, выдавал один и тот же ключ шифрования файлов, одни и те же salt/UEи/OE, одни и те же байты/Permsи одни и те же nonce AES-GCM, из-за чего зашифрованный вывод сборки Free Pascal на Linux или macOS тривиально восстановим, а nonce GCM повторяется под фиксированным ключом. Байты теперь берутся из/dev/urandom, а недоступный пул ядра поднимает исключение вместо отката, как уже делал недоступныйCryptGenRandomв Windows
Version 3.114.7
Исправлено (Fixed)
- Искажённый object stream мог заставить точки входа сжатия и восстановления читать за конец декодированного буфера. Смещения членов, объявляемые потоком, теперь проверяются на диапазон и возрастающий порядок, как только разобран заголовок, заявленное число членов больше вместимости заголовка отвергается до выделения какой-либо памяти, а диапазон байтов каждого члена проверяется до того, как срезается его замыкающий пробельный хвост, а не после
Version 3.114.6
Исправлено (Fixed)
- Вынос встроенных изображений наружу давал непригодный image XObject. Словарь записывался с лишней косой чертой перед первым ключом, что открывало пустое имя и сдвигало каждый ключ на значение предыдущего ключа, а таблица встроенных сокращений отображала Decode в
GвместоD, поэтому массив/Dвыбрасывался, а сокращение значения DeviceGray принималось за ключ. Изображения, поднятые из потока содержимого, теперь несут корректный словарь и сохраняют свой массив Decode
Version 3.114.5
Исправлено (Fixed)
- Шейпер HarfBuzz назначал длины кластеров не тем глифам в фрагментах справа налево и давал глифам, делящим один кластер, — например диакритике и частям лигатур, — длину в единицу.
ClusterLengthкаждого глифа теперь простирается от начала его кластера до следующего кластера в логическом порядке, в обе стороны, поэтому отображение символов в глифы для арабского текста и иврита совпадает с тем, что сообщает бэкенд Uniscribe
Version 3.114.4
Исправлено (Fixed)
- Транспорт меток времени на libcurl передавал свои числовые опции и читал код состояния HTTP как 32-битные значения, тогда как libcurl принимает и возвращает C
long, который на Linux и macOS имеет 64 бита. Запрос состояния мог перезаписать четыре байта рядом со своей целью на стеке, а значения опций зависели от того, что случайно держала старшая половина регистра. Оба теперь используют разрядностьlongплатформы, поэтомуFPdfTsaFpcкорректен на LP64-платформах
Version 3.114.3
Исправлено (Fixed)
- Бэкенд PKCS#11 копировал сырые байты метки объекта токена прямо в строку, что в Delphi укладывает байты UTF-8 на кодовые единицы UTF-16. Сертификат, выбранный через
TPdfPkcs11Options.CertificateLabel, поэтому никогда не мог совпасть, аEnumerateCertificatesсообщал бессмысленныйLabelText. Метки теперь декодируются как заданный стандартом UTF-8, а PIN, передаваемыйC_Login, кодируется как UTF-8 вместо сужения через кодовую страницу хоста, поэтому не-ASCII PIN доходит до токена неповреждённым
Version 3.114.2
Исправлено (Fixed)
- Подписыватель Keychain macOS спрашивал
SecKeyIsAlgorithmSupportedне о той операции, решая, принимает ли ключ RSASSA-PSS: запрос называл операцию расшифровки вместо подписи, поэтому ответом всегда было нет, и каждая подпись RSA молча откатывалась к PKCS#1 v1.5. Ключ, поддерживающий PSS, теперь подписывает PSS, как того проситTPadesSignerOptions.PaddingScheme, а аргумент операции передаётся с разрядностью, которую объявляет фреймворк
Version 3.114.1
Исправлено (Fixed)
- Вложенные пары скобок в тексте справа налево давали неверное направление. Правило BD16 стандарта UAX #9 обрабатывает пары в порядке появления их открывающих скобок, и пара, разрешённая правилом N0, становится предшествующим сильным контекстом для пары, открывающейся после неё; пары же обрабатывались в порядке, которым их закрывающие скобки их завершали, поэтому внутренняя пара могла следовать за буквой, которую она заключает, вместо контекста, установленного внешней парой. Текст вроде арабского или еврейского предложения с вводной частью, содержащей вложенную скобку, теперь верстается так, как ожидает читатель
Version 3.114.0
Добавлено (Added)
FPdfCryptoSslпроверяет подписи PDF и токены меток времени через OpenSSL, что закрывает последнюю платформенную брешь в проверке подписей: у Linux вообще не было бэкенда проверки CMS.ConfigureSslCmsVerifierустанавливает его, libcrypto разрешается по имени во время выполнения, так что ничего против неё не линкуется, и привязываются как серия 1.1, так и 3.x- Подпись и цепочка сертификатов оцениваются отдельными проходами, поэтому исправная подпись под цепочкой, не доходящей до якоря доверия, сообщается как действительная подпись с недействительным доверием, а не как сломанная подпись
ConfigureSslTrustAnchorsдобавляет якоря доверия DER в системное хранилище, аConfigureSslCrlsпоставляет CRL, которые проверка отзыва может консультировать. Отзыв считается проверенным, только когда CRL реально присутствует, потому что OpenSSL сам не загружает ничего; без предоставленных список результат говорит unsupported вместо того, чтобы пропустить непроверенную цепочкуSslAvailable,SslMissingSymbols,SslLibraryPath,SslLibraryVersionиSslAbiLayoutсообщают, что привязалось, а что нет, иConfigureSslLibraryPathнаправляет бэкенд на конкретную библиотеку, когда платформенные умолчания не находят ни одной
Version 3.113.0
Добавлено (Added)
TPdfKeychainCmsVerifierпроверяет подписи PDF и токены меток времени на macOS черезCMSDecoderи SecTrust, так что проверка подписей больше не ограничена Windows.ConfigureKeychainCmsVerifierустанавливает его, и один модуль теперь закрывает обе половины поддержки macOS так же, какFPdfCryptoWinзакрывает её для Windows- Проверка отзывов учитывается: когда она запрошена, к базовой политике X.509 добавляется политика отзыва, а отключение онлайн-получения ограничивает оценку кэшированными ответами. Контрольные точки прогресса срабатывают для этапов подписи, цепочки, онлайн-получения и отзыва ровно так, как об этом сообщает бэкенд Windows
KeychainVerificationAvailableсообщает о поддержке проверки отдельно от подписывания, поскольку этим двум операциям нужны разные символы фреймворков и одна может присутствовать без другой
Version 3.112.0
Добавлено (Added)
FPdfCryptoMacподписывает PAdES идентификатором из Keychain macOS — аналогом хранилища сертификатов Windows: сертификат и его закрытый ключ берутся из Keychain, а подпись создаётSecKeyCreateSignature, поэтому ключ никогда не покидает системное хранилище.ConfigureKeychainSignerProviderустанавливает его, и никакой дополнительный модуль не нужно развёртывать рядом с приложением, в отличие от бэкенда токенов PKCS#11- Подписант следует за сертификатом: ключ EC подписывает ECDSA, ключ RSA — RSASSA-PSS, а там, где PSS недоступен — старая macOS или ключ, который её не принимает, — заполнение откатывается к PKCS#1 v1.5, и выпущенный AlgorithmIdentifier честно сообщает об этом, а не заявляет PSS
KeychainMissingSymbolsперечисляет все символы фреймворков, которые не удалось разрешить, поэтому развёртывание, сообщающее о недоступности бэкенда, отличит отсутствующий фреймворк от имени, которое этот биндинг перевёл неверно
Version 3.111.0
Добавлено (Added)
ConfigurePadesCmsVerifierустанавливает бэкенд проверки CMS, которым пользуется валидатор PAdES, так что проверка подписей и токенов меток времени больше не привязана к Windows.IPdfCmsVerifierобъявляет две операции, за которые отвечает бэкенд, — отделённую для подписи PDF и присоединённую для токена метки времени, аPadesCmsVerificationAvailableсообщает, есть ли вообще какой-нибудь бэкенд
Изменено (Changed)
- Записи результатов и опций проверки переехали в
FPdfCryptoпод именамиTPdfCmsVerify*. ИменаTWinCmsVerify*остались как алиасы, поэтому существующий код продолжает работать, а подключённый бэкенд оперирует теми же типами, что и бэкенд Windows - Поведение Windows не изменилось: без установленного верификатора он по-прежнему использует CryptoAPI, а контрольные точки прогресса, опции отзыва и собственные коды ошибок остались теми же. Там, где не отвечает ни один бэкенд, каждый вердикт помечается как неподдерживаемый, а не остаётся непроверенным
Version 3.110.0
Добавлено (Added)
FPdfPkcs11подписывает PAdES ключом, который остаётся внутри токена PKCS#11.ConfigurePkcs11SignerProviderустанавливает его как бэкенд подписывания, модуль загружается во время выполнения по пути, так что ничего не прилинковывается, и один и тот же код обслуживает Windows, Linux и macOS. Реализовано и перечисление токенов, которое объявляет интерфейсIPdfPkcs11SignerProvider: слоты, токены и сертификаты каждого из них- Для типичного случая подписание вне Windows больше не требует провайдера со стороны хоста: достаточно модуля токена и
TPdfPkcs11Options. RSA PKCS#1 v1.5, RSASSA-PSS и ECDSA — всё создаётся через токен FPdfSha1добавляет SHA-1 ради одной цели — сопоставления сертификата по отпечатку, который носитTPadesSignerOptions. Windows разрешала это внутри хранилища сертификатов; токен возвращает байты сертификата, оставляя сопоставление вызывающему коду. Это не дайджест подписи, и стек PAdES по-прежнему везде подписывает SHA-256
Изменено (Changed)
- Помощники для сертификатов DER, которые читают OID алгоритма открытого ключа, извлекают издателя и серийный номер и переупаковывают сырую подпись ECDSA, переехали из бэкенда Windows в
FPdfCms, где они доступны каждому бэкенду подписывания
Version 3.109.0
Изменено (Changed)
- Загрузчик собственной библиотеки больше не привязан к Windows.
LibraryNameпо умолчанию принимаетpdfium.dll,libpdfium.soилиlibpdfium.dylibв зависимости от целевой платформы, сборка V8 ищется под соответствующим именем, а загрузка и привязка символов на Free Pascal идут через переносимый загрузчик. Поведение Windows не изменилось, включая раскладку развёртывания Win32 и Win64 и диагностику несовпадения архитектуры - Каталоги развёртывания на других платформах следуют написанию
<cpu>-<os>, которое уже используют скомпилированные модули, поэтомуDLLs/x86_64-linux/libpdfium.soлежит рядом сLib/FPC/x86_64-linux. Откат к системному каталогу остался только у Windows; в остальных случаях его покрывает путь поиска загрузчика
Version 3.108.0
Добавлено (Added)
TPdfHarfBuzzTextShaperобрабатывает двунаправленный текст и письменности со сложным устройством на платформах Free Pascal, где нет Uniscribe. Уровни вложенности он разрешает черезFPdfBidi, разбивает текст на фрагменты по письменности, формирует каждый фрагмент с помощью libharfbuzz и расставляет фрагменты в визуальном порядке. Устанавливается черезConfigureTextShaper; libharfbuzz разрешается во время выполнения, аHarfBuzzAvailableчестно сообщает, когда его нет- Шейпер не перечисляет шрифты. Uniscribe читает бинарник шрифта из контекста устройства, переносимого аналога у которого нет, поэтому хост передаёт
TPdfFontDataResolver, отображающий имя шрифта в байты файла шрифта, — эта политика остаётся там, где ей и место
Version 3.107.0
Добавлено (Added)
FPdfBidiреализует алгоритм Unicode Bidirectional (UAX #9) на чистом Pascal:PdfResolveBidiLevelsвозвращает один уровень вложенности на кодовую единицу UTF-16,PdfBidiVisualOrderприменяет переупорядочивание L2, аPdfBidiClassOfвыдаёт Bidi_Class кодовой точки. Покрыты правила P2-P3, X1-X10, W1-W7, N0-N2, I1-I2 и L1-L2, включая инициаторы изоляции и парные скобки BD16- Модуль не зависит ни от компилятора, ни от платформы — именно это позволяет верстать двунаправленный текст там, где недоступен Uniscribe. Движок шейпинга разрешает глифы для фрагмента, направление которого уже известно, так что именно эта часть и должна первой определить направление
Version 3.106.0
Добавлено (Added)
ConfigureTextShaperустанавливает бэкенд шейпинга текста, через который теперь проходит вся библиотека, вместе сActiveTextShaper,ActiveTextShaperNameиClearTextShaper. ИShapePdfText, иTPdf.AddShapedTextтеперь используют установленный шейпер вместо прямого создания экземпляра Uniscribe, поэтому хост может подать свой движок, а тест — детерминированный
Изменено (Changed)
FPdfTextShapingкомпилируется на платформах, отличных от Windows: бэкенд Uniscribe теперь значение по умолчанию для платформы, а не единственная реализация, и ограничен сборкой Windows. Там, где бэкенда нет, точки входа шейпинга сообщают об этом, а не перестают компилироваться
Version 3.105.1
Безопасность (Security)
- Ответ метки времени теперь ограничен 4 МБ на обоих транспортах. Раньше TSA, продолжавшая слать данные, могла наращивать буфер приёма без предела, превращая вызов подписания в неограниченный рост памяти
Version 3.105.0
Добавлено (Added)
- Простановка меток времени RFC 3161 работает на платформах Free Pascal, отличных от Windows: новый бэкенд libcurl отправляет TimeStampReq и читает TimeStampResp, поэтому
PadesTsaAvailableсообщает True и PAdES B-T, B-LT и B-LTA могут получать токены и там. libcurl разрешается во время выполнения и не является зависимостью времени сборки; когда его нет, бэкенд сообщает о недоступности ровно так же, как вариант на WinHttp. Windows продолжает использовать WinHttp, и её это не касается - Подписание на этих платформах всё ещё требует ключевого материала, которым библиотека не владеет: подайте его через
ConfigurePadesSignerProviderв видеIPadesSignerProvider(илиIPdfPkcs11SignerProviderдля ключей на токенах), посколькуFPdfCryptoWinработает только на Windows
Version 3.104.1
Добавлено (Added)
- Пример лаборатории инспекции XFA теперь доступен и для Lazarus, так что пробы возможностей XFA, вывод списка пакетов, экспорт пакетов и запасное поведение
OnXfaRuntimeMissingможно проверить из LCL-сборки
Version 3.104.0
Изменено (Changed)
- Библиотека компилируется на Free Pascal 3.2 без избегаемых диагностик: внутренний тайминг читает миллисекундный тик из
GetTickCount64вместо устаревшего 32-битного вызова, устаревшие аксессоры управляющего слова SSE заменены наGetMXCSRиSetMXCSR, база смещения отпечатка содержимого получила явный тип, чтобы не спотыкаться о проверку диапазона на этапе компиляции, а при проверке растрового изображения на раскладку top-down адреса строк сравниваются как беззнаковые указатели
Version 3.103.1
Исправлено (Fixed)
- Метаданные документа, попадающие в XMP, сохраняют не-ASCII символы на Free Pascal: заголовки, авторы, темы, ключевые слова и имена создателей, приходящие в
SaveAsPdfA,SaveAsPdfUa,SaveAsPdfE,SaveAsPdfX,SaveAsPdfRиSaveAsPdfVT, теперь конвертируются через кодовую страницу строки, а не копируются байт в байт, так что пакет метаданных остаётся валидным UTF-8, как требует ISO 19005-1 6.7.2, даже когда хост-программа работает не на кодовой странице UTF-8 - Экспорт XFDF, круговые преобразования производственных метаданных и разбор XML доверенных списков используют ту же конвертацию с учётом кодовой страницы, поэтому текст, перемещающийся между
TBytesиstring, больше не зависит от кодовой страницы хоста
Version 3.103.0
Добавлено (Added)
TPdfEuropeanTrustedListразбирает аутентифицированные европейские доверенные списки, перезагружает кэши с контрольными суммами через тот же аутентификатор, принимает источники обновлений от вызывающего кода, выдаёт текущие якоря доверия и оценивает квалифицированные службы подписи на указанное время проверкиTPadesTrustValidationOptions.QualifiedTrustEvaluatorприменяет офлайн-политику квалифицированного доверия к каждому проверяемому подписанту, не добавляя валидатору PAdES сетевой доступ
Version 3.102.0
Добавлено (Added)
BeginIncrementalSaveиCommitIncrementalSaveтеперь дописывают аутентифицированные ревизии в документы, зашифрованные AES-256, сохраняя исходную ссылку/Encrypt, параметры безопасности, точные поколения объектов и все прежние байты
Изменено (Changed)
- Перегрузка фиксации в файл теперь надёжно сбрасывает на диск и строго переоткрывает побочный файл в том же каталоге, проверяет границу его ревизии и атомарно заменяет целевой файл, откатывая сессию при любой неудаче
Version 3.101.0
Изменено (Changed)
SaveAsRedactedтеперь сохраняет безопасные части частично пересекающегося текста, прямоугольных путей и выровненных по осям изображений, а затем удаляет имена ресурсов, на которые больше не ссылаются страница, Form XObject, pattern, appearance и вложенные области ресурсов
Version 3.100.0
Изменено (Changed)
OptimizeImagesтеперь выбирает передискретизацию box, bilinear, bicubic, Lanczos или bilevel по масштабу, классу содержимого, замеренной детализации и качеству, заданному вызывающим кодом, с фильтрацией с учётом альфы и строгим бюджетом рабочей памяти
Version 3.99.0
Добавлено (Added)
GraftPdfAcroFormимпортирует иерархические поля AcroForm, виджеты, внешние виды, порядок вычислений, ресурсы по умолчанию, действия и значения через явные отображения страниц и политики коллизийTPdfCrossDocumentGraftMapпереиспользует импортированные косвенные объекты по идентичности источника, сохраняя циклы, общие ссылки, точные поколения источника и транзакционную семантику отказа
Version 3.98.0
Добавлено (Added)
TPdfOutlineEditorсоздаёт, перемещает, удаляет, стилизует, раскрывает и перенаправляет элементы оглавления, переставляет явные адресаты по результатам плана страниц и дописывает независимо проверенную инкрементальную ревизию
Version 3.97.0
Добавлено (Added)
TPdfTreeEditorчитает, проверяет, обновляет, балансирует, разбивает, сливает, сериализует и инкрементально сохраняет произвольные структуры PDF NameTree и NumberTree, сохраняя пригодные для повторного использования косвенные ссылки и сырые значения записей
Version 3.96.0
Добавлено (Added)
TPdfParserResourceBudgetдаёт единую потокобезопасную политику процесса для рекурсии, токенов, объектов, декодированных байтов, коэффициента расширения, аллокаций и дедлайнов в пользовательских парсерах PDF, с неизменяемыми снимками на каждую операцию и настраиваемыми значениями по умолчанию
Version 3.95.0
Изменено (Changed)
ValidatePdfXтеперь проверяет актуальные словари PDF/X, метаданные, OutputIntent, шрифты, запрещённые возможности, прозрачность, цветовые пространства и блоки страниц посредством ограниченных разреженных чтений на незашифрованных документах с корректным xref
Version 3.94.0
Изменено (Changed)
ValidatePdfRтеперь проверяет актуальные словари PDF/R, страницы, фильтры изображений, метаданные и маркеры нижнего колонтитула посредством ограниченных разреженных и оконных чтений на незашифрованных документах с корректным xref
Version 3.93.0
Изменено (Changed)
ValidatePdfEтеперь проверяет актуальные словари PDF/E, метаданные, OutputIntent, формы и запрещённые возможности посредством ограниченных разреженных чтений на документах с корректным xref
Version 3.92.0
Изменено (Changed)
ValidatePdfVTтеперь выполняет углублённый анализ области действия, видимости, инкапсуляции и вложенного использования Form у повторяющихся XObject посредством ограниченных разреженных чтений на документах с корректным xref
Version 3.91.0
Добавлено (Added)
TPdfSparseDictionaryReaderумеет разрешать активное поколение объекта и декодировать прямой поток в пределах заданного вызывающим кодом лимита байтов
Изменено (Changed)
ValidatePdfVTтеперь использует ограниченные разреженные чтения для проверок метаданных PDF/VT, DPart, OutputIntent, Info, страниц и обычных словарей на обычном пути с корректным xref
Version 3.90.0
Добавлено (Added)
TPdfSparseDictionaryReaderдержит один разреженный индекс xref и объектных потоков открытым для повторных ограниченных чтений словарей косвенных объектов
Изменено (Changed)
InjectPdfVTMarkersтеперь проверяет и сохраняет существующую иерархию DPart PDF/VT с ограниченными чтениями источника, а дефектные иерархии по-прежнему проходят через запасной путь с перестроением
Version 3.89.0
Добавлено (Added)
ReadPdfSparsePageDictionariesвозвращает идентичность объектов страниц и ограниченные байты словарей в порядке дерева страниц через разреженный индекс объектов
Изменено (Changed)
InjectPdfVTMarkersтеперь синтезирует иерархию DPart PDF/VT и дописывает объекты-маркеры с ограниченными чтениями источника, когда сохранённый PDF ещё не содержит иерархии DPart
Version 3.88.0
Добавлено (Added)
ReadPdfSparseCatalogSubDictчитает прямой или косвенный подсловарь каталога через разреженный индекс объектов; используется внедрением маркеров PDF/UA дляMarkInfoиViewerPreferences
Изменено (Changed)
InjectPdfUaMarkersтеперь разрешаетMarkInfoиViewerPreferencesкаталога через разреженный поиск и дописывает ревизию PDF/UA с ограниченными чтениями источника на обычном пути xref
Version 3.87.0
Добавлено (Added)
AppendPdfSparseUpdateпотоково дописывает одну разреженную ревизию к сохранённому PDF: байты источника дословно, тела объектов от вызывающего кода по записанным смещениям и один инкрементальный блок xref/trailer, сцепленный через/PrevNormalizePageViewRectнормализует две отображённые точки пространства страницы в ограниченную страницей видимую прямоугольную область либо сообщает, что страница не видна вовсе- Внедрение маркеров PDF/E синтезирует свежий объект Info с
/ISO_PDFEVersion, когда у исходного документа нет словаря Info
Изменено (Changed)
- Внедрение маркеров PDF/E, PDF/X и PDF/R теперь разрешает каталог, Info и trailer через разреженный поиск и дописывает ревизии через
AppendPdfSparseUpdateс ограниченными чтениями источника на обычном пути xref - Callback заполнения форм
FFI_GetPageViewRectтеперь сообщает часть страницы, реально видимую в подключённомTPdfView, вместо всегда целого блока страницы, откатываясь к размерам страницы для headless-документов TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь согласованно сообщают Version 3.87.0
Исправлено (Fixed)
- Контрольные точки сегментов путей, доступные через биндинг
FPDFPath_GetBezierControlPointsс момента его появления, никогда не заполнялись: собственный экспорт отвечает только для индекса конечной точки каждой кубической кривой из трёх записей, поэтому запрос теперь выполняется один раз на кривую, и все три записи несут контрольные точки кривой
Version 3.86.0
Добавлено (Added)
ReadPdfSparseRevisionInfoвыдаёт ограниченные сведения о последней ревизии, каталоге, шифровании, идентификаторе документа и помеченной структуре для постпроцессоров потоковComposePdfSparseUpdateIdсохраняет или выводит идентификаторы документа инкрементального обновления, не разворачивая полный исходный PDF
Изменено (Changed)
InjectPdfAMarkersтеперь разрешает каталог и trailer через разреженный поиск, копирует большие входы ограниченными кусками и дописывает ревизию PDF/A без выделения байтового массива размером с источник на обычном пути xref- Внедрение маркеров PDF/A сохраняет классический или xref-stream стиль вывода, поколения каталога и Info, идентификаторы trailer, поведение отказа при шифровании и правила отката до Level A
Version 3.85.0
Добавлено (Added)
SanitiseActiveContentPdfStreamпринимает принадлежащее вызывающему коду рабочее пространство чистки для пользовательского ограниченного хранилища или хранилища с опорой на диск
Изменено (Changed)
- Очистка активного содержимого теперь обновляет каталог и trailer через разреженный поиск, ограниченные окна парсера и копирование диапазонов фиксированного размера вместо чтения всего PDF в один байтовый массив на обычном пути xref
TPdf.SaveAsSanitisedприменяетSaveMemoryLimitиSaveTemporaryDirectoryк своему рабочему пространству чистки и включает его диагностические сообщения о сбросе на диск
Исправлено (Fixed)
StripMetadata=Trueтеперь удаляет ссылку/Infoиз trailer, даже когда в каталоге нет записи/Metadata
Version 3.84.0
Изменено (Changed)
TPdf.PdfVersionтеперь переиспользует состояние парсера PDFium черезFPDF_GetFileVersionвместо повторного разбора всего исходного PDF- Запросы версии читают максимум восьмибайтовый заголовок PDF, чтобы дефектное объявление каталога не могло занизить действующую версию
Version 3.83.0
Изменено (Changed)
PageLabelledPdfStreamтеперь разрешает и обновляет каталог через ограниченные окна потока и разреженный ленивый индекс объектов- Вывод меток страниц копирует большие исходные PDF диапазонами фиксированного размера вместо выделения байтового массива целого документа на обычном пути xref
Version 3.82.0
Изменено (Changed)
ApplyDefaultOpenActionтеперь читает классические, xref-stream, гибридные ревизии и ревизии объектных потоков через разреженный ленивый индекс объектов, включая документы с очень большими номерами объектов- Обработка действия открытия по умолчанию использует окна фиксированного размера и ограниченное копирование диапазонов вместо загрузки всего PDF в один байтовый массив
Version 3.81.0
Добавлено (Added)
PostProcessSavedPdfпринимает три принадлежащих вызывающему коду рабочих пространства с поддержкой Seek для пользовательских потолков памяти и обработки с опорой на диск
Изменено (Changed)
TPdf.SaveAsприменяетSaveMemoryLimitиSaveTemporaryDirectoryк каждому рабочему пространству постобработки сохранённого PDF и включает их сбросы на диск в диагностику- Собственный инкрементальный ремонт xref-stream использует окна хвоста и словаря фиксированного размера с ограниченным копированием диапазонов вместо байтовых массивов целого файла и повторных перевыделений всего файла
Version 3.80.0
Добавлено (Added)
ReadAttachmentMetadataсобирает имена вложений, описания, подтипы MIME, декодированные размеры и признак читаемости за одно ограниченное собственное перечислениеExtractAttachmentsToStreamsпишет пакет в принадлежащие вызывающему коду потоки с пофайловыми и суммарными лимитами байтов, настраиваемыми кусками записи, поддержкой отмены и результатами по каждому элементу
Изменено (Changed)
- Пакетное извлечение удерживает в памяти PDFium Delphi Component максимум одно декодированное вложение вместо разворачивания всех полезных нагрузок пакета
Version 3.79.0
Добавлено (Added)
TPdfCacheGovernor,TPdf.CacheBudgetBytes, запросы использования по видам кэшей и телеметрия согласуют удерживаемую память кэшей через один потокобезопасный глобальный байтовый бюджет LRUTPdfTileCacheи общепроцессный кэш системных шрифтов могут подключаться к выбранному вызывающим кодом регулятору с точным учётом байтов растровых изображений и шрифтов
Изменено (Changed)
- Разобранные сцены страниц, миниатюры, данные структуры, снимки текста и снимки объектов страниц теперь конкурируют в рамках бюджета
TPdfпо умолчанию в 256 МиБ, сохраняя прежние лимиты на число записей - Активные сцены страниц остаются закреплёнными до завершения рендеринга, а непрозрачные собственные сцены страниц используют явно оценённый вес, поскольку PDFium не предоставляет настраиваемого API суммарного размера кэша в байтах
Version 3.78.0
Добавлено (Added)
TPdfLayoutPagedPlan,TPdfLayoutDocument.BuildPagedPlanиTPdf.GeneratePagedLayoutпотоково пишут команды вёрстки в выбранное вызывающим кодом рабочее хранилище с поддержкой Seek и материализуют по одной странице за раз
Изменено (Changed)
- Большие сгенерированные макеты могут сбрасывать команды во временное хранилище, удерживать настраиваемый кэш страниц LRU, восстанавливать несмежные сегменты верхнего и нижнего колонтитулов и освобождать свёрстанный текст после каждого элемента потока
Version 3.77.0
Добавлено (Added)
TPdfLayoutTable, строки, ячейки и опции таблицы добавляют межстраничные таблицы с рассчитанными дорожками сетки, подписями, повторяющимися строками заголовков, разбиваемыми строками тела, ссылками и настраиваемыми границами
Изменено (Changed)
- Сгенерированные помеченные таблицы сохраняют одну непрерывную структуру Table / TR / TH / TD через страницы, держат группы с объединением строк атомарными и автоматически связывают ячейки данных с идентификаторами заголовков
Version 3.76.0
Добавлено (Added)
TPdfLayoutConstraintsиSetLastItemConstraintsдобавляют в сгенерированные макеты удержание вместе, удержание со следующим, физический разрыв страницы до / после и настраиваемый контроль висячих строк
Изменено (Changed)
BuildPlanпереиспользует каждый результат свёрстки текста и для прогноза разбивки на страницы, и для генерации команд, не давая keep-with-next измерять текст повторно
Version 3.75.0
Добавлено (Added)
TPdf.InspectPdfUaUnicodeCoverageсообщает ограниченные свидетельства на уровне объектов о прямых отображениях Unicode, заменахActualText, ошибках отображения, отсутствующих значениях Unicode и неразрешённых исходных объектах
Изменено (Changed)
TPdf.ValidatePdfUaтеперь переиспользует единое посимвольное сканирование в рамках объекта, которое исключает Artifact и сгенерированные символы и не даётActualTextодного текстового объекта маскировать соседнее содержимое
Version 3.74.0
Изменено (Changed)
ValidatePdfUaPageContentTaggingиTPdf.ValidatePdfUaтеперь сообщаютpvuaiArtifactInStructureTree, когда объект страницы Artifact заявлен MCID из дерева структуры, включая артефакты разбивки на страницы на основе путей- Сканирование содержимого страниц PDF/UA теперь завершается досрочно только после обнаружения и непомеченного реального содержимого, и недопустимого вложения Artifact, сохраняя межстраничное покрытие без повторения уже выполненных проверок
Version 3.73.0
Добавлено (Added)
TPdf.InspectPdfUaLanguageCoverageсообщает ограниченные свидетельства по объектам страниц и строкам структуры о фрагментах естественного языка, включая действующий язык, источник объявления, MCID, индекс структуры и выдержки текстаResolvePdfUaEffectiveLanguageразрешает объявления языка из помеченного содержимого, ближайшего предка по структуре и каталога с явными свидетельствами корректности
Изменено (Changed)
TPdf.ValidatePdfUaтеперь сообщаетpvuaiNaturalLanguageUncovered, когда текст вне артефактов или строки доступности не имеют действующего эффективного объявления/Lang
Version 3.72.0
Добавлено (Added)
TPdf.InspectPdfAMetadataсообщает типизированные свидетельства эквивалентности по каждому полю для всех восьми отображений Info в XMP из ISO 19005-1, включая явные пустые значения и неудачи разбора датTPdf.NormalizePdfAMetadataисправляет только несовпадающие отображённые свойства XMP, сохраняя несвязанные пространства имён и нестандартные языковые альтернативы
Изменено (Changed)
TPdf.ValidatePdfAтеперь сообщаетpvaiInfoXmpValueMismatch, когда значения Info, декодированные PDFium, расходятся с корректно типизированными значениями XMP после сравнения с учётом Unicode или часового пояса
Version 3.71.0
Добавлено (Added)
InspectPdfVT2sStreamвозвращает свидетельства условий печати для каждой MIME-части PDF/VT, включая идентичность OutputIntent, происхождение профиля — встроенный или MIME, хэши ICC и сведения заголовка, а также счётчики страниц и записей DPartFPdfIccProfileобеспечивает ограниченный осмотр заголовка и таблицы тегов ICC с поддержкой MD5, SHA-256, цветового пространства, версии, класса устройства, идентификатора профиля и многоязычного описания профиля
Изменено (Changed)
- Валидация PDF/VT-2s теперь разрешает более ранние вложения ICC MIME через файловые спецификации URL
DestOutputProfileRefи проверяетCheckSum,ICCVersion,ProfileCS,ProfileName, класс устройства и допустимые процессные цветовые пространства - Все части PDF/VT теперь требуют один авторитетный OutputIntent
GTS_PDFX, упаковку профиля — встроенную или внешнюю, подобающую базе PDF/X, и одно и то же охарактеризованное условие печати; вложения, относящиеся только к PDF/X, остаются вне сравнений PDF/VT - Валидация однофайлового PDF/VT-2 теперь распознаёт
DestOutputProfileRefкак внешний целевой профиль вместо сообщения о его отсутствии
Version 3.70.0
Изменено (Changed)
- Валидация PDF/VT теперь проверяет
GTS_Scope,GTS_XID,GTS_EnvиGTS_Encapsulatedнепосредственно на каждом XObject, не позволяя соседним или вложенным словарям закрывать требования подсказок - Область
Recordтеперь разрешаетRecordLevelиз косвенного словаряDPartRoot, а областьStreamотвергается в файлах PDF/VT-1 - Декодированные потоки содержимого страниц и Form XObject теперь проверяют видимость ресурсов
Do, счётчики вхожденийSingleUseи принадлежность записей получателей через действующие унаследованные ресурсы и иерархию DPart - Инкапсулированные XObject теперь проверяют логическую форму, рекомендуемую область,
Intentизображения, изолированные группы прозрачности, цветовые пространства наложения и прямые или вложенные зависимости необязательного содержимого
Version 3.69.0
Изменено (Changed)
- Валидация PAdES теперь отвергает дубликаты записей
Contents,ByteRange,SubFilter,FilterиTypeвместо принятия значения, выбранного парсером - Обнаружение подписей теперь использует линейное сканирование словарей с учётом потоков, распознаёт экранированные токены имён PDF и не может быть перенаправлено закрытым вложенным словарём, размещённым перед настоящим
ByteRange - Проверка
ByteRangeподписи теперь требует точного совпадения исключённого промежутка с прямым шестнадцатеричным токеномContents, по-прежнему допуская последующие инкрементальные ревизии - Словари подписей теперь требуют ровно один
Filterсо значением-именем и согласованное сочетание типа и подфильтраSigилиDocTimeStamp
Version 3.68.0
Добавлено (Added)
TPdf.BuildPadesEvidenceReportсопоставляет для каждой подписи факты подписей PDFium, политику CMS, статус доверия и меток времени, хэши пути сертификатов, покрытие DSS/VRI и решения последующих ревизийTPadesEvidenceReportэкспортирует ограниченные свидетельства нескольких подписей в JSON или CSV и сообщает телеметрию источника, подписи, DSS, ревизии и усечения
Изменено (Changed)
- Валидация доверия PAdES теперь записывает идентичности SHA-256 для сертификата подписанта и упорядоченного пути сертификатов Windows, сохраняя проверку офлайн по умолчанию
- Генерация свидетельств переиспользует один удерживаемый захват байтов источника для анализа соответствия, доверия, DSS и ревизий вместо копирования исходного PDF в новый поток на каждом этапе
Version 3.67.0
Добавлено (Added)
TPadesSignatureFieldOptionsсоздаёт настраиваемые имена полей подписи, обязательные начальные значения (seed values), списки причин и правовых заверений, допустимые сертификаты подписантов и блокировки полей- Локальное и удалённое подписание может создавать подписи подтверждения или сертификации с преобразованиями
FieldMDPиDocMDPиз ISO 32000-1
Изменено (Changed)
- Подписи сертификации сохраняют существующие разрешения каталога, регистрируя новую подпись через
/Perms /DocMDP
Version 3.66.0
Добавлено (Added)
RenderPageBandedToStreamпишет вывод PNG или TIFF прямо в поток вызывающего кода с настраиваемой высотой полосы, сжатием PNG и лимитами байтов выводаRenderPageBandedToEncoderподаёт последовательные полосы страницы кодекам, определённым вызывающим кодом, и возвращает телеметрию полос, строк, памяти, завершения и вывода
Исправлено (Fixed)
RenderPageBandedтеперь сохраняет геометрию рендера полной страницы и отсекает каждую запрошенную полосу вместо перемасштабирования всей страницы в каждую полосу
Version 3.65.0
Добавлено (Added)
TPdfParallelRenderReportтеперь сообщает размер источника, пиковую захваченную память, бэкенд хранилища и вид общей подложки
Изменено (Changed)
RenderPagesParallelразделяет захваченный источник через неизменяемую память, отображение файла только для чтения или произвольный доступFPDF_LoadCustomDocumentвместо выделения второго байтового массива целого документа- Сброшенные на диск источники параллельного рендера остаются под
SaveMemoryLimitи больше не требуют перечитывать весь PDF в адресуемую память процесса
Version 3.64.0
Добавлено (Added)
- У
ImportImposedпоявилась перегрузка, возвращающаяTPdfImpositionExecutionReportсо счётчиками собственного импорта, уникальных источников, пустых слотов, шаблонов XObject, объектов форм, генераций содержимого и страниц вывода
Изменено (Changed)
- Компоновка с нулевой геометрией проводит каждую упорядоченную исходную страницу через один вызов
FPDF_ImportPagesByIndexдо вставки пустых страниц и собственной композиции N-up - Компоновка с пользовательской геометрией переиспользует один собственный шаблон XObject на уникальную исходную страницу, читает кэшированные метрики страниц, не трогая исходную страницу, и заранее выделяет хранилище плана точного размера
Version 3.63.0
Добавлено (Added)
BeginPageObjectEditTransaction,CommitPageObjectEditTransactionиRollbackPageObjectEditTransactionгруппируют собственные мутации объектов страницы в атомарный пакет в рамках страницы с проверяемым откатом по снимкуPageObjectEditTransactionStatusсообщает привязанную страницу, состояние изменений, счётчик успешных мутаций и счётчик поколений содержимого
Изменено (Changed)
- Зафиксированные пакеты объектов теперь вызывают
FPDFPage_GenerateContentодин раз вместо вызова на каждую мутацию — вставку, удаление, преобразование, свойство, метку, объект-аннотацию или внешний вид - Сохранение, смена страницы, удаление страницы, вложенные транзакции правки и неудачные собственные вставки или обновления аннотаций отклоняются до того, как отложенное содержимое успеет потеряться
Version 3.62.0
Добавлено (Added)
ReadPageObjectsSnapshotсобирает принадлежащие вызывающему коду факты об объектах страницы с бюджетами на объекты, пути, отсечения, метки, текст, строки и дедлайнPageObjectsSnapshotдаёт переиспользование с учётом ревизий через LRU с настраиваемой ёмкостью и телеметрией заполнения, попаданий и промахов
Изменено (Changed)
PageComplexityтеперь переиспользует неизменяемый снимок объектов страницы вместо повторных собственных запросов перечисления объектов, прозрачности, путей и изображений
Version 3.61.0
Добавлено (Added)
TPdfтеперь выставляет единый LRU миниатюр для встроенных и отрисованных предпросмотров с настраиваемыми потолками по записям и байтам плюс телеметрией попаданий, промахов, вытеснения, заполнения и ревизийRenderPageThumbnailпринимает поворот, опции рендера, цвет фона иTPdfColorScheme, сохраняя контракт растрового изображения, принадлежащего вызывающему коду
Изменено (Changed)
- Повторные извлечение и отрисовка миниатюр переиспользуют собственные результаты PDFium по ключам ревизии, страницы, источника, размера, поворота, флагов, фона и цветовой схемы, включая кэширование отсутствия опциональных встроенных миниатюр
TPdfThumbnailViewсинхронизирует свой кэш растровых изображений видимых страниц с ревизиями миниатюр документа, поэтому правки не оставляют устаревших предпросмотров
Version 3.60.0
Добавлено (Added)
ReadTextPageSnapshotсобирает Unicode, отображения UTF-16, геометрию и стиль символов и нормализованные метаданные текстовых объектов за один проход с явными бюджетами на символы, объекты, имена шрифтов и дедлайнTextPageSnapshotвыдаёт глубокие копии, принадлежащие вызывающему коду, через настраиваемый LRU с учётом ревизий и телеметрией ёмкости, числа записей, попаданий и промахов
Изменено (Changed)
GetStructuredTextиGetTextInReadingOrderс физической раскладкой теперь переиспользуют один и тот же снимок текста и применяют геометрическую сортировку O(n log n)
Исправлено (Fixed)
- Малые кэши снимков текста и структуры теперь вытесняют самую старую страницу, записывая новые данные под запрошенным индексом страницы, что исключает алиасинг кэша между страницами
Version 3.59.0
Добавлено (Added)
LifecycleActionPolicyвыбирает между отключённым, только-явным и совместимым режимом автоматического выполнения действий жизненного цикла документа и страниц PDFExecuteDocumentLifecycleActionоткрывает действия документа — JavaScript, открытие, закрытие, сохранение и печать, аExecutePageLifecycleActionвыполняет действия открытия и закрытия страницы, не меняяPageNumber
Изменено (Changed)
- Загрузки страниц в headless-режиме теперь получают те же автоматические действия открытия и закрытия страницы, что и загрузки из просмотрщика, причём временные страницы переиспользуются или освобождаются под блокировкой рендера
Version 3.58.0
Добавлено (Added)
ReadStructureElementsиVisitStructureElementsдают итеративный обход помеченной структуры с явными бюджетами глубины, элементов, атрибутов и времени плюс детальным статусом завершенияStructureElementsForPageвыдаёт снимки страниц с нумерацией с единицы, не меняяPageNumber, опираясь на настраиваемый кэш LRU с учётом ревизий и телеметрией попаданий, промахов и счётчиков
Изменено (Changed)
- Потребители доступности, reflow, валидации и просмотрщик теперь переиспользуют принадлежащие вызывающему коду снимки структуры, пока соответствующая правка документа или страницы не сделает их недействительными
Version 3.57.0
Добавлено (Added)
- Полный набор собственных callback'ов хоста форм теперь даёт безопасные по времени жизни ленивые дескрипторы страниц, маршрутизацию курсора интерактивного представления, уведомления об изменении значений, прямоугольники выделенного текста, события URI и события адресатов GoTo
FormHostCallbacksCompleteсообщает готовность callback'ов, аFormSelectionRectsиClearFormSelectionRectsоткрывают ограниченную геометрию выделения в пространстве страницы
Исправлено (Fixed)
- Callback'и текущей страницы XFA теперь корректно переводят между идущими с нуля индексами страниц PDFium и
PageNumberкомпонента с нумерацией с единицы - Callback'и URI AcroForm и XFA теперь сохраняют сырые байты URI и требуют явного одобрения хоста перед любым внешним запуском
Version 3.56.0
Добавлено (Added)
- Индексированные снимки
PageMetricsоткрывают размеры страницы, поворот, метку, прозрачность и пять стандартных блоков страницы, не меняя активную страницу
Изменено (Changed)
- Повторные чтения метаданных страниц переиспользуют автоматически инвалидируемый кэш собственных снимков, сокращая открытия страниц в нагрузках миниатюр, предпечатной проверки и анализа документов
Version 3.55.0
Добавлено (Added)
- Инспекция путей выдаёт точные контрольные точки кубических кривых Безье, когда загруженная сборка PDFium предоставляет
FPDFPath_GetBezierControlPoints, с опциональной пробой возможностей для старых DLL FormFieldTypeAtPoint,TPdfView.FormFieldTypeAtи индексированные свойстваFontFlagsоткрывают собственные факты о формах и шрифтах без сырых дескрипторовTPdf.Signaturesвозвращает всё содержимое собственных подписей, ByteRange, подфильтры, причины, времена и разрешения в одном принадлежащем вызывающему коду снимке
Изменено (Changed)
- Проверки присутствия полей форм теперь используют прямое собственное определение попадания по точке вместо открытия и закрытия дескрипторов аннотаций
Исправлено (Fixed)
- Валидация PDF/E-1 теперь разрешает обычные поля AcroForm, встроенные файлы и аннотации FileAttachment, точно сообщая о верхнеуровневых
/XFAи/NeedAppearances trueAcroForm, включая косвенные значения и значения объектных потоков
Version 3.54.0
Добавлено (Added)
FPdfProductionдобавляет измеряемый выбор изображений с несколькими кодеками, бэкенды обработки цвета и шрифтов, пути SVG, планы стилизованной замены, транзакционные обновления пакетов XFA, векторы штрихкодов, модели Portfolio и безопасное извлечение RichMediaFPdfStandardsExecutionдобавляет измерения и преобразование GeoPDF, транзакционное восстановление PDF/A, планы PDF/UA-2, внешние многоцветные профили, исторические свидетельства DSS и VRI, запросы DPart, глубокие факты PDF/E и полосы PDF/R с фиксированной памятьюTPdf.ImportImposedкомпонует ограниченные планы N-up и booklet через собственные пути N-up или XObject страниц с точной геометрией gutter, bleed и creep, аTPdf.CompareWithсообщает семантические, геометрические и устойчивые к допускам пиксельные различия- Подписывание PAdES теперь поддерживает подключаемые валидаторы цепочки и провайдеры HSM, присоединённый к подписи PDF MAC,
cms-algorithm-protectionи автономные документы политики подписи
Изменено (Changed)
- Движок вёрстки принимает ограниченные HTML и Markdown, распределяет содержимое по колонкам и вычисляет фиксированные, автоматические и дробные дорожки сетки
- Циклы XFDF теперь сохраняют поля с несколькими значениями и rich-text, всплывающие окна, действия, адресаты, оверлеи внешнего вида, пользовательские пространства имён и явное состояние присутствия
Version 3.53.0
Добавлено (Added)
ConfigurePdfLibraryпредоставляет неизменяемую конфигурацию собственного рендерера, шрифтов, V8, Brotli, пути пользовательских шрифтов и песочницы до первой загрузки PDFium- Собственные атрибуты структуры, связи аннотаций, файловые вложения аннотаций, типизированные значения словарей, политики фокуса, запросы z-порядка ссылок и форм и диагностика сопоставления TTF по умолчанию доступны через ограниченные высокоуровневые API
TPdfView.ReplaceFormTextAndKeepSelectionсохраняет активное выделение при повторных правках, а события отпускания правой кнопки теперь доходят до собственного движка форм
Изменено (Changed)
- Детерминированное время документа теперь использует стабильное календарное преобразование UTC в дополнение к фиксированной эпохе, формируя одинаковые метаданные в любом часовом поясе хоста
- Запись строк вложений проверяет собственный результат и кодирует ключи словаря как UTF-8
Version 3.52.0
Добавлено (Added)
TPdf.GetImageObjectRenderedBitmapвозвращает отрисованный результат объекта изображения с применёнными текущей матрицей, цветовым пространством, масками и состоянием рендерингаTPdf.TextObjectGlyphWidth,TPdf.TextObjectFontSizeиTPdf.SetTextObjectFontSizeоткрывают собственное измерение глифов и точное изменение размера шрифта текстового объектаTPdf.TransformPageObjectClipPath,TPdf.DetachFormObjectChild,TPdf.SharePageObjectMarkиTPdf.IsAnnotationObjectSubtypeSupportedдобавляют точное редактирование объектов содержимого и проверку возможностей
Version 3.51.0
Исправлено (Fixed)
- Восемь членов
TPdf, о которых сообщалось в предыдущих примечаниях к выпуску, были объявлены в секции private и не могли вызываться извне модуляPDFium; теперь они public, как и задокументировано:LinkAtPoint,GetTextRenderMode,GetTextObjectRenderedBitmap,IsAnnotationSubtypeSupported,ChooseRenderFlags,AttachmentHasKey,GetAttachmentStringValueиSetAttachmentStringValue
Изменено (Changed)
- Английская справочная документация теперь охватывает каждый публичный член
TPdfиTPdfView: 88 членов, не имевших справочной страницы, её получили, а страницы классов, индекс навигации и справочник API перечисляют их все - Справочные страницы, которые ранее указывали на общую страницу, теперь ссылаются на страницу самого члена, поэтому результат поиска открывает описание искомого API
- Справочник API документирует перечисления и записи, достижимые из публичных сигнатур, включая типы отчётности загрузки и потоков, типы текста, шрифтов и OCR, типы построителя макета, типы проверки PAdES, типы пакетной обработки и проверки, а также типы параллельного рендеринга
Version 3.50.0
Добавлено (Added)
- Каждое GUI-демо теперь открывается с готовым к использованию содержимым вместо пустой формы: демо просмотрщиков и лабораторные демо загружают сгенерированный образец документа, демо отчётов формируют при запуске заполненный отчёт, а обрабатывающие демо заранее создают образцы входных данных, чтобы основное действие выполнялось одним щелчком
MultiPageViewer,SplitViewиFontPropertiesсоздают в памяти образцы документов при запуске (шестистраничная демонстрация, два документа для сравнения бок о бок и страница с несколькими шрифтами для просмотра по щелчку)- Обрабатывающие демо, такие как
MergePDF,BatchExport,SplitPDF,ExtractText,PDFtoJpg,PrintPDFиPrintPreferences, заранее создают образцы PDF рядом с исполняемым файлом и предварительно заполняют элементы ввода, с идемпотентной регенерацией, которая никогда не перезаписывает существующие файлы FormFillиExtractImagesавтоматически загружают образцы файлов, поставляемые в папках этих демо,ImageToPDFсоздаёт два образца растровых изображений,WatermarkStampзаранее формирует свои образцы штампов, аXfdfLabоткрывается на сгенерированном документе с текстовыми аннотациями и аннотациями выделения
Изменено (Changed)
CreatePDFтеперь создаётSample.pdfрядом с исполняемым файлом при запуске без отображения диалога, поэтому документ существует с момента открытия демоTPdf.AboutInfoи метаданные установщика теперь единообразно сообщают Version 3.50.0
Version 3.49.0
Добавлено (Added)
FORM_GetTextDirectionиFORM_SetTextDirectionиз обновлённых бинарных файлов PDFium теперь привязаны, что сохраняет за слоем динамической привязки полное покрытие всех 472 экспортов PDFiumTPdf.FocusedFormFieldTextDirectionиTPdf.SetFocusedFormFieldTextDirectionпредоставляют хранящееся в памяти направление текста сфокусированного виджета через новое перечислениеTPdfFormTextDirection(ftdUnknown,ftdAuto,ftdLTR,ftdRTL), с аналогамиTPdfView, которые перерисовывают сцену страницы после смены направления
Изменено (Changed)
FPDF_LIBRARY_CONFIGтеперь отражает структуру версии 6 с экспериментальным полемm_BrotliEnabledдля бинарных файлов, собранных сPDF_ENABLE_BROTLITPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.49.0
Version 3.48.0
Добавлено (Added)
- Демо
PDFViewerтеперь при запуске создаёт в памяти шестистраничный демонстрационный документ средствами API создания документов, поэтому просмотрщик открывается с отрендеренным содержимым и без файла образца на диске - Панель миниатюр на базе
TPdfThumbnailViewпредоставляет предварительный просмотр страниц с переходом по щелчку рядом с деревом закладок во всех трёх портах демо - Поиск в просмотрщике теперь подсвечивает все совпадения на текущей странице через
HighlightSearchTextвместо одного прямоугольника результата, а количество совпадений выводится в строке состояния - Кнопки
Nightи2-Upна панели инструментов одним щелчком переключают ночной дуотонный режим рендеринга и режим отображения двухстраничного разворота
Изменено (Changed)
- Выделение текста в просмотрщике теперь использует встроенный механизм выделения
TPdfViewс выделением слова двойным щелчком, выделением перетаскиванием и сочетаниями клавиш буфера обмена вместо самописного кода выделения - Страницы отображаются с тенью и плавной прокруткой, обеспечивая современный комфорт чтения
TPdf.AboutInfoи метаданные установщика теперь единообразно сообщают Version 3.48.0
Version 3.47.0
Добавлено (Added)
FPdfBenchmarkвыполняет прогоны ограниченных коллекций PDF с настраиваемыми проходами прогрева и измерения, лимитами страниц и пикселей, кооперативной отменой и индивидуальным статусом успеха, ошибки или пропуска для каждого сценарияTPdfBenchmarkReportфиксирует размеры входных и сохранённых байтов, задержку загрузки и первой страницы, пропускную способность рендеринга, время сохранения и повторного открытия, выборочно пиковый рабочий набор, семантические и пиксельные хэши SHA-256, стабильность повторных прогонов, контроль ожидаемых хэшей и эквивалентность независимого повторного открытия- Отчёты бенчмарков экспортируют безопасный для формул CSV и структурированный JSON для CI, квалификации релизов и длительного отслеживания производительности
GetSkiaRenderCapabilities,RenderPageSkiaиRenderPageSkiaByIndexоткрывают опциональный нативный рендеринг страниц и форм средствами Skia с повторным использованием кэша разобранных страниц и без жёсткого требования к экспорту из DLL- Версионированный ABI печатного вывода с контролем возможностей предоставляет точное перечисление spot-плашек, рендеринг плашек, обнаружение overprint и предварительный просмотр overprint, когда загруженный модуль PDFium их поддерживает
Исправлено (Fixed)
- Сборки PDFium без
PDF_USE_SKIAтеперь загружаются штатно, а не завершаются ошибкой из-за отсутствия экспериментальных экспортов Skia
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.47.0
Version 3.46.0
Добавлено (Added)
ValidatePdfRтеперь проверяет исключительно растровое содержимое страниц, геометрию полос, цветовые модели, эффективное разрешение, параметры сжатия, обязательные метаданные и зашифрованные профили PDF 2.0 через настраиваемые параметры валидацииBuildPdfARepairPlanпревращает результаты валидации в упорядоченные по зависимостям шаги исправления с классами безопасности, защитой от воздействия на подписи и выводом в JSONBuildPdfXProductionPreflightсообщает о боксах страниц, встроенных шрифтах, output intent, красителях, прозрачности, overprint, цветоделении, разрешении изображений и готовности к производству без декодирования полезных данных изображений- Структурная валидация PDF/UA-2 теперь проверяет принадлежность связанных файлов, порядок чтения, описания, связи и обнаруживаемость
Изменено (Changed)
TAssociateFile.Description,TPdf.ImageInfoиTPdf.PageComplexityпредоставляют метаданные, необходимые для рабочих процессов со связанными файлами и производственного предпечатного контроляTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.46.0
Version 3.45.0
Добавлено (Added)
TPdfXmpPacketразбирает, редактирует, клонирует и сериализует XMP с учётом пространств имён, включая неизвестные пространства имён, типизированные контейнеры RDF, значения URI и ресурсов, квалификаторы, языковые альтернативы, обёртки пакетов и сохраняемые поля выравниванияTPdf.ReadXmpPacketиSaveAsWithXmpPacketпредоставляют высокоуровневое чтение метаданных и атомарный вывод; изменения подписанных документов требуют явной авторизации
Безопасность (Security)
- Ограниченный XML-ридер отклоняет DTD и внешние сущности и лимитирует байты пакета, глубину вложенности, число узлов, атрибутов и числовых ссылок на символы
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.45.0
Version 3.44.0
Добавлено (Added)
TPdfValidationRuleRegistryрегистрирует пункты профилей с указанием серьёзности, зависимостей, рекомендаций по исправлению, доказательной базы и встроенных или пользовательских предикатовTPdfValidationBudgetиTPdfValidationExecutionContextограничивают число правил, сбоев и объектов, глубину рекурсии, объём доказательств в UTF-8, зарезервированную память, истекшее время, быстрый отказ и кооперативную отменуValidatePdfFilesParallelпроверяет файлы через изолированные рабочие документы, сохраняя порядок входных данных и агрегируя распределения проблем, тайминги, сбои, отмены и ошибки загрузки
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.44.0
Version 3.43.0
Добавлено (Added)
TPdfStructureElementтеперь несёт сведения о пространстве имён, сопоставлении ролей пространств имён, ссылках, связанных файлах, аннотациях, виджетах, метках и внешнем виде для семантической валидации PDF/UA-2ValidatePdfUa2StructureElementsи его специализированные валидаторы проверяют пространства имён и вложенность ISO/TS 32005, ограниченные табличные сетки, аннотации, формы, связи Formula/MathML, связанные файлы, корни документов, FENote, списки, ссылки TOC, заголовки и подписи без загрузкиpdfium.dllClassifyPdfUaNamespaceраспознаёт пространства имён структуры PDF 1.7, PDF 2.0, MathML, ARIA, DPUB, пользовательские и отсутствующиеPdfUa2StructureHasIssueпредоставляет безопасный для C++Builder запрос одного признака проблемы без возврата множества Pascal по значению
Изменено (Changed)
ValidatePdfUaStructureElementsавтоматически применяет новый набор семантических правил дляpuc2, сохраняя путь правил PDF/UA-1TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.43.0
Version 3.42.0
Добавлено (Added)
TPdfUaSaveOptions.PdfUa2создаёт вывод PDF/UA-2 сpdfuaid:part2,pdfuaid:rev2024 и действующей версией каталога PDF 2.0ValidatePdfUaраспознаётpuc2и сообщает об отсутствующих метаданных ревизии, файлах вне формата PDF 2.0, неименованных конфигурациях опционального содержимого, устаревших аннотациях и родовых заголовках H
Изменено (Changed)
- Валидация PDF/UA теперь выбирает специфичные для профиля правила порядка табуляции, XFA и заголовков для PDF/UA-1 и PDF/UA-2
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.42.0
Version 3.41.0
Добавлено (Added)
SetPageObjectMarkParamдобавляет или заменяет один параметр — целое число, вещественное число, строку или blob — в существующей записи помеченного содержимого, не заменяя саму меткуRemovePageObjectMarkParamудаляет одно выбранное свойство, сохраняя имя метки и все не связанные с ним свойства
Изменено (Changed)
- Нецелые числа помеченного содержимого теперь проходят цикл записи-чтения как
pmpFloatвместо усечения до целочисленных снимков - Неудачная валидация параметра при выполнении
AddPageObjectMarkудаляет частично созданную нативную метку TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.41.0
Version 3.40.0
Добавлено (Added)
ConfigureSystemFontProviderустанавливает сопоставитель шрифтов приложения до запуска PDFium и предоставляет проверенные байты TrueType или OpenType для отсутствующих или замещённых шрифтов документаTPdfSystemFontPolicyуправляет заменой начертаний, нативным резервным путём, побайтовыми лимитами на шрифт и ограниченным кэшированием запросовGetSystemFontProviderStatisticsсообщает об активности сопоставления, кэша, резервных путей, отклонений, таблиц данных и активных дескрипторов
Изменено (Changed)
- Обратные вызовы поставщика предоставляют запрошенные PDFium начертание, насыщенность, стиль, кодировку и шаг символов, удерживая сбои обратных вызовов внутри нативной границы
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.40.0
Version 3.39.0
Добавлено (Added)
AddCidType2Textвстраивает переданные вызываемой стороной данные TrueType с явными для каждого глифа геометрическими соответствиями CID-to-GID и отображениями CID-to-UnicodeTPdfCidFontOptionsвыбирает полное встраивание, предпочтительное подмножество с резервным вариантом или обязательное подмножество и настраивает ограниченные бюджеты шрифтов, глифов и UnicodeTPdfCidFontReportсообщает решения о подмножествах, размеры в байтах, уникальные глифы, состояние встраивания, ожидаемый текст, извлечённый текст и целостность извлечения
Изменено (Changed)
- Формирование подмножеств TrueType сохраняет запрошенные идентификаторы глифов, отклоняет небезопасный результат и откатывает все вставленные объекты страницы, если проверка отображений или извлечения завершается неудачей
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.39.0
Version 3.38.0
Добавлено (Added)
BuildReflowDocumentсоздаёт ограниченное повторно используемое дерево семантических узлов на основе структуры Tagged PDF или вывода физической компоновки для выбранного диапазона страницTPdfReflowDocument.ToHtmlформирует экранированные адаптивные заголовки, абзацы, списки, иллюстрации, подписи, секции страниц и таблицы с семантикой заголовков и span-элементовTPdfReflowOptionsуправляет обнаружением таблиц, секциями страниц, геометрией, CSS, переносами строк, диапазоном страниц, отменой и бюджетами ресурсов
Изменено (Changed)
- Содержимое таблиц заменяет перекрывающиеся блоки абзацев при переформатировании, а состояние активной страницы восстанавливается после успеха, ошибки или отмены
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.38.0
Version 3.37.0
Добавлено (Added)
ApplyOcrSearchLayerвыполняет рендеринг выбранных страниц через PDFium и передаёт ограниченный объём пикселей BGRA в порядке сверху-вниз поставляемому вызываемой стороной интерфейсуIPdfOcrProviderTPdfOcrWordнесёт текст Unicode, достоверность и четырёхугольники в пиксельном пространстве, которые через нативную геометрию страницы отображаются в невидимый текст для поискаTPdfOcrReportфиксирует завершение по страницам, пропуски из-за существующего текста, сбои, отмену, число отрендеренных пикселей и принятые либо отклонённые слова
Изменено (Changed)
- Вставка OCR сохраняет исходные потоки изображений сканов, отфильтровывает некорректные или малодостоверные результаты, фиксируется один раз на страницу и восстанавливает активную страницу
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.37.0
Version 3.36.0
Добавлено (Added)
ExtractTablesобнаруживает таблицы с линейками и выровненные по пробелам на основе нативной геометрии слов и преобразованных линеек контуровTPdfTableсообщает о строках, столбцах, объединённых ячейках, границах страницы, ячейках заголовков, режиме обнаружения, достоверности и прямом выводе в CSV или JSONExtractDocumentTablesсканирует все страницы в рамках общих бюджетов и помечает совпадающие таблицы, продолжающиеся через границы страниц
Изменено (Changed)
- Извлечение таблиц применяет настраиваемые лимиты слов, линеек, ячеек и таблиц и восстанавливает активную страницу после сканирования уровня документа
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.36.0
Version 3.35.0
Добавлено (Added)
GenerateTaggedLayoutсоздаёт новый документ семантической вёрстки с нативным помеченным содержимым, деревом структуры Document, отображениями ParentTree и IDTree и метаданными языка документаTPdfLayoutSemanticsмоделирует заголовки, секции, списки, иллюстрации, подписи, таблицы, связи с заголовками, span-элементы, альтернативный текст, ActualText, языки и идентификаторы элементовTPdfLayoutDocument.AddLinkформирует аннотации Link с URI и связывает каждую аннотацию с её элементом структуры Link через отображения OBJR и StructParent
Изменено (Changed)
- Текст вёрстки по умолчанию получает семантику абзаца, тогда как колонтитулы, линейки, изображения и повторно используемые формы по умолчанию считаются артефактами, если не помечены явно
- Валидация семантического плана отклоняет дублирующиеся идентификаторы, отсутствующих родителей, циклы, недопустимую вложенность списков или таблиц, иллюстрации без замещающего текста и неразрешённые идентификаторы заголовков таблиц до формирования документа
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.35.0
Version 3.34.0
Добавлено (Added)
TPdf.AddShapedTextзаписывает последовательности глифов с RTL, bidi, контекстными формами и лигатурами через нативное системное шейпирование и API шрифтов PDFium CID Type 2ShapePdfTextиTPdfUniscribeTextShaperпредоставляют позиционированные идентификаторы глифов, метрики продвижения, смещения, исходные кластеры, позиции визуальных последовательностей и уровни bidi без изменения документа
Изменено (Changed)
- Сгенерированные отображения ToUnicode покрывают каждый шейпированный глиф, а
ActualTextхранит исходную логическую строку Unicode для соответствующих требованиям потребителей извлечения и доступности - Строки помеченного содержимого с метками порядка байтов UTF-16 теперь корректно декодируются через
PageObjectMarks TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.34.0
Version 3.33.0
Добавлено (Added)
TPdfLayoutCachedNodeсоздаёт унаследованное в подклассе содержимое вёрстки при первом использовании и поддерживает повторные масштабируемые размещения черезAddCachedNodeTPdfLayoutPlanсообщает о попаданиях и промахах кэша измерений, размещениях кэшированных узлов и повторно использованных нативных XObject
Изменено (Changed)
BuildPlanповторно использует совпадающие планы по полным ограничениям страниц, содержимому, шрифтам, стилям, источнику и идентичности измерителя, не повторяя измерение текстаGenerateLayoutпреобразует каждый уникальный кэшированный узел в один привязанный к назначению XObject и создаёт лёгкие объекты Form для каждого размещенияTPdf.AboutInfo, метаданные пакета и метаданные установщика теперь единообразно сообщают Version 3.33.0
Version 3.32.0
Добавлено (Added)
TPdfLayoutDocumentсобирает перенесённый текст, разделители, линейки, изображения, повторно используемые XObject страниц, явные разрывы страниц, верхние и нижние колонтитулы в измеренный план страницGenerateLayoutразбивает на страницы полную вёрстку перед атомарным добавлением нативных страниц и объектов страницы со стабильными ссылками{page}и{pages}
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета и метаданные установщика теперь единообразно сообщают Version 3.32.0
Version 3.31.0
Добавлено (Added)
- Построители
TPdfPagePlanописывают операции удаления, перемещения, вставки, разделения и слияния страниц, не применяя их ValidatePagePlanвозвращает точное отображение старых страниц на новые и перечисляет затронутые закладки, именованные назначения, метки страниц, поля форм, помеченные страницы, импортированные возможности и подписи
Безопасность (Security)
- Планы, которые оставили бы висячие цели навигации или изменили подписанное содержимое без явной авторизации, отклоняются до запуска любой нативной операции со страницами
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.31.0
Version 3.30.0
Добавлено (Added)
SaveRecoverySnapshotзаписывает ограниченный по размеру пакет восстановления с контрольной суммой, содержащий отпечаток источника и проверенный журнал правок документаRestoreRecoverySnapshotвоспроизводит пакет восстановления только при совпадении его контрольной суммы, цепочки журнала, отпечатка источника и отпечатка восстановленного документаEnableRecoveryAutosaveатомарно обновляет явный файл восстановления после каждого изменённого commit, undo или redo, не перезаписывая исходный PDF
Изменено (Changed)
InspectRecoverySnapshotсообщает источник восстановления, отпечатки, количество записей, позицию и ограниченное хранилище, не применяя пакетImportEditJournalи восстановление из снимка теперь требуют явной авторизацииAllowSignedDocumentперед применением правок к подписанному PDF- Хранилище пакетов восстановления использует настроенное ограниченное хранилище произвольного доступа и сквозную замену в том же каталоге для больших журналов и устойчивых к сбоям обновлений автосохранения
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.30.0
Version 3.29.0
Добавлено (Added)
BeginEditTransaction,CommitEditTransactionиRollbackEditTransactionгруппируют произвольные нативные правки документа в атомарные транзакцииUndoEditиRedoEditприменяют проверенные по SHA-256 обратные и прямые дельты к изменениям страниц, объектов, аннотаций, вложений и метаданныхExportEditJournalиImportEditJournalсохраняют ограниченные переносимые дельты с проверкой отпечатка источника и цепочки дайджестов для последующего воспроизведения
Изменено (Changed)
- Снимки транзакций используют воспроизводимый нативный вывод, поэтому неизменённые commit остаются пустыми, даже когда обычные сохранения PDFium содержат недетерминированные идентификаторы или метки времени
- Неудачные commit и недопустимое воспроизведение журнала атомарно восстанавливают предыдущий загружаемый документ, а количество записей, сохранённые байты и размер снимка остаются в пределах настроенных вызываемой стороной лимитов
- Подписанные PDF требуют явной авторизации
AllowSignedDocumentперед началом транзакции правок документа TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.29.0
Version 3.28.0
Добавлено (Added)
TPdf.InspectOptionalContentперечисляет слои OCG, конфигурации по умолчанию и альтернативные, состояния использования View/Print/Export, метаданные масштаба и языка, заблокированные слои, массивы порядка, радиогруппы, политики OCMD, выражения видимости и действующее состояние рендерингаTPdf.SaveAsOptionalContentConfiguredзаписывает строго проверенную копию с выбранными вызываемой стороной состояниями слоёв для заданного использования и конфигурации
Изменено (Changed)
- Вывод состояний слоёв теперь обновляет как массивы конфигурации
/ONи/OFF, так и словари состояния Usage объектов OCG, чтобы PDFium применял запрошенную видимость через свой нативный контекст рендеринга - Запись конфигурации отклоняет неизвестные группы, изменения заблокированных слоёв, конфликты радиогрупп, зашифрованные промежуточные файлы и подписанные файлы без явной авторизации, а по умолчанию удаляет правила автоматического состояния, сохраняя детерминированность выбранного результата
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.28.0
Version 3.27.0
Добавлено (Added)
TPdf.RenderPageByIndexвыполняет рендеринг любой страницы с отсчётом от единицы в точном пиксельном размере, не изменяя активную страницу редактирования и не вызывая события смены страницыPageSceneCacheCapacity,PageSceneCacheCountиClearPageSceneCacheпредоставляют ограниченное управление кэшем сцен и его диагностику
Изменено (Changed)
- Рендеринг страниц по индексу, отрисовка миниатюр и извлечение встроенных миниатюр теперь по умолчанию повторно используют разобранное состояние страницы PDFium через восьмиэлементный кэш LRU
- Записи сцен аннулируются при активации страницы, редактировании, изменениях дерева страниц, обратных вызовах состояния формы, явной очистке и разборе документа; выполняющиеся рендеринги безопасно удерживаются до освобождения
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.27.0
Version 3.26.0
Добавлено (Added)
TPadesSignatureAlgorithmInfoсообщает OID дайджеста, подписи, открытого ключа и именованной кривой каждого подписанта CMS вместе с независимо вычисленным состоянием политики алгоритмовInspectPadesSignatureAlgorithmиEvaluatePadesSignatureAlgorithmраспознают профили P-256, P-384, P-521, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1, Ed25519 и Ed448
Безопасность (Security)
- Валидация PAdES теперь отклоняет несоответствия эллиптических кривых и дайджестов, OID подписи ECDSA, расходящиеся с дайджестом CMS, безымянные параметры EC, параметры Ed25519 и длины вывода SHAKE256 для Ed448, отличные от 512 бит
- Нативная проверка CMS остаётся источником криптографической достоверности, а недоступные алгоритмы и нераспознанные кривые сообщаются как
pcsUnsupportedвместо того, чтобы считаться недействительными подписями TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.26.0
Version 3.25.0
Добавлено (Added)
TPdf.ExportObjectGraphэкспортирует активные объекты классического формата, xref-потоков и объектных потоков как ограниченный типизированный JSON с явными словарями, массивами, строками, именами, скалярными значениями, косвенными ссылками, байтовыми размерами потоков и опциональными дайджестами потоков SHA-256TPdf.SaveAsObjectGraphPatchedустанавливает или удаляет проверенные по схеме значения словаря верхнего уровня через типизированные значения патчей: null, Boolean, целое, вещественное, имя, текстовую строку и косвенную ссылку
Безопасность (Security)
- Экспорт графа объектов применяет бюджеты объектов, рекурсии, строк и выходных байтов, а внесение патчей проверяет каждую операцию перед доставкой, отклоняет висячие ссылки, дублирующиеся операции, зашифрованные входные данные, защищённые изменения фильтров или длины потоков и подписанные документы без явной авторизации
- Патчи графа объектов оформляются как инкрементная ревизия, повторно материализуются для проверки xref, строго загружаются через PDFium и копируются или атомарно переименовываются только после успешного прохождения всех проверок
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.25.0
Version 3.24.0
Добавлено (Added)
TPdf.ValidatePadesTrustпроверяет каждую обнаруживаемую отсоединённую подпись относительно точного исходногоByteRange, оценивает привязку signing-certificate-v2 и текущее системное доверие Windows и сообщает независимые состояния подписи, цепочки, отзыва и метки времениTPdf.ValidatePadesTrustAsyncделает снимок исходного загруженного источника перед запуском, сообщает поэтапный прогресс разбора, криптографии, построения цепочек, AIA, OCSP, CRL и работы с метками времени RFC 3161 и поддерживает кооперативную отменуTPadesTrustValidationOptionsвыбирает офлайн- или онлайн-доверие, опциональную проверку отзыва и меток времени, ограниченный тайм-аут загрузки URL, токен отмены и обратный вызов прогресса
Безопасность (Security)
- Маркеры метки времени подписи и Document Time-stamp теперь проверяют свой отпечаток сообщения SHA-256, вложенную подпись CMS, цепочку TSA и опциональное состояние отзыва независимо от обычной подписи документа
- Валидация доверия никогда не хэширует копию, повторно сохранённую PDFium, по умолчанию использует офлайн-получение сертификатов только из кэша и сообщает о неподдерживаемых или неопределённых состояниях вместо того, чтобы считать недоступное нативное доверие или доказательства отзыва действительными
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.24.0
Version 3.23.0
Добавлено (Added)
TPdf.RenewPadesArchiveTimestampиRenewPadesArchiveTimestampToStreamдобавляют новую метку Document Time-stamp RFC 3161 к существующей цепочке подписей PAdES, не изменяя ни одного исторического байтаTPadesArchiveTimestampOptionsуправляет доступом к TSA, nonce, зарезервированной ёмкостью маркера и опциональным полным обновлением DSS, аTPadesArchiveTimestampReportфиксирует исходный и итоговый уровни, длины цепочек, размеры в байтах и идентичность возвращённой метки времени
Исправлено (Fixed)
- Новый и обновлённый вывод PAdES B-LTA объявляет ESIC ExtensionLevel 2, а валидация B-LT больше не требует Level 2 при отсутствии Document Time-stamp
Безопасность (Security)
- Обновление хэширует точные исходные загруженные байты плюс любое запрошенное обновление DSS, отклоняет зашифрованные или неполные источники, проверяет обнаруживаемый результат B-LTA перед записью вывода и подготавливает файловый вывод перед заменой
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.23.0
Version 3.22.0
Добавлено (Added)
TPdf.AnalyzeSignatureRevisionsвосстанавливает исходную цепочку инкрементных ревизий и возвращает изменения объектов по каждой подписи, классифицированные относительно разрешений DocMDP и FieldMDPTPadesRevisionAnalysisReportразличает разрешённые обновления форм, аннотаций, подписей и материалов валидации и недопустимые изменения страниц или документа, неразрешённые случаи и подозрительные теневые определения
Безопасность (Security)
- Анализ ревизий обнаруживает нессылочные определения объектов, переопределения объектов подписи, активное содержимое, некорректные цепочки ревизий и неразрешённые сжатые объекты, применяя ограниченные бюджеты ревизий, объектов и изменений
- Анализ всегда использует исходный загруженный файл, буфер памяти, пользовательский поток или завершённый прогрессивный источник, а не байты, перезаписанные PDFium
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.22.0
Version 3.21.0
Добавлено (Added)
TPdf.PreparePadesRemoteSignatureсоздаёт заполнитель отсоединённой подписи фиксированной ширины и возвращает постоянный запрос, содержащий дайджест документа SHA-256, точныйByteRange, координаты резервирования и отпечаток подготовленного PDFTPdf.CompletePadesRemoteSignatureзавершает сеансы подписания с HSM, облаком или прерванные после проверки сохранённого запроса и возвращённого CMSTPdf.SavePadesRemoteSigningRequestиTPdf.LoadPadesRemoteSigningRequestпредоставляют стабильный версионируемый двоичный формат сеанса для границ процессов и машин
Безопасность (Security)
- Завершение отклоняет изменённые подготовленные PDF, изменённые координаты
ByteRange, повторно используемые непустые заполнители, сверхразмерные значения CMS, неподдерживаемые структуры SignedData, отсутствующие атрибуты signing-certificate-v2 и дайджесты сообщений CMS, не совпадающие с подготовленным документом TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.21.0
Version 3.20.0
Добавлено (Added)
TPadesDssOptions.Vrisзаписывает по одному косвенному словарю/Type /VRIна каждую подпись с ключом в виде SHA-1 в верхнем регистре от полного декодированного значения/Contents, включая заполнениеTPadesDssVriвыбирает материалы сертификатов, OCSP и CRL через проверенные индексы, а подписание PAdES B-LT и B-LTA теперь автоматически создаёт VRI новой подписи
Изменено (Changed)
- Сертификаты DSS, ответы OCSP и CRL дедуплицируются по хэшу содержимого со стабильным порядком первого вхождения, проверкой коллизий точных байтов и переназначением ссылок VRI до записи каких-либо байтов назначения
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.20.0
Version 3.19.0
Добавлено (Added)
TPdf.GetStructuredTextпреобразует текущую страницу в повторно используемые записи блоков, строк и стилизованных span-элементов, сохраняя исходные индексы символов, скаляры Unicode, геометрию, имена шрифтов, размеры, насыщенность и углы текстаTPdfStructuredTextOptionsвыбирает порядок потока содержимого или физической компоновки, опциональное обогащение шрифтами и семантикой, а также максимальный бюджет символов с гарантированным отказом при исчерпании- Фрагменты Tagged PDF и эвристически читаемого содержимого обогащают блоки сведениями о виде структуры, уровне заголовка, языке, источнике и идентичности элемента структуры, а альтернативный текст непарных элементов Figure остаётся представленным
Изменено (Changed)
- Извлечение физической компоновки теперь использует упорядочивание символов за O(n log n), геометрически растущие буферы строк и span-элементов, кластеризацию строк и столбцов, буферизованное построение Unicode и кэширование шрифтов смежных ненулевых текстовых объектов для предсказуемой производительности на больших страницах
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.19.0
Version 3.18.0
Безопасность (Security)
TPdf.SaveAsRedactedприменяет каждый прямоугольник/Redactк изолированному снимку документа, удаляет каждый пересекающийся объект страницы верхнего уровня и закрашивает непрозрачный замещающий прямоугольник, не изменяя загруженный документ- Редактированный вывод удаляет аннотации редактирования, опционально удаляет другие пересекающиеся аннотации, уничтожает нативные встроенные вложения и вырезает
/AFкаталога, активное содержимое, формы, метаданные и недостижимые объекты предыдущих ревизий TPdfRedactionOptionsуправляет цветом замещения, удалением перекрывающихся аннотаций и бюджетом сканирования объектов страницы с гарантированным отказом, аTPdfRedactionReportфиксирует каждое удаление и метрики выводаTPdfSanitiseOptions.StripAssociatedFilesтеперь по умолчанию удаляет ссылки на связанные файлы на уровне каталога
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.18.0
Version 3.17.0
Добавлено (Added)
TPdf.RenderPagesParallelпараллельно выполняет рендеринг запросов страниц с отсчётом от единицы, при этом каждый рабочий поток владеет независимо загруженными модулем PDFium, документом и состоянием страницы, полученными из одного зафиксированного снимка документаTPdfParallelRenderOptionsуправляет DPI, количеством рабочих потоков, поворотом, нативными флагами рендеринга, цветом фона, лимитами пикселей на страницу и суммарными лимитами сохраняемого выводаTPdfParallelRenderReportсохраняет порядок запросов и возвращает принадлежащие вызываемой стороне буферы BGRA или RGBA сверху-вниз с постраничными данными об успехе, отмене, сбое, размерах, тайминге и диагностике- Прогрессивный рендеринг в рабочих потоках опрашивает
IPdfCancellationTokenмежду нативными фрагментами, а недопустимые запросы и исчерпание бюджетов остаются изолированными в соответствующих результатах TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.17.0
Version 3.16.0
Добавлено (Added)
TPdfEncryptionRevision.erR7добавляет вывод ISO/TS 32003 AES-256-GCM с/V 6,/R 7,/CFM /AESV4и обязательным расширением разработчика PDF 2.0- Каждая зашифрованная строка и поток получают уникальный 96-битный IV, шифртекст неизменной длины и 128-битный тег аутентификации, а
EncryptMetadata = Falseсохраняет байты потока метаданных DecryptAesGcmDocumentBytesпроверяет пароль пользователя или владельца, зашифрованные разрешения, опциональные автономные данные PDF MAC и каждый тег GCM перед возвратом совместимых с PDFium байтов открытого текста- Вывод AESV4 можно сочетать с
TPdfEncryptOptions.EnableIntegrityProtection, чтобы аутентификация GCM на уровне объектов и защита всего документа PDF MAC по ISO/TS 32004 сосуществовали - Шифрование теперь использует корректные классические записи перекрёстных ссылок вместо интерпретации объектоподобного текста внутри данных потока как косвенных объектов
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.16.0
Version 3.15.0
Добавлено (Added)
TPdfEncryptOptions.EnableIntegrityProtectionзаписывает автономные коды аутентификации PDF MAC по ISO/TS 32004 для документов AES-256 Standard Security Handler ревизий 5 и 6TPdf.ValidatePdfMacпроверяет точные исходные байты источника, строго покрывающий EOF/ByteRange, CMSAuthenticatedData, производный от пароля ключ файла, аутентифицированные атрибуты, обёрнутый ключ MAC и значение HMACFPdfHmacдобавляет HMAC-SHA256 и HKDF-SHA256, аFPdfAes— примитивы RFC 3394 AES-256 Key Wrap и аутентифицированной распаковкиTPdfMacValidationResultразличает действительные, отсутствующие, недействительные и неподдерживаемые коды аутентификации с диагностическим текстомTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.15.0
Version 3.14.0
Добавлено (Added)
TPdf.ValidatePadesтеперь проверяет отсоединённые подписи CMS относительно точных сегментов исходного/ByteRangeв Windows, включая подписанные атрибуты и значение подписиTPadesValidationResultпредоставляет совокупный статус целостности и состояния ByteRange, CMS,signing-certificate-v2, системного доверия, отзыва и метки времени по каждой подписи, не смешивая неподдерживаемые или непроверенные доказательства с недействительной подписью- Привязка сертификата подписанта проверяется по SHA-256, цепочки сертификатов используют вычисление системного доверия Windows только из кэша, а нативные коды ошибок остаются доступными для диагностики
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.14.0
Version 3.13.1
Исправлено (Fixed)
TPdf.ValidatePadesтеперь проверяет исходный файл, буферизованную память или байты пользовательского потока вместо копии, повторно сохранённой PDFium, которая могла лишить силы смещения или отбросить словари подписей- Проверки
/ByteRangePAdES теперь принимают подписи, охватывающие более раннюю полную ревизию PDF с последующими корректными инкрементными обновлениями, и дополнительно проверяют диапазоны Document Time-stamp TPadesValidationResult.SourceStatusразличает валидацию исходного источника и недоступный или неполный прогрессивный ввод, а предикаты соответствия отклоняют результаты без исходных байтовTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.13.1
Version 3.13.0
Добавлено (Added)
FPdfSha3предоставляет свободные от зависимостей примитивы SHA3-256, SHA3-384, SHA3-512 и SHAKE256 для ISO/TS 32001 и связанной криптографической работы PDF 2.x- Инкрементные контексты поглощают произвольно разбитый ввод, а SHAKE256 поддерживает повторные вызовы squeeze и вывод, пересекающий границы скорости губки
- Однократные помощники для байтовых массивов и шестнадцатеричных строк нижнего регистра дополняют потоковый API с явной валидацией жизненного цикла и размеров в Delphi, C++Builder и Lazarus
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.13.0
Version 3.12.0
Добавлено (Added)
TPdf.ImportFDFимпортирует данные форм FDF из файлов или потоков и применяет разобранные значения через существующий путь полей виджетовFdfImportFromStreamиFdfImportFromFileразбирают прямые и косвенные иерархические поля, литеральные и шестнадцатеричные строки PDF, PDFDocEncoding, текст Unicode, значения-имена и явные пустые значения в рамках ограниченных бюджетов ресурсов- Экспорт FDF теперь записывает не-ASCII имена полей и значения как соответствующие стандартам текстовые строки UTF-16BE и безопасно экранирует имена исходных файлов
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.12.0
Version 3.11.0
Добавлено (Added)
TPdf.DetectPageSkewвыполняет рендеринг текущей страницы при низком DPI и определяет угол наклона, проецируя тёмные пиксели на возможные углы поворота; возвращается угол, максимизирующий дисперсию строчных сумм (выравнивание текстовых строк), с точностью около 0.1 градусаTPdfSkewReportпредоставляет обнаруженный угол, достоверность и размеры выборкиTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.11.0
Version 3.10.0
Добавлено (Added)
TPdf.GetTextInReadingOrderизвлекает текст текущей страницы в исходном порядке потока содержимого или в порядке физической компоновки (сверху вниз, слева направо) черезFPDFText_GetCharBoxи извлечение символов с сортировкой по позиции, поэтому многоколоночный и визуально переупорядоченный текст читается естественно- Перечисление
TPdfReadingOrderвыбирает междуroContentOrderиroPhysicalLayout TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.10.0
Version 3.09.0
Добавлено (Added)
TPdfImageOptimizeOptions.PreserveBilevelпропускает однобитовые двухуровневые изображения (ImageMask / сканы линейной графики) при выполненииOptimizeImages, чтобы прореживание методом ближайшего соседа не разрушало их чёткие границыTPdfImageOptimizeOptions.MinDimensionпропускает изображения меньше порога (обычно значки или декоративные элементы, которым дальнейшее уменьшение не приносит выгоды)TPdfImageOptimizeOptions.Defaultпредоставляет рекомендуемую отправную точку (целевые 150 DPI, коэффициент 1.5, двухуровневые изображения сохраняются, минимальный размер 8)TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.09.0
Version 3.08.0
Добавлено (Added)
TPdfTileCacheпредоставляет ограниченный кэш LRU отрендеренных фрагментов страниц с ключами по ревизии документа, странице, масштабу, повороту, флагам рендеринга и прямоугольнику устройства, поэтому неизменённые фрагменты не перерисовываются при обновлениях, а устаревшие фрагменты от предыдущего сохранения вытесняются автоматическиTTileKeyпредоставляет составной ключ кэша со статической фабрикойCreateи компараторомEqualsTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.08.0
Version 3.07.0
Добавлено (Added)
TPdf.GetAnnotationFontColorиTPdf.SetAnnotationFontColorобёртывают ранее привязанные, но не использовавшиесяFPDFAnnot_GetFontColorиFPDFAnnot_SetFontColor, открывая чтение и запись цвета текста виджета для редактирования полей форм без прямого обращения к словарю аннотацииTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.07.0
Version 3.06.0
Добавлено (Added)
TPdf.RenderPageBandedвыполняет рендеринг текущей страницы горизонтальными полосами через обратный вызов, поэтому постеры и инженерные страницы можно экспортировать без выделения полной целевой битовой карты — каждая полоса рендерится во вновь создаваемыйTBitmapзапрошенной высоты полосы и освобождается после возврата обратного вызоваTPdfBandCallbackпредоставляет контракт на полосу (индекс полосы, смещение сверху по Y, битовая карта) с логическим возвратом, позволяющим вызываемой стороне досрочно отменить полосовой рендерингTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.06.0
Version 3.05.0
Добавлено (Added)
TPdf.RenderPageProgressiveWithColorSchemeуправляет нативным циклом прогрессивного рендеринга с цветовой схемой для слабовидящих черезFPDF_RenderPageBitmapWithColorScheme_Start, позволяя вызываемой стороне переопределять цвета заливки и обводки контуров и текста для доступности с сохранением учитывающего отмену цикла ContinueTPdfColorSchemeпредоставляет четыре переопределяемых поляTColorсо значениемDefault, которое откатывается к встроенным цветам PDFium, когда все поля равныclDefaultTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.05.0
Version 3.04.0
Добавлено (Added)
TPdf.ExportFDFсериализует значения полей форм как документ FDF (ISO 32000-1 §12.7.11) в дополнение к существующему пути XFDF, повторно используя ту же модель данныхTXfdfField, поэтому вызываемая сторона собирает поля однократно и выдаёт любой из форматовFdfExportToStreamиFdfExportToFileвFPdfXfdfпредоставляют низкоуровневый сериализатор FDF для вызываемых сторон, строящих коллекции полей независимо от загруженногоTPdfTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.04.0
Version 3.03.0
Добавлено (Added)
TPdf.SaveAsSanitisedзаписывает чистую копию с одной ревизией, которая вырезает активное содержимое из каталога (/OpenAction,/AAкаталога,/Names,/AcroForm,/Metadata) и затем удаляет недостижимые объекты, так что осиротевшие тела JavaScript, действий и вложений исчезают из тела файлаTPdfSanitiseOptionsпредоставляет независимые переключатели вырезания по каждому вектору плюс опциональный проход удаления по достижимости;TPdfSanitiseReportфиксирует количество вырезанных записей, количество удалённых объектов, размеры в байтах и любые ошибкиTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.03.0
Version 3.02.0
Добавлено (Added)
TPdf.SaveAsPageLabelledзаписывает полную копию PDF, в которой числовое дерево/PageLabelsкаталога заменяется переданными диапазонами с применением стилей нумерации — десятичного, римского в верхнем и нижнем регистре и буквенного в верхнем и нижнем регистре — с опциональными текстовыми строками префикса и начальными номерами согласно ISO 32000-1 §12.4.2TPdfPageLabelRange,TPdfPageLabelRanges,TPdfPageLabelStyleиTPdfPageLabelReportпредоставляют модель диапазонов, перечисление стилей и количества байтов и диапазонов по каждому сохранению- Существующие записи
/PageLabelsкаталога обнаруживаются и отклоняются, если не переданReplaceExisting=True; в этом случае старая запись вырезается перед внедрением новых диапазонов TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.02.0
Version 3.01.0
Добавлено (Added)
TPdf.FlattenPageRotationзапекает текущий/Rotateкаждой страницы в поток содержимого, боксы страницы и прямоугольники аннотаций, затем сбрасывает/Rotateв 0 — за счёт обёртыванияFPDFPageObj_TransformF+FPDFAnnot_GetRect/SetRect+FPDFPage_SetMediaBox/SetCropBox+FPDFPage_SetRotationвизуальная компоновка сохраняется без опоры на подсказку отображения поворотаTPdfFlattenRotationOptionsпредоставляет управления преобразованием аннотаций, заменой боксов страницы и автообновлением по каждой странице;TPdfFlattenRotationReportфиксирует обработанные, пропущенные и неудачные страницы плюс общее число преобразованных объектов и аннотацийTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.01.0
Version 3.00.0
Добавлено (Added)
TPdf.StampPagesFromPdfставит штамп исходной страницей в виде позиционированного, масштабированного, при необходимости повёрнутого наложения или подложения Form XObject на одну или несколько целевых страниц, обёртываяCreateXObjectFromPage+FPDFPageObj_SetMatrix+FPDFPageObj_SetBlendMode+FPDFPage_InsertObjectAtIndexс явными политиками боксов страницы, привязки, полей, масштаба, поворота, смешивания и z-порядкаTPdfOverlayOptionsиTPdfOverlayReportпредоставляют управления размещением, преобразованием, смешиванием и z-порядком плюс количества проштампованных, неудачных и пропущенных страниц по каждой страницеTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 3.00.0
Version 2.99.0
Добавлено (Added)
TPdf.RefreshAppearanceизбирательно регенерирует поток внешнего вида одного виджета черезFPDFAnnot_SetAP, избегая полностраничной перестройкиNeedAppearancesTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.99.0
Version 2.98.0
Добавлено (Added)
TPdfView.MouseDownтеперь направляет события правой кнопки в нативный движок заполнения форм черезFORM_OnRButtonDown, включая контекстные меню и взаимодействие с виджетами по правому щелчку- Пункты 78 (сопоставление аннотаций-ссылок), 82 (представление виджетов) и 83 (модель атрибутов структуры) карты маршрутов подтверждены как уже завершённые за счёт существующей инфраструктуры
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.98.0
Version 2.97.0
Добавлено (Added)
TPdf.SetDeterministicTimeиTPdf.RestoreActualTimeпозволяют тестам и воспроизводимым сборкам внедрять фиксированное время создания, изменения и текущее время через поддерживаемые нативные обратные вызовыTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.97.0
Version 2.96.0
Добавлено (Added)
TPdf.GetWidgetAdditionalActionJavaScriptчитает JavaScript дополнительных действий виджета для заданного триггера события черезFPDFAnnot_GetFormAdditionalActionJavaScript, не выполняя ни одного скриптаTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.96.0
Version 2.95.0
Добавлено (Added)
TPdf.GetObjectTextизвлекает текст Unicode текстового объекта страницы черезFPDFTextObj_GetTextдля точного редактирования содержимого и диагностики кодировокTPdf.GetObjectsByTypeвозвращает индексы всех объектов страницы, соответствующих категории (текст, контур, изображение, форма, затенение), для избирательного вывода по категориямTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.95.0
Version 2.94.0
Добавлено (Added)
TPdf.AttachmentHasKey,GetAttachmentStringValueиSetAttachmentStringValueчитают, записывают и проверяют наличие пользовательских значений расширений файловых спецификаций у встроенных вложенийTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.94.0
Version 2.93.0
Добавлено (Added)
TPdf.InsertObjectAtIndexвставляет объект страницы в запрошенную позицию стека черезFPDFPage_InsertObjectAtIndex, а не всегда в конецTPdf.UpdateAnnotationObjectфиксирует отредактированный объект внешнего вида аннотации черезFPDFAnnot_UpdateObject, поэтому изменения принадлежащих аннотациям объектов страницы надёжно сохраняютсяTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.93.0
Version 2.92.0
Добавлено (Added)
TPdf.InsertClipPathсоздаёт прямоугольный контур обрезки и вставляет его в текущую страницу через нативные путиFPDF_CreateClipPathиFPDFPage_InsertClipPath, дополняя существующий инспекторPageObjectClipPathTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.92.0
Version 2.91.0
Добавлено (Added)
TPdf.GetPageComplexityсканирует текущую страницу и сообщает количества объектов изображений, контуров и текста, а также общее число сегментов контуров, общее число пикселей изображений и наличие прозрачности для планирования рендерингаTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.91.0
Version 2.90.0
Добавлено (Added)
TPdf.IsAnnotationSubtypeSupportedзапрашивает у загруженной DLL PDFium, какие подтипы аннотаций она поддерживает, перед редактированиемTPdf.ChooseRenderFlagsвыбирает нативные флаги рендеринга (полутоновой, ограниченный кэш изображений) по итоговому масштабу и размеру назначения для адаптивной субдискретизации изображенийTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.90.0
Version 2.89.0
Добавлено (Added)
TPdf.GetTextRenderModeпредоставляет нативный режим отображения текста (заливка, обводка, обрезка) текстового объекта страницы для диагностики авторингаTPdf.GetTextObjectRenderedBitmapвыполняет рендеринг одного текстового объекта в изолированную битовую карту через нативный путьFPDFTextObj_GetRenderedBitmapTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.89.0
Version 2.88.0
Добавлено (Added)
TPdf.GetThumbnailтеперь откатывается к рендерингу замены, когда у страницы нет встроенной миниатюры, реализуя приоритет встроенных миниатюрTPdf.LinkAtPointвозвращает, существует ли нативная ссылка в координате пространства страницы, используяFPDFLink_GetLinkAtPoint, а не только сканирование прямоугольниковTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.88.0
Version 2.87.0
Добавлено (Added)
TPdf.AuditActiveContentвозвращает снимокTPdfActiveContentAuditс количеством действий JavaScript, количеством встроенных файлов, количеством подписей, типом формы XFA и разрешениями документа, не выполняя ни одного скрипта или действияTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.87.0
Version 2.86.0
Добавлено (Added)
TPdf.GetFeatureInventoryоднократно сканирует все страницы и возвращает единую запись количеств объектов текста, контуров, изображений, Form XObject и затенения вместе со сведениями о вложениях, подписях, типе формы, разрешениях и версии PDFTPdfFeatureInventoryобъединяет в один снимок сведения обо всём документе, ранее требовавшие отдельных обращений к свойствамTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.86.0
Version 2.85.0
Добавлено (Added)
TPdf.SaveAsReproducibleперезаписывает документ так, что два сохранения одного и того же состояния в памяти дают побайтово идентичный вывод- Недетерминированные метки времени
/Info(/CreationDate,/ModDate) вырезаются, а исходный/ID(производный от зависящих от часов байтов) опускается, при этом порядок объектов и поколения остаются стабильными TPdfReproducibleReportсообщает количества сохранённых и удалённых объектов плюс число вырезанных записей меток времениTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.85.0
Version 2.84.0
Добавлено (Added)
TPdf.SaveAsInlineImagesExternalisedперезаписывает документ, извлекая каждое встроенное изображениеBI/ID/EIв повторно используемый XObject изображения и заменяя встроенный блок оператором/ImN Do- Сокращения словаря встроенных изображений (
/W,/H,/BPC,/CS,/F, значения цветовых пространств и фильтров) разворачиваются в полные имена XObject изображений, чтобы извлечённый объект соответствовал стандартам - Словарь
/Resources /XObjectстраницы обновляется новыми ссылками на XObject, а перезаписанный поток содержимого сжимается Flate TPdfInlineImageExternaliseReportсообщает количества экстернализованных, пропущенных и неудачных изображений плюс число созданных XObjectTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.84.0
Version 2.83.0
Добавлено (Added)
TPdf.SaveAsFlateRecompressedперезаписывает документ и перекодирует подходящие потокиFlateDecodeс максимальным сжатием, заменяя поток только когда измеренная экономия байтов превышает порог вызываемой стороныTPdfFlateRecompressOptionsвыбирает минимальную экономию в байтах и минимальный коэффициент экономии, поэтому уже оптимальные потоки остаются нетронутымиTPdfFlateRecompressReportсообщает количества перекодированных, пропущенных и неудачных потоков вместе с исходным и итоговым объёмом байтов перекодированных потоков- Номера объектов и поколения остаются стабильными; изменяются только перекодированные полезные данные потоков и их прямые значения
/Length, поэтому каждая уцелевшая перекрёстная ссылка остаётся действительной TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.83.0
Version 2.82.0
Добавлено (Added)
TPdf.OptimizeImagesобходит каждый объект изображений страницы и прореживает те, чьё эффективное разрешение размещения превышает выбранный вызываемой стороной целевой уровень, затем фиксирует каждую затронутую страницу через нативный генератор содержимогоTPdfImageOptimizeOptionsвыбирает целевое DPI и минимальный коэффициент, поэтому перекодируются только действительно передискретизированные изображенияTPdfImageOptimizeReportсообщает количества оптимизированных, пропущенных и неудачных изображений вместе со структурированным сообщением об ошибке- Прореживание использует проход методом ближайшего соседа по нативному буферу битовой карты PDFium, сохраняя исходный формат, шаг и альфа-канал, а
FPDFImageObj_SetBitmapперекодирует уцелевшее изображение TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.82.0
Version 2.81.0
Добавлено (Added)
TPdf.SaveAsDeduplicatedперезаписывает документ как одну чистую ревизию, схлопывая совместимые шрифты, изображения и Form XObject на одного общего представителя- Рекурсивный отпечаток содержимого объединяет каждый словарь ресурсов, его полное достижимое поддерево и его необработанные данные потока, поэтому дубликаты сливаются только при полном совпадении содержимого
- Каждая перекрёстная ссылка на удалённый при слиянии дубликат переписывается на уцелевшего представителя, а перестроенная классическая таблица перекрёстных ссылок сохраняет стабильность номеров объектов
TPdfDedupReportсообщает количества сохранённых и удалённых объектов плюс слитые количества шрифтов, изображений и Form XObject по категориямTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.81.0
Version 2.80.0
Добавлено (Added)
TPdf.SaveAsReachableперезаписывает документ как одну чистую ревизию, сохраняя только косвенные объекты, достижимые из каталога и словаря /Info трейлераTPdfPruneReportсообщает количества сохранённых и удалённых косвенных объектов вместе с размерами источника и вывода в байтах и структурированными причинами сбоев для зашифрованного или некорректного ввода- Недостижимые объекты-сироты, оставшиеся от инкрементных обновлений, слияний страниц или восстановленных сохранений, выметаются, а перестроенные классические перекрёстные ссылки и трейлер сохраняют
/Root,/Infoи/IDбез перенумерации TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.80.0
Version 2.79.0
Добавлено (Added)
TPdf.CreateDocumentSearchсоздаёт прямой или обратный поиск по всему документу, возвращающий по одному совпадению за раз без построения индекса текста всего документаTPdfDocumentSearchResultсообщает страницу с отсчётом от единицы, диапазон символов, совпавший текст и прямоугольники в пространстве страницы для каждого результата- Поисковые сеансы принимают
IPdfCancellationToken, удерживают только текущие дескрипторы страницы и текста PDFium и безопасно завершаются при закрытии документа TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.79.0
Version 2.78.0
Изменено (Changed)
TPdfRangeRequestSchedulerтеперь вытесняет перекрывающиеся передачи с более низким приоритетом, поэтому критические для страниц подсказки PDFium не ждут за фоновыми загрузками- Внешне доступные разрежённые байты отменяют избыточные активные передачи, а заменённые или дублирующиеся обратные вызовы транспорта возвращают False, не публикуя устаревшее покрытие
- Повышение приоритета сохраняет независимые истории повторов, а вытеснение транспорта больше не расходует бюджет повторов незатронутых хвостов диапазонов
TPdfRangeRequestStatistics.SupersededRequestCountсообщает о работе транспорта, вытесненной подсказками с более высоким приоритетом или внешне предоставленным покрытиемTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.78.0
Version 2.77.0
Добавлено (Added)
TPdf.SaveAsNormalizedContentзаписывает синтаксически нормализованное содержимое страниц в поток или атомарно заменяемый файл и сообщает количества нормализованных, пропущенных и объединённых страницNormalizePdfContentSequenceпредоставляет ограниченную автономную нормализацию токенов для декодированных последовательностей потоков содержимого
Изменено (Changed)
- Массивы
/Contentsстраниц теперь можно объединять в один поток, сохраняя строки, имена, полезные данные встроенных изображений, неизвестные операторы и межпотоковое состояние графики - Некорректные токены, несбалансированные области состояния, неподдерживаемые фильтры, зашифрованный ввод и перезапись подписанных документов имеют явные политики и структурированные отчёты о состоянии
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.77.0
Version 2.76.0
Добавлено (Added)
TPdfStreamInspectorинвентаризирует произвольные физические объекты потоков PDF и сообщает смещения объектов, необработанные длины, цепочки фильтров, DecodeParms, маркеры внешних файлов, состояние шифрования и нативные пути изображений или вложенийCopyRawDataкопирует полные кодированные полезные данные или проверенные байтовые окна, аDecodeDataприменяет предикторы ASCIIHex, ASCII85, LZW, Flate, RunLength, TIFF 8-bit и PNG в объявленном порядкеTPdfStreamInspectOptionsограничивает ресурсы источника, необработанных и декодированных данных, словарей, числа потоков и коэффициента расширения со структурированными отчётами о лимитах, некорректных данных, неподдерживаемых кодеках, шифровании и ошибках записи
Изменено (Changed)
- Разрешение длины потоков теперь предоставляет точные интервалы для прямых и косвенных значений
/Length, включая потоки нулевой длины и полезные данные, содержащие литеральную последовательностьendstream TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.76.0
Version 2.75.0
Добавлено (Added)
TPdfLoadOptionsдобавляет политики совместимой, строгой и восстановительной загрузки для файлов, памяти, байтовых диапазонов и пользовательских потоковTPdfLoadReportсообщает маршрут нативного восстановления, действительность xref, повреждённые смещения, конфликты записей, количества ревизий, бюджеты аудита и структурированные проблемы для классических, гибридных документов и документов с xref-потокамиTPdf.SaveAsRepairedсоздаёт полную копию с одной ревизией и независимо строго загружает её перед выдачей проверенного потока или атомарной заменой целевого файла
Изменено (Changed)
- Существующие перегрузки загрузки сохраняют совместимое поведение и теперь публикуют нативную действительность xref и статус восстановления через
LastLoadReport - Строгая загрузка отклоняет документы, потребовавшие нативной перестройки xref или не прошедшие структурный аудит, а восстановленный вывод подписанного документа требует явной авторизации вызываемой стороны
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.75.0
Version 2.74.0
Добавлено (Added)
TPdf.MergeFilesобъединяет списки файловых источников с диапазонами страниц и паролями для каждого источника, держа открытым не более одного исходного документаTPdfBatchMergeOptionsдобавляет обработку ошибок с остановкой или пропуском, импорт в рамках источника или кусками, политики форм и структуры, управление вставкой, обратные вызовы прогресса, отмену, копирование настроек просмотрщика и управление откатомTPdfBatchMergeReportсообщает о зафиксированных и откаченных страницах, результатах источников, вызовах нативного импорта, крупнейшем пакете, пиковом числе открытых источников, обнаружениях политик, проблемах и конечном статусе
Изменено (Changed)
- Пакетный путь по умолчанию выполняет один нативный импорт страниц на источник, чтобы PDFium мог повторно использовать клонированные объекты в рамках этого источника, затем закрывает источник перед открытием следующего файла
- Покусочный режим предоставляет более тонкие точки отмены и меньшие нативные пакеты, а неудачные частичные источники и результаты остановки или отмены могут удалить все страницы, вставленные операцией
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.74.0
Version 2.73.0
Добавлено (Added)
TPdfRandomAccessStoreобеспечивает потокобезопасный последовательный и позиционированный ввод-вывод, удерживает небольшое содержимое в ограниченной памяти и однократно выгружается в приватное временное хранилище при достижении выбранного вызываемой стороной потолкаTPdf.SaveMemoryLimitиSaveTemporaryDirectoryнастраивают промежуточное хранение при сохранении, аLastSaveSpillCountиLastSaveLargestMemoryBufferпредоставляют измеримую диагностику по каждому сохранению
Изменено (Changed)
- Промежуточные буферы сохранения, преобразования стандартов, валидации, шифрования, DSS и PAdES теперь используют общее ограниченное рабочее хранилище с монопольными файлами выгрузки, удаляемыми при закрытии, и затиранием памяти
- Пользовательские обратные вызовы блоков PDFium сериализуют обычные позиционирования потока и используют не зависящие от курсора позиционированные чтения при опоре на
TPdfRandomAccessStore - Файловое сканирование возможностей XFA теперь читает перекрывающиеся блоки фиксированного размера вместо копирования полного PDF в память
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.73.0
Version 2.72.0
Добавлено (Added)
TPdf.BeginIncrementalSave,CommitIncrementalSaveиEndIncrementalSaveпредоставляют сеанс ревизий, добавляющий только изменённые или вновь созданные косвенные объектыTPdfIncrementalCommitInfoсообщает количество изменённых объектов, добавленные байты, общий объём вывода в байтах и количество успешных ревизий для каждого commit
Изменено (Changed)
- Каждый грязный commit сохраняет полный предыдущий вывод как точный байтовый префикс, не создаёт ревизию, когда ничего не изменилось, и продолжает классический формат или формат xref-потоков источника
- Нативный инкрементный вывод xref-потока ремонтируется с его обязательным типом, собственной записью, длиной, индексом и терминатором объекта перед дальнейшей обработкой
- Зашифрованные документы отклоняются до начала сеанса, а подписанные документы требуют явного разрешения вызываемой стороны, чтобы политику подписей нельзя было обойти случайно
- Файловая перегрузка завершает соседний временный файл перед атомарной заменой назначения и откатывает состояние сеанса после любой ошибки записи или замены
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.72.0
Version 2.71.0
Добавлено (Added)
TPdf.SaveAsObjectStreamзаписывает файлы PDF 1.5+ с ограниченными сжатыми группами объектов и чистым xref-потоком, содержащим полные записи type 2PackPdfObjectStreamsможет модернизировать классический, гибридный, xref-потоковый и существующий объектно-потоковый ввод после разрешения активной ревизии
Изменено (Changed)
- Локальный для страниц порядок объектов, адаптивные ширины полей xref, прямой доступ к каталогу и настраиваемые потолки элементов и декодированных байтов балансируют размер файла со скоростью произвольного доступа
- Файловая перегрузка завершает соседний временный файл перед атомарной заменой назначения, а недопустимые параметры инкрементности, версии и группирования отклоняются до начала вывода
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.71.0
Version 2.70.0
Добавлено (Added)
TPdf.SaveAsLinearizedзаписывает настоящий PDF Fast Web View в поток или файл с группировкой объектов первой страницы, двумя секциями перекрёстных ссылок и таблицами подсказок смещений страниц и общих объектов по Annex F- Активные элементы объектных потоков материализуются автоматически, позволяя вводу с xref-потоками и объектными потоками стать дружественным к диапазонам выводом без изменения видимого содержимого страниц
Изменено (Changed)
- Файловая перегрузка завершает соседний временный файл перед атомарной заменой назначения, а потоковая перегрузка сохраняет обычные параметры сохранения PDFium и явные проверки версий
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.70.0
Version 2.69.0
Добавлено (Added)
TPdfRangeRequestSchedulerпреобразует байтовые подсказки PDFium в приоритезированную, объединённую и ограниченную по размеру транспортную работу, не навязывая непрерывную загрузку- Полное и частичное завершение, ограниченные повторы, дедупликация разрежённой доступности, статистика запросов и безопасная относительно поколений отмена поддерживают конвейеры HTTP Range и пользовательского транспорта
TPdfProgressiveDocument.RangeRequestsавтоматически получает подсказки документа, формы и страниц, повышая приоритет только тех байтов, которые блокируют интерактивную страницу
Изменено (Changed)
CancelProgressiveLoadтеперь отменяет активную работу с диапазонами до нативной доступности и разборки потоков, а устаревшие завершения транспорта безопасно игнорируютсяTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.69.0
Version 2.68.0
Добавлено (Added)
TPdfProgressiveDocumentподдерживает сеанс доступности PDFium, пока удалённый или растущий поток произвольного доступа получает запрошенные PDFium байтовые диапазоныCheckDocumentAvailability,CheckFormAvailabilityиLoadAvailablePageвозвращают объединённые подсказкиTPdfDownloadRange, чтобы хост мог загрузить только данные, необходимые для открытия и отображения линеаризованной страницыAvailableByteCountподдерживает монотонные непрерывные загрузки, аOnDataAvailable— разрежённые и внеочередные кэши диапазонов
Изменено (Changed)
- Линеаризованные файлы используют нативные шлюзы прогрессивного документа, формы и страницы PDFium; нелинеаризованные файлы автоматически переключаются на нативный загрузчик пользовательских потоков после появления полного файла
TPdfStreamAdapterможет сообщать логический итоговый размер, отличный от текущих сохранённых байтов, сохраняя явный лимитFPDF_FILEACCESSв 4 GiBTPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.68.0
Version 2.67.0
Добавлено (Added)
TPdfView.AllowFormEventsотключает события мыши, клавиатуры и фокуса, которые просмотрщик направляет в слой заполнения форм, для просмотрщика только чтения или просмотрщика, самостоятельно управляющего взаимодействием с формой- Поля форм при выключенном переключателе по-прежнему рендерятся нормально: загрузка и закрытие страницы намеренно оставлены без ограничения, поскольку они инициализируют слой форм, а не реагируют на ввод
- Переключатель присоединяется к существующим
AllowUserPageChangeиAllowUserTextSelectionи по умолчанию равен True, поэтому существующее поведение не меняется
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.67.0
Version 2.66.0
Добавлено (Added)
- Именованные действия, инициируемые документом (ISO 32000-1 §12.6.4.11), теперь достигают хоста через новое событие
OnNamedAction; ранее каждое из них отбрасывалось - Без обработки четыре стандартных имени навигации —
NextPage,PrevPage,FirstPage,LastPage— перемещают страницу, ограничиваясь первой и последней вместо зацикливания TPdf.PerformNamedActionпозволяет приложению вызвать то же поведение напрямую, возвращая False для имени, не имеющего предусмотренного библиотекой смысла
Исправлено (Fixed)
- Тест шифрования измерял тело потока обратным сканированием от
endstream, что изредка принимало байт шифртекста за терминатор строки и выдавало перемежающийся сбой; сама библиотека была корректна
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.66.0
Version 2.65.0
Добавлено (Added)
BuildToUnicodeCMapгенерирует CMap ToUnicode (ISO 32000-1 §9.10.3), необходимый шрифту CID, чтобы его текст можно было копировать, искать и читать вспомогательным технологиям — без него текст рендерится корректно, но извлекается как пустота- Записи разбиваются на части по установленному спецификацией лимиту 100 на блок, дублирующиеся глифы записываются однократно, а
.notdefпропускается - CMap следует соглашению CID = GID, поэтому поток
CIDToGIDMapрядом не нужен
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.65.0
Version 2.64.0
Добавлено (Added)
- Аннотации Ink и stamp рисуют себя из собственных объектов страницы, а не из потока содержимого страницы, и эти объекты теперь доступны:
AnnotationObjectCountиAnnotationObjectInfoчитают их,AddPathToAnnotationпередаёт аннотации контур, построенный с помощьюCreatePath, аRemoveAnnotationObjectудаляет объект - Построение внешнего вида штампа больше не требует внешнего инструмента: создайте контур как обычно, затем передайте его аннотации вместо страницы
- PDFium принимает объекты страницы только для подтипов ink и stamp, поэтому любой другой подтип отклоняется с сообщением, называющим ограничение, а не с непонятным сбоем
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.64.0
Version 2.63.0
Добавлено (Added)
TPdf.AddStandardFontTextрисует текст одним из 14 шрифтов, которые обязан предоставлять каждый PDF-ридер, вообще не встраивая шрифтовую программу — итоговый файл заметно меньше, чем тот же текст, нарисованный черезAddText, который встраивает найденное системное начертание- Новое перечисление
TPdfStandardFontименует все 14 начертаний, поэтому вызываемая сторона не может опечататься в имени базового шрифта; PDFium сопоставляет эти имена точно, и опечатка молча дала бы отсутствие шрифта - PDF/A и PDF/X оба требуют встраивания всех шрифтов, поэтому вывод для этих профилей должен продолжать использовать
AddText
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.63.0
Version 2.62.0
Добавлено (Added)
TPdf.TextObjectGlyphOutlineвозвращает контур одного глифа шрифта текстового объекта как сегменты контура — для преобразования текста в векторную графику или исследования глифа, который могла изменить подмена шрифта- Результат повторно использует существующий тип
TPdfPathSegments, поэтому читается так же, как контур нарисованного объекта-пути - Координаты находятся в собственном дизайн-пространстве шрифта, нормализованном так, что один em равен 1.0; запрошенный размер шрифта не масштабирует их, поэтому вызываемой стороне, желающей единицы устройства, нужно умножить их на кегль самостоятельно
- Пустой результат означает, что шрифт не предоставляет контура для этого глифа, и это не ошибка; запрос глифа нетекстового объекта вызывает исключение
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.62.0
Version 2.61.0
Добавлено (Added)
TPdf.InspectAvailabilityсообщает, что PDFium может определить о PDF без загрузки его как документа: линеаризован ли файл («веб-оптимизирован»), увенчался бы успехом полный разбор, содержит ли он данные формы и какую страницу просмотрщик показал бы первой- Новые типы
TPdfAvailability,TPdfLinearizationиTPdfFormAvailabilityнесут ответы; поток читается, но не удерживается, а его позиция восстанавливается при возврате - Это закрывает последний пробел в семействе
FPDFAvail_*, которое было привязано и загружено, но не имело ни одного вызова где-либо в библиотеке - Delphi, Lazarus и C++Builder каждый охватывают сообщаемые факты, гарантию позиции потока и отклонение nil-потока
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.61.0
Version 2.60.0
Добавлено (Added)
- Помеченное содержимое (ISO 32000-1 §14.6) теперь доступно из высокоуровневого API:
PageObjectMarksчитает каждый тег BDC и его список свойств из объекта страницы,AddPageObjectMarkзаписывает метку,RemovePageObjectMarkудаляет её, аPageObjectMarkedContentIDсообщает MCID - Новые типы
TPdfContentMark,TPdfContentMarkParamиTPdfMarkParamKindнесут имя тега и его типизированные параметры (целое число, float, строка, blob), причём вид значения разрешается через PDFium, а не угадывается по успешно сработавшему геттеру - Добавление метки перестраивает поток содержимого страницы, поэтому тег переживает сохранение; это пришлось сделать явным, поскольку
SaveAsсам по себе не регенерирует содержимое - Delphi, Lazarus и C++Builder каждый несут шесть тестов, включая тот, что распаковывает сохранённый поток содержимого, чтобы подтвердить, что оператор BDC и его список свойств действительно попали в файл
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.60.0
Version 2.59.0
Добавлено (Added)
TPdfAnnotationполучаетHasLinkUriиLinkUri, поэтомуCreateAnnotationтеперь может создать рабочую веб-ссылку: аннотация сохраняется с действием/URI, указывающим на заданный адрес- Установка URI ссылки для любого подтипа, кроме
anLink, вызывает исключение, поскольку словарь действия есть только у аннотации Link - Пока поле доступно только для записи; обратное чтение цели ссылки идёт через семейство
FPDFLink_*, которому нужен дескриптор документа - Delphi, Lazarus и C++Builder проверяют, что сохранённые байты несут действие
/URIи целевой адрес
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.59.0
Version 2.58.12
Добавлено (Added)
- Валидация PDF/X сообщает
pvxiTrimBoxWithArtBox, когда страница несёт/TrimBoxи/ArtBoxодновременно; обе задают готовую страницу, поэтому RIP не может определить, какая из них авторитетна (ISO 15930) - Валидация PDF/X сообщает
pvxiPageBoxOutsideMediaBox, когда/TrimBoxили/BleedBoxвыходит за пределы/MediaBox, включая бокс с отрицательным началом координат; бокс за пределами носителя нельзя воспроизвести - Прямоугольники нормализуются перед сравнением, поэтому принимается любой порядок углов, а бокс, точно касающийся края носителя, проходит валидацию
- Отчёты предпечатной проверки классифицируют обе проблемы по структуре и называют конкретное средство исправления
- Delphi, Lazarus и C++Builder покрывают оба отклоняемых случая и один соответствующий требованиям
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.12
Version 2.58.11
Добавлено (Added)
- Валидация PDF/UA сообщает
pvuaiTociWithoutToc, когда документ помечает записи TOCI, но никогда не помечает контейнер TOC, которому они принадлежат, из-за чего вспомогательные технологии объявляют элементы оглавления без оглавления (ISO 14289-1 §7.7) - Отчёты предпечатной проверки классифицируют проблему по структуре и рекомендуют обернуть записи элементом TOC
- C++Builder получает первое покрытие тестами PDF/UA в дополнение к тестам Delphi и Lazarus
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.11
Version 2.58.10
Добавлено (Added)
- Валидация PDF/A сообщает
pvaiSymbolicTrueTypeEncoding, когда символический шрифт TrueType несёт запись/Encoding; ISO 19005-1 §6.3.7 допускает только встроенный cmap шрифта, поэтому/Encodingпротиворечил бы ему - Символический флаг читается из
/FontDescriptor, записан ли тот прямо в словаре шрифта или указан косвенно; несимволический шрифт сохраняет обязательный/WinAnsiEncodingили/MacRomanEncoding, не помечаясь проблемой - Отчёты предпечатной проверки классифицируют проблему по содержимому и рекомендуют удалить запись
- Delphi и Lazarus покрывают помеченный случай плюс оба принимаемых; C++Builder покрывает помеченный и несимволический случаи
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.10
Version 2.58.9
Добавлено (Added)
- Валидация PDF/A сообщает реализационные лимиты контейнеров из Annex C ISO 19005-1:
pvaiNameOverLimitдля имён длиннее 127 байтов,pvaiArrayOverLimitсвыше 8191 элемента,pvaiDictOverLimitсвыше 4095 записей иpvaiNestingOverLimitсвыше 28 уровней вложенности - Лимиты включительны, поэтому контейнер, точно достигший лимита, всё ещё проходит валидацию; тесты фиксируют как отклоняемую, так и принимаемую сторону каждой границы
- Отчёты предпечатной проверки классифицируют четыре проблемы по структуре и называют конкретный лимит в каждой рекомендации
- Delphi и Lazarus покрывают все четыре лимита плюс граничные случаи; C++Builder покрывает лимит массива и границу
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.9
Version 2.58.8
Добавлено (Added)
- Валидация PDF/R сообщает
pvriPageImageMismatch, когда количество изображений не совпадает с количеством страниц; ISO 23504-1 §6.5.1 требует ровно одного strip-изображения на страницу, поэтому страница без изображения или с несколькими не соответствует стандарту - Тесты Delphi, Lazarus и C++Builder покрывают страницу без изображения, страницу с двумя и соответствующий случаю одного изображения вариант
Изменено (Changed)
- Тесты внедрения маркеров PDF/R теперь начинаются с исходной страницы, уже несущей strip-изображение, поскольку внедрение маркеров добавляет метаданные и не может создать содержимое страницы
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.8
Version 2.58.7
Добавлено (Added)
- Валидация PDF/R сообщает
pvriFontForbidden, когда страница называет ресурс шрифта; страница PDF/raster несёт отсканированное изображение и ничего больше (ISO 23504-1 §6.5.2) - Валидация PDF/R сообщает
pvriForbiddenImageFilterдля кодировок полос вне белого списка:/LZWDecode,/RunLengthDecode,/ASCII85Decode,/ASCIIHexDecode,/JBIG2Decodeи/Cryptотклоняются, тогда как/CCITTFaxDecode,/DCTDecode,/JPXDecodeи/FlateDecodeпроходят (ISO 23504-1 §6.6) - Отчёты предпечатной проверки классифицируют обе проблемы по содержимому и рекомендуют конкретное средство исправления
- Тесты Delphi, Lazarus и C++Builder покрывают ресурс шрифта, отклоняемый фильтр и страницу только с кодировками из белого списка
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.7
Version 2.58.6
Добавлено (Added)
- Валидация PDF/E сообщает
pveiFontNotEmbedded, когда документ показывает использование шрифтов, но не содержит встроенных шрифтовых программ, поэтому требование проверяется как на пути без DLL, так и через PDFium - Инженерный чертёж должен рендериться идентично спустя десятилетия, поэтому ISO 24517-1 не освобождает ни один из стандартных 14 шрифтов; проверка применяется одинаково к
/Type1,/TrueType,/Type0и/MMType1 - Отчёты предпечатной проверки классифицируют новую проблему по содержимому и рекомендуют встроить каждую шрифтовую программу
- Тесты Delphi, Lazarus и C++Builder покрывают дескриптор без программы, встроенный
/FontFile2и документ, вообще не использующий шрифтов
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.6
Version 2.58.5
Добавлено (Added)
InjectPdfEMarkersтеперь записывает output intent, требуемый ISO 24517-1 §6.2: встроенный целевой профиль sRGB ICC, output intent/GTS_PDFE1, называющий его, и массив/OutputIntentsкаталога — всё в составе одного инкрементного обновления- Поток профиля выводит свой
/Nиз заголовка ICC, а не предполагает три компонента, поэтому профиль CMYK был бы описан корректно - Валидация PDF/E сообщает
pveiMissingOutputIntentиpveiMissingIccProfile, поэтому кандидат без заявленного цветового условия больше не принимается - Тесты Delphi, Lazarus и C++Builder покрывают принятый output intent, вариант без целевого профиля и каталог вовсе без output intent
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.5
Version 2.58.4
Добавлено (Added)
- Валидация PDF/X теперь сообщает
pvxiFontNotEmbeddedпо байтовому сканированию, поэтому невстроенный шрифт выявляется на пути без DLL, а не только через проверку на основе PDFium - В отличие от PDF/A, стандартные 14 шрифтов в PDF/X не освобождены, поэтому сообщается любое использование шрифта без встроенной шрифтовой программы
- Проверка остаётся консервативной: она срабатывает, только когда файл показывает использование шрифтов, но вовсе не содержит
/FontFile,/FontFile2или/FontFile3, поскольку сопоставление дескрипторов с программами даёт ложные срабатывания на общих дескрипторах - Тесты Delphi, Lazarus и C++Builder покрывают дескриптор без программы, встроенную программу и документ, не использующий шрифтов
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.4
Version 2.58.3
Добавлено (Added)
- Валидация PDF/X теперь сообщает
pvxiColorSpaceForbidden, когда кандидат PDF/X-1a несёт/DeviceRGB,/CalRGBили/Lab, которые ISO 15930-1 §6.2 исключает из своего CMYK-обмена - Проверка ограничена только PDF/X-1a, поэтому PDF/X-3 и более поздние продолжают разрешать RGB и независимые от устройств пространства, сочетаемые с output intent
- Проверяются только однозначные токены имён цветовых пространств; поток
ICCBasedтребует разрешения/Nи остаётся за уровнем объектной модели - Тесты Delphi, Lazarus и C++Builder покрывают помеченное пространство RGB, помеченное пространство Lab, принимаемую пару CMYK и градаций серого и разрешённый случай на PDF/X-3
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.3
Version 2.58.2
Добавлено (Added)
- Валидация PDF/X теперь сообщает
pvxiTransparencyForbiddenдля группы прозрачности или активной мягкой маски, которые запрещают ISO 15930-1 §6.2 (PDF/X-1a) и ISO 15930-3 §6.3 (PDF/X-3) - Проверка ограничена обнаруженным уровнем соответствия, поэтому PDF/X-4 и PDF/X-6 продолжают разрешать прозрачность, а файл с неопределённым уровнем никогда не помечается правилом, которое может к нему не относиться
- Мягкая маска, явно отключённая как
/SMask /None, прозрачностью не считается PdfHasActiveSMaskперенесён изFPdfPdfaв интерфейсFPdfPdfCommon, чтобы каждый валидатор мог использовать одно правило мягких масок- Тесты Delphi, Lazarus и C++Builder покрывают помеченную группу на X-1a, помеченную мягкую маску на X-3, отключённую мягкую маску и разрешённый случай на X-4
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.2
Version 2.58.1
Добавлено (Added)
- Валидация PDF/X теперь проверяет форму output intent, требуемого ISO 15930-7 §6.2.4:
pvxiOutputIntentSchemeсообщает о подтипе, который присутствует, но не является/GTS_PDFX, аpvxiOutputIntentMissingIdentifier— об отсутствующем/OutputConditionIdentifier - Подтип сопоставляется как целый токен имени, поэтому более длинное имя вроде
/GTS_PDFXVersionбольше не проходит, тогда как запись того же имени с экранированием#xxпо-прежнему проходит - Output intent вовсе без подтипа не трогается, поскольку его отсутствие уже сообщается проблемами уровня маркеров
- Отчёты предпечатной проверки относят обе проблемы к категории output intent и предлагают исправление
- Тесты Delphi, Lazarus и C++Builder покрывают принимаемый подтип, подтип PDF/A, более длинный токен имени, отсутствующий подтип и отсутствующий идентификатор условия
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.58.1
Version 2.58.0
Изменено (Changed)
- Все 35 обратных вызовов, которые PDFium выполняет из собственных фреймов C++ (заполнение форм, XFA, платформа JavaScript, пауза прогрессивного рендеринга, чтение и запись потоков), теперь удерживают любое исключение Pascal и возвращают документированное значение сбоя вместо раскрутки через границу языков
- Обработчик события, возбуждающий исключение, неудачное выделение памяти или неожиданная ошибка внутри обратного вызова больше не могут обрушить процесс или оставить PDFium в неопределённом состоянии
Исправлено (Fixed)
- Регистрация таймера формы теряла его запись, когда базовый таймер не удавалось создать
Добавлено (Added)
- Тесты Delphi, Lazarus и C++Builder теперь покрывают сохранение в поток назначения, отказывающий в записи, и подтверждают, что документ остаётся работоспособным и сохраняемым после этого
Version 2.57.8
Исправлено (Fixed)
- Более старые выпуски Delphi (XE5 и ранее) не могли скомпилировать триальную библиотеку с ошибкой
E2003 Undeclared identifier: 'GetTickCount64'вFPdfPades.pas, поскольку модуль Windows из этих компиляторов не экспортирует символ - Те же компиляторы также не справлялись с
GetUserDefaultLocaleNameвPDFium.pasи с присваиваниемTBytesвarray of ByteвGetXfaFormPackets, поэтому обратный вызов локали XFA и снимок пакетов теперь собираются и на этих компиляторах
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.8
Version 2.57.7
Изменено (Changed)
- Каждая перезапись при сохранении теперь усекает целевой поток перед записью, а не только перематывает его, поэтому предоставленный вызываемой стороной буфер, уже содержавший более длинный документ, не может сохранить устаревший хвост после нового
%%EOF - Тесты Delphi, Lazarus и C++Builder теперь покрывают сохранение в заранее заполненный поток
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.7
Version 2.57.6
Исправлено (Fixed)
- Сканирование объектов перед шифрованием принимало цифровые последовательности любой длины, поэтому длинное число в любом месте файла могло переполниться в отрицательный или фиктивный номер объекта и добавить фантомную запись в перестроенную таблицу перекрёстных ссылок
- Номера объектов выше лимита Annex C ISO 32000-1 и поколения выше 65535 теперь отклоняются как заголовки объектов вместо усечения
Добавлено (Added)
- Тесты Delphi, Lazarus и C++Builder теперь подтверждают точное количество используемых записей перестроенной таблицы
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.6
Version 2.57.5
Исправлено (Fixed)
- Шифрование с
EncryptMetadata = Falseзаписывало/EncryptMetadata falseв словарь Encrypt, но по-прежнему шифровало поток метаданных документа, поэтому ридер, следующий этому объявлению, находил нечитаемый XMP - Поток
/Type /Metadataтеперь копируется без изменений при выключенном шифровании метаданных, тогда как все остальные потоки по-прежнему шифруются
Добавлено (Added)
AnsiNameTokenMatchesKeyтеперь входит в интерфейсFPdfPdfCommonдля учитывающих разделители сравнений имён- Тесты Delphi, Lazarus и C++Builder теперь покрывают оба режима шифрования метаданных
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.5
Version 2.57.4
Исправлено (Fixed)
- Перестроенная при шифровании таблица перекрёстных ссылок опускала обязательную голову свободного списка объекта 0, требуемую ISO 32000-1 §7.5.4, поэтому её первая подсекция начиналась на один объект позже
- Каждая перестроенная запись заявляла поколение 0; объекты, записанные с более высоким поколением, теперь сохраняют его, поэтому таблица согласуется с заголовками объектов, на которые указывает
Добавлено (Added)
- Тесты Delphi, Lazarus и C++Builder теперь покрывают запись головы свободного списка и сохранение поколений в перестроенной таблице
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.4
Version 2.57.3
Исправлено (Fixed)
- Зашифрованный вывод отбрасывал ключевое слово
streamкаждого объектного потока, поэтому сохранённый файл больше не был корректным синтаксисом PDF, а строгие ридеры сообщали о содержимом страницы как ни о потоке, ни о массиве потоков - Перезапись
/Lengthсопоставляла/Lengthкак простую подстроку, поэтому словарь потока с/Length1(любой встроенный шрифт) получал искажённое имя ключа, тогда как реальная длина оставалась устаревшей - Поток, указывающий длину косвенно как
/Length N 0 R, получал номер объекта, перезаписанный новой длиной; теперь запись заменяется прямой зашифрованной длиной - Словарь потока вовсе без
/Lengthтеперь получает его вместо того, чтобы оставлять ридер без длины
Добавлено (Added)
AnsiFindDictKeyTokenтеперь входит в интерфейсFPdfPdfCommonдля учитывающих разделители поисков ключей словаря верхнего уровня- Тесты Delphi, Lazarus и C++Builder теперь покрывают сохранение
/Length1, замену косвенной длины и согласованность размера тела потока
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.3
Version 2.57.2
Исправлено (Fixed)
SaveAsEncryptedиSaveAsEncryptedToStreamсRevision = erR6создавали документы, отклонявшие собственный правильный пароль примерно в одном файле из четырёх, поскольку счётчик раундов алгоритма 2.B ISO 32000-2 §7.6.4.3 начинался на раунд ниже и лишний раунд менял значения/U,/O,/UEи/OE- Зашифрованные R6 документы теперь открываются с паролем пользователя или владельца в любом соответствующем ридере и по-прежнему отклоняют неверный пароль
Добавлено (Added)
- Наборы тестов Lazarus и C++Builder получили покрытие шифрования, ранее доступное только в Delphi: длины ключей R6, поля словаря Encrypt, повторный цикл шифрования и повторного открытия и отклонение неверного пароля
Изменено (Changed)
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.2
Version 2.57.1
Изменено (Changed)
- Ввод в поле формы, перемещение курсора и переключение флажков теперь перерисовывают только область, о которой PDFium сообщает как о повреждённой, а не весь просмотрщик
- Прямоугольники повреждения нормализуются для направленной вверх оси Y страницы, расширяются на один пиксель, чтобы сглаженные границы виджетов оставались чёткими, и отсекаются по видимой клиентской области
- Прямоугольник повреждения, полностью прокрученный за пределы окна просмотра, больше не планирует перерисовку, тогда как неактивное представление или неотображённая страница по-прежнему откатываются к полной перерисовке
- Тесты Delphi, Lazarus и C++Builder теперь покрывают ограниченную инвалидацию форм, перевёрнутые боксы страниц, боксы за пределами экрана и безопасность неактивных представлений
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.1
Version 2.57.0
Добавлено (Added)
TPdfThumbnailView.Orientationподдерживает вертикальную и горизонтальную компоновку миниатюр, сохраняя существующее вертикальное значение по умолчаниюFirstVisiblePageIndex,LastVisiblePageIndexиEnsureCurrentPageVisibleпредоставляют доступ к окну миниатюр и управляют им через отсчитываемые от единицы индексы страниц
Изменено (Changed)
- Изменение
CurrentPageIndexтеперь прокручивает выбранную миниатюру в поле зрения в любой ориентации - Тесты Delphi, Lazarus и C++Builder теперь охватывают значения ориентации по умолчанию, переключение, видимые диапазоны и видимость выбранной страницы
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.57.0
Version 2.56.2
Изменено (Changed)
HighlightSearchText,AddSearchTextHighlightиClearHighlightтеперь аннулируют только прямоугольники устройства для диапазонов поиска, которые были добавлены или удалены, вместо перерисовки всего средства просмотра- Замена выделений теми же совпадениями или добавление дублирующихся совпадений больше не планирует ненужную перерисовку
- Тесты Delphi, Lazarus и C++Builder теперь охватывают ограниченную инвалидацию, идемпотентные обновления, очистку и безопасность неактивных представлений
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.56.2
Version 2.56.1
Изменено (Changed)
TPdfThumbnailViewтеперь повторно использует отрисованные растровые изображения для страниц, остающихся видимыми при перерисовках и смежных позициях прокрутки- Кэш сохраняет только текущий видимый диапазон страниц и точно освобождает записи, когда страницы покидают этот диапазон, назначенный документ изменяется или изменяются размеры миниатюр
- Тесты Delphi, Lazarus и C++Builder теперь охватывают повторное использование кэша, отсечение окна просмотра, инвалидацию по размеру, замену документа и уничтожение компонента
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.56.1
Version 2.56.0
Добавлено (Added)
TPdfView.CutSelectedFormTextToClipboardиTPdfView.PasteFormTextFromClipboardобеспечивают редактирование через буфер обмена Unicode для находящегося в фокусе редактируемого виджета формы
Изменено (Changed)
- Редакторы форм в фокусе теперь обрабатывают стандартные сочетания клавиш копировать, вырезать, вставить и выделить всё перед передачей текстового ввода в PDFium
- Вырезание и вставка отклоняют поля только для чтения и сеансы без разрешения на заполнение или изменение формы, тогда как вырезание успешно копирует перед удалением выбранного текста
- Тесты Delphi, Lazarus и C++Builder теперь охватывают поведение без фокуса, циклическое прохождение сочетаний клавиш и отклонение только для чтения
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.56.0
Version 2.55.0
Добавлено (Added)
TPdfView.AddSearchTextHighlightдобавляет уникальные совпадения для другого поискового термина к наложению текущей страницы, позволяя нескольким запросам оставаться выделенными вместе
Изменено (Changed)
HighlightSearchTextостаётся точкой входа для замены и теперь использует аддитивный сканер, тогда как повторяющиеся диапазоны символов игнорируются, аClearHighlightудаляет весь накопленный набор- Тесты Delphi, Lazarus и C++Builder теперь охватывают накопление различных запросов и подавление повторяющихся диапазонов
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.55.0
Version 2.54.0
Добавлено (Added)
TPdfтеперь предоставляет полные снимки объектов страницы, пакетные обновления стилей, аффинные преобразования объектов, сегменты контуров, контуры обрезки и дочерние объекты Form XObject- Инспекция символов теперь включает цвета заливки и обводки, имя и флаги шрифта, свободные границы глифов, эффективные матрицы, дескрипторы текстовых объектов и преобразование индекса символа в индекс текста
- Аннотации теперь сохраняют геометрию границ и потоки внешнего вида normal, rollover и down при двустороннем прохождении
- Новые средства доступа к необработанным и декодированным миниатюрам, преобразования содержимого страницы и аннотаций, а также
RenderPageWithMatrixпредоставляют прямые расширенные пути рендеринга и редактирования
Изменено (Changed)
- Изменения стиля объектов страницы могут фиксироваться как один пакет, чтобы PDFium регенерировал содержимое страницы только один раз
- Матричный рендеринг использует существующий путь битовой карты без копирования, когда макет целевой битовой карты совместим
Version 2.53.1
Исправлено (Fixed)
- Встроенная китайская надпись меню Копировать теперь использует не зависящие от кодировки кодовые точки Unicode и корректно отображается в сборках Lazarus
- Более старые цепочки инструментов Delphi могут компилировать
FPdfAsync, когда их модульWinapi.Windowsпропускает объявлениеGetTickCount64
Version 2.53.0
Добавлено (Added)
- Новый набор тестов
Tests.ApiCoverage, охватывающий открытые API TPdf, ранее имевшие нулевое покрытие сквозными тестами:GetPageBox/SetPageBox(чтение/запись MediaBox/CropBox, ошибки отсутствия box и цикл сохранения),FlattenPage/FlattenAllPages(возвращаемое значение и сохранение количества страниц),GenerateFormAppearances(без действий над документами без форм),SaveAsEncrypted/SaveAsEncryptedToStream(AES-256 с циклом пароля — проверяет, что зашифрованный файл отказывается открываться без пароля и открывается с ним), проверка границDeletePage(страница 0 и вне диапазона вызываютEPdfError) и представленные в v2.38.0 аннотационные часовыеHasContents/HasAuthor(проверяющие, чтоDefault(TPdfAnnotation)оставляет их равнымиFalse)
Version 2.52.0
Добавлено (Added)
TPdfView.CopySelectedFormTextToClipboardкопирует выделение текста внутри находящегося в фокусе виджета AcroForm в буфер обмена Windows какCF_UNICODETEXT
Изменено (Changed)
- Операции копирования текста страницы и формы в фокусе теперь используют один и тот же защитный модуль записи буфера обмена Unicode и оставляют буфер обмена без изменений, когда их выделение пусто
- Тесты Delphi, Lazarus и C++Builder теперь охватывают неактивные или не сфокусированные вызовы копирования формы и цикл выделения формы в фокусе через буфер обмена Windows
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.52.0
Version 2.51.0
Добавлено (Added)
TPdfView.SelectLineAtвыделяет визуальную строку текста, содержащую страницу на основе единицы и индекс символа на основе нуля, без необходимости ввода с помощью мыши
Изменено (Changed)
- Программное выделение строки, выделение тройным щелчком, а также
Shift+HomeилиShift+Endтеперь используют одну модель границ строки на основе блоков символов - Тесты Delphi, Lazarus и C++Builder теперь охватывают стабильное выделение строки и недопустимые индексы страниц или символов
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.51.0
Version 2.50.0
Добавлено (Added)
TPdf.LoadDocumentтеперь принимает отсчитываемое от нуля окноIndexиCountв буферTBytes, позволяя встроенным PDF загружаться без выделения временного среза массива байтов
Изменено (Changed)
- Загрузка диапазона байтов отклоняет отрицательные или выходящие за пределы окна перед изменением состояния документа и сохраняет существующие параметры времени жизни буферизованного и заимствованного буфера
- Тесты Delphi, Lazarus и C++Builder теперь охватывают окна встроенных PDF и недопустимые аргументы диапазона байтов
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.50.0
Version 2.49.1
Добавлено (Added)
TPdfView.FitModeтеперь поддерживаетpfmFitHeightдля подгонки текущей страницы под видимую высоту окна просмотра с возможностью горизонтальной прокрутки при необходимости
Исправлено (Fixed)
- Режимы подгонки теперь сходятся после того, как изменение видимости полосы прокрутки меняет клиентскую область, сохраняя согласованность результатов fit-page, fit-width и fit-height между VCL и LCL
- Тесты просмотрщика Delphi, Lazarus и C++Builder теперь охватывают выбор
pfmFitHeightи круговые обходы перечислений TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.49.1
Version 2.49.0
Добавлено (Added)
- Открытая поверхность привязки PDFium теперь охватывает все 470 экспортированных функций в проверенных заголовках, включая доступ к описаниям вложений через
FPDFAttachment_SetDescriptionиFPDFAttachment_GetDescription TPdfтеперь предоставляет описания вложений, валидность перекрёстных ссылок, смещения конца trailer, ревизию security-handler, загрузку в 64-разрядную память, диапазоны байтов подписи, диапазоны текста веб-ссылок и расширенные снимки данных изображения, фильтра, метаданных и профиля ICC- Помощники форм теперь поддерживают нативный фокус полей, запросы и обновления параметров выбранного варианта, пересылку колеса мыши, записываемые росчерки пера и наложения форм после прогрессивного рендеринга
Изменено (Changed)
FormFieldCount, индексы полей формы и порядок табуляции теперь описывают только аннотации виджетов вместо включения несвязанных аннотаций страницы- Страницы
TPdfв автономном режиме теперь входят и выходят из жизненного цикла страницы form-fill, поэтому нативный фокус и API сфокусированных полей работают безTPdfView - Экспорт описаний вложений ограничен возможностями, поэтому приложения, использующие более старую сборку PDFium, по-прежнему могут загружать библиотеку и определять недоступную функцию
Исправлено (Fixed)
- Прогрессивный рендеринг страниц теперь отрисовывает элементы управления форм при включённом заполнении форм
- Тесты Delphi, Lazarus и C++Builder теперь охватывают новую диагностику документов, описания вложений, пути пера, поведение форм, диапазоны байтов подписи, диапазоны веб-ссылок и метаданные изображений
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.49.0
Version 2.48.0
Добавлено (Added)
TPdfMatrixтеперь предоставляет фабрики, клонирование и присваивание, диагностику конечного состояния и обратимости, сравнение на основе допуска, доступ к трансляции, отчёт определителя и аффинное разложение- Композиция prepend, поворот с учётом точки вращения, масштабирование, наклон и отражения, а также отображение прямоугольников stretch, contain и cover поддерживают рабочие процессы в локальном пространстве и подогнанные макеты без ручной арифметики коэффициентов
- Немодифицирующий обратный доступ, обратное отображение точек, преобразования векторов и четырёхугольников, динамические пакеты точек и прямоугольников, варианты на месте и однопроходные преобразованные границы расширяют переиспользуемую геометрическую поверхность
Изменено (Changed)
- Трансляция, масштабирование и отражения осей теперь обновляют только затронутые коэффициенты вместо маршрутизации через общее аффинное умножение
- Преобразование прямоугольников нормализует входные данные один раз, использует специализированный точный путь с выравниванием по осям там, где это возможно, и вычисляет общие повёрнутые границы без временных записей точек
- Пакетные преобразования точек и прямоугольников выделяют один массив результатов или повторно используют хранилище вызывающего, а преобразованные границы точек накапливаются за один проход без промежуточного массива
Исправлено (Fixed)
- Отображение прямоугольников отклоняет результаты нулевого размера, неконечные и с переполнением
Singleперед публикацией непригодной матрицы - Тесты Delphi, Lazarus и C++Builder теперь проверяют порядок композиции, инварианты точки вращения, обратные круговые обходы, подогнанные прямоугольники, разложение и поведение объёмной геометрии
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.48.0
Version 2.47.0
Добавлено (Added)
FPdfAsyncтеперь предоставляет структурированные причины и сообщения отмены, удаляемые регистрации обратных вызовов, источники на основе тайм-аута, ожидание отмены и атомарные операции try-cancel через расширенные интерфейсы, сохраняющие исходный APITPdfFuture<T>.RunExдобавляет настраиваемую диспетчеризацию ответов и приоритет исполнителя, тогда как конверты результатов предоставляют идентификаторы операций, валидность значений, имена классов исключений, замеры времени завершения и переиспользуемые помощники завершенияTPdfAsyncExecutorдобавляет переиспользуемый пул фиксированных исполнителей с четырьмя приоритетными дорожками FIFO, опциональное противодавление ограниченной очереди, отменяемые дескрипторы задач, ожидание с учётом тайм-аута, снимки задач, агрегированную статистику и корректное завершение
Изменено (Changed)
- Повторяющиеся асинхронные задания могут переиспользовать потоки исполнителей и операции очереди O(1) вместо создания потока для каждой задачи, тогда как синхронизированное завершение остаётся доступным для узлов UI
- Сбои исполнителя и future сохраняют диагностику класса и сообщения исключений, отмена сохраняет свою исходную причину, а исключения обратных вызовов остаются изолированными от жизненного цикла исполнителя и завершения
- Тесты Delphi, Lazarus и C++Builder теперь охватывают расширенную поверхность отмены, метаданных future, управления задачами, противодавления, упорядочения приоритетов, статистики, сбоев и завершения
Исправлено (Fixed)
- Конкурирующие владельцы отмены теперь получают детерминированный результат первого писателя вместо полагания на отдельную последовательность наблюдения и отмены
- Ожидание простоя основного потока обрабатывает синхронизированные ответы задач, предотвращая оставление завершённым исполнителем пула в постоянно занятом состоянии во время скоординированного завершения
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.47.0
Version 2.46.0
Добавлено (Added)
FPdfAsn1теперь предоставляет классы идентификаторов, кодирование и декодирование 64-разрядных номеров тегов высокой разрядности, разобранные записи TLV, окна дочернего чтения с нулевым копированием, типизированные декодеры примитивов и срезы содержимого или закодированных значений- Модули записи DER теперь поддерживают полный беззнаковый 64-разрядный диапазон INTEGER, проверенное произвольное содержимое INTEGER, ENUMERATED, автоматический выбор UTCTime или GeneralizedTime, теги application и private, многозначные SEQUENCE и канонически отсортированный вывод SET OF
ValidateDerвозвращает ошибки проверки с учётом смещения, обеспечивая настраиваемые лимиты вложенности, количества узлов, длины содержимого, количества ошибок, корня и опционального упорядочения SET
Изменено (Changed)
- Конкатенация DER и многозначная композиция используют одно выделение вывода, буферы модулей записи предоставляют операции reserve, count, capacity и передачи владения, а сортировка SET OF теперь использует
O(n log n)сортировку слиянием - Значения BOOLEAN, INTEGER, BIT STRING, OBJECT IDENTIFIER, NULL, UTF8String, PrintableString, IA5String, UTCTime и GeneralizedTime получают проверки канонической формы во время кодирования, типизированного декодирования или проверки
- Пакет среды выполнения Lazarus теперь экспортирует
FPdfAsn1, а тестовые наборы Delphi, Lazarus и C++Builder проверяют ту же открытую поверхность DER
Исправлено (Fixed)
- Контекстно-зависимые номера тегов больше 30 больше не усекаются в младшие пять бит идентификатора
- Некорректные идентификаторы тегов высокой разрядности, неминимальные определённые длины, недопустимый UTF-8, ненулевое заполнение BIT STRING, недопустимые поля времени, завершающие корни и нарушения лимитов ресурсов детерминированно отклоняются
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.46.0
Version 2.45.0
Добавлено (Added)
FPdfPreflightReportтеперь назначает каждому вопросу серьёзность Info, Warning или Error и предоставляет API серьёзности, статуса, категории, issue-code, lookup, search, flattening и filtering на уровне стандарта и отчёта- Отчёты предпечатной проверки теперь экспортируют SARIF 2.1.0, JUnit XML, NDJSON и собственный XML через соответствующие методы
To*иSave*ToFileдля конвейеров CI, автоматизации и потоковой передачи - Стабильные отпечатки отчётов SHA-256 идентифицируют эквивалентные результаты проверки независимо от исходных путей и временных меток генерации
Изменено (Changed)
- Отчёты JSON, CSV, text, Markdown и HTML теперь включают серьёзность и расширенные сводки статуса; HTML добавляет доступные подписи таблиц и сводку статуса
- Построение коллекций вопросов и стандартов использует геометрический рост ёмкости, результаты запросов предварительно размерены, экранирование JSON записывается в один ограниченный выходной буфер, а все файлы отчётов используют один прямой модуль записи UTF-8
- Сводки категорий вопросов используют детерминированное упорядочение, временные метки включают миллисекунды, JSON несёт
formatVersion: 2, а ячейки CSV нейтрализуют формулы электронных таблиц
Исправлено (Fixed)
- Экспорт JSON теперь сохраняет допустимые дополнительные пары Unicode и заменяет изолированные суррогатные кодовые единицы UTF-16 вместо выдачи некорректных скалярных данных
- Экспорт HTML теперь экранирует апострофы, а отфильтрованные представления отчётов владеют независимыми массивами вопросов вместо совместного использования изменяемого хранилища результатов
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь единообразно сообщают Version 2.45.0
Version 2.44.0
Добавлено (Added)
- Закладки и места назначения предоставляют состояние открытия, количество потомков, цели действий, режимы просмотра места назначения и до четырех параметров просмотра
Metadata,GrantedPermissions,UserGrantedPermissions,HasPermissionиUserHasPermissionпредоставляют типизированные снимки состояния документа для инспекции и запросы разрешенийExtractThumbnail(PageNumber)выполняет рендеринг запрошенной страницы без изменения активной страницы, а результаты отметки времени RFC 3161 предоставляют сведения о политике, времени формирования и nonce
Изменено (Changed)
- Пути закладок, JavaScript, метаданных, мест назначения и эскизов используют проверенные двухпроходные буферы, геометрический рост коллекций и обход, защищенный от циклов
- Постобработка сохранения разрешает активный каталог, дерево страниц и действие открытия через текущую ревизию xref, кэширует декодированные потоки объектов и сканирует словари PDF с учетом лексических границ
- Совместный синтаксический анализ PDF теперь обеспечивает точные заголовки объектов, поколения, ключи словарей, длины потоков, геометрию предиктора, диапазоны целых чисел, а также границы комментариев, литеральных строк и шестнадцатеричных строк
- Проверка ответов RFC 3161 теперь связывает как nonce, так и SHA-256
messageImprint, требует структурно корректного подписанта и применяет строгие правила DER для длины, OID, INTEGER и GeneralizedTime
Исправлено (Fixed)
- Инкрементные документы больше не выбирают неактивные повторяющиеся каталоги или некорректные суффиксы ссылок при добавлении действия открытия по умолчанию
- Маркеры отметки времени с длинной формой DER-длин сохраняют полный закодированный маркер, тогда как некорректный порядок необязательных полей CMS и пустые наборы подписантов отклоняются
- Чистые сборки Delphi теперь записывают поля начального значения nonce PAdES через выравниваемо-безопасные копии байтов и передают байты ответа XFA с точным собственным типом указателя
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные установщика теперь согласованно сообщают Version 2.44.0
Version 2.43.0
Добавлено (Added)
- Записи полей и аннотаций XFDF теперь предоставляют флаги присутствия, различающие опущенное значение XML от явно пустого значения
Изменено (Changed)
- Импорт XFDF принимает элементы и атрибуты с префиксами пространств имен, смешанное текстовое содержимое и содержимое CDATA, ссылки на сущности и значения, существенные с точки зрения пробельных символов, отклоняя при этом недопустимые ссылки на скалярные значения Unicode
- Импорт и экспорт XFDF используют индексированное сопоставление полей и ограниченные геометрические буферы, повышая пропускную способность и пиковое поведение выделения памяти для глубоко вложенных форм, крупных коллекций аннотаций, списков штрихов, вершин и четырехугольников разметки
- Проверка PDF/A и PDF/UA использует ограниченный рост для крупных коллекций страниц, потоков, имен структуры и RoleMap; разрешение RoleMap в PDF/UA теперь обрабатывает прямые массивы и косвенные объекты имен или массивов с точным указанием поколения
Исправлено (Fixed)
- Круговые преобразования XFDF теперь сохраняют глубоко вложенные пути полей, явно пустые значения полей, явно пустое содержимое аннотаций и различие между отсутствующим и пустым содержимым
- Недопустимые загрузки из буферов памяти и назначения страниц вне диапазона отклоняются без оставления частичного состояния документа или страницы, а неудачная повторная загрузка собственной страницы сохраняет ранее активную страницу
- Крупные идентификаторы маркированного содержимого и буферы метаданных подписи ограничиваются и проверяются перед выделением памяти или собственным доступом
Version 2.42.0
Добавлено (Added)
TPdfMatrixтеперь предоставляетInvert,TryInvert,TransformPointиTransformRectдля отображения координат, проверки попадания, нормализованных границ и явной обработки сингулярных матрицTPdf.WrapTextполучил перегрузкуBreakLongWords, которая разбивает CJK и другой текст без пробелов, сохраняя при этом допустимые суррогатные пары UTF-16TPdfAnnotation.AttachmentPointSetsпредоставляет каждый четырехугольник в многострочных аннотациях разметки, тогда как существующее полеAttachmentPointsостается псевдонимом для первого набора
Изменено (Changed)
- Извлечение текста, построение читаемого содержимого, поиск слов и отображение смещений разговорного текста теперь используют ограниченное выделение памяти и пути бинарного поиска, сокращая повторные выделения и линейные сканирования на больших страницах
- Сериализация ASN.1 и генерация зашифрованных PDF теперь используют геометрические выходные буферы; упорядочение зашифрованных объектов использует сортировку
O(n log n), а строки xref записываются непосредственно в итоговый буфер WrapTextсохраняет границы строк CR, LF и CRLF и повторно использует один собственный объект измерения для всей операции- Импорт и экспорт XFDF сохраняют каждый четырехугольник разметки; импорт также применяет цвета RGB/внутренней заливки и анализирует десятичные координаты независимо от языкового стандарта процесса
Исправлено (Fixed)
- Устаревшие вызывающие процедуры снова могут обновлять содержимое и автора аннотации путем присвоения непустых строк без установки более новых сигнальных флагов
HasContentsиHasAuthor - Явно пустые строки аннотаций теперь используют допустимый собственный буфер с нулевым завершением, поэтому очистка
/Contents,/Tи других необязательных текстовых ключей больше не передает нулевой (nil) указатель в PDFium
Version 2.41.0
Изменено (Changed)
- Отчеты Preflight
SaveJsonToFile,SaveMarkdownToFileиSaveTextToFileтеперь записывают UTF-8 в Delphi (соответствуя существующемуSaveHtmlToFile) вместо системной кодовой страницы ANSI; символы non-ASCII в путях к файлам, рекомендациях и примечаниях к области применения искажались в Delphi при сохранении с помощью этих методов SaveCsvToFileтеперь выполняет запись в UTF-8 с префиксом BOM, поэтому Excel для Windows автоматически определяет кодировку; без BOM Excel обрабатывает UTF-8 CSV как кодовую страницу 1252 и искажает любые символы non-ASCII
Исправлено (Fixed)
- Демонстрационная программа
ExtractImagesдопускала утечку кэшированных объектовTBitmapвFExtractedImages, когда форма закрывалась без их предварительной очистки; теперь форма переопределяетDestroyдля вызоваClearExtractedImages, освобождая каждый кэшированный bitmap
Version 2.40.0
Изменено (Changed)
TPdf.RenderPage(HDC, ...)теперь маскирует исключения FPU/SSE вокруг вызоваFPDF_RenderPage, соответствуяTPdfView.RenderPage(HDC)(исправлено в v2.25.0) и каждой точке входа рендеринга, возвращающей bitmap; перегрузка прямого вывода на DC на уровнеTPdfранее оставляла исключения FPU немаскированными в компиляторах до D12
Исправлено (Fixed)
ColorToARGBтеперь возвращает полностью прозрачный пиксель (alpha 0) дляclNoneиclDefaultвместо того, чтобы обрабатывать сигнальное значение как буквальный цвет RGB; предыдущее поведение приводило к темной, почти непрозрачной заливке, когда вызывающий абонент передавалclNoneв ожидании отсутствия цвета
Version 2.39.1
Исправлено (Fixed)
- При явном сохранении в PDF 1.3 теперь удаляются записи
/SMask /None,/AIS falseи/TK true, которые лишь повторяют исходное состояние графики, при этом по-прежнему отклоняются нестандартные состояния прозрачности
Version 2.39.0
Изменено (Changed)
CreatePDFиImageToPDFтеперь используют подтвержденные места назначения для сохранения и сообщают об успешном завершении только тогда, когдаSaveAsзавершается успешноBatchExport,PDFtoJpgиSplitPDFтеперь выделяют уникальные выходные каталоги, чтобы при повторных запусках и одинаковых именах входных файлов сохранялись предыдущие результатыSplitViewтеперь зацикливает поиск один раз без сохранения скрытого состояния страницы после отмены или отсутствия совпадений, а также прерывает незавершенные задания печати вместо отправки частичного вывода
Исправлено (Fixed)
MergePDFтеперь отклоняет некорректные токены диапазона страниц и выходные пути, перезаписывающие исходные файлы, подсчитывает фактически импортированные страницы и отказывается сохранять пустой результат- Демонстрационные примеры
Attachmentдля Delphi и C++Builder теперь фиксируют сохранения по тому же пути с помощью безопасной при откате замены файлов, поэтому неудачное переименование не может удалить исходный PDF
Version 2.38.0
Изменено (Changed)
SetAnnotationDataтеперь защищает запись/Contentsи/Authorс помощью сигнальных флаговHasContents/HasAuthorв структуреTPdfAnnotation, соответствуя существующему шаблонуHasName/HasSubject/HasIcon; ранее эти два поля записывались безусловно, поэтому присвоение записиDefault(TPdfAnnotation)для обновления только цвета или флагов неявно перезаписывало существующее содержимое и автора аннотации пустыми строками;GetPageAnnotationтеперь устанавливает эти сигнальные флаги, так что цикл чтения-модификации-записи сохраняет исходные значения
Исправлено (Fixed)
GenerateFormAppearancesтеперь считывает значение флажка или переключателя черезFPDFAnnot_GetFormFieldValue(который переходит к родительскому словарю полей согласно ISO 32000-1 §12.7.5) вместоFPDFAnnot_GetStringValue(Annot, 'V', ...)(который считывает словарь виджета); виджет обычно не содержит/V, поэтому/ASникогда не синхронизировался с отмеченным состоянием, а сведенный флажок или переключатель отображался как неотмеченный
Version 2.37.0
Изменено (Changed)
ParseTsaUrlтеперь ограничивает порт диапазоном1..65535после синтаксического анализа; в противном случае слишком большое значение порта приводило бы к циклическому переносу из-за усечения доDWORDи могло совпасть с действительным портом- Функция XFDF
ParseFieldтеперь принимает параметр глубины (по умолчанию 0, с ограничением 64) и возвращает пустое поле при достижении лимита, благодаря чему злонамеренно вложенная цепочка<field>глубиной в 100 000 уровней больше не может переполнить стек
Исправлено (Fixed)
- В HTTP-запросах TSA теперь добавлена защита от пустого тела запроса перед передачей
@ReqDer[0]вWinHttpSendRequest; разыменование динамического массива нулевой длины привело бы к обращению по неинициализированному указателю; хотяBuildTimeStampReqвсегда возвращает непустой SEQUENCE, точка вызова теперь защищает этот контракт
Примечания (Notes)
- Комментарий в заголовке
FPdfTsaWinотносительно проверки отзыва HTTPS был исправлен: WinHttp проверяет цепочку сертификатов сервера по умолчанию, но не выполняет проверку отзыва CRL/OCSP, если это явно не включено с помощьюWinHttpSetOption; предыдущая формулировка утверждала, что проверка отзыва предоставляется «бесплатно», что вводило в заблуждение
Version 2.36.0
Изменено (Changed)
- HTTP-запросы TSA теперь отправляют явный заголовок
Content-Lengthв дополнение к заголовкамContent-TypeиAccept; WinHttp формирует его на основе общей длины, но некоторые прокси-серверы RFC 3161 требуют явного заголовка и без него отклоняют запрос с ошибкой411 Length Required - Экспорт XFDF теперь отбрасывает управляющие символы C0 (кроме TAB/LF/CR, которые уже экранированы) вместо вывода недействительной обратной косой черты и шестнадцатеричной последовательности; предыдущее экранирование
\-01Fне является допустимым XML (обратная косая черта не имеет специального значения в XML), поэтому любой совместимый ридер отклонил бы документ как некорректный InjectAssociatedFilesтеперь записывает/Subtypeв словарь потока EmbeddedFile, когда вызывающий метод предоставляетTAssociateFile.MIMEType; это поле было объявлено и задокументировано, но ранее инжектор жестко кодировал/Type /EmbeddedFileи игнорировал его (ISO 32000-2 §7.11.4 допускает использование/Subtypeв потоке)
Исправлено (Fixed)
- Импорт XFDF пропускал первый байт содержимого после UTF-8 BOM и первый байт при отсутствии BOM: вызовы
BytesToAnsi(Bytes, 4, ...)(с BOM) иBytesToAnsi(Bytes, 1, ...)(без BOM) использовали смещенные на единицу начальные смещения, посколькуBytesToAnsiпринимает индекс массива на основе 0; теперь вызовы используют3и0 - В
ExtractSignatureValueбыли обнаружены две ошибки отступа с висящимif, из-за которыхR.Position:= CNвыполнялся безусловно для необязательных ветвейcertificates [0]иsignedAttrs [0]; теперь эти ветви обернуты вbegin/end, поэтому позиция сдвигается только при фактическом чтении необязательного TLV (тот же класс ошибки исправлен вAddSignatureTimestampToCmsв версии v2.22.0)
Version 2.35.0
Изменено (Changed)
TFPDFAvail_IsDocAvail,TFPDFAvail_IsPageAvailandTFPDFAvail_IsFormAvailтеперь принимаютhints: PFX_DOWNLOADHINTSвместоvar hints: FX_DOWNLOADHINTS, благодаря чему задокументированный режим только запросаnullptr(проверка текущей доступности без запроса дополнительных данных) становится достижимым из Delphi; заголовок PDFium явно разрешаетhintsпринимать значение null, тогда как предыдущая привязка сvarделала это невозможнымTFPDF_SetSystemFontInfoтеперь принимаетpFontInfo: PFPDF_SYSFONTINFOвместоvar pFontInfo: FPDF_SYSFONTINFO, позволяя вызывающим методам передаватьnilдля указания PDFium прекратить использование ранее зарегистрированного системного интерфейса шрифтов (задокументированный путь отключения)TPdfThumbnailView.Paintтеперь вычисляетVisibleRowsпо той же формуле, что иUpdateScrollBarRange(ClientHeight div RowHeight), так что количество отображаемых строк соответствует размеру страницы полосы прокрутки; предыдущая формула только для отрисовки ((ClientHeight - FMarginY) div RowHeight + 1) могла отличаться на одну строку при граничных значениях высоты, приводя к избыточному рендерингу невидимой строки или пропуску последней видимой строки
Version 2.34.0
Добавлено (Added)
TPdf.SaveAsEncrypted/SaveAsEncryptedToStream— высокоуровневый API, который сохраняет документ, а затем шифрует его с помощью PDF 2.0 AES-256-CBC (V=5/R=5/R=6); принимает структуруTPdfEncryptOptionsс паролями пользователя/владельца, разрешениями и версией ревизии; делегирует выполнениеEncryptDocumentBytes- Шифрование строковых литералов StrF:
EncryptDocumentBytesтеперь шифрует литеральные строки(...)в объектах без потоков (словарь Info и т.д.) в шестнадцатеричные строки AES-256-CBC, соответствующие формату шифрования потоков (16-byte IV + PKCS7-зашифрованный текст); шестнадцатеричные строки<...>остаются нетронутыми
Version 2.33.0
Добавлено (Added)
- Инжектор шифрования всего документа по алгоритму AES-256-CBC в модуле
FPdfEncrypt.pas; функцияEncryptDocumentBytesпринимает открытый текст PDF и пароль, шифрует каждый косвенный потоковый объект (16-byte IV + AES-256-CBC PKCS7 под ключом файла), корректирует/Length, добавляет объект словаря/Encryptи перестраивает полную классическую таблицу перекрестных ссылок и концевик с/Encryptи/ID; завершает стек шифрования PDF 2.0 (блок AES + GCM + SHA-512/384 + R6 формирование ключей + словарь + сканирование документа) - Вспомогательный метод
EncryptStreamPayload— формат потока PDF 2.0 AES-256 (IV добавляется в начало зашифрованного текста AES-CBC-PKCS7), который может повторно использоваться вызывающими модулями, самостоятельно управляющими структурой объектов
Version 2.32.0
Добавлено (Added)
- Хэширование SHA-512 / SHA-384 (FIPS 180-4) в новом модуле
FPdfSha512.pas; реализация на чистом Pascal; требуется для итерации хэширования паролей PDF 2.0 R6, которая разветвляется по 128-bit значению mod-3 для выбора SHA-256/384/512 на каждом раунде; корректность подтверждена тестами с известным ответом FIPS-180-4 B.1 - Формирование ключа шифрования PDF 2.0 и построитель словаря Encrypt в новом модуле
FPdfEncrypt.pas; реализует алгоритм 2.B по стандарту ISO 32000-2 §7.6.4.3 (итерационная схема R6: AES-128-CBC + циклический выбор SHA-256/384/512), вычисляет 32-byte ключ шифрования файла вместе с записями/O,/U,/OE,/UE,/Permsи строит словарь шифрования V=5/R=5/R=6 с/CFM /AESV3; использует байтовые буферы в стиле TBytes
Version 2.31.0
Добавлено (Added)
- Примитивы блочного шифрования AES (FIPS 197) в новом модуле
FPdfAes.pas; блочные шифры AES-128 и AES-256 на чистом Pascal, а также вспомогательные функции режима CBC и поддержка CSPRNG; тесты с известным ответом FIPS-197 Appendix C.2 / C.3 подтверждают корректность; это криптографическая основа для стека шифрования PDF 2.0 - Аутентифицированное шифрование AES-GCM (NIST SP 800-38D) в новом модуле
FPdfAesGcm.pas; реализует GHASH (GF(2^128) multiplication), GCTR и структуру GCM AEAD поверх блочных примитивов AES; тестовые сценарии NIST GCM 1 и 3 (AES-128) точно соответствуют эталонным шифротексту и тегу, сценарий 13 (AES-256) подтвержден полным циклом шифрования-расшифрования; GCM является режимом ISO/TS 32003 для PDF 2.0 - Проверка целостности структур ParentTree и ClassMap для PDF/A Level A (ISO 19005-1 §6.8.3);
pvaiParentTreeMissingотмечает StructTreeRoot без дерева чисел /ParentTree;pvaiClassMapUnresolvedотмечает ссылку на класс /C при отсутствии /ClassMap
Version 2.30.0
Добавлено (Added)
- Внедрение сопутствующих файлов (
InjectAssociateFiles/TPdf.SaveAsWithAssociateFiles, ISO 32000-2 §7.11.4); новый модульFPdfAssocFilesприсоединяет массивы ссылок на спецификации файлов/AFк каталогу или словарю любой страницы, охватывая все восемь значений/AFRelationshipиз Таблицы 45 стандарта ISO 32000-2; повторно используется паттерн инкрементного обновления, хорошо зарекомендовавший себя вInjectPadesDssMarkers - Поддержка PDF/X-6 (ISO 15930-9:2020); перечисление
TPdfXConformanceдобавляетpxc6; инжектор и валидатор проводят его через идентификациюpdfxid:GTS_PDFXVersion; PDF/X-6 — преемник PDF/X-4 на базе PDF 2.0 для полного обмена данными - Стандарт PDF/A запрещает действие
/Thread(пропуск в белом списке ISO 19005-1 §6.6.1); список запрещенных действий теперь включает Thread наряду с Launch, ResetForm, ImportData, SetOCGState, SetState, GoTo3DView, Rendition и Hide
Исправлено (Fixed)
- Путь валидации PDF/A-4e теперь поддерживает те же проверки структурированной разметки (tagged-structure), MarkInfo и разрывов слов, что и Level A; изменение на стороне сохранения в версии v2.29.0 учитывало
PdfAIsLevelE, но три условия вValidatePdfAComplianceпроверяли исключительноPdfAIsLevelA, из-за чего документ PDF/A-4e без структурированной разметки ошибочно проходил проверку - Расхождение тестов OCG
/BaseState: проход PostProcess в версии v2.28.0 корректно расширил область допустимых значений до/ONили/OFF(ISO 32000-1 Таблица 8.70), но тесты Delphi и C++ все еще ожидали отклонения/OFF; теперь в тестах используется действительно недопустимое значение (/Undefined), а новый позитивный тест фиксирует приемлемость/OFF - Избыточное совпадение геопространственного типа
/Subtype /GEO: вызовContainsDictionarySubtype('GEO')соответствовал любому словарю, содержащему этот токен, включая несвязанные, такие как случайный/ViewerPreferences << /Subtype /GEO >>; новый методContainsMeasureDictionarySubtypeдополнительно требует наличия/Type /Measureили эксклюзивного ключа Measure, так что словари, отличные от Measure, больше не вызывают требование ADBE ExtensionLevel 3
Version 2.29.0
Добавлено (Added)
- Поддержка PDF/A-4 (ISO 19005-4:2020) в валидаторе, инжекторе XMP и слое объектной модели Pdfium;
TPdfAConformanceдобавляетpac4base,pac4fиpac4e; базовый уровень соответствует PDF 2.0 (ISO 32000-2) и заменяет устаревшие уровни A/B/U схемой base + F (форм) + E (доступность);ValidatePdfAсчитывает пакет XMP сpdfaid:part=4(базовый уровень опускает элемент соответствия),SaveAsPdfAзаписывает его, аSignPadesWithPdfAпринимаетpac4baseв качестве контейнера долгосрочного архива - Привязка
FPDFBookmark_GetColor— последний непривязанный публичный экспорт PDFium (469/469); классTBookmarkполучает поляHasColorиColor, заполняемые из массива закладок/C(ISO 32000-1 §12.3.3); привязка использует отказоустойчивую загрузку, поэтому старые библиотеки DLL, выпущенные до появления этого экспорта, продолжают работать - Проверка версии заголовка PDF/E-1 (ISO 24517-1 §5)
pveiBadPdfVersion— стандарт PDF/E-1 основан на версии PDF 1.6, поэтому заголовки, отличные от 1.6, теперь помечаются как ошибочные - Проверка
pvriEncryptVersionMismatchпо стандарту PDF/R-1 (ISO 23504-1) — шифрование разрешено только для заголовков%PDF-2.0; тело документа версии 1.x, содержащее/Encrypt, теперь помечается как ошибочное (ранее это было неактивным утверждением) - Проверка
pvriBadMediaBoxпо стандарту PDF/R-1 — полеMediaBoxкаждой страницы должно иметь вид[0 0 w h];PdfRHasNonZeroMediaBoxOriginпредставляет собой независимый от локали сканер ASCII, пропускающий описания MediaBox с косвенными ссылками - Проверка
pvaiRoleMapUnresolvedдля PDF/A Level A (ISO 19005-1 §6.8.3.4) — теперь помечается неполный словарь RoleMap, оставляющий пользовательские типы структур/Sнеразобранными, что устраняет пробел, существовавший при проверке только наличияpvaiRoleMapMissing
Исправлено (Fixed)
- Функция
PdfVersionToName(20)возвращала значение"1.0"вместо"2.0", что искажало запись каталога/Versionи сообщения валидатора при каждом сохранении в формате PDF 2.0; средство форматирования теперь явно разделяет major.minor для кодов версий>= 20 - Компиляция кодировщика отрицательных значений INTEGER в модуле
FPdfAsn1.pasзавершалась ошибкой в Delphi 12 (E2015в выраженииInteger(-(V<0))), блокируя весь тестовый проект; ошибка исправлена использованием маски расширения знакаInt64(-Ord(V<0)) - Список запрещенных в PDF/A типов аннотаций теперь включает
/RichMediaдля всех частей стандарта (ранее этот тип был упущен; ISO 32000-1 §12.5.6.35 запрещает его использование в PDF/A)
Version 2.28.0
Добавлено (Added)
- Тип
TPdfVersionтеперь включает значениеpv20для PDF 2.0 (ISO 32000-2); функцияDecodePdfVersion(20)возвращаетpv20вместоpvUnknown, аEncodePdfVersion(pv20)возвращает 20, благодаря чему версия документа PDF 2.0 больше не теряется при повторном чтении и может быть задана явно
Изменено (Changed)
- Функция
DecodeDateтеперь выполняет разбор строк дат PDF с необязательными конечными полями согласно PDF Reference 3.8.3 вместо жесткого требования полного 23-character форматаD:YYYYMMDDHHmmSSOHH'mm'; теперь принимаются соответствующие спецификации сокращенные даты, такие какD:20260712,D:20260712153000иD:20260712153000Z(ранее они отклонялись жестким условиемLength=23); часовой пояс теперь проверяется на соответствие реальному диапазону UTC-12..UTC+14 range вместо проверки на значение> 23 - Метод
FPdfMeasure.MeasureTextтеперь кодирует имя шрифта как FPCAnsiString/ DelphiUTF8Encode, соответствуя остальным точкам вызова FPDF_BYTESTRING в библиотеке, вместо простого приведения кAnsiString, которое искажало имена семейств non-ASCII из-за текущей кодовой страницы
Исправлено (Fixed)
- Путь обработки отрицательных значений в
TDerWriter.Integerприводил к сбоям или формированию поврежденных данных DER: циклwhile V <> -1 do V := V shr 8оставлял массивInnerпустым дляValue = -1(что вызывало ошибку выхода за диапазон при последующем обращении кInner[Length(Inner)-1]) и генерировал избыточные байты для других отрицательных чисел; кодировщик теперь извлекает байты дополнительного кода со знаковым сдвигом и корректно останавливается, когда остаток представляет собой чистое расширение знака; поля CMS/PAdES INTEGER положительны, так что это затрагивает только вызывающие методы, передающие отрицательные значения, но теперь этот путь работает корректно - Методы
TPdf.GetCharacterOriginиTPdfView.GetCharacterOriginигнорировали возвращаемое значениеFPDFText_GetCharOriginи при ошибке возвращали неинициализированную точку; теперь результат инициализируется нулем, а неудачное чтение возвращает начало координат (соответствуя контрактуGetCharacterRectangle)
Version 2.27.0
Изменено (Changed)
- Демонстрации
PDFViewerиMultiPageViewerдля Delphi, C++Builder и Lazarus теперь оборачивают поиск по документу один раз, принимаютEnterиF3для перехода к следующему результату, сбрасывают контекст поиска при изменении параметров совпадений и оставляютEscдля отмены активного поиска или задания печати - Печать из viewer теперь учитывает текущий поворот viewer и соответственно выбирает книжную или альбомную ориентацию вывода, так что поворот с панели инструментов отражается на печатаемых страницах
- Все три демонстрации
ViewerInteractionLabтеперь поддерживают горячие клавишиCtrl+A,Ctrl+C,Enter,F3иEsc, не перехватывая штатные команды выделения и копирования edit-control
Исправлено (Fixed)
- Отмена печати в viewer для C++Builder и Lazarus теперь прерывает задание принтера вместо отправки страниц, отрендеренных до отмены, а Lazarus явно выходит из каждого вложенного цикла копий, страниц и раскладки
- Кнопка Cancel в Delphi
MultiPageViewerтеперь подключена к своему обработчику, а поля поиска вMultiPageViewerдля C++Builder/Lazarus сохраняют штатный ввод клавиш со стрелками, Home и End
Version 2.26.0
Изменено (Changed)
TPdf.GetObjectBitmap,TPdf.GetBitmap,TPdf.GetThumbnailи их аналоги вTPdfViewтеперь захватывают render lock вокруг вызоваFPDFImageObj_GetBitmap/FPDFPage_GetThumbnailAsBitmap, какRenderPage/RenderTile. Это вызовы на стороне рендеринга PDFium, которые раньше выполнялись без блокировки и могли состязаться с параллельнымUnloadPage/ReloadPageтого же документаTPdf.RenderPageThumbnailтеперь учитывает запись/Rotateстраницы: для страниц с/Rotate 90или270вписывание пересчитывается по повернутым размерам, так что пропорции миниатюры совпадают с тем, что показывает viewer, вместо собственных (неповернутых) размеров, возвращаемыхFPDF_GetPageSizeByIndex
Исправлено (Fixed)
TPdfView.GetCharacterRectangleигнорировал возвращаемое значениеFPDFText_GetCharBoxи при ошибке PDFium передавал неинициализированныйTPdfRectangleвPageToDevice. Теперь прямоугольник инициализируется нулями, а неудачныйGetCharBoxвозвращаетRect(0,0,0,0)- В
GetLinkAnnotationsдлина буфера для URI path и пути файла была занижена на единицу: второй вызовFPDFAction_GetURIPath/GetFilePathпередавалsize(включая завершающий NUL) как длину буфера, выделенного какsize-1. Теперь вызов передаетsize-1, поэтому на сборке PDFium без самоограничения запись за пределами выделения невозможна
Version 2.25.0
Изменено (Changed)
TPdf.AddText,SetText,AddPathиInsertFormObjectFromXObjectтеперь инвалидируют кэшированную текстовую страницу и аннотации ссылок перед регенерацией содержимого страницы, какSetTextPositionsиRemoveObject. Раньше вызовGetText/GetWebLinks/FindFirstпосле правки страницы возвращал устаревшие текст и данные ссылок, зафиксированные до правки, а удерживаемый хэндлFPDF_TEXTPAGEиспользовался после регенерации содержимого с неопределенным поведениемTPdfView.RenderPage(HDC, ...)теперь захватывает render lock и маскирует исключения FPU/SSE вокруг вызоваFPDF_RenderPage, как и все остальные точки входа рендеринга. Прежняя перегрузка с прямой отрисовкой в DC могла состязаться с параллельнымUnloadPage/ReloadPageтого же документа и оставляла исключения FPU незамаскированными на компиляторах старше D12- Демонстрация
PrintPDFдля Delphi теперь при отмене вызываетPrinter.Abortвместо того, чтобы позволить блокуfinallyдойти доPrinter.EndDoc, что отправляло на печать страницы, отрендеренные до отмены. Демонстрация для Lazarus уже обрабатывала этот случай корректно
Исправлено (Fixed)
TPdf.GetCharacter,TPdf.GetCharcodeи их аналоги вTPdfViewусекали кодовые точки астральной плоскости (emoji, CJK Extension B), возвращаемыеFPDFText_GetUnicode, до младших 16 бит черезWideChar(), порождая одиночный суррогат, портивший дальнейшую обработку текста. Символы выше U+FFFF теперь возвращают U+FFFD (символ-заменитель); для получения полного UTF-16 представления астральных символов используйтеGetTextGetWebLinksвызывалSetLength(Rectangles, FPDFLink_CountRects(...))без защиты от возвращаемого значения-1, что поднималоEOutOfMemoryна некорректной странице. Теперь отрицательный счетчик ограничивается нулемTPdf.Destroyтеперь затирает строкуPasswordв памяти (черезUniqueString+FillChar) до освобождения буфера со счетчиком ссылок, так что пароль не остается читаемым в куче после уничтожения компонента
Version 2.24.0
Добавлено (Added)
TPdf.DeletePage,GetAttachment,GetAttachmentName,GetAttachmentType,SetAttachmentиDeleteAttachmentтеперь проверяют индекс страницы/вложения и при выходе за диапазон поднимаютEPdfError, как это уже делают акцессоры аннотаций. Раньше индекс вне диапазона передавался прямо в PDFium и приводил к молчаливому no-op или неопределенному поведению
Исправлено (Fixed)
- Утечки хэндлов page-object при сбое в
TPdf.AddText,AddBitmapиAddJpegImage: когдаFPDFText_SetText,FPDFImageObj_SetBitmap,FPDFImageObj_SetMatrixилиFPDFImageObj_LoadJpegFileInlineподнимали исключение после создания объекта, но до того, какFPDFPage_InsertObjectпередавал его странице, нативный хэндлFPDF_PAGEOBJECTутекал. Теперь каждый такой путь уничтожает объект при исключении перед повторной эмиссией TPdf.UnloadPageотбрасывал незавершенный хэндлFPath(установленныйCreatePath, но еще не потребленныйAddPath), просто присваивая емуnilбез вызоваFPDFPageObj_Destroy. Теперь хэндл уничтожается, поэтому путь, созданный и оставленный (или прерванный переключением страницы), больше не утекаетTPdf.InsertFormObjectFromXObjectпропускал вызовUpdatePage(FPDFPage_GenerateContent), который выполняет каждая соседняя вставка (AddText/AddPath/AddBitmap/AddJpegImage/SetText/RemoveObject), поэтому Form XObject, вставленный этим способом, исчезал при следующей перезагрузке или сохранении. ТеперьUpdatePageвызывается после вставки
Version 2.23.0
Исправлено (Fixed)
- Валидация
/BaseStateнеобязательного содержимого теперь принимает/OFFв дополнение к/ON(ISO 32000-1, Table 8.70 допускает оба значения). Прежняя проверка отклоняла корректные конфигурации/OCProperties /D /BaseState /OFFс ошибкой “malformed optional content”, хотя файл соответствовал стандарту - Валидация
/Intentнеобязательного содержимого теперь принимает/Designи массивы имен вроде[/View /Design], а не только литерал/View. ISO 32000-1, Table 8.70 определяет/Intentкак имя или массив имен из/Viewи/Design; прежняя проверка единственного значения отвергала корректный вывод стандартных средств подготовки - Определение словаря Geospatial Measure для гейта PDF 1.7
/Extensions /ADBEExtensionLevel 3 больше не требует/Type /Measure, который ISO 32000-1, Table 254 помечает как необязательный. Производители GeoPDF, опускающие/Type(PDFBox, QGIS, FME), раньше обходили этот гейт и молча выдавали несоответствующий стандарту вывод PDF 1.7; теперь детектор сопоставляет только/Subtype /GEO
Version 2.22.0
Изменено (Changed)
- Расчеты fit-zoom в
TPdfView(GetPageZoom,GetPageWidthZoom,GetPageHeightZoom) теперь используютClientWidth/ClientHeightвместо оконныхWidth/Height, так чтоpfmFitPage/pfmFitWidth/pfmFitHeightвписывают страницу в видимую область просмотра, а не во внешнюю рамку с полосами прокрутки и границами; это убирает лишнюю полосу прокрутки, появлявшуюся, когда вписанная страница была чуть больше клиентской области AddSignatureTimestampToCmsтеперь поднимает явныйExceptionс указанием нечитаемого поля CMS SignerInfo (version / sid / digestAlgorithm / signedAttrs / signatureAlgorithm) вместо молчаливогоExit, из-за которого частично разобранный CMS продолжал обрабатываться как полный подписанный CMS; также исправлено отсутствие блокаbegin/endвокруг необязательной веткиsignedAttrs [0], из-за которогоR.Positionне сдвигался
Исправлено (Fixed)
- Утечка хэндла CNG-ключа в
ResolveWinSigner: когдаCryptAcquireCertificatePrivateKeyзавершалась успешно, но последующее извлечение issuer/serial илиTWinCmsSigner.Createподнимали исключение, хэндлNCryptKeyHandleне освобождался, поскольку владение переходит к подписанту только при успешном конструкторе. Теперь настройка после получения обернута так, что при любом сбое хэндл освобождается черезNCryptFreeObject EcDsaP1363ToDerтеперь отклоняет нулевую половинуrилиsвместо эмиссииINTEGER 0; подписи ECDSA сr = 0илиs = 0недопустимы (RFC 4754 §6 / FIPS 186-4 §6 требуют1 ≤ r, s ≤ n-1), и снисходительный верификатор иначе принял бы их как подлинные
Version 2.21.12
Исправлено (Fixed)
- Явное сохранение в PDF 1.5–PDF 1.7 теперь отклоняет неправильно форматированные структуры
/OCPropertiesкаталога, включая отсутствующие обязательные записи/OCGsили/D, недействительные значения конфигурации по умолчанию и записи состояния, не являющиеся массивами
Version 2.21.11
Исправлено (Fixed)
- Явное сохранение версии PDF теперь отклоняет прямые или косвенные записи страницы
/Annots, словари аннотаций которых не содержат необходимую запись/Subtypeили/Rect
Version 2.21.10
Исправлено (Fixed)
- Явное сохранение в PDF 1.7 теперь требует, чтобы геопространственные словари
/Type /Measure /Subtype /GEOи аннотации Projection объявляли/Extensions /ADBEс/BaseVersion /1.7и/ExtensionLevel 3или выше
Version 2.21.9
Исправлено (Fixed)
- Явное сохранение в PDF 1.7 теперь требует, чтобы аннотации RichMedia и действия
RichMediaExecuteобъявляли/Extensions /ADBEс/BaseVersion /1.7и/ExtensionLevel 3или выше
Version 2.21.8
Исправлено (Fixed)
- Явное сохранение в PDF 1.7 теперь требует, чтобы PRC 3D-потоки объявляли
/Extensions /ADBEс/BaseVersion /1.7и/ExtensionLevel 1или выше, вместо того чтобы рассматривать PRC как основную функцию PDF 1.7
Version 2.21.7
Исправлено (Fixed)
- Явное сохранение в PDF 1.4 и старее теперь отклоняет записи XObject изображения
/SMaskInData, включая явное значение0, поскольку встроенные каналы мягкой маски JPEG 2000 требуют PDF 1.5 или выше
Version 2.21.6
Исправлено (Fixed)
- Явное сохранение в PDF 1.4 и старее теперь отклоняет 16-битные XObject изображений, требующие PDF 1.5 или выше, тогда как целевые версии PDF 1.5–PDF 1.7 сохраняют данные изображения
/BitsPerComponent 16
Version 2.21.5
Исправлено (Fixed)
- Явное сохранение в PDF 1.4 и старее теперь отклоняет значения
/PageLayout /TwoPageLeftи/TwoPageRightкаталога документа, требующие PDF 1.5 или выше, тогда как целевые версии PDF 1.5–PDF 1.7 сохраняют запрошенную двухстраничную компоновку
Version 2.21.4
Исправлено (Fixed)
- Явное сохранение в PDF 1.3 теперь отклоняет записи
/Langкаталога документа, требующие PDF 1.4 или выше, тогда как целевые версии PDF 1.4–PDF 1.7 сохраняют идентификатор языка
Version 2.21.3
Исправлено (Fixed)
- Явное сохранение в PDF 1.3 теперь отклоняет деревья имён
/EmbeddedFilesдокумента, требующие PDF 1.4 или выше, не отклоняя потоки встроенных файлов, на которые ссылаются через более старые спецификации файлов
Version 2.21.2
Исправлено (Fixed)
- Явное сохранение в PDF 1.3 теперь отклоняет активные потоки метаданных, требующие PDF 1.4 или новее, сохраняя их для целевых версий PDF 1.4–1.7
Version 2.21.1
Исправлено (Fixed)
- Валидация гибридных ссылок теперь применяет дополнительные записи
/XRefStmдо классических xref-заполнителей той же ревизии, так что сжатые аннотации и другие объекты с версионными ограничениями больше не пропускаются
Version 2.21.0
Изменено (Changed)
- Все примеры просмотрщиков Delphi, C++Builder и Lazarus теперь могут открывать PDF, переданный как первый аргумент командной строки, а примеры
MultiPageViewerдля C++Builder и Lazarus предоставляют явные сочетания клавиш для выбора всего и копирования
Исправлено (Fixed)
- Примеры просмотрщиков теперь отклоняют недопустимые цели страниц закладок и ссылок, сохраняют ошибки загрузки, единообразно проверяют ввод ручного масштабирования, печатают запрошенную страницу с заполненной формой вместо повторения видимой страницы и прерывают отменённые задания печати Delphi вместо отправки неполного вывода
Version 2.20.0
Изменено (Changed)
- Все примеры просмотрщиков Delphi, C++Builder и Lazarus теперь предоставляют согласованные сочетания клавиш для открытия, поиска, сохранения, печати, масштабирования и навигации, а каждый вариант
ViewerInteractionLabподдерживает переходы между страницами, проверенное ручное масштабирование 10–60 %, журналы взаимодействия и проверки координат кликов
Version 2.19.1
Исправлено (Fixed)
- Явная валидация версии PDF теперь следует активной цепочке ревизий — классической, гибридной или на основе xref-потока, включая записи сжатых объектов, — так что замещённые, освобождённые и нессылаемые объекты больше не вызывают ложных сбоев по функциональной версии
Version 2.19.0
Изменено (Changed)
- Примеры для C++Builder и Lazarus — работа с вложениями, извлечение изображений, извлечение текста, преобразование страниц и разделение — теперь используют отдельные папки вывода или безопасно завершаемые файлы, стабильные имена с нулевым дополнением, отзывчивые обновления прогресса и итоговые сводки со счётчиками ошибок по каждому элементу
Исправлено (Fixed)
- Пример
CJKTextLabдля C++Builder теперь измеряет текст через экспортированные функции редактирования PDFium, аMergePDFизбегает неоднозначной перегрузки сообщений VCL, обеспечивая корректную сборку в RAD Studio 37
Version 2.18.3
Исправлено (Fixed)
- Временная метка PAdES B-LTA Document Time-stamp теперь регистрируется как обнаруживаемое поле подписи — невидимый виджет, доступный через
/Annotsпервой страницы и/FieldsAcroForm (ETSI EN 319 142-1 §5.4.3), — вместо недостижимого объекта-сироты, который не могли найти валидаторы, перечисляющие поля подписей; существующие аннотации и поля сохраняются
Version 2.18.2
Исправлено (Fixed)
- Подпись PAdES и запись классических перекрёстных ссылок теперь выдают понятную ошибку, когда смещение байта превышает фиксированную 10-значную ширину поля (~9,3 ГБ), вместо того чтобы молча оставлять заполнитель
/ByteRangeнезаписанным (создавая недействительную подпись) или выходя за пределы 20-байтовой строки xref (ISO 32000-1 §7.5.4); вывод потока перекрёстных ссылок использует 8-байтовые двоичные поля и не затронут
Version 2.18.1
Исправлено (Fixed)
- Подпись PAdES теперь разрешает косвенные ссылки
/Annots,/AcroFormи/Fieldsпервой страницы по полному заголовку объекта (ISO 32000-1 §7.5.3) и фактическому номеру генерации ссылки; прежний поиск подстроки мог сопоставить номер объекта внутри более длинного (разрешая5 0 Rв15 0 obj), а жёстко заданная генерация пропускала объекты сgen>0, что искажало массивы полей подписи или отвергало корректные документы - Когда каталог, первая страница,
/Annots,/AcroFormили/Fieldsнаходятся внутри потока объектов, подпись теперь повторяет попытку на расширенной копии перед отказом, а не отвергает документ сразу
Version 2.18.0
Добавлено (Added)
ReadPdfVersionInfoсообщает версию заголовка, эффективную версию ядра, переопределение каталога и уровень расширения разработчика Adobe из потока PDF
Изменено (Changed)
- Явное сохранение в PDF 1.3–1.7 теперь проверяет структуры каталога, ресурсов страниц, XFA, редактирования и расширений разработчика в контексте их владеющих объектов; зашифрованный вывод с явной версией и инкрементальная нормализация PDF 1.3 отклоняются для сохранения целостности документа
- Сохранение по пути к файлу теперь записывает во временный файл-сосед и заменяет назначение только после успешного завершения всех проверок сжатия, нормализации и версии
Исправлено (Fixed)
- Вывод PDF 1.3 теперь содержит обязательный полный ресурс
/ProcSetи удаляет ключи прозрачности PDF 1.4, если они лишь повторяют начальные значения графического состояния PDF 1.3 - Файлы с гибридными ссылками, потоком xref и потоком объектов больше не перезаписываются классическим компрессором xref, что предотвращает потерю записей сжатых объектов
- Имена, похожие на ключи прозрачности или каталога внутри строк, комментариев или несвязанных карт ресурсов, больше не вызывают ложных ошибок целевой версии
Version 2.17.0
Добавлено (Added)
- Подписи PAdES теперь регистрируются как невидимые аннотации Widget в массиве
/Annotsпервой страницы и в массиве/FieldsAcroForm, сохраняя существующие аннотации и поля формы
Изменено (Changed)
- Инкрементные обновления PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA, PDF/VT и PAdES теперь сохраняют исходное представление перекрёстных ссылок: документы с потоком xref получают обновление потока xref, как требует ISO 32000-1 §7.5.8.1, тогда как классические документы продолжают получать таблицу xref
- Смещения перекрёстных ссылок,
startxref,/Prev, значения ByteRange PAdES и обработка диапазонов SHA-256 теперь используют 64-разрядные позиции с фрагментарным хэшированием, что позволяет работать с файлами размером более 2 ГБ в 64-разрядных сборках - Генерируемые записываемые пакеты XMP теперь резервируют 2048 байт дополнения перед закрывающей инструкцией пакета
Version 2.16.10
Исправлено (Fixed)
- Расширение потока объектов больше не воскрешает устаревшие копии объектов, которые инкрементное обновление перенесло из потока объектов в обычное определение (ISO 32000-1 §7.5.7); проверки соответствия и внедрение маркеров ранее разрешали устаревший каталог или словарь метаданных в таких файлах
Version 2.16.9
Исправлено (Fixed)
- На Free Pascal текстовые строки, входные данные которых не являются корректным UTF-8, расширяются побайтово как Latin-1 и записываются как шестнадцатеричные строки UTF-16BE; ранее необработанные старшие байты попадали в буквальную строку, что не является допустимой кодировкой текстовой строки PDF 1.7
- Декодирование потока теперь распознаёт необработанные данные deflate без обёртки zlib RFC 1950 (распространённый дефект некорректных программ записи) и декомпрессирует их в необработанном режиме, поэтому проверки соответствия больше не «слепнут» на таких потоках
Version 2.16.8
Исправлено (Fixed)
- Инкрементные обновления, записанные постобработчиком сохранения, теперь обновляют второй (изменяемый) элемент трейлера
/ID, как требует ISO 32000-1 §14.4; ранее оба элемента копировались дословно, поэтому инструменты кэширования и синхронизации видели неизменённый идентификатор после каждого обновления
Version 2.16.7
Исправлено (Fixed)
- Обнуление тела потока при проверках соответствия теперь требует, чтобы ключевое слово
streamследовало за концом строки (ISO 32000-1 §7.3.8.1); слово внутри буквальной строки, например(downstream), ранее обнуляло все последующие данные до следующегоendstream, скрывая реальные нарушения от побайтовых проверок - Сканирование запрещённых возможностей PDF/X и PDF/E дополнительно обнуляет буквальные строки и комментарии (§7.2.2), поэтому значение вроде
/Title (see /JavaScript docs)или закомментированный токен больше не порождают ложные находкиJavaScript,AcroFormилиLZWDecode
Version 2.16.6
Исправлено (Fixed)
- Записи DPM PDF/VT теперь проверяются при записи, как описано: имена ключей, нарушающие правило NMTOKEN ISO 16612-2 §6.6 или правило префикса регистранта приложения E, а также дублирующиеся имена, отклоняются вместо записи в словарь DPart — имя с пробелом ранее разбивалось на фиктивную пару ключ/значение и искажало словарь
Version 2.16.5
Исправлено (Fixed)
- Удаление записи словаря, значением которой является шестнадцатеричная строка (например,
/Check <...>), теперь удаляет всю запись; ранее инжекторы оставляли осиротевшее шестнадцатеричное значение, создавая синтаксически некорректный словарь - Удаление записи, косвенная ссылка которой использует символы новой строки между токенами (ISO 32000-1 §7.3.10 допускает любые пробельные символы), больше не оставляет номер генерации и ключевое слово
R
Version 2.16.4
Исправлено (Fixed)
- Сканирование максимального номера объекта больше не требует, чтобы заголовки объектов начинались со строки (ISO 32000-1 §7.5.3 допускает любые пробельные символы или разделители перед ними), поэтому инжекторы больше не могут выделить номер объекта, совпадающий со встроенным заголовком
N G objи молча искажающий файл; номера объектов ограничены потолком приложения C - Потоки, чей
/Lengthявляется косвенной ссылкой, теперь разрешают целочисленный объект по ссылке и используют его значение, если оно совпадает с закрывающимendstream; ранее такие потоки ограничивались поиском по шаблону, что усекало тела, законно содержащие последовательность байтendstream— типично для встроенных PDF-вложений
Version 2.16.3
Исправлено (Fixed)
- Проходы сжатия потоков пропускают документы с потоком перекрёстных ссылок (файлы PDF 1.5+ без классического ключевого слова
trailer) без изменений; ранее путь перестройки неверно разбиралstartxrefкак местоположение таблицы и синтезировал угаданный трейлер, что могло порождать неоткрываемый файл - Компрессор пропускает потоки метаданных XMP, чтобы документ PDF/A сохранял обязательный нефильтрованный поток метаданных (ISO 19005-1 §6.7.2), и не трогает потоки внешних файлов (
/Fс/FFilter) - Восстановленная таблица перекрёстных ссылок сканирует копию документа с очищенными потоками, поэтому двоичное содержимое потока больше не может имитировать заголовки объектов или раздувать таблицу;
/Sizeвосстановленного трейлера теперь отражает реальную таблицу, а номера объектов ограничены потолком приложения C - Поиск исходной таблицы перекрёстных ссылок принимает концы строк только CR (ISO 32000-1 §7.5.1) и больше не может совпасть с буквами
xrefвнутриstartxref; сканирование ключевых слов потока получило тот же защитный хвостendstream, что используется в других местах, и теперь продвигается мимо пропущенных тел потоков
Version 2.16.2
Исправлено (Fixed)
- Разбор целых чисел во всех побайтовых читателях PDF теперь принимает явный знак
+, разрешённый ISO 32000-1 §7.3.3, и отклоняет последовательности цифр, которые вызовут переполнение, поэтому враждебные или повреждённые документы больше не могут обернуть разобранные длины и смещения в вводящие в заблуждение значения
Version 2.16.1
Исправлено (Fixed)
- Инжектор PDF/UA записывает значение
/Langкаталога как правильную текстовую строку PDF; ранее значение пропускалось через XML-эскейпер, поэтому языковой тег, содержащий&или скобки, давал повреждённую запись, а не-ASCII-ввод записывался как необработанный UTF-8 - Запись Info
/ISO_PDFEVersionдля PDF/E использует общий кодировщик текстовых строк, сохраняя корректность не-ASCII-значений в PDF 1.7 - XML-экранирование для пакетов XMP удаляет управляющие символы, недопустимые в XML 1.0, чтобы метаданные, скопированные из повреждённого источника, не делали весь поток метаданных некорректным XML
- Преобразование дат PDF в XMP проверяет числовой формат полей дат и дополняет отсутствующее поле минут, предотвращая искажённые даты ISO 8601 в сгенерированном XMP; на платформах, отличных от Windows, резервная метка времени теперь включает время суток вместо голой даты
Version 2.16.0
Добавлено (Added)
- Декодирование потока теперь восстанавливает предикторы
/DecodeParms(предикторы PNG 10–15 и TIFF предиктор 2, ISO 32000-1 §7.4.4.4) после FlateDecode, учитывая/Colors,/BitsPerComponentи/Columns; потоки объектов, сжатые с предиктором — распространённый выбор авторов PDF 1.5+ — ранее давали разностные байты, поэтому переносимые ими объекты были незаметны для проверок соответствия и внедрения маркеров
Исправлено (Fixed)
- Обнаружение FlateDecode теперь разбирает значение
/Filterкак имя или массив, а не ищет подстроку, поэтому каскадные цепочки фильтров и вхождения слова внутри несвязанных значений больше не вызывают ложный inflate; неподдерживаемые цепочки возвращаются к необработанным байтам, как и прежде
Version 2.15.1
Исправлено (Fixed)
- Сканер словаря теперь пропускает буквальные строки, шестнадцатеричные строки и комментарии при балансировке
<</>>(ISO 32000-1 §7.2.2), поэтому словари со значениями вроде(A >> B)или шестнадцатеричной строкой, примыкающей к закрывающему разделителю, больше не усекаются при разборе трейлера, каталога и проверках соответствия - Извлечение буквальных строк теперь декодирует полный набор экранирований таблицы 3 §7.3.4.2 —
\n \r \t \b \f, восьмеричное\ddd, продолжения строк и нормализацию EOL — вместо буквального копирования экранирующего символа, восстанавливая корректное сравнение/Producer,/GTS_PDFXVersionи/ISO_PDFEVersionдля авторов, использующих восьмеричные экранирования - Буквальные строки, записываемые инжекторами маркеров, теперь экранируют CR, LF и другие управляющие символы, чтобы значения побайтово пережили нормализацию конца строки на стороне читателя
Version 2.15.0
Исправлено (Fixed)
- Инкрементные обновления, записанные инжекторами маркеров PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA и PDF/VT, а также путями подписи PAdES и DSS, теперь сохраняют постоянный идентификатор файла исходного документа: первый элемент трейлера
/IDпереносится дословно, как требует ISO 32000-1 §14.4, и только второй (изменяемый) элемент обновляется; ранее оба элемента перегенерировались, поэтому внешние ссылки и рабочие процессы долгосрочной проверки видели другой идентификатор документа после каждого сохранения - Подписи PAdES, внедрение DSS и метки времени B-LTA Document Time-stamp теперь переносят ссылку
/Infoтрейлера источника вперёд (ISO 32000-1 §7.5.6), поэтому свойства документа больше не исчезают из панелей читателя после подписания; трейлер Document Time-stamp также получает массив/ID - Резервный вариант трейлера
/Infoдля документов с потоком перекрёстных ссылок теперь корректно находит словарь потока XRef и сохраняет номер генерации ссылки; ранее он никогда не совпадал на корректных файлах PDF 1.5+, молча удаляя/Info
Version 2.14.4
Исправлено (Fixed)
- Дата
/Mсловаря подписи, записываемаяTPdf.SignPadesиSignPadesBytes, теперь содержит обязательный префиксD:и маркер UTC смещенияZ, требуемые ISO 32000-1 §7.9.4; строгие валидаторы ранее отвергали время подписания как неверно сформированную строку даты
Version 2.14.3
Исправлено (Fixed)
- Поиск ключей словаря в общем читателе PDF теперь сопоставляет целые токены имён (ISO 32000-1 §7.3.5); ранее поток, в словаре которого
/Length1стоит перед/Length(типично для потоков FontFile), усекался до неверного числа байт, молча скрывая шрифт, CMap или потоки метаданных от проверок PDF/A, PDF/UA и других - Поиск ключей трейлера
/Encrypt,/Root,/Sizeи/Infoбольше не совпадает с более длинными ключами с тем же префиксом (например,/EncryptMetadata) - Расширение потока объектов больше не доверяет повреждённому или враждебному значению
/N: не-целочисленные значения теперь дают 0 вместо неинициализированного числа, а верхняя граница, полученная из/First, предотвращает избыточные выделения при сканировании повреждённых документов
Version 2.14.2
Исправлено (Fixed)
- Инжекторы маркеров PDF/X, PDF/VT, PDF/UA, PDF/E и PDF/R теперь пропускают зашифрованные исходные документы без изменений вместо добавления текстовых разделов обновления; прежнее поведение создавало файлы, чей последний трейлер лишался записи
/Encrypt(ISO 32000-1 §7.5.6), поэтому совместимые читатели читали зашифрованное тело как открытый текст TPdf.SignPades,SignPadesBytesиInjectPadesDssMarkersтеперь вызываютEPadesCrypto, когда исходный документ зашифрован, вместо молчаливого создания повреждённого или непроверяемого файла; снимите шифрование перед подписанием или встраиванием материала DSS
Version 2.14.1
Исправлено (Fixed)
TPdf.SignPadesиSignPadesBytesтеперь заполняют все четыре поля/ByteRangeсловаря подписи; ранее последние три поля оставались нулевыми заполнителями, поэтому созданные подписи объявляли пустой диапазон байт и не проходили проверку в совместимых валидаторах- Словари Document Time-stamp PAdES B-LTA получают то же исправление заполнения
/ByteRange ValidatePadesComplianceтеперь принимает стандартное расположение подписи, где зазор диапазона байт содержит шестнадцатеричное значение/Contents, и проверяет, что второй сегмент диапазона заканчивается точно в конце файла; ранее только беззазорные диапазоны проходили проверку покрытия
Version 2.14.0
Добавлено (Added)
TPdf.ExportXFDFсериализует каждое значение поля формы и аннотации на всех страницах в документ XFDF (ISO 19444-1), генерируя<fields>для иерархических значений форм и<annots>для всех поддерживаемых подтипов аннотаций (text, highlight, underline, strikeout, squiggly, line, circle, square, caret, polygon, polyline, stamp, ink, freetext, fileattachment, sound, link, redact)TPdf.ImportXFDFчитает документ XFDF обратно в загруженный PDF, воссоздавая аннотации на соответствующих страницах и применяя значения полей к их виджет-аннотациям- Запись
TPdfAnnotationполучила поляName(NM),Subject,ModificationDate(M),CreationDate,Icon,Opacity(CA), конечные точки линии, вершины многоугольника/ломаной и жесты чернил, чтобы цикличные преобразования XFDF сохраняли полные метаданные аннотации - Новый пример
XfdfLabв наборах демонстраций для Delphi, C++Builder и Lazarus демонстрирует цикл экспорта/импорта
Version 2.13.6
Исправлено (Fixed)
ValidatePdfAтеперь рассматривает потоки/Metadataкаталога без/Type /Metadataили/Subtype /XMLкак отсутствующие XMP-метаданные черезpvaiMissingXmpMetadata- Отчёты предполётной проверки PDF/A теперь классифицируют
pvaiMissingXmpMetadataкак Метаданные и рекомендуют поток/Metadataкаталога с/Type /Metadata,/Subtype /XML, нефильтрованным XMP и маркерамиpdfaid
Version 2.13.5
Исправлено (Fixed)
ValidatePdfAтеперь сообщает о виджет-аннотациях без словаря внешнего вида и аннотациях PDF/A-2 / PDF/A-3, которым требуется, но не хватает/AP, черезpvaiAnnotationApDictViolation- Отчёты предполётной проверки PDF/A теперь относят
pvaiAnnotationApDictViolationк контенту, который внедрение маркеров не может исправить
Version 2.13.4
Исправлено (Fixed)
ValidatePdfAтеперь сообщает о встроенных изображениях PDF/A-2 и PDF/A-3, чьё значение/Iили/Interpolateравноtrue, черезpvaiImageDictionaryViolation, соответствуя существующему охвату словаря Image XObject- Отчёты предполётной проверки PDF/A теперь относят
pvaiImageDictionaryViolationк контенту, который внедрение маркеров не может исправить
Version 2.13.3
Исправлено (Fixed)
ValidatePdfAтеперь сообщает о встроенных изображениях PDF/A-1, использующих фильтры/LZWDecodeили сокращённый/LZWвнутри потоков контента, черезpvaiInlineImageLzwForbidden, дополняя существующий охват встроенных изображений PDF/A-2 и PDF/A-3- Сканер фильтров встроенных изображений теперь продвигается мимо ведущих имён ресурсов, таких как
/GS1, избегая зависаний при сканировании более широких потоков контента PDF/A-1
Version 2.13.2
Добавлено (Added)
TPdf.SetFocusedFormFieldTextзаписывает текст в буфер редактирования текущего сфокусированного поля формы черезFORM_ReplaceSelection, симметричноFocusedFormFieldText. Для текстовых/комбинированных полей AcroForm значение фиксируется в/Vпри потере фокуса и сохраняется; для текстовых полей XFA запись попадает только в буфер памяти (PDFium не предоставляет публичного API для согласования значений XFA обратно в пакет данных, поэтому оно не сохраняется при сохранении)- Хост-платформа JavaScript теперь подключается всякий раз, когда доступен движок V8, независимо от того, является ли документ XFA — так встроенный JavaScript AcroForm (скрипты уровня документа, вычисления полей,
app.alert) также может выполняться. Ранееm_pJsPlatformподключался только для документов XFA, оставляя JS AcroForm молча отключённым
Изменено (Changed)
- Подключение платформы JavaScript теперь независимо от решения XFA в
InitializeFormFill— таблицаm_pJsPlatformстроится всякий раз, когдаV8FeaturesAvailableравно true, и применяется после подключения версии/обратного вызова XFA, а не вложена в него
Version 2.13.1
Добавлено (Added)
- Новые хост-события раскрывают информацию, которую обратные вызовы заполнения форм v2.13.0 ранее поглощали:
OnXfaUriAction,OnXfaPageCountChanged,OnXfaFocusChange,OnXfaEmail,OnXfaHttpRequest,OnXfaOpenFile,OnJavaScriptBeep,OnJavaScriptPrint,OnJavaScriptMail,OnJavaScriptSubmitForm. По умолчанию каждое событие сохраняет существующее поведение «нет действий» при неназначении, поэтому существующие хосты не затронуты - Свойство только для чтения
TPdf.XfaFormPacketsвозвращает одноразовый снимок всех XFA-пакетов (TXfaPacketList), реализуя типыTXfaPacket/TXfaPacketList, ранее объявленные, но не используемые - Коды ошибок PDFium для XFA
FPDF_ERR_XFALOAD/FPDF_ERR_XFALAYOUTтеперь привязаны и отображаются черезLastPdfError, заменяя обобщённое «Unknown error» при сбоях загрузки/макетирования XFA
Изменено (Changed)
FFI_DoURIActionWithKeyboardModifierтеперь обращается кOnXfaUriActionперед shell-выполнением URI из поля XFA, давая хосту право вето (безопасность: вредоносное поле XFA ранее могло безусловно запускать произвольные URL). Неназначенные обработчики сохраняют прежнее поведениеShellExecuteWпо умолчаниюDecodeFormFieldTypeтеперь маршрутизирует типы полей XFA черезIsXfaFormField, а не через явный case из 8 ветвей, сохраняя согласованность перечисления сFPDF_FORMFIELD_XFA_*по ординальному смещению
Исправлено (Fixed)
ValidatePdfAтеперь сообщает о заявлениях PDF/A-1, использующих потоки перекрёстных ссылок или потоки объектов PDF 1.5 через новыйpvaiPdfA1Pdf15Structure, при этом по-прежнему разрешая потоки объектов для PDF/A-2 и PDF/A-3
Version 2.13.0
Добавлено (Added)
- Полная поддержка среды выполнения XFA (XML Forms Architecture):
TPdf.InitializeFormFillтеперь подключает все 14 обратных вызовов версии 2FPDF_FORMFILLINFO(FFI_DisplayCaret,FFI_GotoURL,FFI_PageEvent,FFI_PopupMenu,FFI_OpenFile,FFI_EmailTo,FFI_UploadTo,FFI_GetPlatform,FFI_GetLanguage,FFI_DownloadFromURL,FFI_PostRequestURL,FFI_PutRequestURL,FFI_OnFocusChange,FFI_DoURIActionWithKeyboardModifier) и прикрепляетIPDF_JsPlatform, чтобы XFA-совместимыйpdfium.dllмог рендерить и скриптовать динамические XFA-формы - Новый модуль
Lib\FPdfXfa.pasобъявляет XFA-константы (FXFA_PAGEVIEWEVENT_*,FXFA_MENU_*,FXFA_SAVEAS_*,FPDF_FORMFIELD_XFA_*) и типыTXfaPacket/TXfaSaveFormat, ранее упоминавшиеся только в комментариях - Статический читатель XFA-пакетов на
TPdf:GetXfaPacketCount/GetXfaPacketName/GetXfaPacketContent/GetXfaPacketByNameплюсGetXfaTemplate/GetXfaDatasets/GetXfaConfigизвлекают пакеты XFAtemplate,datasetsиconfigкак необработанный XML без необходимости в XFA-совместимой среде выполнения - Зонды возможностей: глобальный
XfaFeaturesAvailable, и для каждого документаTPdf.XfaRuntimeAvailable(был лиFPDF_LoadXFAуспешен) иTPdf.XfaStaticReadable(разрешают ли экспорты читателя пакетов) TPdfFormFieldTypeрасширенfiXfa,fiXfaCheckBox,fiXfaComboBox,fiXfaImageField,fiXfaListBox,fiXfaPushButton,fiXfaSignature,fiXfaTextField, сDecodeFormFieldType, отображающим новые значенияFPDF_FORMFIELD_XFA_*- Хост-события JavaScript на
TPdf:OnJavaScriptAlert,OnJavaScriptResponse,OnXfaGotoUrlиOnXfaRuntimeMissingпозволяют хосту настраивать диалоги JS и навигацию XFA или реагировать, когда XFA-документ не может запустить движок - Новый пример
XfaLabдля Delphi, демонстрирующий обнаружение XFA, извлечение пакетов, проверку возможностей и резервный путь при отсутствии среды выполнения
Изменено (Changed)
TPdf.LoadDocumentтеперь предварительно сканирует входные данные на маркеры XFA (/XFAв словаре AcroForm или/NeedsRenderingкаталога) и при их обнаружении автоматически выбираетpdfium.v8.dll, устанавливаяEnableV8Engine := Trueперед первой загрузкой библиотеки-синглтона; после загрузки обычногоpdfium.dllпроцесс не может переключиться, поэтомуOnXfaRuntimeMissingсигнализирует об этом случаеTPdf.GetPageCountтеперь отражает количество страниц, которое движок XFA сообщает черезFFI_PageEventпосле динамической перестраницы, а не только статическое дерево страниц PDF- Когда XFA-документ открыт, но среда выполнения недоступна,
InitializeFormFillтеперь фиксируетversion=1иxfa_disabled=1вместо запроса версии 2 с неназначенными обратными вызовами, что ранее могло вызвать разыменование плохого указателя обратного вызова
Version 2.12.2
Исправлено (Fixed)
ValidatePdfAComplianceтеперь сообщает об используемых пользовательских пространствах имён XMP безpdfaExtension:schemas, при этом по-прежнему принимая стандартные метаданныеpdfaidбез объявлений расширений- Проверка встроенных файлов PDF/A-3 теперь требует наличия как
/Fверхнего уровня, так и/UFв словарях filespec и игнорирует вложенные ключи потока/EFпри проверке этих имён
Version 2.12.1
Исправлено (Fixed)
ValidatePdfAComplianceтеперь декодирует экранированные токены имён PDF перед сопоставлением с JavaScript, LZWDecode, Type1 и другими запрещёнными именами, поэтому обфусцированные, но семантически идентичные имена корректно сообщаются- Проверки встроенных изображений PDF/A теперь отклоняют значения
/Filterи/F, использующие/LZWDecode, сокращённый/LZWили/Crypt, включая форму массива и экранированного имени - Проверка PDF/A теперь сообщает о потоках метаданных с запрещёнными фильтрами, профилях ICC OutputIntent, чей счётчик компонентов
/Nотсутствует или несогласован, и спецификациях встроенных файлов PDF/A-3 с отсутствующим или недействительным/AFRelationship
Version 2.12.0
Добавлено (Added)
- HTTP-запросы TSA теперь устанавливают явные тайм-ауты в 30 с для каждой фазы (разрешение/подключение/отправка/получение) через
WinHttpSetTimeouts, чтобы медленный или недоступный орган временных меток не мог навсегда подвесить поток подписания - Производный нонс для каждого запроса PAdES B-T / B-LTA при пустом
TPadesSignOptions.Nonce: SHA-256-свёртка монотонного счётчика + системные часы +GetTickCount64+ идентификатор процесса заменяет прежний фиксированный запасной вариант$100000000, чтобы два запроса, выданных в одну миллисекунду, не использовали один и тот же нонс для защиты от повторного воспроизведения PdfInflateтеперь ограничивает декомпрессированный вывод 256 МиБ, чтобы сжатый zlib поток не исчерпал память на враждебных или повреждённых входных данных («zlib-бомба»); ограничение достаточно щедро для любого реального потока PDF
Изменено (Changed)
- Наложение смешивания
TPdfView(выделение поиска, выделение текста, читаемое слово, выделение разворота) больше не использует попиксельныйGetPixel/SetPixelV; прямоугольник теперь смешивается через 32-bpp внеэкранныйTBitmapиScanLineза один проход, устраняя тысячи пересечений ядра GDI за отрисовку и делая большие выделения отзывчивыми FPdfAsn1.TDerReader.ReadIntegerтеперь отклоняет INTEGER-поля длиннее 8 байт (и 8-байтовые отрицательные, чей знаковый бит потребовал быshl >= 64), возвращая 0 вместо вычисления неверного значения через неопределённое поведение сдвига на ASN.1-вводе CMS/PAdESParseTimeStampRespбольше не отражает нонс запроса обратно какTPadesTimestamp.Nonce; до появления обходчика TSTInfo, проверяющего возвращённый нонс, поле остаётся 0, сигнализируя «не проверено» вместо того, чтобы давать вызывающим ложную уверенность в свежести ответа временного штампа
Исправлено (Fixed)
PointsToPixelsвозвращал входное значение без изменений для любого DPI: делитель былPointsPerInch(константа 72) вместо литерала 72, сводя формулу кResult := Points. Любой внешний вызывающий, делающий пересчёт точек в пиксели устройства через этот помощник, теперь получает корректноеPoints × PixelsPerInch / 72PdfMaxObjNumнедосчитывал на документах, использующих потоки объектов (ObjStm PDF 1.5+): объекты, сжатые внутри/ObjStm, не имеют маркераN 0 obj, поэтому побайтовое сканирование их пропускало, и инжекторы, выделяющиеMaxObj+1для новых объектов, могли столкнуться со скрытыми членами ObjStm и молча повредить файл. Сканирование теперь сначала расширяет потоки объектов, чтобы каждый номер объекта был виденInjectPdfAMarkersбольше не создаёт ложное заявление о соответствии PDF/A для зашифрованного документа: PDF/A (ISO 19005-1 §7.1) запрещает шифрование, и инжектор ранее копировал источник с маркерами, даже если следующая проверка отвергала его. Когда установленHasEncrypt, источник теперь передаётся без изменений. Обычный путьTPdf.SaveAsPdfAуже снимает шифрование (saRemoveSecurity) перед инъекцией, поэтому это затрагивает только прямых вызывающихPdfReadStreamBytesтеперь отвергает/Length, превышающий весь файл, перед выделением буфера результата, закрывая ранний путь выделения на повреждённой или враждебной косвенной длине
Version 2.11.0
Добавлено (Added)
- Запись PDFium
FPDF_FILEHANDLERтеперь объявляет шесть обратных вызовов (Release,GetSize,ReadBlock,WriteBlock,Flush,Truncate) как реальные поля, а не комментарии, соответствуя раскладке заголовка C. Обратные вызовы XFA FFI для передачи файлов (FFI_OpenFile/FFI_EmailTo/FFI_UploadTo/FFI_DownloadFromURL), возвращающие или принимающиеPFPDF_FILEHANDLER, по-прежнему не реализованы в Pascal-слое заполнения форм, но тип теперь структурно корректен для любого будущего пути отправки/загрузки XFA - Загрузка и выгрузка библиотеки PDFium (
LoadLibrary/UnloadLibrary) теперь сериализованы процессно-глобальной критической секцией, чтобы два рабочих потокаTPdfFuture<T>(или рабочий поток, соревнующийся с главным) не могли оба наблюдатьPDFiumLibrary=0и выполнить двойную привязку или освободить DLL, когда другой поток находится на полпути привязки - Секция
initialization/finalizationтеперь вызываетUnloadLibraryпри выгрузке модуля, гарантируя выполнениеFPDF_DestroyLibrary(ожидание завершения рабочих потоков, освобождение изолята V8, освобождение шрифтов/кэша) вместо того, чтобы полагаться на ОС в возврате DLL
Изменено (Changed)
TPdf.SetActiveтеперь подавляет любое исключение при загрузке (ранее толькоEPdfError), поэтому ошибка потока или нарушение доступа во время настройки формы/страницы оставляетActive=Falseвместо частично загруженного компонента в неопределённом состоянии- Согласованная кодировка символов для аргументов ключей метаданных PDFium:
TPdf.GetMetaTextтеперь использует тот же раздельный подход FPCAnsiString/ DelphiUTF8Encode, чтоGetViewerPreferenceи пути загрузки, вместо голого приведенияAnsiString(Tag) - Дедуплицированы помощники
BytesToAnsi,AnsiToBytes,WriteBytesиWriteStr:FPdfCompressтеперь импортирует их изFPdfPdfCommon(псевдонимыWriteBytesToStream/WriteAnsiToStreamудалены) и избыточная трёхаргументная перегрузкаBytesToAnsiвFPdfPdfaудалена.FPdfAsn1сохраняет локальную копию намеренно, чтобы криптографический слой оставался свободным от модуля слоя соответствия
Исправлено (Fixed)
- Утечка ресурсов в
TPdf.LoadDocument(файл, память,TBytes,TMemoryStream, пользовательский поток) иTPdf.CreateDocument: еслиInitializeFormFillилиReloadPageвыбрасывали исключение после успешногоFPDF_LoadDocument/FPDF_CreateNewDocument, дескрипторFPDF_DOCUMENTутекал, так какFActiveещё был False. Каждый путь теперь оборачивает постзагрузочную настройку вtry/exceptи закрывает документ при неудаче, оставляя компонент корректно неактивным - Более понятная диагностика загрузки DLL PDFium:
CheckLoadLibraryобнаруживаетERROR_BAD_EXE_FORMAT(193) и сообщает о несоответствии архитектуры 32/64-бит, указывая на соответствующую сборкуDLLs/Win32илиDLLs/Win64, вместо передачи только общей ошибки ОС.CheckGetProcAddressтеперь сообщает, что развёрнутыйpdfium.dllстарше привязки, когда требуемый экспорт отсутствует, а не просто выдаёт текст ОС «procedure not found»
Version 2.10.1
Исправлено (Fixed)
- Стандартизация SignerInfo sid в PAdES: идентификатор подписанта теперь использует форму RFC 5652 §5.3
issuerAndSerialNumber(issuer Name + serialNumber, оба извлекаются дословно из DER сертификата подписанта), заменяя прежний нестандартныйsubjectKeyIdentifier+ SHA-256-заглушку полного сертификата, которую отклоняли Adobe Acrobat и другие соответствующие валидаторы. Новый обходщик TbsCertificate DER (ExtractIssuerAndSerial) считывает SEQUENCE издателя и INTEGER серийного номера как необработанные байты TLV — серийные номера часто превышают диапазонInt64, поэтому необработанный TLV обязателен. ФормаsubjectKeyIdentifierостаётся как резерв только в случае неудачного разбора DER сертификата
Изменено (Changed)
TCmsSignerId.SerialNumber: Int64заменён наSerialDer: TBytes(необработанный TLV serialNumber). Построитель CMS встраивает вырезанный TLV дословно вIssuerAndSerialNumber, избегая переполненияInt64на 20-байтовых серийных номерах CA (верхняя граница RFC 5280 §4.1.2.2)
Version 2.10.0
Добавлено
- Долгосрочная проверка PAdES B-LT: когда
TPadesSignOptions.Level >= plB_LT,SignPadesBytesдобавляет инкрементное обновление, содержащее словарь/DSSс сертификатом подписанта и полной промежуточной цепочкой (самоподписанный корень исключается согласно RFC 5652 §10.2.3), плюс маркер/Extensions /ESICуровня Level 1 (EN 319 142-1 §5.4.2) - Архивная метка времени PAdES B-LTA: когда
Level >= plB_LTAи заданTsaUrl, добавляется словарь подписи Document Time-stamp (/SubFilter /ETSI.RFC3161), чей/ByteRangeохватывает весь файл; маркер ESIC повышается до уровня Level 2. Это завершает четыре базовых уровня PAdES (B-B, B-T, B-LT, B-LTA) - Сбор цепочки сертификатов:
ResolveWinSignerтеперь вызываетCertGetCertificateChainи заполняетTPadesResolvedSigner.ChainCertDerпромежуточными сертификатами CA, благодаря чему B-LT/DSS /Certsсодержит каждый сертификат, необходимый для проверки подписи без внешних запросов.CertFreeCertificateContextтеперь привязан, закрывая утечку «один контекст на подпись», отмеченную в v2.8.0 - Рабочий процесс интеграции PDF/A:
TPdf.SignPadesWithPdfAсначала преобразует документ в PDF/A (наивысший уровень, который библиотека генерирует на сегодняшний день), затем применяет запрошенную подпись PAdES — шаблон контейнера долгосрочного архивирования, рекомендуемый EN 319 142-1 Annex A.7
Version 2.9.0
Добавлено
- Доверенная метка времени PAdES B-T:
TPadesSignOptionsполучает поляLevel,TsaUrlиNonce. КогдаLevel >= plB_Tи заданTsaUrl,SignPadesBytesизвлекает значение подписи из построенного CMS, запрашивает метку времени RFC 3161 по нему и встраивает возвращённый TimeStampToken как неподписанный атрибут SignerInfosignature-time-stamp— шаг доверенного времени B-T (EN 319 142-1 §6.3 требование o) FPdfTsa: кроссплатформенный клиент RFC 3161 —BuildTimeStampReq(версия 1, SHA-256 messageImprint по значению подписи, nonce, certReq=true),ParseTimeStampResp(принимает PKIStatus 0/1, отклоняет 2+, извлекает TimeStampToken ContentInfo дословно) иRequestTimestamp(выполнение build+POST+parse за один вызов).PadesTsaAvailableограничивает функцию на платформах без HTTP-бэкендаFPdfTsaWin: Windows-бэкенд WinHttp, динамически привязанный из winhttp.dll (нулевая новая зависимость на этапе компиляции; HTTPS согласовывается хранилищем сертификатов Windows). Повторяет шаблон динамической привязкиFPdfCryptoWinFPdfCms:ExtractSignatureValueобходит построенный CMS для восстановления необработанных октетов подписи (вход хэша TSA), аAddSignatureTimestampToCmsперестраивает ContentInfo с новымunsignedAttrs [1](0xA1), несущим атрибут метки времени. Валидатор первого этапа распознаёт результат как подпись B-T
Version 2.8.0
Добавлено
- Стек подписи PAdES B-B: четыре новых чисто-Pascal/кроссплатформенных строительных блока (
FPdfSha256,FPdfAsn1,FPdfCms,FPdfCrypto) плюс Windows-бэкенд CNG (FPdfCryptoWin) позволяютTPdf.SignPades/SignPadesToStreamсоздавать подпись PAdES B-B сквозным образом. Сертификат подписанта определяется по отпечатку SHA-1 из хранилища Current User “MY”; RSA-PSS (рекомендуется), RSA PKCS#1 v1.5 и ECDSA поддерживаются черезNCryptSignHash FPdfSha256: автономный SHA-256 FIPS 180-4 (Init/Update/Final + однострочные помощники). FPC 3.2.2 не содержит модуля SHA-2, поэтому библиотека владеет одним, чтобы держать каждый путь кода CMS на едином типеTSHA256Digestбез ветвления RTLFPdfAsn1: кодировщик DER (TDerWriter) и читатель (TDerReader), охватывающие SEQUENCE/SET/OID/INTEGER/OCTET STRING/UTCTime/GeneralizedTime/контекстно-зависимые теги с определённо-длиновым кодированием и обработкой IMPLICIT-тегов, которые требует CMSFPdfCms: построитель CAdES SignedData (BuildSignedData), генерирующий подписанные атрибуты content-type, message-digest и signing-certificate-v2, обязательные для PAdES baseline, с опциональными signing-time и commitment-type-indication. Дайджест signedAttrs вычисляется по форме с тегом SET (0x31) и переизлучается с тегом IMPLICIT [0] (0xA0) согласно RFC 5652 §5.4FPdfCrypto+FPdfCryptoWin: абстракция криптографического бэкенда сPadesCryptoAvailable/ResolvePadesSigner, а Windows-реализация привязывает crypt32.dll / ncrypt.dll динамически (без новой зависимости DLL на этапе компиляции). Подписи ECDSA пере кодируются из Windows-формы IEEE P1363 r¦s в DERECDSA-Sig-Value, требуемый CMSSignPadesBytes: инъекция подписи на байтовом уровне — резервирует hex-слот/Contentsфиксированной ширины, вычисляет охватывающий/ByteRange, дайджестирует документ, строит и встраивает CMS и добавляет инкрементное обновление. Валидатор (v2.7.0) распознаёт результат как подпись PAdES B-B
Version 2.7.0
Добавлено
- Структурный валидатор PAdES (ETSI EN 319 142-1 V1.2.1): новый модуль
FPdfPadesи методTPdf.ValidatePadesпроверяют словари значений подписи, доступные из/ByteRange, обходят CMSSignedDataвнутри/Contentsдостаточно глубоко, чтобы подтвердить отсоединённую форму CAdES, и обнаруживают четыре базовых уровня (B-B, B-T, B-LT, B-LTA), а также словари Document Time-stamp (/SubFilter /ETSI.RFC3161) - Набор проблем PAdES на уровне пунктов: 26 перечислений
ppei*охватывают допустимость/SubFilter(adbe.pkcs7.sha1иadbe.x509.rsa_sha1помечены как запрещённые), покрытие файла/ByteRange, запрет/Cert, форму CMSSignedData(один подписант, отсоединённый eContent, диапазон версий), обязательные подписанные атрибуты (content-type,message-digest,signing-certificate/v2), запрещённые дайджесты (MD5, SHA-1), взаимоисключение/Reasonиcommitment-type-indication(требование d), требование доверенного времени B-T, маркер/DSS+/Certs+ ESIC Level 1 для B-LT и метка времени Document Time-stamp + ESIC Level 2 для B-LTA - Инъектор DSS:
TPdf.SaveAsPadesDss/SaveAsPadesDssToStreamдобавляют инкрементное обновление, несущее словарь/DSS(с потоковыми массивами/Certs,/OCSPs,/CRLs) и маркер/Extensions /ESIC(Level 1 или 2) на копию документа, сохраняя исходные байты — шаг внедрения материалов проверки B-LT/B-LTA (пункт 5.4.2) - Кроссплатформенный этап без зависимостей: валидатор и инъектор написаны на чистом Pascal и работают в каждой поддерживаемой IDE (Delphi, Lazarus, FPC, C++Builder); для этого выпуска криптографический бэкенд не требуется и новая зависимость DLL не вводится
Version 2.6.0
Изменено (Changed)
- Дедупликация между стандартами: ещё семь дублированных вспомогательных функций (PdfEnclosingObjNum, PdfDictRefNum, PdfExpandObjectStreams, PdfTextStr, ExtractLiteralString, ExtractXmpAttr) удалены из отдельных стандартных модулей и объединены в
FPdfPdfCommon, что сокращает примерно ~300 строк бремени поддержки кода copy-paste - Качество PreflightReport: проблемы content-класса PDF/X и PDF/E, которые ранее попадали в общую категорию “missing marker”, теперь несут точные категории Content/Metadata/Security и рекомендации для конкретных пунктов (около 15 перечислений для обоих стандартов)
- Покрытие тестами PDF/E и PDF/R: ещё шесть перечислений с нулевым покрытием получили положительные тесты (
pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden,pveiEmbeddedFilesForbidden,pvriBadHeader,pvriProhibitedInfoEntry) - Исправление сборки Lazarus:
Tests.PdfVT(модуль DUnitX только для Delphi, добавленный в v2.5.x) теперь исключён из проекта Lazarus для восстановления компиляции
Version 2.5.3
Добавлено
- Полнота OutputIntent (PDF/X-4 §6.2.4):
pvviOutputIntentSchemeпомечает OutputIntent, чей/Sне равен/GTS_PDFX;pvviOutputIntentMissingIdentifierпомечает отсутствующий/OutputConditionIdentifier - Исключение Reference XObject для PDF/VT-2 (§6.2.2):
pvviReferenceXObjectForbiddenбольше не срабатывает для файлаPDF/VT-2, который может легально использовать Reference XObjects на базе X-5g/5pg - Проверка символов границы MIME (RFC 2046 §5.1.1):
vtmviBoundaryInvalidCharпомечает границу, символы которой выходят за множество bchars или чья длина превышает 70
Исправлено (Fixed)
InjectPdfVTMarkersтеперь записывает Info/CreationDateи/ModDateиз параметров сохранения, благодаря чему полученный файл проходит обратный циклValidatePdfVTComplianceбез ложногоpvviInfoModDateMismatch(ранее инъектор перезаписывал даты XMP, но оставлял даты словаря Info устаревшими)
Version 2.5.2
Добавлено
- Согласованность Info
/ModDate(§6.3 NOTE 2, база PDF/X-4):pvviInfoModDateMismatchпомечает/ModDateсловаря Info, который после нормализации PDF-даты в XMP-дату не равенxmp:ModifyDate - Соответствие inline-чанков PDF/VT-2s (Annex A.2): MIME-валидатор теперь запускает
ValidatePdfVTComplianceна каждой inline-частиapplication/pdfи помечает тело, не являющееся PDF/VT, черезvtmviInlinePdfNotPdfVT
Version 2.5.1
Добавлено
- Проверка сегментации DParts (ISO 16612-2 §6.5 Table 4):
pvviDPartsBadChunkingпомечает массив/DParts, чьи непоследние подмассивы не содержат ровно 8192 элемента или чей последний подмассив выходит за пределы 1..8192 - Согласованность RecordLevel между потоками (Annex A.2): MIME-валидатор PDF/VT-2s теперь извлекает
/RecordLevelкаждого inline-файла PDF и помечает расхождения черезvtmviRecordLevelMismatch, дополняя существующую проверку NodeNameList - Подсказки повторяющихся графических объектов (§6.7):
pvviGtsScopeInvalidValueпомечает/GTS_Scopeвне {SingleUse, Record, File, Stream, Global, Unknown};pvviGtsScopeRecordWithoutRecordLevelпомечает/Recordбез/RecordLevel;pvviGtsXidNotUuidпомечает/GTS_XID, не являющийся uuid: URI RFC 4122;pvviGtsEnvMissingпомечает отсутствующий/GTS_Env, когда/GTS_Scopeравен Stream или Global (§6.7.4) - Обнаружение прямых ссылок MIME (Annex A.2):
vtmviForwardReferenceпомечает inline-файл PDF, который ссылается на имя файла (через/EF /F), не введённое более ранней частью вложения в потоке
Исправлено (Fixed)
ExtractNodeNameListFromPdfиExtractRecordLevelFromPdfвFPdfPdfvtMimeисправили повторяющуюся ошибку off-by-one, где 1-базовое смещение, возвращаемоеAnsiFindKey, трактовалось как абсолютное байтовое смещение в развёрнутом PDF
Version 2.5.0
Добавлено
- Метаданные Document Part для PDF/VT (DPM, ISO 16612-2 §6.6):
TPdfVTSaveOptionsполучилDpmEntriesиDpmTarget, чтобы писатель мог прикрепить словарь/DPMк синтезированному узлу DPart с проверкой имён ключей по правилу второго класса префикса Annex E и правилам §6.6 NMTOKEN / уникальности / формыGTS_Managedна стороне валидатора - Потоковый обмен PDF/VT-2s (Annex A): новый модуль
FPdfPdfvtMimeпредоставляетBuildPdfVT2sStreamиValidatePdfVT2sStreamдля MIME-конвертаmultipart/mixed, несущего inline-чанки PDF/VT плюс профили ICC вложений, с правилом упорядочивания заголовкаX-PDFVT-Stream-version: 1и проверкой согласованностиNodeNameListмежду потоками TPdf.ValidatePdfVTтеперь выполняет авторитетный подсчёт JavaScript-действий черезFPDFDoc_GetJavaScriptActionCount, дополняя побайтовое сканирование имён/JavaScript
Исправлено (Fixed)
- Корректность PDF/VT
Trappedна базе PDF/X-4: значение перечисленияptvUnknownудалено (PDF/X-4 запрещает/Unknown),ptvUnspecifiedнормализуется к/Falseво время записи (отсутствие/Trappedтакже запрещено), а новая проблемаpvviTrappedInvalidпомечает отсутствующее илиUnknownзначение ValidatePdfVTComplianceтеперь разворачивает потоки объектов (PdfExpandObjectStreams) перед сканированием, поэтому каталог, OutputIntent или словарь Metadata, хранящиеся внутри сжатого ObjStm (PDF 1.5+, типично для производителей PDF/X-4), доступны для побайтового поиска
Изменено (Changed)
- PDF/VT-1 теперь наследует полные запреты содержимого PDF/X-4:
pvviAcroFormForbidden(/AcroFormили/XFA),pvviAdditionalActionsForbidden(каталог/AA),pvviMissingTrimBoxиpvviReferenceXObjectForbidden(Reference XObject, только X-5g/5pg) - Дедупликация между стандартами:
BuildDictObj,IccComponentCount, встроенный профиль sRGB ICC (GetSrgbIccProfile),PdfTextStr,PdfEnclosingObjNum,PdfDictRefNumиPdfExpandObjectStreamsбыли повышены из утроенных локальных копий вFPdfPdfa/FPdfPdfx/FPdfPdfvtв единое каноническое местоположение вFPdfPdfCommon; 3144-байтовый ICC-литерал теперь существует ровно один раз в кодовой базе
Version 2.4.0
Исправлено (Fixed)
InjectPdfUaMarkersбольше не теряет ссылку на/Infoтрейлера в файлах с таблицей перекрестных ссылок в виде потока (cross-reference-stream): локальная переменнаяSourceTrailerInfoRef(в которой отсутствовала обработка резервного сценария xref-stream) была заменена на общуюPdfSourceTrailerInfoRef(перенесенную из копии PDF/A, где резервный сценарий поддерживался начиная с версии v2.0.0)- Общая функция
PdfReadStreamBytesтеперь корректно обрабатывает косвенные ссылки/Length N G R(перенесено из локальной копии PDF/A), благодаря чему валидаторы PDF/VT, PDF/R и PDF/E больше не считывают неверно и не пропускают потоки метаданных XMP, созданные инструментами с использованием косвенного указания Length (Acrobat, Ghostscript)
Изменено (Changed)
- Дедупликация между стандартами: локальные копии
PdfReadTrailerвFPdfPdfaиFPdfPdfx, локальные копииSourceTrailerInfoRefвFPdfPdfaиFPdfPdfua, а также локальнаяPdfReadStreamBytesвFPdfPdfaбыли удалены — общие версии из модуляFPdfPdfCommonтеперь применяются повсеместно, что позволило сократить около ~330 строк дублирующегося кода и устранило необходимость синхронизации копий при поддержке - Закрытие долга по тестированию PDF/X: семь ранее не протестированных перечисления контент-классов (enums с нулевым покрытием) получили положительные тесты (
pvxiLzwForbidden,pvxiJavaScriptForbidden,pvxiFormFieldsForbidden,pvxiAdditionalActions,pvxiEmbeddedFilesForbidden,pvxiMissingTrimBox,pvxiTrappedNotSet)
Version 2.3.0
Изменено (Changed)
- Продолжается закрытие долга по тестированию PDF/A: еще три ранее не протестированных перечисления (enums с нулевым покрытием) получили положительные тесты;
pvaiForbiddenRenderingIntent(§6.2.9) отмечает нестандартное имя rendering-intent в потоке контента;pvaiJpeg2000Violation(§6.2.2) отмечает изображение JPXDecode с количеством компонентов/NumComponentsвне диапазона {1,3,4} в Part 2;pvaiInlineImageLzwForbidden(§6.1.10) отмечает встроенное изображение, использующее фильтр LZW в Part 2
Version 2.2.0
Изменено
- Регрессионные тесты cross-reference-stream: существующий
Validate_XrefStreamTrailer_DetectsConformanceтеперь также проверяет, что ссылка/Metadataкаталога разрешена и XMPpdfaid:partсчитывается на базе xref-stream (а не только/Root+/ID); новый тестInjectPdfA_XrefStreamBase_RoundTripsзащищает путь xref-stream инжектора, добавленный в v2.0.0; два кросс-стандартных теста (PdfE_XrefStreamBase_NotRejectedAsUnparsable,PdfR_XrefStreamBase_NotRejectedAsUnparsable) подтверждают, что валидаторы PDF/E and PDF/R больше не отклоняют PDF-файлы с xref-stream как не поддающиеся анализу - Закрытие тестового долга PDF/A:
Validate_MinimalPdf_FlagsRequiredMarkersутверждает, что базовый минимальный PDF вызываетpvaiMissingPdfAIdentifier,pvaiMissingOutputIntent,pvaiMissingIccProfile,pvaiMissingXmpMetadataиpvaiMissingXmpDates, устраняя разрыв симметрии с валидаторами PDF/E и PDF/X, которые уже имели аналогичные тесты; еще два перечисления с нулевым покрытием получили позитивные тесты:pvaiUnembeddedFontиpvaiSubsetMissingCidSet
Version 2.1.0
Исправлено
- PDF/E был случайно пропущен в исправлении cross-reference-stream в v2.0.0: как
InjectPdfEMarkers, так иValidatePdfEComplianceвсе еще вызывалиPdfReadTrailerбезAcceptXrefStream, поэтому инжектор PDF/E незаметно завершался сбоем на выводе PDF 1.5+ (значение по умолчанию дляSaveAsCopyв pdfium); обе точки вызова теперь передаютTrue - Общий резервный механизм cross-reference-stream в
PdfReadTrailerтеперь содержит проверку/Type /XRef, которая уже была в локальных копиях PDF/A и PDF/X, поэтому поврежденное смещениеstartxref, указывающее на несвязанный словарь, чисто завершается ошибкой вместо того, чтобы быть ошибочно распознанным как трейлер - Распознаватель косвенных ссылок
/LangвValidatePdfUaCompliance(v2.0.0) был недостижим:PdfFindObjDictнаходит только словари<<, тогда как строковый объект/Langпредставляет собой(...)или<...>без словаря; он заменен прямым сканированием тела объекта, которое находит строковый токен
Изменено
- Семь избыточных дубликатов вспомогательных функций (PdfStructureBytes, PdfHasName, PdfCountName, BuildStreamObj), которые были побайтово идентичными копиями общих версий из
FPdfPdfCommon, были удалены изFPdfPdfaиFPdfPdfua— общие версии теперь применяются повсеместно черезuses
Version 2.0.0
Исправлено
- Кросс-стандартный незаметный сбой: общая вспомогательная функция
PdfReadTrailer(используемая инжекторами и валидаторами маркеров PDF/UA, PDF/X, PDF/VT и PDF/R) теперь принимает параметрAcceptXrefStreamи переходит на словарь объектов cross-reference-stream при отсутствии ключевого словаtrailer(PDF 1.5+); ранее выводSaveAsCopyв pdfium (который использует cross-reference-stream) приводил к тихому сбою каждого инжектора маркеров — исходные байты копировались без изменений, а вызов по-прежнему возвращал успешное завершение; валидатор PDF/R-1.0 (чья база PDF 2.0 всегда является cross-reference-stream) фактически не выполнял никаких действий; зрелая реализация валидатора PDF/A была перенесена в общую вспомогательную функцию, так что теперь её преимущества доступны всем стандартам - Сканирование словаря трейлера в
InjectPdfUaMarkersиInjectPdfAMarkersтеперь использует учет глубины вложенностиPdfDictEndвместо простого поиска>>, поэтому трейлер, содержащий вложенный словарь (например,/Encrypt << ... >>), больше не обрывается перед конечной записью/Info
Изменено
TPdf.ValidatePdfUaтеперь подавляет грубую побайтовую ошибкуpvuaiFontNotEmbedded, если уже сработала точная ошибка объектной модели PdfiumpvuaiPdfiumFontNotEmbedded, благодаря чему отчет о предварительной проверке больше не содержит двух дублирующих строк «embed your fonts» для одного и того же дефекта- Проверка
pvuaiLangInvalidFormat(§7.2) теперь разрешает косвенную ссылку/Lang(N 0 R) до строкового объекта и проверяет содержимое, поэтому языковой тег с косвенной ссылкой больше не является слепой зоной
Version 1.99.0
Исправлено
pvuaiLangInvalidFormat(§7.2) больше не пропускает строки/Langв шестнадцатеричной кодировке: пары UTF-16BE (с BOMFE FF) и простые шестнадцатеричные строки ASCII теперь декодируются и проходят ту же грамматическую проверку BCP 47, что и литеральные строки(...), благодаря чему выявляется некорректный шестнадцатеричный тег/Lang, тогда как соответствующий стандарту (например, UTF-16BEen-US) больше не подвергается риску ложного срабатывания
Изменено
pvuaiFontMissingToUnicode(§7.21.7) теперь исключает/MacExpertEncodingнаряду с/WinAnsiEncodingand/MacRomanEncoding, что соответствует четырем условиям исключения, перечисленным в пункте
Version 1.98.0
Добавлено
pvuaiNeedAppearancesTrue(§7.18.4) помечает AcroForm, у которой флаг/NeedAppearancesимеет значение true, из-за чего внешний вид виджетов не фиксируется надежно, а вспомогательные технологии не могут связать их с деревом структуры; портировано из валидатора PDF/A и ограничено наличием/AcroFormдля сужения области сканирования
Изменено
- Регрессия корпуса veraPDF: пара успешных и неуспешных тестов для Reference-XObject (§7.20) и подмножеств CharSet/CIDSet (§7.21.4.2) интегрирована в метод
Live_Corpus_ValidatePdfUaMatchesConformance; успешные примеры для запрещенного значения ToUnicode (§7.21.7) и медиаклипа (§7.18.6.2) также добавлены в качестве защиты от ложных срабатываний (их неуспешные примеры используют разметку словаря, которую не фиксирует побайтовое сканирование, поэтому интегрирована только успешная сторона) - В список утверждений об успешном прохождении тестов корпуса добавлено 15 новых проверок без ложных срабатываний, так что каждая активная побайтовая и структурная проверка
pvuai*теперь тестируется на соответствующих стандарту примерах (ранее защищалось только около 30 из 60 активных проблем); проверкаpvuaiLangInvalidFormatбыла намеренно пропущена, поскольку побайтовый валидатор консервативно помечает строки/Langв шестнадцатеричном формате, которые он не может декодировать
Version 1.97.0
Исправлено
- Усиление безопасности
ValidatePdfUaStructureElements: обход цепочки родительских элементовEnclosingTableтеперь содержит счетчик переходов (ограниченный количеством элементов), предотвращая зависание вызывающей стороны при некорректном циклеParentIndexв синтетическом массиве элементов структуры; выделение памяти под массив идентификаторов размеченного содержимого вValidatePdfUaPageContentTaggingтеперь ограничено одним миллионом записей, что предотвращает выделение нескольких гигабайт памяти при поврежденном или вредоносномMarkedContentID
Изменено
- Документирующий комментарий к перечислению
pvuaiOrderedListMissingListNumberingтеперь точно описывает действие проверки: она помечает элементL, у которого значениеListNumberingвыходит за рамки набора Таблицы 347 стандарта ISO 32000-1 (отсутствие атрибута не помечается); предыдущий комментарий ошибочно утверждал, что проверка также обнаруживает упорядоченные списки без этого атрибута, чего реализация на самом деле не делает - Два некорректных примера несоответствия WMode из корпуса (
7.21.3.3-t02) теперь интегрированы в методLive_Corpus_ValidatePdfUaMatchesConformance— начиная с версии v1.95.0 поток CMap распаковывается с помощью FlateDecode, поэтому сравнение словаря с содержимым теперь выполняется на читаемой стороне; устаревший комментарий «not wired» был удален
Version 1.96.0
Добавлено
- Согласованность между стандартами: в
TPdf.ValidatePdfUaдобавлены две проверки, портированные из валидатора PDF/A; проверкаpvuaiAnnotationFlagsViolation(§7.18.1) помечает неисключенные аннотации с флагами Hidden, Invisible или NoView, которые нарушают чтение вспомогательными технологиями; проверкаpvuaiActionTargetMissing(§7.18.5) помечает действия GoToR, URI или SubmitForm, в которых отсутствует обязательный ключ цели (/F+/D, /URI, /F), делая ссылку непригодной для использования вспомогательными технологиями
Исправлено
- Объединение дерева структуры между страницами: цикл накопления
AllElemsвTPdf.ValidatePdfUaтеперь пересчитываетParentIndexкаждого элемента из локального массива страницы в объединенный массив; без этого дочерние элементы второй страницы сохраняли локальный индекс страницы, который указывал на срез первой страницы, незаметно нарушая все проверки, зависящие от ParentIndex (структура таблиц и списков, количество дочерних элементов H из §7.4.4, EnclosingTable) - Анализ RoleMap: функция
PdfReadRoleMapPairsбольше не прекращает сканирование ключей и значений, если значение является косвенной ссылкой (N 0 R) или массивом ([...]) — обе формы RoleMap валидны согласно стандарту ISO 32000-1 14.8.5.1; теперь она просто пропускает эту запись (Continue) вместо прерывания цикла (Break), что устраняет ложные срабатыванияpvuaiRoleMapUnresolvedдля типов, сопоставленных после косвенных ссылок или массивов
Изменено
FPdfPreflightReport: 18 активных значенийTPdfUaValidationIssue, которые ранее подпадали под общую категорию «missing marker» и общую рекомендацию, теперь имеют точные категории (Structure / Content / Metadata / Security) и рекомендации для конкретных разделов; также исправлена опечаткаpuaNone / pua1→pucNone / puc1в файлеPDFSpecComplianceMatrix.md
Version 1.95.0
Изменено
- Проверка полноты и корректности
TPdf.ValidatePdfUa: валидатор соответствия WMode в CMap (pvuaiCMapWModeMismatch, §7.21.3.3) и валидатор запрещенных значений ToUnicode (pvuaiToUnicodeForbiddenValue, §7.21.7) теперь распаковывают потоки CMap и ToUnicode, сжатые с помощьюFlateDecode, перед сканированием (ранее проверялись только несжатые потоки, что приводило к известным пропускам дефектов); общие вспомогательные функцииPdfInflateиPdfReadAndDecodeStreamперенесены изFPdfPdfa/FPdfPdfxвFPdfPdfCommon, чтобы все модули соответствия использовали одну копию
Добавлено
- Проверка
pvuaiSubsetCharSetEmpty(§7.21.4.2) помечает дескриптор шрифтаFontDescriptorподмножества Type 1, который содержит пустой строковый ключ/CharSet— существующая проверкаpvuaiSubsetMissingCharSetвыявляла только отсутствие ключа; пустой/CIDSetне помечается, так как шрифт без CID может легитимно содержать пустую битовую карту
Version 1.94.0
Добавлено
- Второй аудит
TPdf.ValidatePdfUaзакрыл шесть пробелов в покрытии стандарта ISO 14289-1, выявленных в ходе построчного обзора и повторного сканирования нативных API-функций Pdfium, которые уже были обернуты, но не использовались в ветке PDF/UA; проверкаpvuaiHeadingFormatInvalid(§7.4.3) помечает пользовательские теги заголовков, которые начинаются с H, но содержат разделители, пробелы или римские цифры вместо арабских цифр; проверкаpvuaiMissingDocumentOutline(§7.17) помечает многостраничный документ, который не содержит иерархическую структуру закладок (одностраничные документы исключены); проверкаpvuaiStructElementLangInvalid(§7.2) помечает элементы структуры, у которых значение/Langне является допустимым тегом BCP 47; проверкаpvuaiWidgetMissingPrintField(§7.14 / §7.18.4) помечает элементы структуры Widget без владельца атрибута PrintField; проверкаpvuaiLinkNotInStructureTree(§7.18.5) помечает документы, аннотации/Subtype /Linkкоторых не представлены в виде элементов структуры Link; проверкиpvuaiPdfiumAnnotationMissingContentsиpvuaiPdfiumLinkMissingContents(§7.18.1 / §7.18.5) добавляют точное сканирование аннотаций объектной модели Pdfium, которое исключает скрытые аннотации, аннотации вне области обрезки (CropBox), Popup и Widget аннотации, тем самым устраняя ложные срабатывания побайтового эвристического валидатора, который не может читать флаги/Fили область/Rect
Version 1.93.0
Добавлено
TPdf.ValidatePdfUaтеперь добавляет проход по объектной модели Pdfium поверх побайтового инспектора, повторяя архитектуру седьмого раунда PDF/A: он обходит текстовые объекты на каждой странице с помощью связкиFPDFTextObj_GetFont→FPDFFont_GetIsEmbedded(выявляяpvuaiPdfiumFontNotEmbedded, §7.21.4), а также сканирует каждый символ через функцииFPDFText_HasUnicodeMapError(pvuaiPdfiumUnicodeMapError, §7.21.7) иFPDFText_GetUnicode(pvuaiPdfiumNotDefGlyph, §7.21.8) — это значительно точнее побайтовой эвристики, которая срабатывает только при полном отсутствии программ шрифтов или таблицы/ToUnicode; обход досрочно завершается на трех уровнях: цикл страниц прерывается, когда все три типа проблем на уровне Pdfium уже найдены, цикл объектов на странице прерывается при первом же невстроенном шрифте, а сканирование символов пропускает проверку глифа.notdef, если уже обнаружена ошибкаUnicodeMapError; стандарт PDF/UA оставался последним валидатором без слоя объектной модели Pdfium
Version 1.92.0
Добавлено
- Создан
Tests.PdfR— первый тестовый файл для валидатора PDF/R-1 (FPdfPdfr), покрывающий проверку заголовков, запрет ObjStm, обнаружение растровых маркеров и защиту от ложных срабатываний на чистых файлах; все шесть тестовых наборов стандартов PDF теперь имеют специализированные файлы тестов: PdfA(80), PdfUa(101), PdfX(7), PdfE(5), PdfVT(15), PdfR(4) = всего 212 тестов
Version 1.91.0
Добавлено
ValidatePdfEandValidatePdfVTполучили проверки уровня содержимого, ранее доступные только в валидаторах PDF/A, PDF/UA и PDF/X:pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden(только для PDF/E),pveiEmbeddedFilesForbidden(только для PDF/E),pveiOpiForbidden,pvviLzwForbidden,pvviJavaScriptForbidden,pvviEmbeddedFilesForbidden,pvviOpiForbidden;TPdf.ValidatePdfEиTPdf.ValidatePdfVTтакже получили слой объектной модели Pdfium (pveiPdfiumFontNotEmbedded/pvviPdfiumFontNotEmbedded), который выполняет обход текстовых объектов страницы через функциюFPDFFont_GetIsEmbedded, прерывая обход при первом же невстроенном шрифте
Version 1.90.0
Добавлено
TPdf.ValidatePdfXтеперь накладывает проход по объектной модели Pdfium поверх побайтового инспектора: он обходит текстовые объекты на каждой странице черезFPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedи сообщает о невстроенном шрифте как оpvxiPdfiumFontNotEmbedded— это точнее побайтовой эвристики, которая запускается только при полном отсутствии программ шрифтов; обход прерывается на первом найденном невстроенном шрифте
Изменено
- Обход дерева структуры в
TPdf.ValidatePdfUa: вызов постраничной проверкиValidatePdfUaPageContentTagging(который строит карту соответствия идентификаторов размеченного содержимого и выполняет перекрестную проверку каждого текстового/графического объекта) теперь пропускается на последующих страницах, если проблемаpvuaiUntaggedContentуже была обнаружена — элементы структуры по-прежнему собираются для межстраничных проверок (уникальные идентификаторы примечаний, последовательность заголовков), но ресурсоемкий проход по разметке содержимого для каждой страницы прекращается досрочно
Version 1.89.0
Изменено
- Производительность объектной модели Pdfium на уровне
TPdf.ValidatePdfA: обход страниц и объектов теперь досрочно завершается на трех уровнях — цикл страниц прекращается при нахождении всех применимых проблем уровня Pdfium, цикл по объектам на странице завершается, когда найдены обе проблемы для объектов (встраивание шрифта + прозрачность), а сканирование символов текстовой страницы пропускает проход по.notdef, если уже произошла ошибкаUnicodeMapError; проверки доступности API черезAssigned()и флаги соответствия кэшируются в локальные булевы переменные один раз перед циклом, а не пересчитываются для каждой страницы, объекта или символа; на больших несоответствующих стандарту документах обход теперь может остановиться после первой страницы вместо полного сканирования; на соответствующих документах накладные расходы на страницу уменьшены благодаря отсутствию повторных вызововAssigned
Version 1.88.0
Добавлено
ValidatePdfXполучил восемь новых значенийTPdfXValidationIssueна уровне содержимого, охватывающих ограничения печатного обмена, которые стандарт PDF/X накладывает помимо маркеров формата файлов:pvxiLzwForbidden(/LZWDecode),pvxiJavaScriptForbidden(/JavaScript),pvxiFormFieldsForbidden(/AcroForm//XFA),pvxiAdditionalActions(/AA),pvxiEmbeddedFilesForbidden(/EmbeddedFiles//FileAttachment),pvxiOpiForbidden(/OPI//Alternates),pvxiMissingTrimBox(отсутствие/TrimBoxна любой странице) иpvxiTrappedNotSet(отсутствие/Trappedили его значение/Unknown); ранее валидатор PDF/X проверял только маркеры XMP/OutputIntent, это его первая проверка на уровне содержимого; общие вспомогательные функцииPdfStructureBytes,PdfHasNameиPdfCountNameдобавлены вFPdfPdfCommonдля совместного использования всеми модулями соответствия
Version 1.87.0
Добавлено
- Валидация PDF/UA теперь охватывает правила составных шрифтов ISO 14289-1 §7.21.3:
pvuaiCidSystemInfoMismatchпомечает шрифты Type0, у которых встроенная CMap и дочерний CIDFont расходятся в значенияхRegistry/Orderingили чейSupplementCIDFont превышает Supplement у CMap,pvuaiCMapNotEmbeddedпомечает CMap, на которые ссылаются по имени (черезEncodingилиUseCMap) и которые не являются предопределёнными CMap из таблицы 118 ISO 32000-1, аpvuaiCMapWModeMismatchпомечает встроенные CMap, чей атрибутWModeв словаре отличается от WMode в содержимом потока
Исправлено
- Проверка
pvuaiCidFontMissingCidToGidMapиз §7.21.3.2 пропускала словари CIDFontType2, в которых пара ключ/значениеSubtypeразделена переводом строки; теперь также помечается значение имениCIDToGIDMap, отличное отIdentity
Version 1.86.0
Добавлено
- Валидация PDF/UA теперь охватывает правила кодировки TrueType из ISO 14289-1 §7.21.6:
pvuaiTrueTypeEncodingInvalidпомечает несимвольные шрифты TrueType, у которых отсутствуетEncodingили значение не равно ниMacRomanEncoding, ниWinAnsiEncoding(напрямую или черезBaseEncoding), аpvuaiSymbolicTrueTypeEncodingпомечает символьные шрифты TrueType, несущие нестандартное имяEncoding
Version 1.85.1
Изменено
- Проверка порядка табуляции
pvuaiMissingTabsOrderпо ISO 14289-1 §7.18.3 теперь выполняется на уровне каждой страницы: каждая страница, содержащая аннотации, должна объявлять/Tabs /Sв собственном словаре страницы, поэтому соответствующая соседняя страница больше не скрывает страницу без этого объявления
Version 1.85.0
Добавлено
- Валидация PDF/UA теперь различает динамические и статические формы XFA согласно ISO 14289-1 §7.15:
pvuaiXfaDynamicпомечает формы, в конфигурации XFA которых параметрdynamicRenderустановлен вrequired
Изменено
- Прежний флаг-кандидат для любых XFA
pvuaiXfaPresentупразднён и больше не поднимается (статический XFA соответствует §7.15); значение перечисления сохраняется для совместимости API
Version 1.84.0
Добавлено
- Валидация PDF/UA теперь обнаруживает непомеченное реальное содержимое, требуемое ISO 14289-1 §7.1:
pvuaiUntaggedContentпомечает отображаемые текстовые и графические объекты, которые не охвачены деревом структуры страницы (через их идентификаторы маркированного содержимого) и не отмечены как Artifact - Новые вспомогательные функции уровня страницы
GetPageContentMarkInfosиValidatePdfUaPageContentTaggingс записьюTPdfPageContentMarkInfoдля непосредственного использования
Version 1.83.0
Добавлено
- Валидация PDF/UA теперь применяет модель заголовков ISO 14289-1 §7.4.4:
pvuaiHeadingModelMixedпомечает документы, смешивающие обобщённый тегHс нумерованными заголовкамиH1..Hn, аpvuaiHeadingMultipleInNodeпомечает узлы структуры, содержащие более одного дочернего заголовкаH
Version 1.82.0
Добавлено
- Валидация PDF/UA теперь разрешает RoleMap, требуемую ISO 14289-1 §7.1:
pvuaiRoleMapRemapsStandardпомечает записи RoleMap, переопределяющие стандартный тип структуры, аpvuaiRoleMapUnresolvedпомечает используемые нестандартные типы структур, чья цепочка RoleMap отсутствует, оборвана или циклична — косвенные цепочки, достигающие стандартного типа, принимаются, а неиспользуемые записи RoleMap не проверяются - Новые вспомогательные функции
PdfUaIsStandardStructType,PdfReadRoleMapPairs(с декодированием escape-последовательностей PDF-имён#hh) иValidatePdfUaRoleMapUsageдля непосредственного использования
Version 1.81.0
Добавлено
- Валидация PDF/UA теперь охватывает теги списков по ISO 32000-1, требуемые ISO 14289-1 §7.6:
pvuaiListStructureInvalidпомечает элементы LI вне контейнера L и части Lbl/LBody вне элемента LI, при этом разрешая вложенные списки и допустимое использование Lbl внутри элементов Note и BibEntry
Version 1.80.0
Добавлено
- Валидация PDF/UA теперь охватывает теги таблиц по ISO 32000-1, требуемые ISO 14289-1 §7.5:
pvuaiTableStructureInvalidпомечает ячейки TH/TD вне строки TR и строки или группы строк вне контейнера Table,pvuaiTableHeaderMissingScopeпомечает ячейки заголовка, связь которых не определяется ни атрибутом Scope, ни ассоциацией Headers/ID, аpvuaiTableHeadersUndefinedIdпомечает ссылки Headers в документах, не определяющих идентификаторов элементов структуры TPdfStructureElementпредоставляет атрибуты таблицыScope,HasHeaders,HeadersIds,ColSpanиRowSpan, разрешаемые в ходе обхода дерева структуры
Изменено
- Обход дерева структуры теперь читает все атрибуты разметки и таблицы за один проход по словарям атрибутов каждого элемента вместо одного сканирования на каждый атрибут
Version 1.79.1
Добавлено
- Пример
AnnotationsLabпортирован на Lazarus и C++Builder, присоединившись к существующему консольному примеру для Delphi
Исправлено
TPdf.CreateAnnotationмогла вызывать ошибку “Cannot set attachment points” для аннотаций разметки, использующих quad-точки (Highlight, Underline, StrikeOut, Squiggly), поскольку новая аннотация еще не имела слота quad для замены; теперь вместо этого она добавляет первый quad
Version 1.79.0
Добавлено
- Новый консольный пример
AnnotationsLabдля Delphi: создает аннотации Text, Highlight, Square и Circle, записывает их в PDF, затем перезагружает файл и перечисляет список аннотаций страницы
Version 1.78.0
Добавлено
- Новые
TPdf.MeasureTextиTPdf.MeasureTextWidth: измеряют отрисованную ширину и высоту строки для заданного шрифта и размера (в пользовательских единицах PDF, 1 единица = 1/72 дюйма) без добавления контента на страницу, что делает возможной логику компоновки и переноса слов поверхAddText; предоставляется отдельным модулемFPdfMeasureв виде помощника класса - Новый
TPdf.WrapText: жадный перенос слов, построенный наMeasureTextWidth, который разбивает текст по пробелам и упаковывает слова в строки не шире заданной ширины (в пользовательских единицах PDF); слишком длинное одиночное слово получает свою собственную строку (без разрыва внутри слова), возвращая завернутые строки в виде массива
Version 1.77.0
Добавлено
ValidatePdfAполучил три новых значенияTPdfAValidationIssue, охватывающих пункты, которые ранее оценивались как “NO” или “поведение ридера” в ходе предыдущего аудита пробелов (добавленные порядковые номера, существующие значения не изменены):pvaiPdfiumNotDefGlyph(PDF/A-2 6.2.11.8 — символ, который разрешается в Unicode 0 без ошибки сопоставления, симптом времени выполнения ссылки на глиф.notdef; обнаруживается через слой объектной модели Pdfium),pvaiWordBreakMissing(Уровень A 6.8.3.2 — строка show в потоке контента длиннее 20 символов без пробела, вероятное нарушение слитых слов; грубая эвристика, избегающая ложных срабатываний CJK) иpvaiLinkActionMissingTarget(6.6.3 — действие GoToR/URI/SubmitForm без ключа цели отображения, так что ридер не может его представить)
Version 1.76.0
Добавлено (Added)
ValidatePdfAполучил три новых значенияTPdfAValidationIssue(добавлены в конец списка, существующие значения не изменены):pvaiNameNotValidUtf8(PDF/A-2/3 6.1.8 — токен/BaseFontили/FontName, содержащий байты ≥ 0x80, которые не образуют валидную последовательность UTF-8),pvaiInlineImageLzwForbidden(PDF/A-2/3 6.1.10 — встроенное изображение в потоке содержимого страницы использует фильтр LZW или Crypt) иpvaiTrueTypeDifferencesForbidden(6.3.7 Cor.2 — несимвольный шрифт TrueType, чей словарь Encoding содержит/Differences)
Version 1.75.0
Добавлено (Added)
ValidatePdfAполучил три новых значенияTPdfAValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvaiIntegerImplementationLimit(PDF/A-2/3 6.1.13 — числовой токен, превышающий предел 32-битного целого числа со знаком 2,147,483,647),pvaiBlendModeNotWhitelisted(PDF/A-2/3 6.2.10 — значение/BMза пределами стандартного набора режимов наложения по ISO 32000-1 §11.3.5; дополняетpvaiTransparentColorSpaceдля PDF/A-1, которое допускает только Normal/Compatible) иpvaiHexStringOddDigits(6.1.6 — шестнадцатеричная строка<...>с нечетным количеством шестнадцатеричных цифр)
Version 1.74.0
Добавлено (Added)
ValidatePdfAполучил три новых значенияTPdfAValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvaiPermissionsViolation(6.1.12 — словарь/Perms, содержащий/DigestLocation,/DigestMethodили/DigestValueнаряду с/DocMDP),pvaiTransActionForbidden(PDF/A-2 6.5.1 — действие перехода Trans, обнаруживаемое через шаблон словаря действий/S /Transдля избежания ложных совпадений с/Transparency) иpvaiPdfiumObjectTransparency(PDF/A-1 6.4 — объект страницы содержит реальную прозрачность согласноFPDFPageObj_HasTransparency, расширяя уровень объектной модели Pdfium, представленный в v1.73.0, для перехвата эффектов режима наложения / мягкой маски, которые сканирование имен на уровне байтов может пропустить)
Version 1.73.0
Добавлено (Added)
TPdf.ValidatePdfAтеперь накладывает проход объектной модели Pdfium поверх инспектора на уровне байтов: он обходит текстовые объекты каждой страницы черезFPDFPage_GetObject→FPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedи сообщает о невстроенном отрисованном шрифте какpvaiPdfiumFontNotEmbedded(ISO 19005 6.3.4), а также загружает каждую текстовую страницу для сканированияFPDFText_HasUnicodeMapErrorи сообщает о нарушенном отображении Unicode какpvaiPdfiumUnicodeMapError(6.3.8). Эти проверки инспектор на уровне байтов выполнить не может — он видит только токены имен, а не разрешенные дескрипторы шрифтов или состояние сопоставления по каждому символу — и они объединяются с результатом на уровне байтов. Автономная функция на уровне байтовValidatePdfAComplianceосталась без изменений
Version 1.72.0
Добавлено (Added)
ValidatePdfAполучил пять новых значенийTPdfAValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvaiNeedsRenderingPresent(PDF/A-2 6.4.2 — каталог не должен содержать/NeedsRendering),pvaiDestOutputProfileRef(PDF/A-3 6.2.3 — OutputIntent не должен содержать/DestOutputProfileRef),pvaiEmbeddedFileMissingUF(PDF/A-3 6.8 — спецификация файла с/EFтакже должна содержать/UF),pvaiXmpPacketBytesAttr(6.7.5 — заголовок пакета XMP не должен содержать устаревший атрибутbytes=илиencoding=) иpvaiAnnotationToggleNoView(PDF/A-2 6.3.2 — бит/Fаннотации ToggleNoView, значение 512, запрещен)
Version 1.71.0
Изменено
ValidatePdfUaтеперь вызываетpvuaiOrderedListMissingListNumbering(ISO 14289-1 7.6): обходчик дерева структуры разрешает атрибут макетаListNumberingдля каждого элементаLчерез API атрибутов Pdfium и помечает любое значение вне набора таблицы 347 из ISO 32000-1 (Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha,None,Circle,Disc,Square). Отсутствующий атрибут не помечается, так как список может быть неупорядоченным; это закрывает последний оставшийся пробел по ISO 14289-1, зафиксированный в конце 5 раунда
Version 1.70.0
Добавлено
ValidatePdfUaполучил четыре новых значенияTPdfUaValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvuaiSubsetMissingCidSet(ISO 14289-1 7.21.4.2 — CID-подмножествоFontDescriptorдолжно объявлять/CIDSet),pvuaiToUnicodeForbiddenValue(7.21.7 — ToUnicode CMap не должен сопоставлять никакой код сU+FEFFилиU+FFFE; несжатые потоки сканируются на наличие выходных форм<FEFF>/<FFFE>),pvuaiLangInvalidFormat(7.2 —/Langдолжен быть допустимым тегом RFC 1766 / BCP 47; разрешающая грамматика принимаетen,en-US,zh-Hans,es-419и помечает явно несоответствующие значения) иpvuaiOrderedListMissingListNumbering(7.6 — сохранено для полноты API; пока не вызывается валидатором, поскольку для надежного отличия упорядоченных списков от неупорядоченных требуется значение атрибутаListNumbering, которое обходчик дерева структуры не предоставляет)
Version 1.69.0
Добавлено
ValidatePdfUaполучил два новых значенияTPdfUaValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvuaiWidgetOutsideForm(ISO 14289-1 7.18.4 — структурный элемент Widget должен быть вложен в элементForm; обходчик дерева структуры теперь проверяет тип прямого родителя каждого Widget’а) иpvuaiSubsetMissingCharSet(7.21.4.2 — Type 1 подмножествоFontDescriptorдолжно объявлять/CharSet, идентифицируемое по шестибуквенному префиксу имени подмножества+в/FontName)
Version 1.68.0
Добавлено
ValidatePdfUaполучил два новых значенияTPdfUaValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvuaiUriActionIsMap(ISO 14289-1 7.18.5 — словарь действий URI не должен содержать/IsMapсо значениемtrue, так как это отключает доступную цель ссылки) иpvuaiHeadingSequenceViolation(7.4.2 — нумерованные заголовки должны начинаться сH1, а нисходящая последовательность не должна пропускать промежуточный уровень, например,H1→H3является нарушением). Проверка заголовков — это первое правило PDF/UA на уровне дерева структуры в валидаторе:ValidatePdfUaStructureElementsтеперь обходит список типизированных элементов и проверяет последовательностьH1…H6(иH7+согласно 7.4.3) в порядке документа
Version 1.67.0
Добавлено
ValidatePdfUaполучил пять новых значенийTPdfUaValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvuaiLinkMissingContents(ISO 14289-1 7.18.5 — аннотация Link должна содержать альтернативное описание через/Contents),pvuaiAnnotationMissingContents(7.18.1 — любая неисключенная аннотация без/Contentsдолжна иметь альтернативное описание; Popup и Widget являются исключениями),pvuaiEmbeddedFileMissingName(7.11 — словарь спецификации файла должен содержать/Fи/UF),pvuaiMediaClipMissingAlt(7.18.6.2 — словарь данных медиаклипа должен содержать/CTи/Alt) иpvuaiCidFontMissingCidToGidMap(7.21.3.2 — встроенный Type 2 CIDFont должен содержать/CIDToGIDMap)
Version 1.66.0
Добавлено
ValidatePdfUaполучил пять новых значенийTPdfUaValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvuaiRoleMapMissing(ISO 14289-1 7.1 — тегированный документ с нестандартными типами структуры должен содержать/RoleMap),pvuaiOptionalContentAsKey(7.10 — словарь конфигурации дополнительного содержимого не должен содержать ключ автоматического состояния/AS),pvuaiXfaPresent(7.15 — наличие AcroForm/XFAпомечается, так как динамический XFA запрещен),pvuaiTrapNetAnnotation(7.18.2 — аннотации/TrapNetзапрещены) иpvuaiReferenceXObject(7.20 — ссылочные XObject-ы, определяемые по маркеру/Ref, запрещены)
Исправлено
ValidatePdfUaбольше не дает ложных срабатыванийpvuaiEncryptionPresentдля каждого зашифрованного файла: PDF/UA разрешает шифрование, если в ключе/Pсловаря шифрования установлен 10-й бит (значение 1024), что предоставляет доступ для вспомогательных технологий (7.16). Точное нарушение теперь сообщается через новыйpvuaiEncryptionPBitMissing;pvuaiEncryptionPresentсохранено в перечислении для совместимости API, но больше не вызывается валидатором на уровне байтов
Version 1.65.0
Добавлено
ValidatePdfAполучил пять новых значенийTPdfAValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvaiCidFontMissingCidToGidMap(ISO 19005-1 6.3.3.2 Cor.2 — встроенный Type 2 CIDFont должен содержать/CIDToGIDMap),pvaiSubsetMissingCharSet(6.3.5 — Type 1 подмножествоFontDescriptorдолжно содержать/CharSet),pvaiSubsetMissingCidSet(6.3.5 — CID-подмножествоFontDescriptorдолжно содержать/CIDSet),pvaiWidgetActionForbidden(6.6.1 — аннотация Widget не должна содержать/Aили/AA) иpvaiOptionalContentAsKey(ISO 19005-2 6.9 — словарь конфигурации дополнительного содержимого не должен содержать ключ автоматического состояния/AS, что теперь актуально, поскольку PDF/A-2 разрешает дополнительное содержимое)
Version 1.64.0
Добавлено
ValidatePdfAполучил восемь новых значенийTPdfAValidationIssue(добавлены порядковые номера, существующие значения не изменены):pvaiHeaderBinaryMarkerMissing(ISO 19005-1 6.1.2 — заголовок%PDF-x.yдолжен сопровождаться комментарием%с как минимум четырьмя байтами больше 127),pvaiExternalStreamRef(6.1.7 — словарь потока не должен содержать/F,/FFilterили/FDecodeParms),pvaiOutputIntentScheme(6.2.2 —/Sв OutputIntent должно быть/GTS_PDFA1),pvaiInfoXmpDateMismatch(6.7.3 — InfoCreationDate/ModDateдолжны также присутствовать какxmp:CreateDate/xmp:ModifyDate),pvaiMarkInfoMissing(6.8.2.2 — Уровень A требует/MarkInfoс/Marked true),pvaiAnnotationApDictViolation(6.5.3 Cor.2 — словарь/APаннотации должен содержать только/N),pvaiEmbeddedFileMissingAFRelationship(ISO 19005-3 Annex E.2 — каждая спецификация связанного файла должна содержать/AFRelationship) иpvaiJpeg2000Violation(ISO 19005-2 6.2.8.3 — изображение JPEG2000 должно объявлять 1, 3 или 4 компонента)
Исправлено
ValidatePdfAбольше не дает ложных срабатыванийpvaiAnnotationFlagsViolationна документах, которые используют однобуквенное имя ресурса шрифта, например/Font << /F 5 0 R >>; сканирование флага/Fтеперь ограничено контекстом аннотации (/Subtypeтипа аннотации), что соответствует задокументированному поведению (6.5.3)ValidatePdfAтеперь сообщает о требовании PDF/A-3 к связанному файлу для каждого файла индивидуально: документ помечается только тогда, когда встроенный/Type /Filespec, который ссылается на встроенный поток через/EF, не имеет/AFRelationship, вместо предыдущей проверки всего документа целиком (ISO 19005-3 Annex E.2)- Добавлено устаревшее действие
/SetStateв набор запрещенных действий наряду с/SetOCGState, так что имя действия из PDF Reference перехватывается напрямую (6.6.1)
Version 1.63.0
Добавлено (Добавлено)
- Добавлены
TPdf.MeasureTextиTPdf.MeasureTextWidth: измеряют ширину и высоту отрисовки текста заданным шрифтом и размером без добавления содержимого на страницу (в пользовательских единицах PDF, 1 единица = 1/72 дюйма), что позволяет вычислять размещение элементов и автоматический перенос строк поверхAddText; предоставляется отдельным модулемFPdfMeasureв виде class helper
Изменено (Изменено)
Demo\Delphi\MergePDF,Demo\CBuilder\MergePDFиDemo\Lazarus\MergePDFулучшены для всех трёх IDE: выбор диапазона страниц пофайлово, необязательный путь вывода, дедупликация, журнал выполнения, кнопка отмены и сводка объединения; закладки и метаданные импортируются из первого источника- Демо-примеры
CreatePDFдля всех трёх IDE теперь включают опцию «Европейский текст» для ввода текста с диакритиками на чешском, французском, немецком, испанском, португальском, польском и турецком языках, для проверки выбора шрифта и обработки Unicode (старый примерEuropeanTextинтегрирован) - Удалены примеры
ExtractTextPagesиEuropeanText: функциональность постраничного извлечения текстаExtractTextPagesтеперь охвычается опциями диапазона страниц и разделителя вExtractText; многоязычный рендерингEuropeanTextинтегрирован вCreatePDF
Version 1.62.2
Исправлено (Исправлено)
- Снова сгенерированы заголовки C++Builder (
.hpp) для всех версий и платформ RAD Studio (Win32/Win64/Win64x); они разошлись с исходниками Pascal, оставив устаревшие сигнатуры функций и отсутствующие units, которые попадали к пользователям C++Builder через исходную поставку
Version 1.62.1
Исправлено (Исправлено)
- Восстановлена сборка исходников в RAD Studio 12 Athens и более ранних версиях: присваивание
TArray<Byte>в пути валидации PDF/UA использовало неявное преобразование массива, доступное только в Delphi 13, которое не компилировалось в старых IDE
Version 1.62.0
Добавлено (Добавлено)
TPdf.RenderPageThumbnailрендерит любую страницу по индексу в bitmap с сохранением пропорций, не меняя текущую страницу документа, загруженную страницу и не вызываяOnPageChange
Исправлено (Исправлено)
TPdfThumbnailViewбольше не управляетPageNumberдокумента host во время отрисовки; раньше каждый repaint заново загружал страницы, вызывалOnPageChangeи выбрасывал текстовую страницу, что могло нарушать связанныйTPdfViewи запускать циклы repaint. Теперь миниатюры рендерятся черезRenderPageThumbnailбез таких побочных эффектов- Проверка соответствия PDF/X теперь анализирует документы с cross-reference streams (PDF 1.6, типично для PDF/X-4) и объекты, хранящиеся в compressed object streams, вместо того чтобы помечать такие файлы как полностью несоответствующие; маркер
GTS_PDFXVersionчитается и из element-form, и из RDF attribute-form XMP - Проверка PDF/R теперь сообщает
pvriInfoXmpMismatch, когда словарь Info и XMP расходятся в Producer или Creator; раньше проблема была объявлена, но никогда не поднималась - Таймеры form-fill отслеживаются по запросу, поэтому документ, который запускает несколько таймеров одновременно, например интервал JavaScript рядом с миганием курсора поля, сохраняет их все вместо того, чтобы терять все кроме самого последнего
- Отрисовка
TPdfViewи его публичные методыRenderPage/RenderTileтеперь удерживают блокировку рендеринга документа, сериализуясь с рендерингом того жеTPdfиз worker thread, поскольку PDFium не является потокобезопасным - Текст вне ASCII, записываемый в метаданные PDF/X, PDF/R и PDF/VT (OutputIntent condition names, Creator, Producer), теперь кодируется как строка UTF-16BE по ISO 32000-1 §7.9.2.2 вместо сырого UTF-8, который совместимые читатели могли бы прочитать неверно
- Помощники соответствия корректно читают встроенные потоки метаданных, у которых
/Lengthявляется косвенной ссылкой, загружают исходные байты черезReadBuffer, чтобы короткое чтение завершалось чисто, и отвергают отрицательный offsetstartxrefвместо риска чтения вне диапазона
Version 1.61.0
Изменено (Изменено)
- Исправления объявлений FFI/ABI, которые могут потребовать пересборки кода, реализующего затронутые callback'и: callback form-fill
FFI_OpenFileтеперь имеетcdecl(Win32 stack convention), а параметрvalueвFPDFAnnot_SetStringValueиFPDFAttachment_SetStringValueтеперь имеет типFPDF_WIDESTRING(UTF-16LE), чтобы соответствовать заголовкам PDFium - Callback'и progressive-load
FX_FILEAVAIL.IsDataAvailиFX_DOWNLOADHINTS.AddSegmentтеперь принимают offset'ыsize_t, аsize_tимеет ширину указателя в Free Pascal / Lazarus Win64, где раньше он обрезался до 32 бит, что исправляет вызовы API data-availability иoutsize_tв FPC Win64
Исправлено (Исправлено)
- Безопасность памяти: use-after-free таймера form-fill при уничтожении
TPdfс активным курсором AcroForm; двойнойFPDF_CloseDocumentна пути ошибкиImportNPagesToOne; исключения Pascal, выходящие через callback'иFPDF_FILEWRITE/FPDF_FILEACCESSза границу C во время сохранения и вставки JPEG; и переполнение целого при извлечении текста при чтении от стартового индекса до конца страницы TPdfFuture<T>теперь надёжно доставляет свой callback результата; ответ раньше почти всегда терялся и мог затронуть освобождённый поток, потому что worker освобождал сам себя до выполнения поставленного в очередь ответа- Вывод PDF/A, PDF/X, PDF/E, PDF/R, PDF/VT и PDF/UA теперь записывает cross-reference entries ровно по 20 байт, как требует ISO 32000-1 §7.5.4
- Внедрение маркера стандартов больше не разрушает словарь, когда удалённый ключ, например
/Trapped, был последней записью, из-за чего раньше проглатывался закрывающий>>и получался повреждённый объект - Потоки ICC profile в OutputIntent теперь объявляют требуемое количество компонентов
/Nдля PDF/X и PDF/VT, уже присутствующее для PDF/A; зашифрованные исходные документы расшифровываются перед внедрением маркеров PDF/X, PDF/E, PDF/R, PDF/VT и PDF/UA, так что результат получается корректным, а не тихо повреждённым - BOM xpacket UTF-8 в сгенерированном XMP теперь выводится как точные байты, что исправляет повреждение на установках Delphi, у которых ANSI code page не Latin-1; трейлеры инкрементального обновления теперь сохраняют ссылку
/Infoдокумента SaveAsс компрессией больше не обрезает потоки, у которых/Lengthявляется косвенной ссылкой, а перестроенные cross-reference tables теперь используют 20-байтные записи, реальные номера генерации и убирают устаревший указатель/Prev- Валидация соответствия читает маркеры версии XMP в attribute-form для PDF/E и PDF/X, так что распознаются PDF/X-4 файлы, сериализованные как атрибуты, требует точный идентификатор
PDF/E-1, корректно читает потоки метаданных с косвенным/Lengthи больше не путает ключ/IDили/StructTreeRootу structure element при проверке трейлера PDF/UA; некорректный offsetstartxrefбольше не вызывает ошибку диапазона TPdfThumbnailView: последняя страница теперь достижима полосой прокрутки, текущая страница документа host восстанавливается после отрисовки миниатюр, и стандартная обработка mouse-leave снова отправляется- Битмапы страниц и изображений в оттенках серого больше не рендерятся с неправильной палитрой;
TPdfViewбольше не остаётся с висящей ссылкой, когда егоTPdfосвобождается первым - Отчёты preflight: HTML сохраняется как UTF-8, чтобы соответствовать объявленному charset, а экранирование JSON-строк формирует корректные последовательности
\uдля не-ASCII символов в Free Pascal - Тестовые сборки: диалог напоминания о trial теперь появляется вместо того, чтобы быть подавленным до показа
TPdfStreamAdapterтеперь отвергает потоки больше 4 GiB с понятной ошибкой вместо тихого усечения длины, передаваемой в PDFium
Version 1.60.1
Изменено (Изменено)
- Демо AccessibilityReader для Delphi, Lazarus и C++Builder теперь выполняют чтение вслух на
TPdfReadingSession: каждая страница собирается в один озвученный фрагмент черезBuildSpokenTextFromWords, позиции слов SAPI подаютFeedSpokenPosition, а сессия переходит по страницам и управляет курсором слов просмотра, заменяя ручную оркестрацию, которая раньше была в каждом демо - Отслеживание караоке на уровне слова в демо теперь работает и с NVDA как speech engine:
EstimatePacingзадаёт темп reading cursor по elapsed speaking time, тогда как раньше NVDA читал вслух без какого-либо word tracking - Pause и Resume в демо теперь работают и с NVDA:
ResumeRestartsChunkперечитывает текущую страницу с начала при Resume, тогда как SAPI сохраняет своё нативное in-place pause and resume
Version 1.60.0
Добавлено (Добавлено)
- Живой рендеринг для слабовидящих в
TPdfView: новые параметры рендерингаreInvertиreNightDuotoneперекрашивают каждый отрендеренный фрагмент страницы, то есть полную инверсию цветов или ночную duotone палитру, до того как рисуются наложения поиска, выделения, чтения и курсора слов, перенося существующие преобразования цвета bitmap в интерактивный просмотрщик для одностраничного и разворотного макетов; переключение параметров сразу перерисовывает экран NightDuotoneInkиNightDuotonePaperнастраивают ночную палитру, по умолчанию задавая янтарный текст на чёрной странице; при установке обоих параметров выигрываетreInvert
Version 1.59.0
Добавлено (Добавлено)
TPdfReadingSession: компонент оркестрации чтения вслух, независимый от движка речи. Он хранит курсор фрагмента, курсор слов и состояние воспроизведения (Play/PlayFrom/Pause/Resume/Stop), проходит по загруженным фрагментамTPdfSpokenTextпо мере того, как host сообщает о простое движка черезTick, переводит spoken-text offsets обратно в символы страницы и автоматически управляет подключённым курсором словTPdfView; host подключает любой движок речи черезOnSpeakи события запросов cancel / pause / resume, так что библиотека не связывается напрямую ни с каким speech APIFeedSpokenPositionпотребляет word positions двигателя, например SAPIStatus.InputWordPosition;EstimatePacingсEstimatedWordsPerMinuteзадаёт темп двигателям без position signal;ResumeRestartsChunkперечитывает текущий chunk для движков без нативного pauseOnChunkChange,OnWordChangeиOnFinishedсрабатывают только при реальных изменениях, а освобождённый подключённый view автоматически отсоединяется, так что код host остаётся без мерцания и устойчивым к сбоям
Version 1.58.0
Добавлено (Добавлено)
EstimateSpokenWordIndexоценивает, какое слово произносит speech engine, по elapsed time и скорости слов в минуту, давая более длинным словам пропорционально больше времени, чтобы engines, которые не сообщают position слова, такие как клиент NVDA controller, тоже могли управлять word-level reading cursor; вызывающий передаёт elapsed time, поэтому routine остаётся clock-free и подходит для unit testing
Version 1.57.0
Добавлено (Добавлено)
- Сборка spoken-text с двухдоменным отображением для отслеживания чтения вслух:
BuildSpokenTextFromWordsиSpokenTextAppendстроят строку, передаваемую text-to-speech engine, из word boxes страницы, одновременно записывая span table, аSpokenToPageCharпереводит reported spoken offset, например SAPIStatus.InputWordPosition, обратно в индекс символа страницы, чтобы word-level highlight tracking оставалось корректным, когда spoken text не равен всему тексту страницы, например при skipped regions, per-unit reading и pronunciation overrides TPdfSpokenTextиTPdfSpokenSpanнесут spoken string и исходные page ranges, из которых он был построен; offsets на вставленных separators переходят к следующему mapped word, а offsets за пределами mapped runs сообщают об отсутствии совпадения
Version 1.56.9
Добавлено (Added)
Demo\Delphi\PreflightReportдобавляет предпросмотр Action Plan, который сводит в один remediation checklist непроходные требования, приоритеты, следующие шаги, коды проблем и рекомендацииDemo\Delphi\PreflightReportCliпринимаетplan/actionplanкак формат вывода для запуска одного файла и пакетной обработки, и пишет тот же remediation checklist в текстовый файл
Изменено (Changed)
- Оба демо-примера Delphi PreflightReport теперь показывают счетчики состояний pass / action / review вместе с общим количеством требований и проблем
Version 1.56.8
Изменено (Изменено)
ViewerInteractionLabтеперь добавляет управление переходом по страницам, ручной масштаб, логирование координат по щелчку дляDeviceToPage/PageToDeviceи более четкий лог взаимодействия для проверок выбора, поиска, поворота и навигации- Страницы readme
ViewerInteractionLabтеперь описывают добавленный workflow взаимодействия во всех локализованных демо readme
Version 1.56.7
Добавлено (Добавлено)
AccessibilityWorkbenchCliсопоставляет каждое найденное finding с WCAG 2.1 Success Criteria и ISO 14289-1 (PDF/UA-1), показывает секцию standards-coverage в отчетахAccessibilityWorkbenchCliвычисляет задокументованный accessibility score от 0 до 100 по опубликованной шкале штрафов и зонам excellent / good / needs work / poor, с выводом по файлу и средним значением для пачкиAccessibilityWorkbenchCliпринимаетfailscore=N, чтобы завершать запуск с кодом выхода 2, если хотя бы один файл ниже NAccessibilityWorkbenchCliпишет лог SARIF 2.1.0, когда имя сводки пакета заканчивается на.sarif, с одним правилом на тип finding и тегами WCAG 2.1 и PDF/UA для CI и code-scanningAccessibilityWorkbenchCliдобавляет командуversion, которая выводит связанную версию PDFium Delphi Component
Version 1.56.6
Добавлено (Добавлено)
IntakeWorkbenchCliвычисляет SHA-256 forensic hash каждого входного файла, с переходом кunavailableна компиляторах безSystem.Hash, и сообщает его во всех форматахIntakeWorkbenchCliпринимаетpasswords=file.txtдля пробного снятия блокировки у документов с паролем из списка кандидатов, записывая индекс совпавшего кандидата без вывода текста пароляIntakeWorkbenchCliпринимаетcopyto=dirи помещает каждый проверенный файл в подпапку по уровню рискаIntakeWorkbenchCliпишет SARIF 2.1.0, когда имя сводки пакета заканчивается на.sarif, добавляя одно правило на флаг риска и один результат на отмеченный файл для CI и code-scanningIntakeWorkbenchCliдобавляет командуversion, которая выводит связанную версию PDFium Delphi Component
Version 1.56.5
Добавлено (Добавлено)
IntakeWorkbenchCliтеперь выводит рекомендуемые действия после intake: accept, request-password, manual-review, quarantine, deduplicate, и раскрывает счетчики действий в сводках пакетаAccessibilityWorkbenchCliтеперь выводит рекомендуемые remediation действия: pass-through, remediate-tags, run-ocr, remediate-semantics, manual-review, с соответствующими счетчиками в пачке
Изменено (Изменено)
- Оба CLI-дэмо для инструментальной обработки теперь показывают рекомендованное действие в консоли, text, HTML, JSON и CSV, поэтому операторы пакета могут маршрутизировать файлы без риска постобработки и полей статуса
Version 1.56.4
Исправлено (Исправлено)
- Чтение аннотаций, закладок или аннотаций ссылок в цикле больше не протекает строками предыдущего элемента: результатные записи
TPdfAnnotationTBookmarkиTLinkAnnotationтеперь очищаются с инициализацией с учетом managed types, а не нулевой инициализацией сырой памяти, поэтому документы с очень большим количеством текстовых аннотаций больше не раздувают память процесса на весь срок жизни приложения - При уничтожении
TPdfс зарегистрированным обработчикомOnUnsupportedFeatureэтот обработчик теперь отсоединяется от процессного глобального PDFium callback, и последующая загрузка документа из другого экземпляраTPdfбез собственного обработчика больше не может попасть в освобожденный компонент (use-after-free)
Version 1.56.3
Исправлено (Исправлено)
AccessibilityWorkbenchCliбольше не считает пустые страницы heuristic reading-order страницами, поэтому tagged документы с пустыми разделителями сохраняют корректный accessibility статус; страницы без читаемого контента теперь сообщаются отдельно- Определение заголовка таблицы в
AccessibilityWorkbenchCliбольше не переноситTHячейки вложенной таблицы во внешнюю таблицу, а имена полей формы и шрифтов сравниваются с учетом регистра, поэтому разные поля не сливаются - Инвентаризация URL host в
IntakeWorkbenchCliтеперь удаляет части userinfo, query и fragment, поэтому ссылка вроде[email protected]относится к реальному хосту, а целиmailto:теперь учитывают домен, а не остаются невидимыми - Markdown-отчеты
IntakeWorkbenchCliэкранируют обратные кавычки в путях, host и именах вложений, управляемых атакующим, чтобы формат отчета не ломался из документа
Изменено (Изменено)
AccessibilityWorkbenchCliтеперь сообщает font-scan и form-field-scan ошибки отдельными счетчиками, отмечает не встроенные шрифты с встроенными экземплярами и обрезает длинные списки шрифтов явным маркером усечения- Пакетные сводки
IntakeWorkbenchCliдобавляют столбец количества attachment-annotation, а пересчет аннотаций по страницам ограничен 20000 на страницу и это ограничение указывается во всех форматах
Version 1.56.2
Добавлено (Добавлено)
AccessibilityWorkbenchCliтеперь проверяет встраивание шрифтов, tooltip полей форм, источник порядка чтения, структуры документа, структуру таблиц и списков, подозрительный альтернативный текст и более подробные сведения проверки по страницам, чтобы пакетные отчеты accessibility выявляли больше целей для исправленияIntakeWorkbenchCliтеперь сообщает лимиты сканирования страниц, действия launch и remote-go-to, инвентари host URI, количество аннотаций, неподдерживаемые функции PDFium, дублирующиеся идентификаторы документов и расширенные флаги риска для автоматической проверки intake
Изменено (Изменено)
IntakeWorkbenchCliпринимаетmaxpages=Nв режимах одного файла и пакетной обработки, чтобы ограничить сканирование страниц каждого документа, продолжая формировать отчеты metadata, attachment, script, XFA, signature и risk
Version 1.56.1
Исправлено (Исправлено)
- Загрузка старого
pdfium.dll, в котором отсутствует более новый экспорт, теперь завершается корректной ошибкой: путь сбоя сбрасывает каждую связанную точку входа API, поэтому проверкиAssigned()(например, дляFPDF_GetLastErrorилиFPDF_GetSecurityHandlerRevision) сообщают, что библиотека не загружена, вместо вызова уже выгруженного модуля и падения с нарушением доступа UnloadLibraryтеперь очищает все привязки API PDFium, а не только необязательные вспомогательные функции V8, поэтому после освобождения DLL не остаются устаревшие указатели функций
Version 1.56.0
Добавлено (Добавлено)
- Пословный karaoke курсор чтения в
TPdfView:TrackReadingWordAtсопоставляет смещение символа текущего слова движка text-to-speech, например SAPIStatus.InputWordPosition, с прямоугольниками слов страницы, выделяет содержащее его слово отдельным оверлеем над блоком чтения, прокручивает его в видимую область и возвращает индекс слова, чтобы произносимое слово подсвечивалось по мере продвижения голоса SetReadingWordиClearReadingWordзадают или очищают выделенное слово напрямую изTPdfWordBox; повторная установка того же слова является no-op, поэтому пословное отслеживание не вызывает мерцания просмотраReadingWordColorиReadingWordFollowуправляют цветом курсора слова и тем, прокручивает ли просмотр произносимое слово автоматически в видимую область
Version 1.55.2
Исправлено (Исправлено)
- ViewerInteractionLab теперь дает строкам панели инструментов больше вертикального пространства, поэтому Open PDF, Create Sample, навигация, поиск и элементы выбора больше не перекрываются при масштабированных шрифтах
Version 1.55.1
Исправлено (Исправлено)
- ViewerInteractionLab теперь размещает Prev, Next и Rotate во второй строке панели инструментов, избегая начального перекрытия с Open PDF и Create Sample
Version 1.55.0
Добавлено (Добавлено)
- Мост от word boxes к выделению для сценария «прочитать и выделить»:
TPdfView.SelectWordBoxиSelectWordSpanвыбирают один word box или span word boxes на одной странице изPageWordBoxesпо их диапазонам символов, чтобы текущее читаемое слово или строку можно было также выделить и скопировать WordBoxIndexAtCharIndexсопоставляет индекс символа с содержащим его word box, обеспечивая пословную подсветку по мере продвижения курсора TTS
Version 1.54.0
Добавлено (Добавлено)
- Голосовые accessors для заполнения форм, читающие сфокусированное поле прямо из логического курсора:
FocusedFormFieldValue,FocusedFormFieldNameиFocusedFormFieldDetailsвTPdfиTPdfViewсообщают значение текущего поля, читаемое человеком имя, сначала из tooltip/TU, а при его отсутствии из/T, и полныйTPdfFormFieldInfoс типом, флагами и вариантами, то есть всё, что голосовому UI нужно озвучивать при проходе по форме
Исправлено (Исправлено)
FocusedFormFieldValueчитает поле черезFocusedFormFieldIndex, а не через интерактивный фокус pdfium, поэтому голосовое заполнение получает правильное значение даже без экранной каретки, при этом существующийFocusedFormFieldTextпо-прежнему отражает фокус pdfium и не меняется
Version 1.53.0
Добавлено (Добавлено)
- Подсветка на уровне слов:
TPdf.PageWordBoxesиTPdfView.PageWordBoxesразбивают страницу на записиTPdfWordBox, каждая из которых содержит текст слова, его диапазон символов и ограничивающий прямоугольник в координатах страницы, чтобы средство специальных возможностей могло по очереди подсвечивать каждое произнесённое слово, передавая этот прямоугольник вSetReadingHighlight BuildWordBoxesраскрывает шаг tokenization отдельно, превращая текст страницы в word boxes с диапазонами символов
Version 1.52.0
Добавлено (Добавлено)
- Помощники рендеринга для слабовидящих
InvertPdfBitmap,GrayscalePdfBitmapиDuotonePdfBitmapприменяют цветовые преобразования к отрендеренному 32-bit bitmap прямо на месте, чтобы средство специальных возможностей могло показывать страницы в инверсии, dark-mode, в градациях серого или в пользовательской двухцветной схеме, например с тёмным фоном и светлым текстом - Преобразования выполняются по пикселям и ведут себя одинаково в VCL и Lazarus/LCL, не изменяя размеры bitmap
Version 1.51.0
Добавлено (Добавлено)
- Единицы чтения уровня предложения для вспомогательного listen-reading:
TPdf.ReadingUnits,TPdf.DocumentReadingUnitsиTPdfView.ReadingUnitsлинеаризуют поток читаемого содержимого в упорядоченные записиTPdfReadingUnitразмером с предложение, каждая из которых содержит озвучиваемый текст, семантический вид, страницу, прямоугольники подсветки и тег языка, чтобы экранный диктор мог идти по странице или по всему документу по одной произносимой единице за раз NextReadingUnitOfKindНаходит следующую или предыдущую TPdfReadingUnit, у которой Kind совпадает с запрошенным TPdfContentFragmentKindBuildReadingUnitsнапрямую преобразует любыеTPdfContentFragmentsв единицы чтения: заголовки и описания figure или alt остаются целыми, абзацы делятся по границам предложений, десятичные точки сохраняются, а курсор чтения представляет собой обычный индекс, которым владеет вызывающий код
Version 1.50.0
Добавлено (Добавлено)
ValidatePdfAтеперь умеет проверять документы PDF 1.5+, в которых каталог, OutputIntent или другие словари хранятся внутри сжатых объектных потоков (/Type /ObjStm). Объектные потоки распаковываются, и переносимые ими объекты разрешаются, поэтому такие документы проверяются по существу, а не помечаются как лишённые маркеров PDF/A
Version 1.49.5
Исправлено (Исправлено)
ValidatePdfAбольше не сообщает об отсутствии описанияpdfaExtension:schemasкак о проблеме. Схема идентификатора PDF/A (pdfaid) общеизвестна, поэтому ни veraPDF, ни PDF/A-2/-3 не требуют для неё описания схемы-расширения, и пометка её отсутствия ошибочно дискредитировала каждый соответствующий стандарту сторонний PDF/A. Документы, создаваемые самой библиотекой, по-прежнему включают это описание
Version 1.49.4
Исправлено (Исправлено)
ValidatePdfAтеперь определяет уровень соответствия, когда идентификатор PDF/A записан в виде XML-атрибутов (pdfaid:part="2"), а не дочерних элементов, поэтому документы в форме атрибутов больше не помечаются с неизвестным уровнем. Это также устраняет каскадную ошибку, при которой необнаруженный уровень заставлял проверки, специфичные для конкретной части, откатываться к строгим правилам PDF/A-1 и ошибочно помечать встроенные файлы и прозрачность, которые PDF/A-2 и PDF/A-3 допускают
Version 1.49.3
Исправлено (Исправлено)
ValidatePdfAтеперь проверяет документы PDF 1.5+, у которых данные перекрёстных ссылок представлены cross-reference stream (файлы без ключевого словаtrailer). Уровень соответствия, трейлерный/IDи остальные маркеры считываются из словаря cross-reference stream, поэтому такие документы проверяются по существу, а не помечаются как полностью несоответствующие
Version 1.49.2
Исправлено (Исправлено)
ValidatePdfAбольше не сообщает о ложной проблеме невстроенного шрифта в документах, которые встраивают все свои шрифты. Прежняя эвристика сравнивала количество токенов/FontDescriptorс числом встроенных программ шрифтов, но каждый встроенный шрифт даёт два токена/FontDescriptor(ссылку на словарь шрифта плюс объект дескриптора), поэтому каждый файл со встроенными шрифтами ошибочно помечался. Теперь проверка сообщает только о документе, который ссылается на шрифты, но при этом не встраивает ни одной программы шрифта, что согласуется с соответствующим исправлением вValidatePdfUa
Version 1.49.1
Исправлено (Исправлено)
- Вывод PDF/A теперь проходит проверку как соответствующий PDF/A-1b и PDF/A-1a в veraPDF: встроенный поток ICC-профиля sRGB OutputIntent (на который ссылается
/DestOutputProfile) теперь объявляет требуемое количество компонентов/N(3 для встроенного RGB-профиля), как предписывает ISO 19005-1 6.2.3.2. Документы, создаваемыеSaveAsPdfA, ранее не проходили строгую проверку PDF/A-1, поскольку поток целевого профиля опускал/N; значение выводится из заголовка ICC-профиля, поэтому переданный вызывающей стороной профиль CMYK или Gray также получает корректное количество
Version 1.49.0
Исправлено (Исправлено)
ValidatePdfUaбольше не сообщает о ложно отсутствующей XMP-идентификации в соответствующих требованиям тегированных PDF — идентификатор PDF/UA (pdfuaid:part),dc:title, даты XMP и трейлерный/IDтеперь считываются из байтов исходного документа, а не из пересохранённой копии, в которой отсутствуют XMP-поток/Metadataи, для файлов с cross-reference-stream, трейлерный/ID- Проверка встраивания шрифтов в
ValidatePdfUaисправлена так, что документ, встраивающий все свои шрифты, больше не помечается как содержащий невстроенные шрифты; теперь помечается только документ, который ссылается на шрифты, но при этом не встраивает ни одной программы шрифта ValidatePdfUaтеперь принимает элемент структурыFormula, альтернативный текст которого задан черезActualText, а не через записьAlt(ISO 14289-1 §7.7), что согласуется с существующим правилом дляFigure
Version 1.48.0
Добавлено (Добавлено)
- Программное выделение текста в
TPdfView:SelectTextRange(по странице и диапазону символов) иSetSelection(по явным диапазонам для каждой страницы) выделяют текст из кода — например, чтобы прочитать и подсветить фрагмент; оба перерисовывают представление и вызываютOnSelectionChangeпри изменении выделения.SelectionRangesвозвращает текущее выделение в виде диапазонов символов по страницам, аSelectionRectanglesвозвращает его прямоугольники в координатах страницы для пользовательской подсветки или прокрутки к выделению
Version 1.47.0
Добавлено (Добавлено)
- Навигация по полям формы для голосового заполнения форм, доступная как в
TPdf, так и вTPdfView:FormFieldTabOrder,FocusedFormFieldIndex,FocusFormField,FocusNextFormField,FocusPreviousFormField,ClearFormFieldFocusиFocusedFormFieldText. Они перемещают логический курсор поля по виджет-полям страницы в порядке обхода (с переходом по кругу на концах), благодаря чему вспомогательная программа чтения может пройти по форме, озвучить каждое поле черезFormFieldInfo[Index].AlternateName(всплывающую подсказку /TU) и заполнить его черезFormField[Index] - Событие
TPdfView.OnFormFieldFocusChange, возникающее при перемещении курсора поля (передаёт индекс нового поля или -1 при сбросе)
Version 1.46.0
Добавлено (Добавлено)
- Поток содержимого для вспомогательного чтения вслух:
TPdf.ReadableContent,TPdf.ReadablePageContent,TPdf.DocumentReadableContentиTPdfView.ReadableContentвозвращают упорядоченный список семантических элементовTPdfContentFragment, каждый из которых несёт озвучиваемый текст (реальные глифы либоActualText/Alt для изображений), вид фрагмента (заголовок с уровнем, абзац, изображение, элемент списка, ячейка таблицы, ссылка, обычный текст), язык, номер страницы (начиная с 1), а также прямоугольники подсветки блока и отдельных строк. Тегированные PDF линеаризуются в логическом порядке чтения по дереву структуры; для нетегированных страниц используется порядок отрисовки, поэтому вслух можно прочитать любой документ - Синхронизированная подсветка чтения в
TPdfView:SetReadingHighlight,ClearReadingHighlightи публикуемое свойствоReadingHighlightColorподсвечивают читаемый в данный момент блок поверх наложений поиска и выделения - Новые публичные типы
TPdfContentFragment,TPdfContentFragments,TPdfReadableContent,TPdfContentFragmentKindиTPdfReadingOrderSource, а также новая вспомогательная функцияClassifyStructType
Version 1.45.0
Добавлено (Добавлено)
ValidatePdfUaтеперь также обходит живое дерево тегированной структуры и сообщает о трёх хорошо диагностируемых нарушениях содержимого, которые невозможно обнаружить при побайтовом сканировании: элементFigure, у которого отсутствуют как атрибут Alt, так и ActualText (ISO 14289-1, 7.3); элементFormulaбез атрибута Alt (7.7); элементNoteбез уникального идентификатора (7.9). Для отображения этих нарушений добавлены три новых значенияTPdfUaValidationIssue:pvuaiFigureMissingAlt,pvuaiFormulaMissingAltиpvuaiNoteMissingId. Обход дерева пропускается для нетегированных документов- Новая публичная вспомогательная функция
ValidatePdfUaStructureElementsприменяет правила дерева структуры к плоскому списку элементов (например, возвращаемомуTPdf.StructureElements), что позволяет выполнять проверки или тестировать их без загрузки полного документа
Version 1.44.5
Исправлено (Исправлено)
- Проверка встраивания шрифтов в
ValidatePdfA,pvaiFontNotEmbeddedпо ISO 19005-1, 6.3.4, теперь также обнаруживает невстроенные простые шрифты без/FontDescriptor, прежде всего 14 стандартных шрифтов Type 1, таких как Helvetica, Times и Courier, которые PDF/A требует встраивать без исключений. Раньше такой шрифт оставался незамеченным; теперь проверка также учитывает словари простых шрифтов,/Type1,/TrueTypeи/MMType1, при подсчёте встроенных программ шрифтов, повторяя исправление PDF/UA из 1.44.3
Version 1.44.4
Исправлено (Исправлено)
ValidatePdfVTтеперь отклоняет некорректные деревья DPart по ISO 16612-2 §6.5, когда/DPartsявляется плоским массивом ссылок вместо требуемого array of arrays, либо когда leaf DPart повторяет страницу/Startкак/End, хотя диапазон содержит только одну страницуValidatePdfVTтеперь проверяет имена/NodeNameListкак значения XML NMTOKEN после раскрытия escape-последовательностей#xxв PDF name, поэтому недопустимые имена уровней иерархии сообщаются черезpvviMissingDPartRoot, а не принимаются как пригодная структура DPart
Version 1.44.3
Исправлено (Исправлено)
- Проверка встраивания шрифтов в
ValidatePdfUa(pvuaiFontNotEmbedded, ISO 14289-1, 7.21.4) теперь также обнаруживает невстроенные простые шрифты, у которых отсутствует/FontDescriptor, — в первую очередь 14 стандартных шрифтов Type 1 (Helvetica, Times, Courier и другие), для которых PDF/UA не предоставляет исключений из требования встраивания. Ранее такой шрифт оставался незамеченным, и документ, использующий его, мог быть признан соответствующим стандарту; теперь проверка также учитывает словари простых шрифтов (/Type1,/TrueType,/MMType1) при подсчёте встроенных программ шрифтов
Version 1.44.2
Исправлено (Исправлено)
ValidatePdfVTтеперь оставляет присутствующий, но нераспознанный маркерpdfvtid:GTS_PDFVTVersionкакpvcUnknown, а не понижает его доpvcNone. Это позволяет отличать недопустимые строковые значения уровня файла, такие какPDF/VT-2s, от документов без какого-либо маркера PDF/VT; PDF/VT-2s идентифицируется MIME stream header в ISO 16612-2 Annex A, а не XMP-маркером PDF-файла- Проверка
/DPartRootтеперь строже валидирует tree semantics из ISO 16612-2 §6.5:/DPartRootNodeи/NodeNameListдолжны описывать фактическую глубину DPart, DPart parent links должны образовывать дерево,/Startи/DPartsявляются взаимоисключающими, а/DPartкаждой страницы должен указывать на покрывающий ее leaf DPart в том же depth-first порядке, что и page tree
Version 1.44.1
Исправлено (Исправлено)
SaveAsPdfVTтеперь записывает минимальную Document Part Hierarchy по ISO 16612-2 §6.5, когда исходный PDF не содержит пригодного/DPartRoot. Созданное дерево связывает каждую страницу через/DPart, сохраняет уже существующую допустимую иерархию и оставляет более подробные метаданные получателя/DPM вызывающему рабочему процессуValidatePdfVTтеперь проверяет пригодную структуру DPart, считывает значения XMP PDF/VT как из атрибутов RDF, так и из текста элементов, и требует точного соответствия PDF/VT базе PDF/X: для PDF/VT-1 требуется PDF/X-4, а для PDF/VT-2 требуется PDF/X-4p, PDF/X-5g или PDF/X-5pgTPdfVTSaveOptions.Conformance = pvc2больше не записывает недопустимые маркеры однофайлового PDF/VT-2. Однофайловый writer нормализует вывод до PDF/VT-1, поскольку PDF/VT-2 требует семантики набора файлов
Version 1.44.0
Добавлено (Добавлено)
ValidatePdfUaтеперь также сообщает о проверяемых на уровне байтов нарушениях PDF/UA на уровне содержимого в дополнение к маркерам формата файла: программа шрифта, которая не встроена (ISO 14289-1, 7.21.4), шрифт, у которого отсутствует CMap/ToUnicodeпри отсутствии освобождённой кодировки простого шрифта (7.21.7), и документ, содержащий аннотации, но не объявляющий порядок табуляции/Tabs /Sна странице (7.18.3)- Три новых значения
TPdfUaValidationIssue—pvuaiFontNotEmbedded,pvuaiFontMissingToUnicodeиpvuaiMissingTabsOrder— возвращаются функциейValidatePdfUaи включаются в предполётный отчёт. Они представляют собой грубые эвристики, предназначенные в качестве предполётных подсказок, а не полной проверки соответствия ISO 14289-1
Version 1.43.1
Исправлено (Исправлено)
SaveAsPdfUaтеперь принудительно устанавливает обязательные по ISO 14289-1, 7.1 записи каталога/ViewerPreferences/DisplayDocTitle true,/MarkInfo/Marked trueи/Suspects falseдаже в том случае, если исходный документ уже содержит эти словари с отсутствующими или противоречащими значениями. Ранее маркеры вставлялись только при полном отсутствии словарей, поэтому документ, в котором, например, имелся/ViewerPreferencesбезDisplayDocTitleили/MarkInfoс/Marked false, после конвертации оказывался несоответствующим стандарту- Существующие ключи в уже имеющемся словаре
/ViewerPreferencesили/MarkInfoсохраняются, а словарь, переданный в виде косвенной ссылки, разрешается перед применением обязательных ключей
Version 1.43.0
Добавлено (Добавлено)
- Теперь
ValidatePdfAприменяет правила PDF/A-2 / PDF/A-3 для встроенных и связанных файлов, а также для текста уровня Level U. Встроенные файлы по-прежнему отклоняются для PDF/A-1; для PDF/A-3 встроенный файл, в котором отсутствует обязательный ключ/AFRelationship(ISO 19005-3 Приложение E), помечается, тогда как вложения PDF/A-2 разрешены (их собственное соответствие рекурсивно не проверяется). Новая проблемаpvaiUnicodeMappingMissingсообщает о документе PDF/A-2u или PDF/A-3u, шрифты которого не содержат сопоставления/ToUnicode(ISO 19005-2 6.2.11.7). Прозрачность и необязательное содержимое по-прежнему помечаются только для PDF/A-1
Version 1.42.0
Добавлено (Добавлено)
- PDF/A-2 (ISO 19005-2) и PDF/A-3 (ISO 19005-3) теперь поддерживаются на всех трёх уровнях соответствия — a, b и u — через
SaveAsPdfA,ValidatePdfAи свойствоPdfAConformance. ПеречислениеTPdfAConformanceполучает значенияpac2a,pac2u,pac3aиpac3u(у PDF/A-1 нет уровня Level u). При сохранении записываются соответствующиеpdfaid:part(2 или 3) иpdfaid:conformance(A, B или U), при этом сохраняется подтип OutputIntentGTS_PDFA1, который ISO 19005-2 оставляет для совместимости. Запрос Level A по-прежнему понижается до соответствующего Level B (для любой части), если в документе отсутствует тегированная структура, которую требует этот уровень
Version 1.41.0
Добавлено (Добавлено)
- Теперь
ValidatePdfAобнаруживает нарушения PDF/A на уровне содержимого, которые невозможно исправить вставкой маркеров, в дополнение к структурным маркерам, о которых уже сообщалось: JavaScript и другие запрещённые действия, additional-actions (/AA), встроенные файлы,LZWDecode, прозрачность (soft masks и transparency groups), необязательное содержимое (/OCProperties), запрещённые подтипы аннотаций (FileAttachment, Sound, Movie, 3D, Screen), AcroForm/NeedAppearances trueи/XFA, шрифты, в дескрипторах которых отсутствует встроенная программа шрифта, а также заявление о Level A, сделанное без тегированной структуры, требуемой ISO 19005-1 6.8. Проверки прозрачности, необязательного содержимого и встроенных файлов применяются только к PDF/A-1 (в PDF/A-2 и PDF/A-3 эти возможности разрешены). Новые значенияTPdfAValidationIssueотражают каждый случай; существующие значения не изменились
Version 1.40.3
Исправлено (Исправлено)
- Теперь
SaveAsPdfAудаляет любое шифрование исходного документа перед формированием вывода PDF/A. ISO 19005-1 6.1.3 запрещает ключ/Encryptв трейлере, но путь сохранения ранее сохранял обработчик безопасности исходного документа, из-за чего сохранение зашифрованного документа как PDF/A создавало зашифрованный, несоответствующий файл. Сохранение PDF/A теперь сначала расшифровывает документ. На незашифрованные документы это не влияет
Version 1.40.2
Исправлено (Исправлено)
- Метод
SaveAsPdfAбольше не формирует ложное заявление о соответствии PDF/A Level A. Когда запрашивается Level A (pac1a), но в исходном документе отсутствуют маркеры тегированной структуры, требуемые ISO 19005-1 6.8 —/StructTreeRootв каталоге и словарь/MarkInfoсо значением/Marked true, — сохранённый файл теперь идентифицируется как соответствующий Level B (pdfaid:conformance=B) вместо заявления о Level A. На чисто визуальный вывод PDF/A-1b это не влияет
Version 1.40.1
Исправлено (Исправлено)
- Ужесточена проверка соответствия версии PDF: действие
SetOCGState(set-optional-content-group-state) теперь распознаётся как функция PDF 1.5. Сохранение в целевой формат PDF 1.2, 1.3 или 1.4, содержащий действиеSetOCGState, теперь отклоняется в соответствии с ISO 32000-1 (Table 198); ранее такое действие могло попадать в вывод более низкой версии. Отдельное устаревшее действие PDF 1.2SetStateпо-прежнему принимается начиная с PDF 1.2
Version 1.40.0
Добавлено (Добавлено)
- Подключён API
FPDFPageObj_AddExistingMark()из PDFium, который присоединяет существующую метку содержимого к объекту страницы. Когда последовательные объекты страницы используют одну и ту же метку, в сохранённом PDF они объединяются в одну метку, охватывающую их все; несмежные объекты получают отдельные копии - Подключён API
FPDFTextObj_SetFontSize()из PDFium для изменения размера (в пунктах) существующего текстового объекта, дополняющий уже имеющуюся привязкуFPDFTextObj_GetFontSize()
Изменено (Изменено)
- Прилагаемые библиотеки времени выполнения PDFium (Win32 и Win64, стандартная сборка и сборка с V8) обновлены до снимка PDFium от 2026-06-02
Version 1.39.53
Изменено (Изменено)
- Демонстрационные проекты Delphi
PDFViewer,SplitViewиMultiPageViewerтеперь по умолчанию открывают документы в режимеZoom to Page - Начальная отрисовка теперь вписывает всю страницу в область просмотра до выбора пользователем ручного уровня масштабирования
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика обновлены для отображения 1.39.53
Version 1.39.52
Изменено (Изменено)
- Расширен
Demo\Lazarus\CreatePDF: вводный пример теперь создает двухстраничный PDF с vector paths, table content, embedded image, text annotation, rotated text и более понятным document-building walkthrough - Для всех папок демо Delphi, C++Builder и Lazarus добавлены оформленные страницы
README.html; оставшийся текстовый README демо заменен руководством, удобным для чтения в браузере - Обновлены
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика до 1.39.52
Version 1.39.51
- Batch summary в
Demo\Delphi\PreflightReportCliрасширены итогами стандартных статусов для результатов Pass, Action required и Review по выбранным стандартам - Строки по файлам теперь включают счетчики action-required и review в summary TXT / HTML / JSON / CSV, что упрощает проверку CI artifacts без открытия каждого созданного отчета
- Обновлены
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика до 1.39.51
Version 1.39.50
- Улучшен режим пакетной обработки каталогов в
Demo\Delphi\PreflightReportCli:batchdir=folderтеперь собирает найденные пути PDF, сортирует их и затем создает отчеты в стабильном порядке - Рекурсивные сканирования каталогов теперь создают воспроизводимый порядок отчетов и строк summary, а явная обработка
batch=list.txtпо-прежнему сохраняет порядок файла списка - Обновлены
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика до 1.39.50
Version 1.39.49
- Расширены batch summary в
Demo\Delphi\PreflightReportCli: теперь они записывают run settings, включая тип источника, путь источника, рекурсивный режим, выходной каталог, формат отчета, выбранные стандарты и режимfailon= - JSON summary теперь содержит объект
run, TXT и HTML summary показывают раздел run settings, а CSV rows повторяют те же audit columns для электронных таблиц и CI pipelines - Обновлены
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика до 1.39.49
Version 1.39.48
- Улучшен batch output naming в
Demo\Delphi\PreflightReportCli: duplicate input file names, использующие одинoutdir=, больше не перезаписывают generated reports друг друга - Batch runs теперь добавляют суффиксы
-2,-3и последующие, когда generated report path уже назначен в том же запуске, а summaries записывают итоговый collision-safe report path - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.48
Version 1.39.47
- Batch summaries в
Demo\Delphi\PreflightReportCliулучшены: TXT и JSON outputs теперь включают aggregate totals для total files, processed files, failed files, issues иfailon=matches - CSV summaries остаются чистой row table для существующих consumers, а HTML summaries продолжают показывать те же aggregate metrics в dashboard header
- Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.47
Version 1.39.46
Demo\Delphi\PreflightReportCliрасширенsummary=batch.html/.htm, чтобы batch runs могли выводить browser-readable dashboard вместе с TXT / CSV / JSON manifests- HTML summaries показывают metrics total, processed, failed, issue и совпадения
failon=, затем перечисляют каждый input с report links, status, counts и error text - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.46
Version 1.39.45
Demo\Delphi\PreflightReportCliрасширен параметрамиbatchdir=folderиrecursive, чтобы scripts могли напрямую сканировать PDF folders без предварительного создания list file- Directory batch mode повторно использует поведение
outdir=,summary=,standards=иfailon=из list-based batch mode; non-recursive сканирует только выбранную folder, аrecursiveвключает subfolders - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.45
Version 1.39.44
- Расширен
Demo\Delphi\PreflightReportCli: добавленsummary=batch.csv|json|txt, чтобы batch runs могли выводить machine-readable manifest рядом с per-file reports - Batch summaries включают каждый input path, report path, status, standard count, passed count, issue count, состояние совпадения
failon=и error text для CI jobs и внешних scripts - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.44
Version 1.39.43
- Расширен
Demo\Delphi\PreflightReportCli: добавленыbatch=list.txtиoutdir=reports, чтобы scripts могли за один запуск создавать preflight reports для списка PDF files - Batch mode пропускает пустые строки и строки комментариев
#, формирует каждый report name.preflight.<ext>из входного PDF, продолжает работу после per-file errors и перед возвратом выводит сводку processed и failed files - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.43
Version 1.39.42
Demo\Delphi\PreflightReportCliрасширен параметромfailon=none|issues|action|review, чтобы CI jobs могли преобразовывать созданные preflight results в детерминированные exit codes- CLI теперь возвращает exit code 2, когда выбранная
failon=rule срабатывает после создания report file и optional attached-report PDF; runtime errors по-прежнему возвращают exit code 1 - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.42
Version 1.39.41
Demo\Delphi\PreflightReportCliрасширен параметромattach=output.pdf, чтобы созданный preflight report можно было встроить как document-level attachment в новую PDF copy- CLI сохраняет созданный TXT / HTML / Markdown / JSON / CSV report file на диске и отказывается прикреплять его обратно к исходному input PDF path, снижая риск случайной перезаписи
- Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.41
Version 1.39.40
- Добавлен
Demo\Delphi\PreflightReportCli, Delphi console companion для scriptable генерацииFPdfPreflightReportбез открытия viewer - CLI поддерживает no-argument sample creation, input / output arguments, optional password, форматы вывода
text/html/md/json/csvиstandards=filtering для PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R и PDF/VT - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata для отображения 1.39.40
Version 1.39.39
FPdfPreflightReportрасширен методамиTPdfPreflightReport.ToMarkdownиSaveMarkdownToFile, чтобы preflight reports можно было экспортировать как Markdown, удобный для issue tracker- Примеры
PreflightReportдля Delphi, C++Builder и Lazarus обновлены: добавлены Markdown preview switching и действия Save MD наряду с существующим workflow TXT / HTML / JSON / CSV - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.39
Version 1.39.38
- Примеры
SecurityAuditдля Delphi, C++Builder и Lazarus расширены JSON audit report export наряду с существующим TXT save / copy workflow - JSON report содержит
format,generatedAt,summary,findingCountи структурированные строкиfindingsс полями severity, area и detail - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.38
Version 1.39.37
FPdfPreflightReportрасширен методамиTPdfPreflightReport.ToCsvиSaveCsvToFile, чтобы preflight reports можно было экспортировать как spreadsheet-friendly CSV- Samples Delphi, C++Builder и Lazarus
PreflightReportобновлены: добавлены CSV preview switching и Save CSV actions рядом с существующим TXT / HTML / JSON workflow - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы указывать 1.39.37
Version 1.39.36
FPdfPreflightReportрасширен методомTPdfPreflightReport.IssueCategoryCountsи переиспользуемыми типамиTPdfPreflightIssueCategoryCountиTPdfPreflightIssueCategoryCountsдля группировки marker-level issues по categoryTPdfPreflightReport.ToText,ToHtmlиToJsonобновлены, чтобы сгенерированный PreflightReport включал issue-category count summaries наряду с per-standard rows и detailed issue recommendations- Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, теперь они сообщают 1.39.36
Version 1.39.35
- Расширенный sample
PrintDialogпереименован вPrintPreferencesдля Delphi, C++Builder и Lazarus, чтобы demo name соответствовал workflow для PDF author print preferences, N-up printing, odd / even filtering, grayscale, cell border и duplex mapping - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, теперь они сообщают 1.39.35
Version 1.39.34
Demo\Delphi\PrintPDFполучил загрузку PDF перетаскиванием, а существующий workflowDemo\CBuilder\PrintPDFзадокументирован вместе с примерами PrintPDF для Delphi и Lazarus- Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.34
Version 1.39.33
- Добавлен
Demo\CBuilder\SplitView, завершая SplitView sample matrix для Delphi, C++Builder и Lazarus - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы они сообщали 1.39.33
Version 1.39.32
- Добавлен
Demo\Lazarus\SplitView: side-by-side PDF comparison теперь доступен в Lazarus с two- or three-pane layouts, active-view navigation, synchronized commands, zoom presets и rotation - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы они сообщали 1.39.32
Version 1.39.31
- Добавлен
Demo\Lazarus\PrintPDF: standard PDF print workflow теперь доступен в Lazarus с preview navigation, page ranges, copies, collate mode, progress и cancellation - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы они сообщали 1.39.31
Version 1.39.30
- Добавлен
Demo\Lazarus\FontProperties, завершающий матрицу примеров FontProperties для Delphi, C++Builder и Lazarus - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.30
Version 1.39.29
- Добавлен
Demo\CBuilder\FontProperties, который переносит проверку индексированных метаданных символов и шрифтов в C++Builder наряду с примером Delphi - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.29
Version 1.39.28
- Добавлен
Demo\Delphi\ExtractTextPages, завершающий матрицу примеров постраничного извлечения текста для Delphi, C++Builder и Lazarus - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.28
Version 1.39.27
- Добавлен
Demo\Lazarus\PrintDialog, что завершает PrintDialog sample matrix для Delphi, C++Builder и Lazarus - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.27
Version 1.39.26
- Добавлен
Demo\CBuilder\PrintDialog, поэтому N-up printing и PDF author print preferences workflow теперь доступны в C++Builder наряду с Delphi sample - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.26
Version 1.39.25
- Добавлен
Demo\CBuilder\ViewerInteractionLab, что завершает ViewerInteractionLab sample matrix для Delphi, C++Builder и Lazarus - Обновлены library build workflow и Win64 C++Builder package outputs, чтобы
TPdfViewviewer interaction methods корректно связывались в Win64 demos - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.25
Version 1.39.24
- Добавлен
Demo\Lazarus\ViewerInteractionLab, поэтому focused viewer interaction workflow теперь доступен в Lazarus наряду с Delphi sample - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.24
Version 1.39.23
- Добавлен
Demo\Lazarus\SearchAndSelect, завершающий SearchAndSelect sample matrix для Delphi, C++Builder и Lazarus - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.23
Version 1.39.22
- Добавлены
Demo\CBuilder\ContentExtractionLabиDemo\Lazarus\ContentExtractionLab, поэтому multi-category content extraction workflow теперь доступен во всех поддерживаемых demo IDE - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.22
Version 1.39.21
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportиDemo\CBuilder\PreflightReportдополнены preview format selector, чтобы пользователи могли проверить text или JSON output перед сохранением отчетов- Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.21
Version 1.39.20
- Добавлен JSON export для
FPdfPreflightReportчерезTPdfPreflightReport.ToJsonиSaveJsonToFile, включая машиночитаемые summary, per-standard status / priority, next action и issue detail Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportиDemo\CBuilder\PreflightReportдополнены действиями Save JSON рядом с экспортом TXT / HTML- Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.20
Version 1.39.19
FPdfPreflightReportрасширен: добавленыTPdfPreflightStatus, issue categories, per-standard priority и next-action guidance в TXT / HTML reportsDemo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportиDemo\CBuilder\PreflightReportтеперь показывают status, priority, issue count и next action в summary gridTPdf.AboutInfo, Lazarus package metadata и installer version metadata обновлены до 1.39.19
Version 1.39.18
- Добавлен
Demo\Lazarus\SecurityAudit, завершающий матрицу примеров Delphi, C++Builder и Lazarus для read-only PDF risk-surface audit workflow - Пример Lazarus перечисляет permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, XFA state, V8 / XFA helper availability и unsupported-feature callbacks, затем сохраняет или копирует finding list как TXT report
TPdf.AboutInfo, Lazarus package metadata и installer version metadata обновлены до 1.39.18
Version 1.39.17
- Добавлен
Demo\CBuilder\SecurityAudit: read-only PDF risk-surface audit workflow теперь доступен в C++Builder вместе с существующим примером Delphi - Пример C++Builder перечисляет permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, XFA state, V8 / XFA helper availability и unsupported-feature callbacks, затем сохраняет или копирует finding list как TXT report
TPdf.AboutInfo, Lazarus package metadata и installer version metadata обновлены до 1.39.17
Version 1.39.16
- Добавлен
Demo\CBuilder\SearchAndSelect: самостоятельный SearchAndSelect viewer workflow теперь доступен в C++Builder вместе с существующим примером Delphi - Пример C++Builder создает или открывает PDFs, выводит matches по всем страницам с page / character-index previews, поддерживает Previous / Next и double-click navigation, а также подсвечивает matches текущей страницы через
HighlightSearchText - Он также показывает
AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboard,ClearSelection,OnSelectionChangeи spreadDisplayModeoptions; метаданные версии теперь сообщают 1.39.16
Version 1.39.15
- Добавлен
Demo\CBuilder\WatermarkStamp, завершающий demo matrix Delphi, Lazarus и C++Builder для reusable Form XObject watermark и stamp workflows - Пример C++Builder создает target и stamp PDF, повторно использует stamp page через
CreateXObjectFromPage, применяетTPdfMatrixtransforms и сохраняет centered watermarks, corner stamps и page number labels - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы они сообщали 1.39.15
Version 1.39.14
- Добавлен
Demo\Lazarus\WatermarkStamp, который переносит reusable Form XObject watermark и stamp workflow в Lazarus - Пример Lazarus создает target и stamp PDF, повторно использует stamp page через
CreateXObjectFromPage, применяетTPdfMatrixtransforms и сохраняет centered watermarks, corner stamps и page number labels - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы они сообщали 1.39.14
Version 1.39.13
- Добавлен
Demo\CBuilder\PreflightReport, завершающий матрицу demos Delphi, Lazarus и C++Builder для переиспользуемого workflowFPdfPreflightReport - Пример C++Builder использует
FPdfPreflightReport.hppдля создания standard summaries, TXT report previews, TXT / HTML report files и поведения Open Last Report TPdf.AboutInfo, Lazarus package metadata и installer version metadata обновлены, чтобы сообщать 1.39.13
Version 1.39.12
- Добавлен
Demo\Lazarus\PreflightReport, который переносит preflight report workflow для PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R и PDF/VT в Lazarus - Пример Lazarus может открыть или создать PDF, выбрать target standards, показать summary rows и TXT report output, сохранить TXT / HTML reports и открыть последний сохраненный report
TPdf.AboutInfo, Lazarus package metadata и installer version metadata обновлены, чтобы сообщать 1.39.12
Version 1.39.11
Demo\Delphi\SearchAndSelectрасширен списком результатов поиска по всем страницам, который записывает page number, character index и preview text- Добавлены Previous / Next match navigation и double-click result jumping при сохранении поведения
HighlightSearchTextна текущей странице TPdf.AboutInfo, Lazarus package metadata и installer version metadata обновлены, чтобы сообщать 1.39.11
Version 1.39.10
Demo\Delphi\SecurityAuditрасширен действиями Save Report и Copy Report, которые экспортируют текущий summary и finding rows как TXT audit report- Теперь demo очищает report export state при сбросе audit panel, чтобы скопированные или сохраненные reports соответствовали видимым findings
TPdf.AboutInfo, Lazarus package metadata и installer version metadata обновлены для версии 1.39.10
Version 1.39.9
Demo\Delphi\ContentExtractionLabрасширен действиями source-PDF save, report copy-to-clipboard и all / none category selection- Теперь demo сбрасывает текущий report при изменении category selection, чтобы TXT / JSON exports отражали видимый extraction scope
TPdf.AboutInfo, Lazarus package metadata и installer version metadata обновлены для версии 1.39.9
Version 1.39.8
- Добавлен
Demo\Delphi\ContentExtractionLab, единый content extraction workflow sample для document metadata, page text, page objects, images, attachments, links, annotations, bookmarks и font / character metrics - Пример может открыть существующий PDF или создать synthetic PDF с содержимым text, image, attachment и annotation, а затем сформировать summary rows и подробные TXT / JSON reports
- Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы указывать 1.39.8
Version 1.39.7
- Добавлен
Lib\FPdfPreflightReport.pas, переиспользуемый report helper, который объединяетValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRиValidatePdfVTв один объектTPdfPreflightReport - Добавлен
Demo\Delphi\PreflightReport, workflow sample для открытия или создания PDF, выбора target standards, просмотра summary rows и issue recommendations, а также сохранения TXT или HTML отчетов - Создаваемые отчеты явно описывают границу встроенной marker-level validation, чтобы приложения могли при необходимости использовать dedicated content-level preflight tools
- Обновлены
TPdf.AboutInfo, Lazarus package metadata, package project lists и installer version metadata, чтобы показывать 1.39.7
Version 1.39.6
- Добавлен
Demo\Delphi\SearchAndSelect, сфокусированный пример viewer workflow для search highlighting, text selection, selected-text preview, copy, clear и spread display modes - Пример демонстрирует
HighlightSearchText, параметры поиска match-case / whole-word,AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboardиClearSelectionбез добавления новой library API - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы указывать 1.39.6
Version 1.39.5
Demo\Delphi\ViewerInteractionLabрасширен до примера viewer UX в стиле SearchAndSelect сHighlightSearchText, параметрами match-case / whole-word, предварительным просмотром выбранного текста и существующими selection / clipboard controlsDemo\Delphi\PrintDialogрасширен для проверки PDF author print preferences:PrintCopies,PrintPageRanges,PrintScaling,PrintPaperHandlingи видимого duplex mapping черезSetPdfPrintPaperHandlingDevMode- Добавлен
Demo\Delphi\SecurityAudit, read-only пример risk-surface, который перечисляет permissions, attachments, document JavaScript, URI / Launch links, web links, signatures, XFA state и V8 / XFA helper availability - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы указывать 1.39.5
Version 1.39.4
- Добавлены
Demo\CBuilder\ImageToPDFиDemo\Lazarus\ImageToPDF, завершающие матрицу примеров ImageToPDF для Delphi, C++Builder и Lazarus - Новые примеры демонстрируют выбор нескольких изображений, предварительный просмотр выбранного изображения, одну PDF-страницу на изображение, размер страницы A4 portrait / landscape, центрированное масштабирование изображения, прогресс по изображениям и открытие созданного PDF после сохранения
- Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы указывать 1.39.4
Version 1.39.3
- Добавлен
Demo\CBuilder\BatchExport, который переносит workflow многофайлового экспорта PDF в JPG в C++Builder наряду с существующими примерами Delphi и Lazarus - Пример демонстрирует
LoadCustomDocument,IPdfCancellationTokenSource, потоковый вводTFileStream, прогресс по файлам и страницам, обработку отмены, ввод DPI / quality / password и открытие выходной папки после завершения - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы указывать 1.39.3
Version 1.39.2
- Добавлен
Demo\Delphi\WatermarkStamp, запускаемый пример workflow Form XObject, который создаёт целевой PDF и повторно используемый stamp PDF, а затем применяет центрированные watermarks, штампы в правом верхнем углу и метки номеров страниц ко всем страницам - Пример демонстрирует
CreateXObjectFromPage,InsertFormObjectFromXObject,TPdfMatrixиFPDFPageObj_SetMatrixбез добавления новой library API - Обновлён
Docs\en-us\Examples.html, чтобы использовать актуальный шаблонTPdfMatrix.Handleпри передаче матриц вFPDFPageObj_SetMatrix - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.2
Version 1.39.1
- Добавлен
Demo\Delphi\ViewerInteractionLab, компактный пример наTPdfViewдля display modes, fit modes, page colors, rotation, пользовательского выделения текста, clipboard actions и обратной связи координат черезDeviceToPage - Добавлены
Demo\CBuilder\StandardsLabиDemo\Lazarus\StandardsLab, чтобы пользователи Lazarus могли запускать workflow проверки и marker-output для PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R и PDF/VT - Модули standards перечислены в
Lib\37.0\PDFiumPas.dprojиLib\FPC\PDFiumLaz.lpk, а сборка Delphi demoSplitViewисправлена удалением дублирующего importWinapi.ShellAPI - Исправлены блокеры batch-build для Delphi demo в
BatchExport,PDFViewer,MultiPageViewerиSplitViewбез изменения их runtime behavior - Исправлена совместимость batch-build для C++Builder demo
PDFViewerиMultiPageViewerзаменойnullptrнаNULLдля текущего project mode - Обновлены
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, чтобы сообщать 1.39.1
Version 1.39.0
- Добавлен
Demo\Delphi\StandardsLab, запускаемый пример рабочего процесса стандартов: он загружает или создает PDF, выполняетValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRиValidatePdfVT, а затем показывает обнаруженную conformance, статус прохождения и количество issue в одной таблице - Кнопки сохранения StandardsLab вызывают
SaveAsPdfA,SaveAsPdfUa,SaveAsPdfE,SaveAsPdfX,SaveAsPdfRиSaveAsPdfVT, делая вывод marker стандартов PDF видимым без написания собственного harness - Обновлены
TPdf.AboutInfo, метаданные пакета Lazarus и метаданные версии установщика до 1.39.0
Version 1.38.0
- Оверлеи поиска и выделения текста в
TPdfViewтеперь используют настоящее alpha blending вместо логического рисования mask, сохраняя содержимое страницы под подсветкой - Добавлена функция
SetPdfPrintPaperHandlingDevMode, которая сопоставляетTPrintPaperHandlingсо значениями WindowsDEVMODE.dmDuplex:DMDUP_SIMPLEX,DMDUP_HORIZONTALиDMDUP_VERTICAL TPdfView.SmoothScrollтеперь анимирует line/page scrollbar commands через timer-driven segments; thumb tracking остается мгновеннымTPdf.AboutInfoи метаданные версии установщиков обновлены до 1.38.0
Version 1.37.0
TPdfтеперь имеет блокировку рендера на уровне экземпляра, сериализующуюRenderPage,RenderTile,RenderPageProgressive, перезагрузку страницы и выгрузку документа. Рендеринг из worker через общий компонент стал практичным; приложение по-прежнему координирует изменения документа и жизненный цикл- Исправлена zero-copy обертка bitmap: bottom-up DIB
TBitmapтеперь отклоняется с fallback на собственный буфер PDFium и финальное копирование, что устраняет stride corruption / access violation в VCL render тестах - Уточнено поведение выделения
TPdfView:AllowUserTextSelectionблокирует только пользовательский ввод, API выделения из кода продолжают рисовать, аSelectAllследует фактически видимому spread, поэтому обложка больше не выбирает страницу 2. Тесты Delphi, Lazarus и C++Builder расширены TPdf.AboutInfoи метаданные версии установщиков обновлены до 1.37.0
Version 1.36.0
- В
TPdfViewвключено пользовательское выделение текста: свойствоAllowUserTextSelection, зарезервированное в v1.17.0, теперь управляет полноценным drag-select pipeline. Щелчок левой кнопкой по текстовому символу переводит просмотрщик в режим выделения, а щелчок по пустой области, как и раньше, продолжает панорамирование. Виджет заполнения формы сохраняет приоритет, поэтому щелчок по полю формы по-прежнему фокусирует поле, а не запускает выделение - Двойной щелчок выделяет слово, тройной щелчок выделяет строку,
Ctrl+Aвыделяет текущую страницу, а в spread display modes и обе страницы, аCtrl+Cкопирует выделение в буфер обмена Windows какCF_UNICODETEXT Shift+LeftиShift+Rightрасширяют выделение по одному символу за раз, переходя на соседнюю страницу в spread mode, аShift+HomeиShift+Endрасширяют его до визуальной границы строки, используя высоту рамки исходного символа как допуск кластеризации строки, поэтому строки со смешанными размерами шрифта группируются корректно- При наведении на текст курсор меняется на
crIBeam; при уходе с текста возвращается стандартный курсор. Пока выполняется drag выделения, переход в 20-pixel dead zone у любого края просмотрщика запускает автопрокрутку страницы, 50 ms tick, 16 px за tick, с теми же границами, что и у пути pan, поэтому выделение можно продолжать за пределы текущего viewport, не отпуская мышь - Выделение между страницами работает в spread display modes,
dmTwoPageContinuousиdmTwoPageContinuousWithCover: drag, начатый на левой странице и законченный на правой, выбирает непрерывный диапазон через обе страницы.SelectedTextсоединяет постраничные фрагменты через CR/LF, поэтому round-trip текст читается как обычное многострочное содержимое - Добавлено новое published property
SelectionColorсо значением по умолчаниюclHighlight, то есть системным цветом выделения Windows, независимое отHighlightColor, который по-прежнему окрашивает результаты поиска в жёлтый. Подсветка поиска и активное drag выделение могут одновременно отображаться на экране без цветового конфликта - Новое published event
OnSelectionChangeсрабатывает всякий раз, когда материализованные диапазоны выделения действительно меняются, и не вызывается при повторном применении того же состояния, поэтому приложения могут напрямую привязывать его к тексту status bar или состоянию кнопок без debounce - Новый public API у
TPdfView:HasSelection,SelectionCharCount,SelectedText,ClearSelection,SelectAll,CopySelectionToClipboard. Это точки входа уровня кода и они всегда работают независимо отAllowUserTextSelection; флаг управляет только пользовательским вводом, мышью, Ctrl+C, Ctrl+A и Shift+arrows, поэтому kiosk host может отключить пользовательское выделение и всё равно строить кнопки Select All или Copy поверх того же API - Стандартное popup menu правой кнопки
Copyи复制подключается автоматически, если host не назначил собственноеPopupMenu, поэтому обычный сценарий выделить текст, щёлкнуть правой кнопкой и скопировать работает сразу. Подпись выбирается между английским и китайским поSysLocale.PriLangID; приложениям, которым нужна полная локализация или более богатое меню, достаточно назначить своёPopupMenu, и меню по умолчанию будет подавлено - Выделение автоматически очищается при переходах
SetPdf,SetPageNumber,SetActive(False)иDisplayMode, аOnSelectionChangeсрабатывает ровно один раз, если предыдущее выделение было непустым. Подсистема form-fill сохраняет приоритет: пока редактируется поле формы, все сочетания выделения передаются полю, поэтому оно получаетCtrl+C,Ctrl+AиShift+arrowsдля собственного выделения - Наборы регрессий Delphi и Lazarus расширены до 202 случаев каждый, а набор C++Builder до 159 случаев, с покрытием значений по умолчанию, round-trip, поведения public API, очистки при смене состояния, mouse drag по тексту и по пустой области, различения click и drag, переключения IBeam cursor, двойного щелчка по слову, тройного щелчка по строке, keyboard shortcuts, подключаемого по умолчанию popup menu, его подавления и caption, а также spread cross-page selection, включая проверку clipboard CR/LF round-trip
Version 1.35.0
- Добавлена поддержка инъекции маркеров PDF/VT, ISO 16612-2:2010: TPdf.SaveAsPdfVT преобразует текущий документ в файл, соответствующий PDF/VT-1 или PDF/VT-2, то есть подмножество PDF для печати переменных данных и транзакционной печати. PDF/VT построен поверх PDF/X-4, и ISO 16612-2 §6.2.1 требует, чтобы каждый PDF/VT-1 файл также соответствовал PDF/X-4, поэтому инжектор записывает полный набор маркеров PDF/X-4, XMP
pdfxid:GTS_PDFXVersion = "PDF/X-4", Info/GTS_PDFXVersion (PDF/X-4)и/Trapped, а также catalog/OutputIntents, ссылающийся на OutputIntent dictionary со встроенным ICC profile, вместе со специфичными для PDF/VT свойствами - Инъекция, специфичная для PDF/VT, охватывает XMP
pdfvtid:GTS_PDFVTVersion, то есть "PDF/VT-1" или "PDF/VT-2" по §6.3 Table 2, иpdfvtid:GTS_PDFVTModDate, синхронизированный сxmp:ModifyDateпо §6.3 NOTE 1, а также описание pdfaExtension:schemas, объявляющее оба пространства имён pdfxid и pdfvtid по NPES URIhttp://www.npes.org/pdfx/ns/id/иhttp://www.npes.org/pdfvt/ns/id/. Trailer несёт массив/ID - Добавлен TPdf.SaveAsPdfVTToStream для in-memory вывода PDF/VT и краткая форма со значениями по умолчанию
TPdf.SaveAsPdfVT(FileName), которая создаёт PDF/VT-1 с встроенным sRGB IEC61966-2.1 OutputIntent, 3144 bytes, тем же профилем, что используется в SaveAsPdfA и SaveAsPdfX, и/Trapped /False - Добавлен TPdf.ValidatePdfVT: он проверяет маркеры соответствия PDF/VT в открытом PDF, наличие XMP
pdfvtid:GTS_PDFVTVersionиGTS_PDFVTModDate, равенство междуpdfvtid:GTS_PDFVTModDateиxmp:ModifyDate, наличие базового идентификатораpdfxid:GTS_PDFXVersion, наличие в catalog/DPartRootпо §6.5,/OutputIntentsс/DestOutputProfile, trailer /ID, статус шифрования и наличиеxmp:CreateDate/ModifyDate, а затем возвращает TPdfVTValidationResult с определённым уровнем соответствия и набором найденных проблем - Добавлено свойство TPdf.PdfVTConformance: оно возвращает уровень соответствия текущего открытого документа, pvc1, pvc2, pvcNone или pvcUnknown, без необходимости явно вызывать ValidatePdfVT
- В новой единице FPdfPdfvt экспортируются новые типы: TPdfVTConformance, TPdfVTTrappedState, TPdfVTValidationResult, TPdfVTValidationIssue и TPdfVTSaveOptions
- Document Part Hierarchy, дерево
DPartRootиDPartпо §6.5, является структурой уровня приложения, зависящей от mapping получателя и диапазонов страниц в variable-data print workflow. SaveAsPdfVT не синтезирует DPart tree автоматически; ValidatePdfVT выводит отсутствие/DPartRootкакpvviMissingDPartRoot, чтобы вызывающий код мог пропускать PDF/VT файлы через отдельный шаг построения DPart. Требования PDF/X-4 на уровне содержимого, такие как встраивание шрифтов, прозрачность, ICC managed color и запреты OPI, JavaScript и Reference XObject, остаются ответственностью автора документа и rendering pipeline PDFium - Строка TPdf.AboutInfo обновлена, чтобы сообщать текущую версию продукта
Version 1.34.0
- Добавлена поддержка инъекции маркеров PDF/R-1, ISO 23504-1:2020: TPdf.SaveAsPdfR преобразует текущий документ в файл, соответствующий PDF/R-1, то есть растровое транспортное подмножество PDF для сканированных документов. Инъекция охватывает требования уровня формата файла, которые можно прикрепить постобработкой: уникальный комментарий идентификации версии
%PDF-raster-1.0, записываемый между trailer dictionary и keyword startxref по §5, catalog dictionary, сокращённый до white list из §6.3, где остаются только Version, ViewerPreferences, PageLayout, PageMode, AcroForm и Metadata, Document Information Dictionary, сокращённый до white list из §6.4.3, где остаются только Creator, Producer, CreationDate и ModDate, поток catalog /Metadata XMP с четырьмя записями из §6.4.4 Table 1, xmp:CreatorTool, pdf:Producer, xmp:CreateDate и xmp:ModifyDate, а также trailer массив /ID - Добавлен TPdf.SaveAsPdfRToStream для in-memory вывода PDF/R и краткая форма
TPdf.SaveAsPdfR(FileName)для типового сценария - Добавлен TPdf.ValidatePdfR: он проверяет открытый PDF на маркеры соответствия PDF/R-1, включая footer comment
%PDF-raster-x.y, версию заголовка, отсутствие /Type /ObjStm, соответствие catalog white list, соответствие Info dictionary white list, наличие XMP metadata stream и trailer /ID, а затем возвращает TPdfRValidationResult с определённым уровнем соответствия и набором найденных проблем - Добавлено свойство TPdf.PdfRConformance: оно возвращает уровень соответствия текущего открытого документа, prc1, prcNone или prcUnknown, без необходимости явно вызывать ValidatePdfR
- В новой единице FPdfPdfr экспортируются новые типы: TPdfRConformance, TPdfRValidationResult, TPdfRValidationIssue и TPdfRSaveOptions.
TPdfRSaveOptions.Defaultустанавливает StripInfoOptionalEntries и StripCatalogOptionalEntries в True, поэтому по умолчанию инжектор создаёт catalog и Info dictionary, соответствующие §6.3 и §6.4.3; вызывающий код может установить их в False, чтобы сохранить исходные записи, хотя тогда вывод уже не будет удовлетворять этим пунктам PDF/R, при том что остальные маркеры останутся прикреплёнными - Требования уровня содержимого остаются ответственностью исходного PDF: структура Contents для каждой страницы по §6.5.1, форма MediaBox
[0 0 w h]по §6.5.3, ограничения на filter по §6.2.2, только FlateDecode, bitonal CCITTFaxDecode и DCTDecode для 8-bit gray или RGB, отсутствие object streams по §6.2.4 и strip layout по §6.6. Постобработкой это обеспечить нельзя; PDF/R структурно является гораздо более строгим подмножеством, чем другие стандарты PDF/x, и требует правильной генерации исходных bytes. ValidatePdfR показывает те проблемы уровня формата файла, которые может обнаружить этот unit; для полной проверки уровня содержимого его стоит сочетать с валидатором PDF/R от TWAIN Working Group - Строка TPdf.AboutInfo обновлена, чтобы сообщать текущую версию продукта
Version 1.33.0
- Добавлена поддержка инъекции маркеров PDF/X, семейство ISO 15930: TPdf.SaveAsPdfX преобразует текущий документ в файл, соответствующий PDF/X-1a:2001, PDF/X-3:2002 или PDF/X-4, путём постобработки базового PDF инкрементным обновлением. Инъекция охватывает требования уровня формата файла, которые можно прикрепить постобработкой: поток XMP metadata с
pdfxid:GTS_PDFXVersionи, для PDF/X-1a и PDF/X-3,pdfxid:GTS_PDFXConformance, вместе с соответствующим описанием pdfaExtension:schemas, переписанный Document Information Dictionary с записями/GTS_PDFXVersion,/GTS_PDFXConformanceи/Trapped, обновлённый catalog с/OutputIntents [N 0 R], указывающим на OutputIntent dictionary с/S /GTS_PDFXи встроенным ICC profile, и trailer массив/ID - Добавлен TPdf.SaveAsPdfXToStream для in-memory вывода PDF/X и краткая форма
TPdf.SaveAsPdfX(FileName), которая создаёт PDF/X-4 со встроенным sRGB IEC61966-2.1 OutputIntent, 3144 bytes, идентичным профилю, используемому в SaveAsPdfA - Добавлен TPdf.ValidatePdfX: он проверяет открытый PDF на маркеры соответствия PDF/X, включая XMP pdfxid identifier и его равенство значению из Info dictionary, описание pdfxid extension schema, массив /OutputIntents с /DestOutputProfile, наличие Title, trailer /ID, статус шифрования и наличие xmp:CreateDate и xmp:ModifyDate, а затем возвращает TPdfXValidationResult с определённым уровнем и набором найденных проблем
- Добавлено свойство TPdf.PdfXConformance: оно возвращает уровень соответствия текущего открытого документа, pxc1a, pxc3, pxc4, pxcNone или pxcUnknown, без необходимости явно вызывать ValidatePdfX. Строка версии XMP разбирается, чтобы различать три уровня соответствия
- В новой единице FPdfPdfx экспортируются новые типы: TPdfXConformance, TPdfXTrappedState, TPdfXValidationResult, TPdfXValidationIssue и TPdfXSaveOptions.
TPdfXSaveOptions.Defaultнацелено на PDF/X-4 с sRGB OutputIntent и/Trapped /False; вызывающий код может переопределитьConformance, передать blob CMYKIccProfileDataдля коммерческих print workflow или изменитьOutputCondition,OutputConditionIdentifierиRegistryName, чтобы сослаться на конкретную запись реестра ICC characterization, например FOGRA39 или GRACoL2006_Coated1v2 - Требования уровня содержимого, все шрифты должны быть встроены, без JavaScript, без видимых annotations, с запретом OPI и правилами прозрачности для PDF/X-1a и PDF/X-3, остаются ответственностью автора документа и rendering pipeline PDFium. Для полной проверки соответствия ValidatePdfX стоит сочетать с preflight tool, например callas pdfaPilot или Ghent PDF Workgroup Output Suite
- Строка TPdf.AboutInfo обновлена, чтобы сообщать текущую версию продукта
Version 1.32.0
- Добавлена поддержка инъекции маркеров PDF/E-1 (ISO 24517-1:2008): TPdf.SaveAsPdfE преобразует текущий документ в файл, соответствующий PDF/E-1, путём постобработки базового PDF инкрементным обновлением. Инъекция охватывает требования уровня формата файла — поток XMP-метаданных с
pdfe:ISO_PDFEVersion = "PDF/E-1"и соответствующим описанием pdfaExtension:schemas, переписанный Document Information Dictionary с обязательной записью/ISO_PDFEVersion (PDF/E-1)из §5, эквивалентность Info-XMP, унаследованная из ISO 19005-1 §6.7 через §13.1, и массив/IDв trailer (§6.2) - Добавлен TPdf.SaveAsPdfEToStream для вывода PDF/E в память и краткая форма
TPdf.SaveAsPdfE(FileName) - Добавлен TPdf.ValidatePdfE: проверяет маркеры соответствия и возвращает TPdfEValidationResult
- Добавлено свойство TPdf.PdfEConformance: возвращает уровень соответствия без явного вызова ValidatePdfE
- Новые типы, экспортированные в новой единице FPdfPdfe: TPdfEConformance, TPdfEValidationResult, TPdfEValidationIssue, TPdfESaveOptions
- Переписывание Info dictionary — первое в пути постобработки PDF/x PDFium Delphi Component — переписывает существующий объект Info под тем же номером (ссылка /Info в trailer сохраняется), синтезирует новый Info dictionary, если в исходном trailer нет /Info
- Требования уровня содержимого (встраивание шрифтов, CMap ToUnicode, запрещённые XObject / ключи ExtGState / формы XFA) остаются ответственностью автора документа
- Строка TPdf.AboutInfo обновлена для сообщения текущей версии продукта
Version 1.31.0
- Добавлена поддержка инъекции маркеров PDF/UA-1 (ISO 14289-1:2014): TPdf.SaveAsPdfUa преобразует текущий документ в файл, соответствующий PDF/UA-1, путём постобработки базового PDF инкрементным обновлением. Инъекция охватывает требования уровня формата файла, выполнимые постобработкой — поток XMP-метаданных с
pdfuaid:part = 1и соответствующим описанием pdfaExtension:schemas, обязательныйdc:title, catalog/MarkInfo << /Marked true /Suspects false >>и/ViewerPreferences << /DisplayDocTitle true >>(только если их нет в источнике), catalog/Lang(когда вызывающий предоставляет тег BCP 47) и массив/IDв trailer - Добавлен TPdf.SaveAsPdfUaToStream для вывода PDF/UA в память, и быстрая форма с параметрами по умолчанию
TPdf.SaveAsPdfUa(FileName)для распространённого случая - Добавлен TPdf.ValidatePdfUa: проверяет в открытом PDF маркеры соответствия PDF/UA-1 (наличие StructTreeRoot, /Lang, /MarkInfo /Marked true с /Suspects = false, /ViewerPreferences /DisplayDocTitle true, идентификатор XMP pdfuaid:part, наличие dc:title, /ID в trailer, статус шифрования) и возвращает структурированный результат с обнаруженным уровнем соответствия и набором найденных проблем
- Добавлено свойство TPdf.PdfUaConformance: возвращает уровень соответствия открытого документа (puc1, pucNone или pucUnknown) без явного вызова ValidatePdfUa
- Новые типы, экспортированные в новой единице FPdfPdfua: TPdfUaConformance, TPdfUaValidationResult, TPdfUaValidationIssue, TPdfUaSaveOptions
- Пустые поля TPdfUaSaveOptions (Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate / DocumentId / InstanceId / Language) автоматически заполняются через FPDF_GetMetaText / FPDF_GetFileIdentifier / FPDFCatalog_GetLanguage
- Требования уровня содержимого (полнота тегирования StructTreeRoot, текст Alt у Figure, CMap ToUnicode, встраивание шрифтов и т.д.) остаются ответственностью автора документа — SaveAsPdfUa добавляет только маркеры формата. ValidatePdfUa сообщает об отсутствии StructTreeRoot как
pvuaiMissingStructTreeRoot - Строка TPdf.AboutInfo обновлена для сообщения текущей версии продукта
Version 1.30.0
- Вывод PDF/A-1b теперь удовлетворяет требованиям ISO 19005-1 (с Cor.1:2007) к эквивалентности между Document Information Dictionary и XMP: каждая запись Info dictionary, которую PDFium записывает в базовый PDF, отражается в XMP-пакете, включая Title (dc:title), Author (dc:creator), Subject (dc:description согласно Cor.1), Keywords (pdf:Keywords), Creator (xmp:CreatorTool), Producer (pdf:Producer), CreationDate (xmp:CreateDate) и ModDate (xmp:ModifyDate). Также выводится xmp:MetadataDate
- Trailer документа PDF/A теперь всегда содержит массив /ID (обязательное требование ISO 19005-1 6.1.3). Когда TPdf.SaveAsPdfA обрабатывает документ, источник которого уже имеет file identifier, 16-байтовые ID permanent и changing переиспользуются; иначе из исходных байтов выводится детерминированный 16-байтовый резервный ID
- Внедряемый XMP теперь содержит описание extension schema pdfaid, требуемое ISO 19005-1 6.7.8 (заменено Cor.1) — pdfaid считается extension schema относительно XMP Specification 2004, поэтому все соответствующие файлы должны объявлять её property names, value types и categories в контейнере pdfaExtension:schemas
- TPdfASaveOptions получил пять новых необязательных полей: Producer, CreationDate, ModDate (строки даты PDF в формате «D:YYYYMMDDHHmmSSOHH'mm'»), DocumentId и InstanceId (16-байтовые строки для массива /ID в trailer). TPdf.SaveAsPdfA / SaveAsPdfAToStream автоматически заполняют пустые поля через FPDF_GetMetaText и FPDF_GetFileIdentifier, поэтому существующий вызывающий код продолжает работать без изменений
- TPdf.ValidatePdfA / TPdf.PdfAConformance теперь сообщают о трёх дополнительных проблемах: pvaiMissingTrailerId (нет /ID в trailer), pvaiMissingXmpDates (отсутствует xmp:CreateDate или xmp:ModifyDate) и pvaiMissingExtensionSchema (отсутствует описание extension schema pdfaid)
- Символы не-ASCII в Title, Author, Subject, Keywords, Creator и Producer теперь кодируются как UTF-8 в XMP-пакете (XMP Specification требует UTF-8), сохраняя многоязычные метаданные при прохождении через SaveAsPdfA
- Строка TPdf.AboutInfo обновлена для сообщения текущей версии продукта
Version 1.29.0
- Обновлены поставляемые DLL PDFium (Win32 и Win64, как стандартные сборки, так и сборки с V8) до снимка PDFium от 2026-05-22, что включает в себя исправления путей сбоя в FPDFText_SetText / FPDFText_SetCharcodes и различные внутренние укрепления из проекта PDFium
- Новый флаг сохранения FPDF_SUBSET_NEW_FONTS из PDFium открыт в FPdfPageOps.pas, что позволяет вызывающим FPDF_SaveAsCopy запрашивать автоматическое подмножествование встроенных файлов шрифтов для вновь добавленных текстовых объектов. Существующие константы FPDF_INCREMENTAL, FPDF_NO_INCREMENTAL и FPDF_REMOVE_SECURITY теперь определены в форме битового сдвига PDFium (устаревшее численное значение 3 сохранено как FPDF_REMOVE_SECURITY_DEPRECATED для бинарной совместимости)
- В FPdfView.pas добавлены перечисление FPDF_FONT_BACKEND_TYPE (FREETYPE / FONTATIONS) и соответствующее поле m_FontLibraryType в FPDF_LIBRARY_CONFIG, благодаря чему приложения, инициализирующие PDFium с рендером Skia, могут выбирать шрифтовой backend при запуске
- Сигнатура TFPDFPage_InsertObject приведена в соответствие с C-экспортом PDFium: функция теперь возвращает FPDF_BOOL (TRUE при успехе, FALSE если page_object равен NULL или передача владения не удалась) вместо void. Существующие вызовы PDFium Delphi Component продолжают компилироваться без изменений, поскольку Delphi / FPC позволяют игнорировать возвращаемое значение функции
- Исправлена строка TPdf.AboutInfo, чтобы она сообщала текущую версию продукта (с версии 1.28.0, которая была чисто документационным выпуском, она оставалась устаревшей на v1.27.0)
Version 1.28.0
- Существенно расширена встроенная документация по всему API: каждая запись о свойстве, методе, событии и глобальной функции теперь содержит трёхабзацное Description, список Remarks, многострочный Delphi Example и более богатый блок See Also — охватывает 200+ ранее малосодержательных страниц, включая все счётчики TPdf, геттеры метаданных, аксессоры шрифтов и символов, свойства уровня страницы, индексированные записи, методы уровня документа и полную поверхность состояния / отображения / событий TPdfView
- Точно настроен макет справки в соответствии с визуальной базой losLab: согласованы размеры h1/h2, стили сетки навигации по API объединены в общий StyleSheet, удалены постраничные встроенные CSS-переопределения в Navigation.html
- Документация теперь поставляется со вспомогательным скриптом (Docs\Build-Expand-Entries.ps1), который восстанавливает обогащение страниц записей из единой таблицы данных для воспроизводимого обслуживания
Version 1.27.0
- Добавлена поддержка создания PDF/A-1b: TPdf.SaveAsPdfA сохраняет любой открытый документ как файл, соответствующий PDF/A-1b, путём постобработки базового PDF с помощью инкрементального обновления, внедряющего поток XMP-метаданных, sRGB ICC OutputIntent и обновлённый каталог документа — всё это без необходимости в дополнительных DLL API. Работает на любой платформе, поддерживаемой PDFium Delphi Component
- Добавлен TPdf.SaveAsPdfAToStream для вывода PDF/A в память
- Добавлен TPdf.ValidatePdfA: проверяет открытый PDF на соответствие PDF/A (маркеры XMP pdfaid, OutputIntent со встроенным ICC-профилем, шифрование) и возвращает структурированный результат с обнаруженным уровнем соответствия и набором конкретных найденных проблем
- Добавлено свойство TPdf.PdfAConformance: возвращает уровень соответствия текущего открытого документа (pac1b, pac1a, pac2b, pac3b, pacNone или pacUnknown) без необходимости явно вызывать ValidatePdfA
- Экспортированы новые типы: TPdfAConformance, TPdfAValidationResult, TPdfAValidationIssue, TPdfASaveOptions (в новом модуле FPdfPdfa.pas)
- SaveAsPdfA поддерживает пользовательский ICC-профиль через TPdfASaveOptions.IccProfileData; если значение пустое, автоматически используется встроенный профиль sRGB IEC61966-2.1 (HP/Microsoft, 3144 bytes)
- Заменён монолитный HTML-справочник реструктурированной системой веб-справки: 302 отдельных страницы записей API (по одной на каждое свойство, метод, событие и глобальную функцию), охватывающих TPdf и TPdfView, каждая с полным описанием, таблицей параметров, примером кода на Delphi и ссылками See Also
- Добавлен Navigation.html: исчерпывающий одностраничный индекс навигации по API, организованный в шесть разделов (свойства/методы/события TPdf, свойства/методы/события TPdfView, глобальные функции) с 5-колоночной flex-сеткой для быстрого просмотра
- TPdf.html и TPdfView.html переработаны в компактные страницы обзора компонентов, сохраняющие разделы справочника типов (Types, Constants, Global Variables) и со ссылками на отдельные страницы записей для всех членов
- Добавлен полнотекстовый поиск на основе Search.js с инкрементальным сопоставлением на стороне клиента по всем 312 проиндексированным страницам
- Обновлены все панели навигации по всему сайту с указанием на Navigation.html
Version 1.26.0
- Добавлен Demo/Lazarus/BatchExport — LCL-порт демо Delphi BatchExport из v1.14.0. Тот же набор функций: пакетный экспорт PDF -> JPG для нескольких файлов с общим прогрессом по каждому файлу, текущим прогрессом по каждой странице, вводом DPI / качества / пароля и кооперативно отменяемой пакетной обработкой на основе IPdfCancellationToken. Выходная папка открывается в файловом менеджере платформы после успешного завершения извлечения
Version 1.25.0
- В TPdf добавлено повторное использование страниц через Form XObject, что позволяет реализовать сценарии водяных знаков, наложения шаблонов и “штамповки одной страницы на множество”: CreateXObjectFromPage создаёт переиспользуемый дескриптор из любой страницы другого документа; InsertFormObjectFromXObject вставляет ОДНУ копию обёрнутой страницы в текущую страницу. Возвращает вставленный FPDF_PAGEOBJECT, чтобы вызывающая сторона могла позиционировать / масштабировать / поворачивать его с помощью FPDFPageObj_SetMatrix и помощников TPdfMatrix из v1.9.0
- Новый класс TPdfXObject на Pascal обёртывает дескриптор FPDF_XOBJECT из PDFium и автоматически закрывает его в своём деструкторе, устраняя необходимость в ручной церемонии FPDF_CloseXObject
- Расширены регрессионные наборы Delphi и Lazarus до 147 случаев каждый, а набор C++Builder — до 123 случаев, охватывающие контракты создания дескрипторов и вставки страничных объектов
Version 1.24.0
- Добавлен TPdf.RenderPageProgressive — отменяемый вариант RenderPage, который управляет циклом прогрессивного рендеринга PDFium и опрашивает IPdfCancellationToken из v1.7.0 между итерациями, так что длительный рендеринг с высоким DPI может быть прерван в середине страницы, а не блокировать вызывающую сторону до завершения
- Возвращает значение TPdfProgressiveStatus: prsDone, prsCancelled или prsFailed. Передайте AToken = nil для рендеринга до завершения без пауз (без возможности prsCancelled)
- Использует тот же zero-copy fast path, который был представлен в v1.21.0 — PDFium рендерит напрямую в DIB целевого TBitmap. Тот же legacy fallback применяется, когда DIB не может быть обёрнут
- Расширены регрессионные наборы Delphi и Lazarus до 145 случаев каждый, а набор C++Builder — до 121 случая, охватывающие nil-token (завершается), предварительно отменённый токен (prsCancelled) и попиксельную эквивалентность с синхронным RenderPage на живом токене
Version 1.23.0
- Добавлены шесть новых методов TPdfView, которые открывают приложениям выбор текста виджета формы PDFium и Undo/Redo: GetSelectedFormText возвращает текущий выделенный текст внутри сфокусированного виджета формы; SelectAllFormText выделяет каждый символ; FormUndo / FormRedo / FormCanUndo / FormCanRedo управляют историей редактирования сфокусированного виджета. Базовые API PDFium уже были привязаны, но не имели высокоуровневой точки входа. Все шесть безопасно выходят, когда вид неактивен или в документе нет сфокусированного виджета AcroForm
- Расширены регрессионные наборы Delphi и Lazarus до 142 случаев каждый, а набор C++Builder — до 119 случаев, охватывающие контракт «нет формы, нет фокуса» для каждого нового метода
Version 1.22.0
- В TPdf добавлены обёртки композиции страниц: ImportPagesByIndex принимает массив индексов с нулевой базой для копирования конкретных страниц из исходного документа; ImportNPagesToOne возвращает новый TPdf, страницы которого являются N-up композициями этого документа; MovePages переупорядочивает страницы на месте. Базовые API PDFium уже были привязаны, но не имели Pascal-дружественной точки входа
- ImportPagesByIndex принимает пустой массив для импорта каждой исходной страницы (эквивалентно передаче nil на уровне C ABI)
- Расширены регрессионные наборы Delphi и Lazarus до 136 случаев каждый, а набор C++Builder — до 115 случаев, охватывающие импорт подмножества, импорт всего документа, переупорядочение страниц и N-up композицию
Version 1.21.0
- Улучшена производительность рендеринга за счёт переключения TPdf.RenderPage / TPdf.RenderTile (и соответствующих помощников TPdfView) на путь вывода zero-copy. PDFium теперь пишет напрямую в буфер DIB целевого TBitmap вместо внутреннего буфера, который затем копировался построчно, экономя одну копию памяти размером width x height x 4 bytes на рендеринг. Улучшение наиболее заметно при высоком DPI (панели миниатюр, экспорт в качестве печати, пакетный экспорт)
- Legacy путь per-scanline сохранён как безопасный fallback на маловероятный случай, когда целевой DIB не может быть обёрнут (экстремальные размеры, необычный stride, OOM). Поведение байт-в-байт идентично между двумя путями, просто медленнее в fallback
- Расширены регрессионные наборы Delphi и Lazarus до 132 случаев каждый, а набор C++Builder — до 112 случаев, охватывающие апгрейд bitmap вызывающей стороны на pf32bit, round-trip размеров и тест разумности stride на большом bitmap
Version 1.20.0
- В TPdfView добавлена подсветка результатов поиска: HighlightSearchText(Text, MatchCase, MatchWholeWord) сканирует текущую страницу вида и возвращает количество найденных совпадений, накладывая маску HighlightColor поверх каждого совпадения при каждой перерисовке. ClearHighlight удаляет подсветку; переключение вида на другую страницу автоматически очищает её, поскольку совпадения привязаны к странице
- HighlightColor по умолчанию clYellow и опубликован, чтобы приложения могли тематизировать подсветку под палитру UI
- Расширены регрессионные наборы Delphi и Lazarus до 129 случаев каждый, а набор C++Builder — до 109 случаев, охватывающие цвет по умолчанию, round-trip цвета, «совпадения реальных слов из фикстуры» против строки sample.pdf и контракт «отсутствующее слово возвращает ноль совпадений»
Version 1.19.0
- В TPdfView добавлено свойство FitMode с четырьмя значениями: pfmNone (ручное масштабирование), pfmActualSize (100%), pfmFitPage (вся страница помещается в окно просмотра) и pfmFitWidth (ширина страницы совпадает с шириной окна просмотра). Активный режим подгонки автоматически применяется заново при Resize и при смене текущей страницы, поэтому длинные документы со смешанными размерами страниц остаются идеально оформленными
- Прямая установка Zoom отменяет активный режим подгонки (FitMode возвращается в pfmNone), что соответствует стандартному соглашению PDF-просмотрщиков, когда ввод значения масштаба выводит из Fit Page / Fit Width
- По умолчанию pfmNone, чтобы существующие приложения сохранили своё поведение явного масштабирования
- Расширены регрессионные наборы Delphi и Lazarus до 124 случаев каждый, а набор C++Builder — до 106 случаев, охватывающие значение по умолчанию, round-trip режима, fit-page, дающий реальный масштаб на загруженном документе, и отмену режима подгонки ручным масштабированием
Version 1.18.0
- В TPdfView добавлено свойство PageColor, отвязывающее фон отрендеренной PDF-страницы от Color окружающего контрола. По умолчанию clWhite, поэтому PDF-страницы теперь рендерятся как бумажно-белые независимо от темы хост-приложения. Просмотрщики в тёмном режиме теперь могут оставить область прокрутки тёмной, оставляя саму PDF-страницу белой (или любого цвета, который выберет приложение)
- Изменение поведения: приложения, которые устанавливали TPdfView.Color, чтобы перекрасить PDF-страницу, должны вместо этого устанавливать PageColor. Поведение по умолчанию улучшается для распространённого случая (белые страницы на тематизированных фонах контролов) без каких-либо изменений кода
- Расширены регрессионные наборы Delphi и Lazarus до 120 случаев каждый, а набор C++Builder — до 103 случаев, охватывающие значение по умолчанию и round-trip цвета
Version 1.17.0
- В TPdfView добавлены переключатели блокировки пользовательского ввода, чтобы приложения, встраивающие просмотрщик в киоски, панели предпросмотра или контексты только для чтения, могли отключать жесты навигации без создания подклассов: AllowUserPageChange контролирует новые сочетания клавиш PgUp / PgDn / Ctrl+Home / Ctrl+End; ChangePageOnMouseScrolling контролирует новые переходы по страницам колесом вверх / вниз; AllowUserTextSelection зарезервирован для будущего пути выделения текста перетаскиванием мыши. Все три по умолчанию равны True, поэтому существующие приложения обновляются без изменения поведения
- Навигация по страницам колесом мыши пропускает Ctrl+колесо, чтобы приложения могли оставить Ctrl+колесо зарезервированным для масштабирования
- Расширены регрессионные наборы Delphi и Lazarus до 118 случаев каждый, а набор C++Builder — до 101 случая, охватывающие значения по умолчанию и round-trip переключателей
Version 1.16.2
- Расширено регрессионное покрытие TPdfView для кликов по ссылкам аннотаций, когда страница просмотрщика отличается от связанной страницы TPdf, с использованием реального headless-пути клика мыши в Delphi, Lazarus и C++Builder
- Наборы Delphi и Lazarus теперь выполняют по 114 случаев каждый, а C++Builder — 99 случаев
Version 1.16.1
- Исправлена обработка кликов по ссылкам в TPdfView, чтобы автоматические действия аннотаций и веб-ссылок использовали страницу, отображаемую в данный момент просмотрщиком, даже когда связанный компонент TPdf находится на другой странице
- Укреплена защита TPdfThumbnailView от висячих ссылок Pdf при уничтожении связанного компонента TPdf
- Добавлено регрессионное покрытие времени жизни ссылок на миниатюры; наборы Delphi и Lazarus теперь выполняют по 113 случаев каждый, а C++Builder — 98 случаев
- Синхронизированы README, документация тестов, поиск/индексное содержимое HTML Help и сгенерированные выходные данные пакетов C++ с интеграционными обновлениями v1.7.0 – v1.16.0
Version 1.16.0
- Добавлено новое демо Delphi PrintDialog (Demo/Delphi/PrintDialog), сфокусированное на N-up печати (1 / 2 / 4 / 9 страниц на лист) с фильтрацией нечётных / чётных страниц, рендерингом в градациях серого и опциональными границами ячеек толщиной 1 пиксель. Это сознательно небольшой компаньон к существующему демо PrintPDF, которое уже охватывает предпросмотр, недавние файлы, масштабирование и scaling
Version 1.15.0
- Добавлен новый компонент TPdfThumbnailView (модуль FPdfThumbnail), который рендерит одну миниатюру страницы в строке в прокручиваемой боковой панели с подсветкой при наведении и выделении плюс навигацией кликом. Спроектирован для размещения рядом с TPdfView, чтобы конечные пользователи могли просматривать длинный документ по страницам
- Компонент зарегистрирован на вкладке палитры losLab рядом с TPdf и TPdfView; ключевые свойства: Pdf, CurrentPageIndex, ThumbnailWidth, ThumbnailHeight, TextColor, HoverColor, SelectionColor, BorderColor и событие OnPageClick
- Расширены регрессионные наборы Delphi и Lazarus до 112 случаев каждый, а набор C++Builder — до 97 случаев, охватывающие значения по умолчанию, round-trip размера миниатюр, ограничение экстремальных значений, round-trip цвета и назначение обработчика событий
Version 1.14.0
- Добавлено новое демо Delphi BatchExport (Demo/Delphi/BatchExport), показывающее, как преобразовать множество файлов PDF в JPG за один проход с использованием TPdf.LoadCustomDocument для потоковой загрузки, IPdfCancellationToken для кооперативной отмены и индикаторов общего прогресса по файлам + текущего прогресса по страницам. Демо использует один экземпляр TPdf на файл (сам PDFium не потокобезопасен) и открывает выходную папку в Explorer после успешного завершения извлечения
Version 1.13.0
- В TPdfView добавлен UI-оверлей асинхронного рендеринга через три новых свойства: AsyncRendering, LoadingText и LoadingColor. Когда AsyncRendering равно True, путь отрисовки одной страницы рисует небольшой индикатор “Loading...” поверх отрендеренной страницы, чтобы приложения, использующие собственный worker для долгих рендеров, разделяли согласованную визуальную подсказку
- Значения по умолчанию сохраняют существующее поведение: AsyncRendering равно False, поэтому приложения, которые не подключаются к этой функции, не видят визуальных изменений
- В документации уточняется, что сам PDFium не потокобезопасен — фактический вынос рендеринга в worker требует, чтобы вызывающая сторона держала один TPdf на каждый worker; предстоящее демо batch-export показывает этот паттерн
- Расширены регрессионные наборы Delphi и Lazarus до 106 случаев каждый, а набор C++Builder — до 93 случаев, охватывающие значения по умолчанию и round-trip трёх свойств
Version 1.12.0
- В TPdfView добавлена обработка ссылок по клику. Новое свойство LinkOptions контролирует автоматическое поведение для четырёх типов действий ссылок PDF: goto (переход к странице), URI (ShellExecute), launch (ShellExecute) и встроенный GotoR (зарезервирован). По умолчанию включены loAutoGoto и loAutoOpenURI; loAutoLaunch и loAutoEmbeddedGoto остаются выключенными, чтобы случайный клик не мог запустить произвольную программу
- Добавлены события OnAnnotationLinkClick и OnWebLinkClick, которые срабатывают перед любым автоматическим действием и позволяют приложениям проверить ссылку, пометить её Handled или перенаправить (например, на запрос безопасности)
- Обнаружение клика по ссылке работает только тогда, когда жест является кликом, а не перетаскиванием, используя свежий якорь MouseDown, поэтому жесты панорамирования по-прежнему проходят через существующий путь прокрутки без изменений
- Расширены регрессионные наборы Delphi и Lazarus до 102 случаев каждый, а набор C++Builder — до 91 случая, охватывающие LinkOptions по умолчанию, round-trip установки и назначение обработчика событий
Version 1.11.0
- В TPdfView добавлена визуальная отделка: свойства PageShadowSize, PageShadowColor и PageBorderColor рисуют опциональную тень под прямоугольником страницы и однопиксельную границу вокруг неё. Значения по умолчанию сохраняют прежний плоский вид (PageShadowSize = 0; граница рисуется в clBlack по умолчанию, но сливается с белым фоном по умолчанию, пока вызывающая сторона не изменит цвета)
- Добавлено свойство SmoothScroll как opt-in флаг для будущей инкрементальной анимации прокрутки; свойство сегодня корректно сохраняется и подключено, чтобы приложения могли сохранять настройку, в то время как сторона рендеринга по-прежнему использует существующее немедленное поведение прокрутки
- Расширены регрессионные наборы Delphi и Lazarus до 98 случаев каждый, а набор C++Builder — до 89 случаев, охватывающие значения по умолчанию, round-trip свойств и ограничение отрицательного размера тени
Version 1.10.0
- Добавлена прямая вставка изображений через новые перегрузки TPdf.AddImage и TPdfView.AddImage, принимающие либо путь к файлу, либо TBitmap, в дополнение к существующему AddPicture на основе TPicture. AddImage(FileName) распознаёт любой формат, зарегистрированный в графических модулях VCL или LCL (BMP, PNG через модуль PngImage, JPG и т. д.), и проходит через тот же конвейер, что и AddPicture, поэтому поведение идентично
- AddImage(TBitmap) пропускает посредник TPicture, что упрощает вызывающим сторонам, которые уже держат TBitmap из работы по рендерингу или пакетной генерации
- Расширены регрессионные наборы Delphi и Lazarus до 92 случаев каждый, а набор C++Builder — до 84 случаев, охватывающие вставку bitmap, границы page-object, отклонение nil bitmap и загрузку BMP-файла
Version 1.9.0
- Добавлена высокоуровневая поддержка матрицы преобразования через новый класс TPdfMatrix в модуле FPdfMatrix. TPdfMatrix обёртывает FS_MATRIX из PDFium с ОО API для Translate, Scale, Rotate, HorizontalFlip, VerticalFlip, CentralFlip, Skew и Multiply, подходящим для составления преобразований перед передачей их в FPDFPageObj_SetMatrix и аналогичные API PDFium
- TPdfMatrix.Multiply правильно сохраняет снимок шести элементов матрицы перед вычислением новых значений строк, исправляя скрытую проблему, при которой альтернативные реализации на Pascal перезаписывают более ранние элементы во время того же вызова и дают неверные результаты для любой композиции за пределами чистого translate
- Расширены регрессионные наборы Delphi и Lazarus до 88 случаев каждый, а набор C++Builder — до 81 случая, охватывающие identity, reset, translate / scale / flip, порядок post-multiplicative композиции и регрессионный случай Multiply
Version 1.8.0
- Добавлена потоковая загрузка по требованию через новый метод TPdf.LoadCustomDocument(AStream, AOwnsStream) и вспомогательный класс TPdfStreamAdapter, опирающиеся на FPDF_LoadCustomDocument из PDFium. PDFium теперь читает блоки из предоставленного TStream только при необходимости, поэтому очень большие или удалённые PDF больше не требуют предварительной копии в памяти
- Добавлено опциональное владение потоком: передача AOwnsStream = True передаёт время жизни TStream объекту TPdf, который освобождает его при выполнении UnloadDocument
- Расширены регрессионные наборы Delphi и Lazarus до 79 случаев каждый, а набор C++Builder — до 75 случаев, охватывающие потоковую загрузку через TFileStream, очистку owned-stream и контракт «externally-owned-stream переживает unload»
Version 1.7.0
- Добавлены примитивы кооперативной асинхронной отмены в новом модуле FPdfAsync, экспонирующем IPdfCancellationToken / IPdfCancellationTokenSource и переиспользуемый singleton PdfNoCancellationToken, чтобы долгие потоки рендеринга и экспорта могли поддерживать чистую семантику отмены из UI
- Добавлен лёгкий помощник TPdfFuture<T>, который запускает worker в фоновом потоке и постит конверт TPdfFutureResult<T> обратно в главный поток, различая случаи успеха, отмены и неудачи
- Расширены регрессионные наборы Delphi и Lazarus до 76 случаев каждый, а набор C++Builder — до 73 случаев, с общим покрытием состояния отмены, идемпотентного отмены, fan-out обратных вызовов и пост-регистрации после отмены
Version 1.6.10
- Добавлен высокоуровневый доступ TPdf.PrintPageRanges к предпочтению диапазона страниц печати PDF viewer, возвращающий диапазоны страниц с базой единица для кода приложения
- Добавлены TPdf.SetFormFieldFlags / SetFormFieldFlagsAt и соответствующие помощники TPdfView, чтобы приложения могли обновлять флаги полей AcroForm через публичный API, включая покрытие флагов password и multi-select
- Укреплено покрытие ABI привязок PDFium для FPDF_DWORD размера Windows, обратных вызовов FPDF_FILEACCESS и полей слотов встраивания V8
Version 1.6.9
- Добавлены низкоуровневые привязки рендеринга Skia для недавно экспортированных API FPDF_RenderPageSkia и FPDF_FFLDrawSkia в поставляемых стандартных и V8 PDFium DLL
- Расширены публичные проверки покрытия привязок: загрузка стандартных и V8 DLL теперь проверяет точки входа рендеринга Skia наряду с существующими пробами возможностей V8/XFA
Version 1.6.8
- Добавлены TPdf.SetTextPositions и TPdfSingleArray для установки позиций каждого символа на существующих текстовых объектах через недавно экспортированный API FPDFText_SetPositions
- FPDFText_SetPositions повышен до обязательной привязки для текущих поставляемых PDFium DLL, при этом подтверждается, что точки входа рендеринга Skia остаются недоступными, поскольку DLL по-прежнему их не экспортируют
- Расширены регрессионные наборы Delphi, C++Builder и Lazarus до 65 случаев каждый с покрытием позиции текста
Version 1.6.7
- Добавлен высокоуровневый доступ TPdf к действиям JavaScript уровня документа из name-tree, возвращающий имена действий и сценарии через JavaScriptAction и JavaScriptActions
- Добавлен TPdf.FileIdentifier для чтения постоянных и изменяющихся trailer ID как двоичных TBytes без терминирующего байта PDFium
- Добавлены TPdf.PageBox, GetPageBox и SetPageBox для MediaBox, CropBox, BleedBox, TrimBox и ArtBox на текущей странице
- Подтверждено, что в текущих поставляемых PDFium DLL только точки входа рендеринга Skia остаются недоступными во время выполнения, поскольку эти экспорты отсутствуют
- Расширены регрессионные наборы Delphi, C++Builder и Lazarus до 64 случаев каждый с покрытием JavaScript документа, trailer ID и page-box
Version 1.6.6
- Добавлена поддержка во время выполнения для поставляемой PDFium DLL с включённым V8. Установка EnableV8Engine перед загрузкой теперь выбирает pdfium.v8.dll из дерева DLLs\Win32 или DLLs\Win64 и экспонирует привязки, специфичные для V8/XFA, когда загруженная DLL их предоставляет
- Добавлены V8FeaturesAvailable, XfaBStrHelpersAvailable, GetRecommendedV8Flags и низкоуровневые опциональные привязки для FPDF_BStr_*, FPDF_GetRecommendedV8Flags и FPDF_GetArrayBufferAllocatorSharedInstance
- FPDFText_SetPositions сделан опциональным, чтобы PDFium Delphi Component продолжал загружаться с PDFium DLL, которые не экспортируют этот экспериментальный сеттер позиций текста
- Расширены регрессионные наборы Delphi, C++Builder и Lazarus до 61 случая каждый с покрытием возможностей стандартной DLL и V8 DLL