Примечания к выпускам PDFiumPas
История версий пользовательских возможностей PDFiumPas, исправлений, улучшений просмотрщика, генерации документов, вывода PDF/A, рендеринга и обновлений документации
Последний выпуск
- Последняя версия: 2.19.0; Дата выпуска:
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)
- Последняя версия: 2.21.2; Дата выпуска:
Version 2.21.1
Исправлено (Fixed)
- Валидация гибридных ссылок теперь применяет дополнительные записи
/XRefStmдо классических xref-заполнителей той же ревизии, так что сжатые аннотации и другие объекты с версионными ограничениями больше не пропускаются
Version 2.21.0
Изменено (Changed)
- Все примеры просмотрщиков Delphi, C++Builder и Lazarus теперь могут открывать PDF, переданный как первый аргумент командной строки, а примеры
MultiPageViewerдля C++Builder и Lazarus предоставляют явные сочетания клавиш для выбора всего и копирования
Исправлено (Fixed)
- Последняя версия: 2.21.3; Дата выпуска:
Version 2.20.0
Изменено (Changed)
- Все примеры просмотрщиков Delphi, C++Builder и Lazarus теперь предоставляют согласованные сочетания клавиш для открытия, поиска, сохранения, печати, масштабирования и навигации, а каждый вариант
ViewerInteractionLabподдерживает переходы между страницами, проверенное ручное масштабирование 10–60 %, журналы взаимодействия и проверки координат кликов
Version 2.19.1
Исправлено (Fixed)
- Последняя версия: 2.21.4; Дата выпуска:
Version 2.19.0
Изменено (Changed)
- Последняя версия: 2.19.1; Дата выпуска:
Исправлено (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)
- Последняя версия: 2.21.12; Дата выпуска:
- Сохранение по пути к файлу теперь записывает во временный файл-сосед и заменяет назначение только после успешного завершения всех проверок сжатия, нормализации и версии
Исправлено (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 превышаетSupplementCMap,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
Добавлено (Добавлено)
Demo\Delphi\PreflightReportдобавляет предпросмотр Action Plan, который сводит в один remediation checklist непроходные требования, приоритеты, следующие шаги, коды проблем и рекомендацииDemo\Delphi\PreflightReportCliпринимаетplan/actionplanкак формат вывода для запуска одного файла и пакетной обработки, и пишет тот же remediation checklist в текстовый файл- Оба демо-примера 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, которая выводит связанную версию PDFiumPas
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, которая выводит связанную версию PDFiumPas
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, поэтому ссылка вродеtrusted.example@evil.exampleотносится к реальному хосту, а цели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(), который присоединяет существующую метку содержимого к объекту страницы. Когда последовательные объекты страницы используют одну и ту же метку, в сохранённом PDF они объединяются в одну метку, охватывающую их все; несмежные объекты получают отдельные копии - Подключён вышестоящий API
FPDFTextObj_SetFontSize()для изменения размера (в пунктах) существующего текстового объекта, дополняющий уже имеющуюся привязкуFPDFTextObj_GetFontSize()
Изменено (Изменено)
- Прилагаемые библиотеки времени выполнения PDFium (Win32 и Win64, стандартная сборка и сборка с V8) обновлены до вышестоящего снимка от 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 PDFiumPas — переписывает существующий объект 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) до восходящего снимка от 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 теперь определены в восходящей форме битового сдвига (устаревшее численное значение 3 сохранено как FPDF_REMOVE_SECURITY_DEPRECATED для бинарной совместимости)
- В FPdfView.pas добавлены перечисление FPDF_FONT_BACKEND_TYPE (FREETYPE / FONTATIONS) и соответствующее поле m_FontLibraryType в FPDF_LIBRARY_CONFIG, благодаря чему приложения, инициализирующие PDFium с рендером Skia, могут выбирать шрифтовой backend при запуске
- Сигнатура TFPDFPage_InsertObject приведена в соответствие с восходящей версией: C-функция теперь возвращает FPDF_BOOL (TRUE при успехе, FALSE если page_object равен NULL или передача владения не удалась) вместо void. Существующие вызовы PDFiumPas продолжают компилироваться без изменений, поскольку 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, используемой в справочнике HotXLS: согласованы размеры 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. Работает на любой платформе, поддерживаемой PDFiumPas
- Добавлен 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 сделан опциональным, чтобы PDFiumPas продолжал загружаться с PDFium DLL, которые не экспортируют этот экспериментальный сеттер позиций текста
- Расширены регрессионные наборы Delphi, C++Builder и Lazarus до 61 случая каждый с покрытием возможностей стандартной DLL и V8 DLL
Version 1.6.5
- Добавлено инспектирование структурного дерева Tagged PDF через TPdf.StructureElements и TPdfView.StructureElements, включая тип элемента, заголовок, альтернативный текст, фактический текст, текст расширения, язык, идентификаторы marked-content, количество детей и количество атрибутов
- Добавлен выбор режима печати PDFium для Windows через TPdfPrintMode и SetPdfPrintMode, охватывающий режимы печати EMF, только текст, PostScript, pass-through, image-mask и Type 42
- Добавлены низкоуровневые привязки для оставшихся публичных экспортов PDFium из стандартной DLL, охватывающих действия JavaScript, флаги формы аннотации/цвет шрифта, состояние active page-object, индексированную вставку, значения с плавающей точкой content-mark, данные ICC-профиля изображения, удаление form-object и позиции текста
- Расширены регрессионные наборы Delphi, C++Builder и Lazarus до 59 случаев каждый с покрытием структурного дерева Tagged PDF, режима печати и привязок публичных экспортов
Version 1.6.4
- Обновлены демонстрации Delphi, C++Builder и Lazarus, чтобы автоматически открывать сгенерированные PDF, экспортированные текст/изображения и папки пакетного вывода после успешного создания
Version 1.6.3
- Расширены согласованные регрессионные наборы Delphi, C++Builder и Lazarus до 56 случаев каждый с GUI-покрытием TPdfView для помощников fit-zoom, round-trip координат устройства/страницы, hit-тестирования символов и панорамирования мышью через контролы просмотрщика со скрытыми окнами
- Фикстуры TPdfView теперь используют явный размер просмотрщика и тестовые подклассы, которые упражняют защищённые обработчики мыши, сохраняя при этом наборы полностью headless
Version 1.6.2
- Исправлено TPdf.AddPage(0, ...), чтобы вставленная первая страница немедленно становилась активной. Существующий образец кода продолжает работать, в то время как PageNumber теперь сообщает корректную страницу с базой единица после вставки
- Синхронизирована версия пакета Lazarus и расширены согласованные регрессионные наборы Delphi, C++Builder и Lazarus до 52 случаев каждый
Version 1.6.1
- Исправлено неправильное требование минимальной версии в валидаторе соответствия версии PDF v1.6.0: действие SetState переклассифицировано с PDF 1.5 на PDF 1.2, что соответствует разделу 6.9.9 PDF 1.2 Reference. Цели SaveAs PDF 1.3 / 1.4, которые содержат действия SetState, теперь сохраняются правильно, а не отклоняются
- Добавлены соответствующие лексические проверки PDF 1.2 согласно тому же разделу спецификации: действия Sound, Movie и NOP плюс цветовое пространство Separation теперь блокируются, когда выбранная целевая версия старше PDF 1.2
- Расширены регрессионные наборы Delphi, C++Builder и Lazarus до 50 случаев каждый путём добавления положительного теста принятия SetState для PDF 1.4, который фиксирует исправленную границу
Version 1.6.0
- Укреплены явные цели SaveAs PDF 1.0 – PDF 1.7 с полным валидатором соответствия версии возможностям, охватывающим всю временную шкалу возможностей от PDF 1.1 до ISO 32000-1. Валидатор теперь блокирует сохранения, содержащие записи словаря, имена фильтров, подтипы аннотаций, типы действий, шрифты, цветовые пространства или параметры шифрования, введённые после выбранной целевой версии. Примеры: JBIG2Decode (1.4+), MarkInfo / Tagged PDF (1.4+), OutputIntents (1.4+), ICCBased / DeviceN / BleedBox / TrimBox / ArtBox / StructTreeRoot (1.3+), аннотации Polygon / PolyLine / Caret / Screen / Watermark / Redact, шифрование AES и AES-256 (CFM AESV2 / AESV3), записи каталога Perms / Legal / Requirements / NeedsRendering и привязанные к версии действия, такие как JavaScript, Trans, SetState, Rendition, GoToE, GoTo3DView, отклоняются, когда целевая версия PDF не может их представить
Version 1.5.13
- Расширены регрессионные наборы Delphi, C++Builder и Lazarus до 49 случаев каждый, добавлено прямое покрытие отклонения цветовых пространств ICCBased, Tagged PDF MarkInfo, аннотаций Polygon, шифрования AES (V2) и аннотаций Redact против целей PDF 1.2 / 1.3 / 1.4 / 1.5 / 1.6 соответственно
Version 1.5.12
- Исправлена постобработка SaveAs для инкрементальных переписываний каталога. PDFiumPas теперь валидирует последний повторённый косвенный объект, поэтому существующие переопределения catalog /Version правильно заменяются при сохранении в явно более старую целевую версию PDF
- Расширены регрессионные наборы Delphi, C++Builder и Lazarus до 44 случаев каждый, добавлено прямое покрытие замены устаревшего catalog /Version, нормализации версии каталога PDF 1.4 и отклонения функций прозрачности и portable-collection, когда выбранная целевая версия PDF не может их представить
Version 1.5.11
- Укреплён версионированный вывод SaveAs для явных целей PDF 1.3, 1.4, 1.5, 1.6 и 1.7. PDFiumPas теперь нормализует маркеры версии каталога, сохраняет безопасность версии для Fit Height OpenAction по умолчанию и отклоняет более новые функции PDF, когда выбранная целевая версия не может их представить
- Добавлено регрессионное покрытие Delphi, C++Builder и Lazarus, которое сохраняет и перезагружает явные файлы PDF 1.3 – PDF 1.7, проверяя финальный заголовок, Fit Height OpenAction по умолчанию и сообщаемую версию PDF
Version 1.5.10
- Сделан шаг от варианта B спецификации к варианту C путём добавления smoke-тестов TPdfView во все три IDE-набора (Tests.PdfView). Каждый набор строит скрытый родительский TForm (через TForm.CreateNew на сторонах Pascal и
new TForm(NULL, 0)на стороне C++Builder), переподключает TPdfView к новому родителю, устанавливает Active := True, а затем проверяет round-trip поверхность для PageCount, значения по умолчанию PageNumber, Zoom, Rotation, DisplayMode и что View.Text совпадает с базовым TPdf.Text. Каждый IDE-набор теперь выполняет 39 случаев
Version 1.5.9
- Сделан шаг от варианта A спецификации к варианту B путём добавления render smoke-тестов во все три IDE-набора. Каждый набор Tests.Render вызывает TPdf.RenderPage на sample.pdf и проверяет три надёжных сигнала вместо побайтных контрольных сумм: возвращённый bitmap точно соответствует запрошенному размеру в пикселях; разные запрошенные размеры (200x100, 64x256) производят соответствующие bitmap; и отрендеренная страница содержит не менее 95% белого фона с не менее чем 50 (Lazarus: 20) небелых пикселей, отмечающих сглаженный текст. Каждый IDE-набор теперь выполняет 33 случая
Version 1.5.8
- Закрыты исходные группы тест-плана A(2) добавлением ещё семи регрессий на IDE: TPdf.CreateAnnotation, создающий аннотацию anHighlight плюс round-trip SaveAs/LoadDocument, путь чтения AcroForm на Demo/Delphi/FormFill/cmp_fill_out_and_merge_forms.pdf (FormType равно ftAcroForm, FormFieldCount > 0, FlattenAllPages сбрасывает поля до нуля) и тихое покрытие путей чтения для Bookmarks, LinkAnnotationCount и WebLinkCount на документе, не имеющем ни одной из этих функций. Каждый IDE-набор теперь выполняет 30 случаев
Version 1.5.7
- Расширены наборы Delphi (DUnitX), Lazarus (FPCUnit) и C++Builder (GoogleTest) семью новыми регрессиями на IDE: PdfVersion, PageRotation, поиск подстроки TPdf.FindFirst / FindNext, согласование CharacterOrigin / CharacterRectangle с источником AddText, регистрация CreateAttachment плюс round-trip SaveAs/LoadDocument и round-trip AddText с акцентированным текстом, который проверяет, что путь встраивания европейских TrueType из v1.3.0 сохраняет дополнительные кодовые точки Latin-1 нетронутыми
Version 1.5.6
- Сохранённые PDF теперь получают действие открытия Fit Height для первой страницы по умолчанию, когда существующее OpenAction отсутствует, чтобы PDF-просмотрщики изначально отображали сгенерированные документы с масштабом по высоте страницы
- Добавлено регрессионное покрытие Delphi, Lazarus и C++Builder для сгенерированного OpenAction и настройки Fit Height
Version 1.5.5
- Добавлены регрессионные тесты в наборах Delphi (DUnitX), Lazarus (FPCUnit) и C++Builder (GoogleTest) для индексированной поверхности API инспекции символов и шрифтов (TPdf.FontBaseName, FontFamilyName, FontWeight, FontItalicAngle, FontData, FontIsEmbedded, CharacterFontWeight, CharacterAngle). Набор Lazarus намеренно пропускает FontData, который в настоящее время вызывает access violation внутри FPDFFont_GetFontData под FPC
Version 1.5.4
- Добавлено C++Builder Attachment демо, портированное из образца Delphi, охватывающее создание PDF, добавление, перечисление, извлечение, удаление и сохранение встроенных вложений файлов с отображением подтипа MIME
Version 1.5.3
- Открыт расчёт разворота страниц, лежащий в основе двухстраничных режимов TPdfView, как помощник уровня модуля ComputeSpreadPages(DisplayMode, PageNumber, PageCount, out LeftPageNo, out RightPageNo). Поведение не изменилось; помощник делает правило, учитывающее обложку, независимо тестируемым без создания просмотрщика
- Добавлены пять регрессионных тестов в наборах Delphi (DUnitX), Lazarus (FPCUnit) и C++Builder (GoogleTest), охватывающих пустые документы, стандартное двухстраничное сопоставление, обложку, стоящую отдельно в dmTwoPageContinuousWithCover, пары после обложки и поведение ограничения для последней страницы / выхода за диапазон
Version 1.5.2
- Добавлена поддержка языка документа через TPdf.Language, отображаемая на запись /Lang каталога PDF
- Добавлен доступ к подтипу MIME вложения с TPdf.AttachmentType
- В TPdfAnnotationSubtype добавлен anRedact и добавлены помощники удаления страничных объектов для TPdf и TPdfView
- Обновлены демо просмотрщика и вложений для отображения новой информации о языке и типе вложения, когда она доступна
Version 1.5.1
- Добавлен dmTwoPageContinuousWithCover для TPdfView, чтобы макеты просмотрщика могли отображать первую страницу отдельно, а затем продолжать двухстраничными разворотами
- Обновлены демо Delphi, C++Builder и Lazarus MultiPageViewer для экспонирования режима отображения двух страниц с учётом обложки
Version 1.5.0
- Добавлены автоматизированные тестовые наборы уровня smoke для Delphi (DUnitX), Lazarus (FPCUnit) и C++Builder (GoogleTest). Три набора используют единый PDF-фикстуру в Tests\TestData и выполняют одни и те же семь случаев каждый, охватывающие загрузку документа, информацию о странице, извлечение текста, метаданные, round-trip сохранения, проверку заголовка PDF и свойство Compressed
Version 1.4.3
- Улучшено демо FontProperties для отображения API метаданных шрифтов как TPdfView, так и TPdf, включая дескрипторы шрифтов, размер данных шрифта и метрики символов
- Добавлены индексированные свойства инспекции символов и шрифтов TPdfView и обновлено демо FontProperties для запроса метаданных шрифта текстового объекта
Version 1.4.2
- Добавлены индексированные свойства инспекции символов и шрифтов в TPdf для анализа текста без необходимости в просмотрщике. Свойства, индексированные по символам (CharacterAngle, CharacterFontSize, CharacterFontWeight), запрашивают метрики каждого символа из текстового потока текущей страницы. Свойства, индексированные по page-object (FontAscent, FontBaseName, FontData, FontDescent, FontFamilyName, FontHandle, FontIsEmbedded, FontItalicAngle, FontWeight), запрашивают метаданные шрифта для любого текстового объекта на текущей странице
- Нетекстовые page-object возвращают безопасные нулевые или пустые значения для всех Font* свойств, а не вызывают ошибку, что упрощает итерацию по каждому page-object и инспекцию только текстовых
- FontBaseName читает имя базового шрифта PostScript напрямую, а не возвращается к имени семейства шрифтов, давая более точный идентификатор для встроенных шрифтов
Version 1.4.1
- Добавлены версии демо EuropeanText для C++Builder и Lazarus, чтобы все поддерживаемые семейства IDE могли проверить генерацию акцентированного европейского текста с системными шрифтами TrueType
- Добавлены версии демо FormFill для C++Builder и Lazarus, включая образцы PDF-форм, редактирование полей, регенерацию внешнего вида, сохранение с заполнением и сохранение с уплощением
Version 1.4.0
- Добавлена поддержка Lazarus / Free Pascal: новый пакет PDFiumLaz предоставляет те же TPdf, TPdfView и связанные компоненты под widget-сетом LCL, расширяя библиотеку на IDE Lazarus и компилятор Free Pascal наряду с существующими пакетами Delphi и C++Builder
- Добавлены версии демонстраций для Lazarus, чтобы разработчики Lazarus могли исследовать каждую функцию с помощью запускаемых примеров
- Исправлена проблема компиляции Lazarus, при которой условные определения Free Pascal оценивались вместе с проверками версии компилятора Delphi, заставляя сборки FPC пытаться разрешить специфичные для Delphi имена модулей и сбоить
Version 1.3.1
- Задокументирован рабочий процесс уплощения форм в справочном наборе: GenerateFormAppearances, FlattenPage, FlattenAllPages и связанные константы FLAT_* / FLATTEN_* теперь освещены в TPdf, TPdfView, справочнике API, матрице функций и примерах программирования
- Исправлена таблица архитектуры на странице обзора, чтобы в ней перечислялись фактические модули привязок, поставляемые в папке Lib
Version 1.3.0
- Улучшена поддержка европейских символов при создании PDF. TPdf.AddText теперь загружает и кэширует соответствующий системный TrueType шрифт перед созданием текстового объекта, сохраняя акцентированные символы чешского, французского, немецкого, испанского, португальского, польского и турецкого языков, которые встроенные стандартные шрифты PDFium не могут представить
- Приложения, которые ранее производили знаки вопроса или замещающие глифы для не-ASCII латинского текста, теперь рендерят правильно без каких-либо изменений кода. Добавлено демо EuropeanText для иллюстрации функции
Version 1.2.0
- В TPdf добавлено обновление внешнего вида AcroForm: вызов GenerateFormAppearances после изменения значений FormField[] обновляет внешний вид виджета, чтобы заполненные значения были видны в стандартных PDF-просмотрщиках без необходимости интерактивного сеанса редактирования
- Добавлены помощники уплощения форм в TPdf (FlattenPage / FlattenAllPages) и TPdfView (FlattenPage для текущей страницы вида). Уплощение постоянно встраивает заполненные значения полей как обычное содержимое страницы и удаляет интерактивный слой формы, производя статический документ, который рендерится согласованно во всех просмотрщиках
- Добавлен Demo\Delphi\FormFill для демонстрации рабочих процессов fill-and-save и fill-and-flatten с образцом AcroForm PDF
Version 1.1.2
- Добавлено сжатие PDF-потоков при сохранении. Новое свойство TPdf.Compressed (включено по умолчанию) переписывает несжатые потоки содержимого как сжатые потоки FlateDecode при сохранении, значительно уменьшая размер файла для программно сгенерированных PDF. Приложения, требующие простого несжатого вывода, могут установить Compressed в False перед вызовом SaveAs
Version 1.1.1
- Сборки пакета Win64 больше не включают модули регистрации времени проектирования, предотвращая сбои времени сборки, когда пакет Win64 развёртывается в контексте только времени выполнения
- Загрузчик PDFium DLL теперь сначала ищет в подкаталоге приложения Win32 или Win64, используя стандартные имена pdfium.dll и pdfium.v8.dll, и возвращается к плоскому каталогу приложения и системному каталогу Windows. Это соответствует размещению DLL, поставляемому с пакетом компонентов, делая установку простой
Version 1.1.0
- Исправлен дефект визуального обрезания в режиме двух страниц TPdfView: содержимое страницы перетекало через корешок, потому что обе плитки левой и правой страниц делили один прямоугольник обрезания. Каждая плитка теперь обрезается независимо, поэтому содержимое остаётся в пределах границ своей страницы
- Улучшено сообщение об ошибке демо Delphi, когда PDFium DLL не может быть найдена, предоставляя более чёткое приглашение с ожидаемым именем DLL и местоположением