Журнал изменений
История выпусков
« Вернуться к указателю документации
История версий библиотеки PDFlibPas. Записи перечислены от самых новых к самым старым; каждая версия соответствует семантическому версионированию согласно политике выпусков проекта.
Языки:English (US)English (UK)Español (España)Español (Latinoamérica)DeutschFrançaisItaliano日本語Português (Brasil)NederlandsSvenskaPolskiTürkçe한국어العربيةРусский简体中文繁體中文
v3.56.42 2026-05-27
- Исправлен буферный путь расшифровки AES-256, добавленный в v3.56.41: вызывающий код теперь может записывать результат расшифровки обратно в тот же
AnsiString, который предоставил буфер шифротекста, без нарушения доступа. - Обычный сценарий API
LoadFromFile,Encrypt,SaveToFile, повторная загрузка,DecryptиSaveToFileснова завершается для больших загруженных PDF, сохраняя оптимизацию расшифровки AES-CBC с уменьшенным копированием. - Добавлены регрессионные AES-тесты для случаев, когда входной буфер и результат являются одним и тем же объектом при откате зашифрованных stream во время сохранения, включая большие payloads 504 KB, которые раньше выявляли сбой.
v3.56.41 2026-05-27
- Добавлен
TPDFlib.DACopyFileдля рабочих процессов Direct Access, которым нужны число страниц и неизмененная копия файла без построения полного обычного графа объектов. - Оптимизировано расшифрование AES-256 за счет буферных путей AES-CBC, используемых при расшифровании загруженных строк и stream, что уменьшает дополнительное копирование шифртекста для больших зашифрованных stream.
- Demo Delphi
HugeFileBenchmarkтеперь включает строкуdirect-copy, а также фильтры--opsи--skipдля целевых запусков на больших файлах.
v3.56.40 2026-05-26
- Демонстрации
HelloWorldдля Delphi и C++Builder теперь создают более содержательный стартовый PDF с информацией о документе, выводом выбранным стандартным шрифтом, оформленным заголовочным блоком, простой векторной графикой и подсказками для следующих шагов, сохраняя тот же сценарий сборки и запуска. - Все заметки к демонстрациям Delphi и C++Builder заменены удобными для браузера страницами
Readme.html, включая вспомогательные заметки о паролях, ограниченных файлах и результатах подписи; индексы демонстраций теперь направляют пользователей к HTML-заметкам.
v3.56.39 2026-05-26
- Пути сохранения прямого файлового API теперь линейно строят таблицы поиска перекрестных ссылок, поэтому
DASaveAsFileи связанные пути прямого сохранения работают намного быстрее с PDF, где очень много объектов или плотные деревья страниц. - Оптимизированный writer сохраняет ту же семантику цепочки свободных объектов и избегает повторных сканирований номеров объектов при полной генерации xref, ускоряя крупные рабочие процессы прямого сохранения без изменения публичного API или контракта вывода.
v3.56.38 2026-05-26
- Исправлен вывод шифрования обычного API:
Encryptтеперь создает или сохраняет trailer/IDдо записи данных безопасности AES-256, поэтому зашифрованные PDF после повторной загрузки снова определяются черезEncryptionStatus. - Рабочий процесс обычного API
LoadFromFile,Encrypt,SaveToFile, повторная загрузка,DecryptиSaveToFileтеперь сохраняет состояние шифрования до явногоDecrypt, совпадая с поведением API прямого доступа к файлам для больших устаревших PDF.
v3.56.37 2026-05-26
- Добавлена функция
TPDFlib.ComparePreflightReports, построчный компаратор для текстовых preflight-отчетов, который игнорирует изменяемые строки временной меткиGenerated:и возвращает пустую строку, когда стабильное содержимое отчета совпадает. - Демонстрация Delphi
PreflightReportтеперь поддерживает--compare <file>в однофайловом режиме, записывает UTF-8-отчет.diff.txtи возвращает код выхода 2, если созданный текстовый отчет отличается от baseline.
v3.56.36 2026-05-26
- Демонстрационная программа Delphi
PreflightReportтеперь поддерживает пакетную обработку каталогов с--input-dir,--output-dirи--recursive, создавая по одному отчету на PDF с именем<basename>.preflight.<ext>. - Пакетный режим записывает UTF-8 файл
preflight-summary.csv, где указаны каждый исходный PDF, статус pass/fail, количество проблем и путь к созданному отчету, сохраняя существующий контракт кодов выхода для автоматизации.
v3.56.35 2026-05-26
ReportFormat = 3добавляет вывод CSV вTPDFlib.CreatePreflightReportExиTPDFlib.SavePreflightReportEx, создавая строки UTF-8 для метаданных отчета, каждой выбранной проверки соответствия, отдельных кодов и сообщений о проблемах, а также итоговой сводки.- Демонстрационная программа Delphi
PreflightReportтеперь поддерживает--format csvи--csv, поэтому командные preflight-запуски могут передавать данные в электронные таблицы или простые CI-парсеры без постобработки JSON или извлечения текста.
v3.56.34 2026-05-26
- Добавлены API с выбором формата
TPDFlib.CreatePreflightReportExиTPDFlib.SavePreflightReportExдля создания preflight-отчетов PDF/A и PDF/UA-1 в виде обычного текста, JSON или автономного HTML при сохранении существующих текстовых API. - Демо Delphi
PreflightReportтеперь поддерживает--format text|json|html, а также сокращения--jsonи--html, поэтому один и тот же командный workflow может создавать отчеты для чтения человеком или машинно-читаемые CI-артефакты.
v3.56.33 2026-05-26
- Добавлены
TPDFlib.CreatePreflightReportиTPDFlib.SavePreflightReport, чтобы приложения могли создавать переиспользуемые текстовые отчеты на основе встроенных проверок соответствия PDF/A и PDF/UA-1 без ручного перебора дескрипторов строковых списков. - Демо Delphi
PreflightReportтеперь напрямую вызывает API отчетов библиотеки, поэтому пример остается сфокусированным на командной строке, выбранных проверках, режиме первой ошибки и кодах выхода, удобных для автоматизации.
v3.56.32 2026-05-26
- Добавлен новый консольный пример Delphi
PreflightReport: он запускает проверки PDF/A и PDF/UA-1 черезCheckFileCompliance, перечисляет списки проблем с помощьюGetStringListCountиGetStringListItemи записывает текстовый preflight-отчет. - Пример поддерживает параметры
--input,--output,--pdfa,--pdfua,--bothи--first-issue, а также коды завершения для автоматизации: проверка пройдена, проблемы найдены и ошибка выполнения.
v3.56.31 2026-05-25
GetCustomKeys(2)теперь последовательно скрывает системные записи каталога, управляемые библиотекой, включая/OutputIntents,/Extensions,/Requirements,/Collectionи/NeedsRendering.- Настройки PDF/A, создаваемые функцией
SetPDFAMode, больше не отображаются в виде пользовательских ключей каталога, что позволяет разделить перечисление метаданных приложения от структур, обеспечивающих соответствие стандарту PDF.
v3.56.25 2026-05-23
- Функция GetPDFUADiagnostics на стороне редактора теперь корректно обрабатывает проблему
MULTIPLE-H-CHILDREN:N, обеспечивая совместимость с функцией10044, начиная с версии v3.56.24. ISO 14289-1 §7.4.4 запрещает наличие более одного непосредственного дочернего элемента H для каждого узла дерева тегов — проверка на стороне редактора выполняется всякий раз, когда дерево FStructElems в памяти содержит такое нарушение. - Новый вспомогательный класс CountMultipleHChildren для обхода дерева выполняет обход дерева в глубину, подсчитывая дочерние элементы H на каждом уровне. Проверка выполняется параллельно с существующими обходами LIST-STRUCT / LIST-NO-NUMBERING и использует ту же схему обхода FStructElems.
v3.56.24 2026-05-23
- Функция аудита PDF/UA-1 теперь включает проверку уникальности тегов H ISO 14289-1 §7.4.4.
10044сообщает о любом узле структуры, содержащем более одного непосредственного дочернего элемента H —, что запрещено спецификацией для документов со строгой структурой, и это ограничение применяется к любому узлу дерева тегов независимо от общего режима структуры. Другое требование § 7.4.4 (документ должен быть либо со строгой, либо со слабой структурой, но не и то, и другое) требует эвристики на уровне всего документа и намеренно не включена в эту проверку. - Новый обход дерева структуры в порядке обхода (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness) подсчитывает непосредственные дочерние элементы H для каждого узла и рекурсивно обходит дерево в глубину. Использует тот же декодер K-образной формы, что и существующие обходы заголовков / списков / заметок.
v3.56.23 2026-05-23
- Аудит PDF/UA-1 теперь включает в себя две проверки шрифтовых программ, которые ранее откладывались в слое словаря v3.56.10 до появления TrueType парсера.
10034сообщает о несимвольных TrueType программах, в которых встроенная SFNT таблица cmap содержит только символьную запись (platformID=3, encodingID=0). — § В первом абзаце версии 7.21.6 требуется хотя бы одна несимвольная подтаблица cmap, чтобы программа могла отображать символы, объявленные в ее /Encoding..10035сообщает о несимвольных TrueType массивах/Encoding /Differences, имена глифов которых не являются членами списка глифов Adobe (кроме.notdef). — § В третьем абзаце версии 7.21.6 требуется, чтобы каждая запись Differences находилась в AGL. - Новая
Lib/PDFlibPDFUAFontInspect.pasреализует толерантный сканер каталога таблиц и парсер каталога подтаблиц cmap. Таблица списка глифов Adobe с 4281 именем, добавленная в качестве основы в предыдущем коммите инфраструктуры, теперь подключена через проверку Differences. Программы, которые не анализируются как SFNT (шрифт Type 1 PFB / PFA, OpenType коллекция, произвольный мусор), немедленно пропускаются. В слое аудита предпочтительнее ложные отрицательные результаты, чем ложные положительные.
v3.56.22 2026-05-23
- Аудит PDF/UA-1 теперь включает проверки данных медиафайлов.
10042сообщает о словарях данных медиафайлов (идентифицируемых/S /MCD, опционально/Type /MediaClip), в которых отсутствует необходимая запись/CTcontent-type.10043сообщает о тех же словарях, в которых отсутствует необходимый/Altмассив. ISO 32000-1 Таблица 274 указывает оба ключа как необязательные, но ISO 14289-1 §7.18.6 делает их обязательными, чтобы программы чтения с экрана могли объявлять содержательное описание встроенных мультимедиа. - Это Фаза 6 плана глубокого аудита PDF/UA (
.superpowers/plans/2026-05-23-pdfua-deep-audit-plan.md). Он работает без каких-либо зависимостей от парсера шрифтовых программ или потока содержимого, поэтому это первый подкласс, следующий за серией v3.56.0..v3.56.13.
v3.56.21 2026-05-23
- Новый
SetSignProcessCommitmentTypeгенерирует атрибутcommitment-type-indicationс подписью (OID 1.2.840.113549.1.9.16.2.16, ETSI EN 319 122-1 v1.2.1 §5.2.3) внутри пути PAdES-B-B SignerInfo. Принимает целочисленные коды от 1 до 6, соответствующие известным схемам ETSI (OIDsid-cti-ets-proofOfOriginчерезid-cti-ets-proofOfCreation); передайте 0, чтобы очистить. Коды, выходящие за пределы допустимого диапазона, отклоняются. - Новый
SetSignProcessSignaturePolicyгенерирует атрибут CAdES с подписью (OID 1.2.840.113549.1.9.16.2.15, §5.2.9). Принимает политику в десятичном формате OID, хеш документа политики в виде шестнадцатеричной строки в верхнем регистре и код алгоритма хеширования (1=SHA-1, 2=SHA-256, 3=SHA-384, 4=SHA-512, 0=автоматически /SHA-256). Атрибут содержитSignaturePolicyIdSEQUENCE сsigPolicyId+sigPolicyHash(OtherHashAlgAndValueSEQUENCE). - Оба атрибута действуют только при SubFilter, равном
ETSI.CAdES.detached(путь PAdES-B-B); они расширяют существующий массивrgAuthAttrнаряду сcontent-typeиsigning-certificate-v2. PAdES Таблица 1, строка d), запрещает объединениеcommitment-type-indicationс записью PDF в словаре подписей/Reason; вызывающая сторона несет ответственность за то, чтобы не устанавливать оба значения одновременно.
v3.56.20 2026-05-23
- Новая функция
AddPAdESDSSVRIдобавляет запись подсловаря Signature VRI в DSS, который собирается, завершая структуру ETSI EN 319 142-1 v1.2.1, раздел 5.4.2.3, Информация, связанная с проверкой. Запись имеет ключ, состоящий из шестнадцатеричного представления в верхнем регистре SHA-1 сигнатур ', а ее подмассивыCert/CRL/OCSPзаполняются путем ссылки на соответствующие родительские потоки DSS с использованием индексов, начинающихся с нуля, указанных в виде разделенных запятыми списков (например,"0,2,5"). - Основная функция
TSmartPDFDocument.AddPAdESDSSWithVRIотслеживает номера объектов потока, выдаваемые для каждого сертификата / CRL / OCSP, и использует их для записи подмассивов VRI в качестве непрямых ссылок обратно в те же потоки, на которые уже указывают родительские массивы DSS, что соответствует требованию спецификации, согласно которому записи VRI должны использовать общее хранилище с родительским словарем DSS. Исходная точка входаAddPAdESDSSпродолжает работать без изменений для вызывающих, которым не требуется VRI. - Каждый подсловарь VRI для каждой сигнатуры содержит необязательный маркер
/Type /VRI, чтобы инструменты, которые обходят каталог по тегамType, могли распознать структуру без повторной обработки родительского пути.
v3.56.19 2026-05-23
- Новый PAdES-B-T рабочий процесс для добавления RFC 3161 / RFC 5816 метки времени подписи (id-aa-signatureTimeStampToken, OID 1.2.840.113549.1.9.16.2.14) к существующей PAdES-B-B подписи.
NewPAdESSignatureTimeStampProcessFromFile/FromStream/FromStringоткрывает подписанный PDF,SetPAdESSignatureTimeStampFieldприсваивает имя полю,GetPAdESSignatureValueHashHexвозвращает SHA-256 (или 384 / 512) хэш идентификатора подписывающего ' для отправки в TSA,GetPAdESSignatureCMSBytesпредоставляет существующую CMS полезную нагрузку,SetPAdESSignatureCMSBytesпринимает расширенные CMS байты, которые вызывающий собирает с помощью своей CMS библиотеки, иEndPAdESSignatureTimeStampProcessToFile/ToStream/ToStringобъединяет новую CMS в исходное/Contentsместо. BuildPAdESSignatureTimeStampAttribute- это помощник, не требующий состояния, который оборачивает TSA-выпущенный TimeStampToken в атрибут CMS, которыйSignerInfo.unsignedAttrsожидает, поэтому вызывающие, у которых уже есть CMS библиотека, могут пропустить OID + SET этапов настройки.- Новый
SetSignProcessReserveContentsBytesрасширяет/Contentsместо в момент первоначальной подписи, чтобы добавленная после этого расширенная CMS поместилась без переполнения исходного резерва. Типичные TSA-выпущенные TimeStampTokens добавляют 2-6 KB к SignerInfo; укажите 1024-8192, чтобы оставить запас. Если запаса недостаточно, вызов расширения возвращает13(переполнение вывода). - Библиотека не поставляется с TSA клиентом HTTP; вызывающий получает TimeStampToken (обычно 30-50 строк TSP запроса + HTTP POST для, например, FreeTSA или DigiCert). В Windows ⟦P0010⟧
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR, в принципе, могла бы автоматизировать CMS внедрение в библиотеку, но возвращаетCRYPT_E_INVALID_INDEX(0x80091008) для деактивированной SignedData формы PAdES, поэтому вместо этого используется предоставленный вызывающим CMS путь к байтам.
v3.56.18 2026-05-23
- Атрибут PAdES
signing-certificate-v2теперь включает необязательное полеIssuerSerial, определенное RFC 5035 (ESSCertIDv2). Различное имя сертификата подписи' оборачивается вGeneralName [4] EXPLICIT directoryNameCHOICE внутриGeneralNames, за которым следует серийный номер сертификата в виде ASN.1 INTEGER. Байты серийного номера поступают в порядке little-endian из Windows CryptoAPI (CRYPT_INTEGER_BLOB) и инвертируются в порядке big-endian с добавлением байта положительного целого числа, если установлен старший бит, что соответствует тому, как OpenSSL и BouncyCastle выдают то же поле. - Верификаторы, которые проверяют соответствие имени и серийного номера набору кандидатов для построения пути (в частности, EU DSS в строгом режиме), теперь находят оба идентификатора в атрибуте signing-cert-v2; предыдущий вывод v3.56.17 предоставлял только ссылку
certHash. - Новые помощники ASN.1
DER_IntegerFromLittleEndian(обрабатывает порядок байтов Win32CRYPT_INTEGER_BLOB) иDER_ContextTagExplicit(оборачивает полезную нагрузку в контекстно-специфический тег) дополняют микро-кодировщикPDFlibASN1. Новые объявленияCERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXTвPDFlibCryptoAPIпредоставляют пути подписи доступ к проанализированным полям сертификата.
v3.56.17 2026-05-23
- Встроенный путь подписи
ETSI.CAdES.detachedтеперь формирует структурно соответствующие PAdES-B-B подписи. Библиотека сама собирает CMS authenticated attributes —content-type(id-data) иsigning-certificate-v2по RFC 5035 / RFC 5816 с SHA-256 хешем сертификата подписи — и передаёт их вCryptSignMessageчерезrgAuthAttr. Как только это поле становится non-NULL, Windows CryptoAPI перестаёт автоматически добавлять атрибутsigning-time, запрещённый PAdES (ETSI EN 319 142-1 v1.2.1 Table 1), поэтому итоговыйSignerInfoнесёт только требуемые атрибуты и ничего сверх. - Новый модуль
PDFlibASN1предоставляет узконаправленный DER (X.690) микро-энкодер — длину-префикс, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER — используемый для построения значения атрибутаSigningCertificateV2. Энкодер следует стандартным правилам для дуг OID в base-128 и опускает необязательное полеhashAlgorithm, когда оно лишь повторяло бы значение по умолчанию SHA-256, что совпадает с поведением OpenSSL и BouncyCastle. ApplySignatureтеперь маршрутизируетETSI.CAdES.detachedпо raw-byte пути (тот же путь, что используется дляadbe.pkcs7.detached), а не подаёт заранее вычисленный digest. CryptoAPI теперь вычисляет authenticated attributemessageDigestпо фактически подписываемому содержимому, чего и ожидают верификаторы.- SHA-384 и SHA-512 также учитываются при построении атрибута signing-certificate-v2: поле
hashAlgorithmвыводится с соответствующимAlgorithmIdentifier, а не полагается на значение по умолчанию. SHA-1 в этом контексте молча повышается до SHA-256, так как PAdES-B-B не разрешает SHA-1 (clause 6.2.1).
v3.56.16 2026-05-23
- Новый
SetSignProcessDigestAlgorithmвыбирает алгоритм message-digest для подписи:1= SHA-1 (deprecated),2= SHA-256 (современный default),3= SHA-384,4= SHA-512,0= auto (SHA-256 для каждого SubFilter, кроме легаси-путиadbe.pkcs7.sha1, который остаётся на SHA-1 ради побайтовой обратной совместимости). ETSI EN 319 142-1 v1.2.1 §6.2.1 запрещает MD5 и отсылает к ETSI TS 119 312 за рекомендуемыми криптонаборами, поэтому подписанты PAdES должны выбирать SHA-256 или сильнее. - Добавлены хеш-хелперы
SHA256StreamRange,SHA384StreamRangeиSHA512StreamRangeрядом с уже существующимSHA1StreamRange; путь подписи использует их для вычисления digest PDF ByteRange выбранным алгоритмом. Теперь OIDSignerInfo.digestAlgorithmPKCS#7 и фактически записанные байты хеша гарантированно совпадают (предыдущий код всегда передавал SHA-1 digest независимо от согласованного алгоритма). TPDFlibPFXFile.SignDataтеперь принимает параметрDigestAlgorithmи выбирает корректный OID для каждой пары (SubFilter, алгоритм):2.16.840.1.101.3.4.2.1/.2/.3для SHA-256/384/512 на detached и кастомных SubFilter (RFC 5754), и соответствующие OID семействаsha256WithRSAEncryptionдля легаси-путиadbe.pkcs7.sha1.
v3.56.15 2026-05-23
- Новый
SetSignProcessDocTimeStampпереключает sign-процесс в режим PAdES Document Time-stamp согласно ETSI EN 319 142-1 v1.2.1 §5.4.3. Получившийся Signature Dictionary несёт/Type /DocTimeStampи/SubFilter /ETSI.RFC3161, опускает запрещённые ключи/M,/Reason,/Location,/ContactInfoи/Name, и резервирует hex-заполнитель размером 8192 байт (или заданного caller-ом размера) в/Contentsдля извлекаемого извне RFC 3161 TimeStampToken. - Passthrough включается автоматически при выборе режима DocTimeStamp, потому что TimeStampToken приходит от внешнего TSA. Вызовы
SetSignProcessInfo, сделанные после переключения в режим DocTimeStamp, молча игнорируются, чтобы signature dictionary оставался спецификационно-совместимым. - Существующая авто-инъекция PAdES
/Extensions /ESIC, добавленная в v3.56.8, уже покрывает DocTimeStamp, поскольку его SubFilter начинается сETSI., так что Document Time-stamp PDF декларирует требуемое catalog extension без дополнительной разводки.
v3.56.14 2026-05-23
- Новый API расширения PAdES Document Security Store (DSS).
NewPAdESDSSProcessFromFile/NewPAdESDSSProcessFromStream/NewPAdESDSSProcessFromStringоткрывают ранее подписанный PDF,AddPAdESDSSCertificate/AddPAdESDSSCRL/AddPAdESDSSOCSPподготавливают DER-кодированный материал проверки, аEndPAdESDSSProcessToFile/EndPAdESDSSProcessToStream/EndPAdESDSSProcessToStringзаписывают инкрементальное обновление, содержащее словарь/DSS << /Type /DSS /Certs [...] /CRLs [...] /OCSPs [...] >>, как указано в ETSI EN 319 142-1 v1.2.1 §5.4.2.2. Это базовый строительный блок для продвижения подписи PAdES-B-B / B-T до долгосрочной проверки PAdES-B-LT. - DSS-процесс автоматически поднимает запись catalog
/Extensions /ESICминимум доExtensionLevel 1при добавлении материала проверки, соответствуя требованию из §5.6, и объединяет новые сертификаты, CRL и OCSP-ответы в существующие массивы/Certs//CRLs//OCSPsпри повторных вызовах, так что ревизии накапливаются, а не перезаписываются. GetPAdESDSSProcessResult/ReleasePAdESDSSProcessзавершают жизненный цикл, отзеркаливая существующую поверхность APISignProcess.
v3.56.8 2026-05-23
- Базовое соответствие PAdES: когда подпись создаётся с PAdES SubFilter (
ETSI.CAdES.detachedилиETSI.RFC3161), document catalog теперь автоматически получает запись/Extensions /ESIC <</BaseVersion /1.7 /ExtensionLevel 2>>, требуемую ETSI EN 319 142-1 v1.2.1 §5.6. Запись добавляется через то же инкрементальное обновление, которое несёт подпись, никогда не понижает существующий более высокий/ExtensionLevelи следует за непрямыми ссылками/Extensionsили/ESIC, когда исходный PDF уже хранит их как отдельные объекты. - Adobe-эквивалентный extension-маркер, записываемый SetSignProcessCustomSubFilter для PDF, созданных через
TPDFlib, теперь/ADBE /BaseVersion /1.7 /ExtensionLevel 8(былоExtensionLevel 5), соответствуя альтернативной декларации, которую базовым подписям PAdES разрешено использовать; level 5 покрывал только формы ISO 32000-2 / 3D / RichMedia и фактически не идентифицировал расширения PAdES.
v3.56.13 2026-05-23
- Когда SetPDFUAMode активен и документ сохраняется, любой структурный элемент L (list), у которого отсутствует явный атрибут
ListNumbering, теперь автоматически получает/O = List /ListNumbering = None. ISO 14289-1 §7.6 требует, чтобы каждый L-тег декларировал свой стиль нумерации; новый save-time fix-upApplyPDFUAListNumberingприсоединяется к существующему семействуApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship/ApplyPDFUAStripTrapNet. - Авторам, которым важен конкретный стиль списка, всё равно следует вызывать SetStructElemListNumbering перед EndTag; авто-fixup срабатывает только когда атрибут ListNumbering отсутствует во время сохранения, так что явные значения сохраняются.
- Диагностическое сообщение writer-стороны
LIST-NO-NUMBERING:Nтеперь отмечает, что авто-fixup замаскирует проблему во время сохранения, так что пользователи понимают и отсутствующий атрибут, и автоматическое поведение исправления.
v3.56.12 2026-05-23
- Аудит PDF/UA-1 получает три новых проверки ISO 14289-1.
10031сообщает об аннотациях Link, чей URI action dictionary несёт/IsMap = true(запрещено §7.18.5, если эквивалентная функциональность не предоставлена в другом месте контента; авторы с законным сценарием использования IsMap могут самостоятельно подавить диагностику).10032сообщает о структурных элементахNote, в которых отсутствует запись/ID— §7.9 требует, чтобы каждый Note-тег декларировал уникальный ID.10033сообщает количество дублирующихся пар, когда два или более Note-тега разделяют одно и то же значение/ID. - Обнаружение коллизий Note ID выполняется сбором ID в отсортированный TStringList и обходом соседних пар, так что группа из трёх Note, разделяющих один ID, считается как две дублирующиеся пары.
- Проверка URI action обходит массив
/Annotsкаждой страницы, фильтрует по/Subtype /Link, затем инспектирует/A /S /URIи булево/IsMap. Непрямые ссылки разыменовываются на каждом шаге, так что вынесенные отдельно action-словари ведут себя так же, как inline-словари.
v3.56.11 2026-05-23
- ISO 14289-1 §7.6 требует, чтобы каждый структурный элемент L (list) нёс явный атрибут
ListNumbering.10030(reader-сторона) иLIST-NO-NUMBERING:N(writer-сторона) сообщают о L-тегах, которые его опускают. Reader-side walker декодирует обе формы/A(одиночный attribute dictionary или массив словарей, перемешанный с revision-целыми) и ищет ключ/ListNumberingнезависимо от owner. Writer-side проверка инспектируетTPDFStructElem.Attributesна то же имя как в финализированном structure list, так и в ещё открытом tag stack. - Допустимые значения
ListNumberingсогласно ISO 32000-1 Table 347:None,Disc,Circle,Square,Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha. Аудит проверяет только наличие ключа, а не выбранное значение — каждому L-тегу нужно одно из этих.
v3.56.10 2026-05-23
- Аудит PDF/UA-1 получает правила TrueType-кодировок ISO 14289-1 §7.21.6.
10028сообщает о non-symbolic TrueType-шрифтах, чей/Encoding(или/BaseEncodingвнутри Encoding dictionary) не является ниMacRomanEncoding, ниWinAnsiEncoding.10029сообщает о symbolic TrueType-шрифтах, которые вообще несут запись/Encoding(запрещено четвёртым параграфом §7.21.6). - Symbolic vs. non-symbolic определяется по биту 3 FontDescriptor
/Flags(маска4), переиспользуя существующий helperUAFontDescriptorSymbolicиз sub-class 4. Полный первый параграф §7.21.6 (встроенная TrueType-программа должна содержать соответствующие записи cmap) требует разбора TrueType font program и пока ожидается; правила уровня словаря выше — это практический слой, который этот аудит может проверить без TrueType-парсера. - Правила Differences-массива в §7.21.6 (имена глифов только из AGL, наличие Microsoft Unicode cmap) остаются вне области охвата по той же причине — они требуют инспекции font-program.
v3.56.9 2026-05-23
- Аудит PDF/UA-1 получает полную проверку ISO 14289-1 §7.18.4.
10027сообщает об аннотациях Widget, чей/StructParentразрешается через/ParentTreestructure tree, но не попадает на структурный элемент с/S = Form. Предыдущая частичная проверка v3.56.7 (10026) ловила только Widget-ы, у которых/StructParentотсутствует полностью; новая проверка завершает правило, следуя указателю number-tree и проверяя тег назначения. - Новый helper
NumberTreeLookupреализует форму number-tree из ISO 32000-1 §7.9.7 (плоский/Numsroot, промежуточные/Kids, ограниченные/Limits). Будущие аудиты, которым нужно разрешать записи страниц/StructParentsили метки/PageLabels, могут его переиспользовать. - Form-tag верификация аннотации Widget использует двухуровневую модель: Widget без
/StructParentсообщается как10026; Widget, чей/StructParentсуществует, но не разрешается в/S = Form, сообщается как более специфичный10027. Это избегает двойного подсчёта одного и того же нарушения под обоими кодами.
v3.56.7 2026-05-23
- Когда SetPDFUAMode активен и документ сохраняется, любые записи аннотаций
TrapNetтеперь автоматически удаляются из массива/Annotsкаждой страницы. ISO 14289-1 §7.18.2 запрещает аннотацииTrapNet; новый save-time fix-upApplyPDFUAStripTrapNetприсоединяется к существующему семействуApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship, так что документы в режиме PDF/UA перестают молча испускать оставшиесяTrapNet. - Аудит PDF/UA-1 получает частичную проверку §7.18.4.
10026сообщает об аннотациях Widget, у которых отсутствует/StructParent— Widget без/StructParentне может быть достигнут из structure tree и поэтому не может быть вложен в структурный тегForm. Полная структурная верификация (разрешение/StructParentчерезParentTreeи подтверждение, что родительский/S—Form) оставлена для последующего релиза. - Writer-side GetPDFUADiagnostics получает соответствующую проблему
WIDGET-NO-STRUCTPARENT:N. Существующее сообщение TRAPNET-ANNOT теперь также отмечает, что SetPDFUAMode автоматически удаляет их при сохранении.
v3.56.6 2026-05-23
- Аудит PDF/UA-1 получает две проверки иерархии заголовков ISO 14289-1 §7.4.2.
10024сообщает, когда первый элемент заголовка в порядке документа не H1 (или H).10025сообщает количество пропусков уровней заголовков в нисходящей последовательности (например, H1, за которым следует H3 без H2). Обе проверки разделяют единый pre-order walk structure tree, который декодирует вложенные формы/K(одиночный StructElem, массив StructElems / IndRefs / MCRs). - Writer-side GetPDFUADiagnostics получает соответствующую проблему
FIRST-HEADING-NOT-H1, паритет с reader10024. У ранее существовавшей writer-проверки HEADING-LEVEL-SKIP теперь есть напарник, который также ловит проблемы вида "первым заголовком был H2".
v3.56.5 2026-05-23
- Когда SetPDFUAMode активен и документ позже шифруется, ключ permissions шифрования (
/Pв encrypt dictionary) теперь автоматически имеет установленный бит 10 (маска$200, "Extract text and graphics in support of accessibility"), даже когда caller не включилppCanCopyAccessвTPDFExtraPermissions, переданный в Encrypt. ISO 14289-1 §7.16 требует, чтобы каждый зашифрованный соответствующий файл разрешал accessibility extraction, и бит легко пропустить иначе. Установка бита всегда безопасна — он только предоставляет дополнительный доступ ассистивным технологиям, а не другим путям извлечения. - Writer-side GetPDFUADiagnostics получает новую проблему
ENCRYPT-NO-ACCESS, которая срабатывает, когда PDFUAMode включён и бит 10/Pencrypt dictionary очищен. Это ловит edge case порядка вызовов, в котором пользователь вызвалEncrypt()сначала, а SetPDFUAMode только после — диагностика говорит пользователю снова вызватьEncrypt(), чтобы encrypt dict был переиспущен с исправленным/P.
v3.56.4 2026-05-23
- Writer-side GetPDFUADiagnostics получает пять новых проверок ISO 14289-1, так что in-memory document audit ловит те же нарушения, что и reader-side CheckFileCompliance ComplianceTest=2 audit.
SUSPECTS-TRUEпомечает MarkInfo/Suspects=true (§7.1: соответствующие файлы PDF/UA требуют Suspects=false).ROLEMAP-STANDARD-REMAP:Nпомечает вызовы AddRoleMap, которые бы переопределили стандартный structure tag — §7.1 запрещает переопределение стандартных тегов.DC-TITLE-MISSINGпомечает пустой XMP dc:title (отдельно от DOCINFO-TITLE-MISSING, который проверяет /Info /Title).TRAPNET-ANNOT:Nпомечает аннотации TrapNet (§7.18.2 запрещает их).ANNOT-PAGE-NO-TABS-S:Nпомечает страницы, несущие аннотации, у словаря страницы которых /Tabs не /S (§7.18.3 требует structure-tree tab order на таких страницах). - Writer-side и reader-side аудиты PDF/UA-1 теперь примерно в паритете: каждая проблема, которую reader-side audit поднимает на сохранённом файле, также достижима из in-memory диагностики, по модулю форматных конвенций каждой функции (newline-separated текст vs. NNNNN-code строковый список).
v3.56.3 2026-05-23
- Аудит PDF/UA-1 получает свои проверки шрифтов из §7.21.
10020сообщает о любом non-Standard-14 шрифте, у FontDescriptor которого отсутствуетFontFile/FontFile2/FontFile3(§7.21.4.1: каждый рендерируемый шрифт должен встраивать свою программу).10021сообщает о descendants CIDFontType2 без записи/CIDToGIDMap(§7.21.3.2).10022отмечает Standard 14 шрифты (Helvetica, Times, Courier, Symbol, ZapfDingbats и варианты bold / oblique), на которые ссылаются без встроенной программы — §7.21.4 NOTE 5 ясно даёт понять, что для этих шрифтов нет исключения из встраивания.10023сообщает о шрифтах, у которых отсутствует CMap/ToUnicodeи которые не соответствуют списку исключений §7.21.7 (предопределённые кодировки MacRoman / MacExpert / WinAnsi, Type 0 с character collections Adobe-GB1 / CNS1 / Japan1 / Korea1, non-symbolic TrueType). - Композитные шрифты Type 0 инспектируются на обоих уровнях:
/ToUnicodeна самом родительском словаре Type 0, и embedding //CIDToGIDMapна первом потомке CIDFont. Шрифты Type 3 пропускают проверку встраивания (их глифы — inline CharProcs), но всё равно участвуют в проверке/ToUnicode. - Хелперы PDFlibPDFA для аналогичной работы со шрифтами намеренно не были общими — полдюжины коротких подпрограмм (subset-prefix stripping, таблица имён Standard-14, наличие FontFile, флаг Symbolic) дублируются локально как
UA*helpers, чтобы аудит PDF/A мог продолжать развиваться без поломки PDF/UA, и наоборот.
v3.56.2 2026-05-23
- Аудит PDF/UA-1 получает пять дополнительных проверок ISO 14289-1, покрывающих аннотации, встроенные файлы и опциональное содержимое.
10015сообщает об аннотациях Link, у которых отсутствует непустое альтернативное описание/Contents(§7.18.5), чтобы скринридеры могли анонсировать цели ссылок.10016и10017помечают FileSpec dictionary встроенных файлов, в которых отсутствуют требуемые ключи имени файла/Fили/UF(§7.11).10018помечает optional-content configuration dictionaries, которые опускают непустую текстовую строку/Name(§7.10).10019помечает optional-content configuration dictionaries, которые содержат запрещённый ключ/AS(§7.10). - Per-page annotation walk, уже обеспечивающий проверки TrapNet и
/Tabs /S, теперь также собирает данные Link //Contentsв том же проходе, сохраняя аудит O(N) по количеству объектов.
v3.56.1 2026-05-23
- Аудит PDF/UA-1 получает пять новых проверок ISO 14289-1.
10010проверяет accessibility extract permission (бит 10 ключа шифрования/P) на зашифрованных файлах (§7.16).10011обнаруживает динамические XFA-формы через элемент<dynamicRender>required</dynamicRender>внутри XFA XDP packet (§7.15).10012помечает Form XObjects, которые несут запись/Ref— reference XObjects запрещены (§7.20).10013помечает аннотацииTrapNet(§7.18.2).10014обходит каждую страницу и сообщает о любой странице, несущей аннотации, у словаря страницы которой не установлен/Tabs /S(§7.18.3), чтобы порядок tab следовал structure tree. - Все пять новых кодов проходят через ту же пару handle CheckFileCompliance + GetStringListItem, что добавлена в предыдущем релизе — новой публичной API-поверхности нет.
v3.56.0 2026-05-23
- Новый reader-side audit
CheckCompliancePDFUAпроверяет внешний PDF на соответствие ISO 14289-1 (PDF/UA-1). Он дополняет существующую writer-side проверку GetPDFUADiagnostics, принимая любой входной PDF (собственный вывод, вывод сканера, сторонний контент) и перечисляя нарушения PDF/UA-1 так же, как CheckFileCompliance уже сообщает о проблемах PDF/A. - CheckFileCompliance теперь принимает
ComplianceTest = 2для запуска нового аудита PDF/UA-1. Тест PDF/A подComplianceTest = 1не изменён, и список проблем по-прежнему возвращается через существующую пару handle GetStringListCount / GetStringListItem. - Первая редакция покрывает основополагающие шлюзы соответствия PDF/UA-1 из §5 (идентификация XMP
pdfuaid:part) и §7.1 (Catalog/Metadatastream, маркер tagged-PDF, structure tree, viewer title preference, document language, XMPdc:title, значение/Suspectsи запрет на переопределение стандартных structure tags). Выпускается восемь диагностических кодов — с10001по10009— сохраняя числовой диапазон визуально отдельным от кодов PDF/A00xxx. - Более глубокие пункты PDF/UA-1 (security, аннотации, XObjects, font subsetting) отслеживаются для последующих patch-релизов поверх того же фреймворка аудита.
v3.55.6 2026-05-22
- Каждый свежесгенерированный XMP packet теперь несёт свойство xmpMM:InstanceID в формате uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Идентификатор генерируется через Win32 CoCreateGuid и даёт каждому произведённому документу уникальный, не зависящий от версии отпечаток, как рекомендовано ISO 19005-1 §6.7.2 (Cor2) и руководствами по best-practice PDF/A. Сборки не-Windows (где XMP packet остаётся пустым) не затронуты.
- Пространство имён xmpMM (http://ns.adobe.com/xap/1.0/mm/) теперь часть SelectionNamespaces XMP packet; новые хелперы SetXMPMM и GenerateInstanceID лежат в основе выпуска InstanceID и обеспечивают фундамент для будущей поддержки xmpMM:History / xmpMM:DerivedFrom.
- Схема описания PDF/A Extension Schema (pdfaExtension / pdfaSchema / pdfaProperty / pdfaType / pdfaField) не добавлена в этом релизе. Создание custom extension schema требует многошагового построения структурированных свойств bag / seq за пределами текущей формы SetDublinCore / SetXMPBasic; работа отслеживается для будущего релиза. Документы, которые должны декларировать custom XMP-свойства, продолжают использовать запасной путь LoadFromString.
v3.55.5 2026-05-22
- У PDF/A-документов теперь нормализуются /F флаги аннотаций во время сохранения. ISO 19005-1 §6.5.3 требует, чтобы бит Print был 1, а биты Hidden / Invisible / NoView — 0 на каждой аннотации; writer теперь применяет эту маску во время сохранения, так что caller-у не нужно помнить раскладку битов. Случай /Subtype /Popup освобождён — popups являются детьми других аннотаций и традиционно не печатаются.
- Флаг AcroForm /NeedAppearances теперь принудительно устанавливается в false во время сохранения, когда документ в любом режиме PDF/A. ISO 19005-1 §6.9 требует, чтобы флаг отсутствовал или был false; ранее writer оставлял любое значение, которое установил caller, что производило документы, просящие viewer перерегенерировать appearances при открытии, и молча нарушало спецификацию, когда caller установил его в true. Исправление также работает для документов, у которых ранее флаг отсутствовал — writer выпускает явный /NeedAppearances false, чтобы не оставить неоднозначности для валидатора.
v3.55.4 2026-05-22
- AddStandardFont теперь отклоняет вызовы в режиме PDF/A. ISO 19005-1 §6.3.4 отзывает исключение PDF reference "Standard 14 may be unembedded": каждая программа шрифта в соответствующем файле должна быть встроена, а библиотека не поставляет outlines Standard 14. Facade возвращает 0 молча; caller-ы должны переключиться на AddTrueTypeFont или AddType1Font с реальным файлом шрифта.
- AddTrueTypeFont теперь молча продвигает Embed=0 (без встраивания) в Embed=1 (встроить полный шрифт), когда активен режим PDF/A. Путь без встраивания производил PDF, который зависел от font fallback viewer-а к системной установке Arial / Times / Courier, что нарушает ISO 19005-1 §6.3.4. Существующие caller-ы, запросившие встраивание (Embed=1 или 2), не затронуты.
- Проверка соответствия non-symbolic TrueType /Encoding (ISO 19005-1 §6.3.7 Cor2 требует WinAnsi или MacRoman как имя кодировки или BaseEncoding, без /Differences) не добавлена в этом релизе, потому что библиотека уже выпускает /WinAnsiEncoding для non-symbolic TrueType subsets, а более глубокое принуждение потребовало бы отслеживать symbolic-vs-non-symbolic dispatch через subset path. CheckCompliancePDFA 00034 / 00035 (добавлены в v3.51.0) помечают любой несоответствующий вывод во время валидации.
v3.55.3 2026-05-22
- Словари шрифтов CIDFontType2, поддерживаемые TrueType, теперь несут /CIDToGIDMap /Identity явно. ISO 19005-1 §6.3.3.2 (Cor2) требует, чтобы запись присутствовала для каждого встроенного Type 2 CIDFont; PDF reference допускает неявный Identity по умолчанию, но PDF/A требует явного значения. Writer ранее опускал ключ полностью, заставляя veraPDF (и CheckCompliancePDFA 00033, добавленный в v3.51.0) помечать файл. Имя /Identity соответствует раскладке GID-as-CID, которую writer уже неявно производил, так что существующие документы рендерятся идентично.
- FontDescriptor /CharSet (для Type 1 subsets) и /CIDSet (для CIDFont subsets) остаются TODO; writer-у нужно было бы отслеживать, какие имена глифов / CIDs попали в subset, чтобы заполнить их точно. CheckCompliancePDFA 00031 и 00032 (также добавлены в v3.51.0) пометят отсутствие, так что пользователи увидят проблему во время валидации.
v3.55.2 2026-05-22
- AddImageDirectFromString теперь отклоняет PDF/A-несовместимые фильтры в точке входа. Передача Filter = 'LZWDecode' отклоняется для каждой части PDF/A (ISO 19005-1 §6.1.10 плюс эквивалентные правила ISO 19005-2 / -3). Передача Filter = 'JBIG2Decode' или 'JPXDecode' отклоняется для PDF/A-1 (режимы 1 и 2). PDF/A-2 и PDF/A-3 допускают JPXDecode согласно ISO 19005-2 §6.2.8.3 с sub-spec ограничениями (число цветовых каналов, единообразие битовой глубины, требования METH/APPROX), которые writer-side gate не принуждает — caller-ам в этих режимах всё равно нужно гарантировать, что поток JPEG 2000 соответствует. Facade возвращает 0 молча, когда запрашивается запрещённый фильтр.
- Входы TIFF, PNG, JPEG и JPEG 2000, загруженные через AddImageFromFile / AddImageFromStream, не затронуты: импортёр декомпрессирует исходные байты и перекодирует с FlateDecode (или DCTDecode для JPEG payload), так что вход LZW никогда не распространяется в output Filter chain. Валидатор CheckCompliancePDFA, добавленный в v3.50.0 (00004) и v3.52.0 (00022, 00023), обеспечивает вторую линию защиты во время валидации для любого непрямого пути, который всё же протолкнёт запрещённый фильтр в вывод.
v3.55.1 2026-05-22
- AddLinkToHideField теперь отклоняет вызовы в режиме PDF/A. Предыдущий релиз оставил комментарий, утверждающий, что действие совместимо с PDF/A, но ISO 19005-1 Cor2 добавил /Hide в список запрещённых действий (§6.6.1), и ISO 19005-2 / -3 наследуют ограничение. Facade возвращает 0 молча при вызове в режиме PDF/A, соответствуя AddLinkToJavaScript и AddLinkToImportData.
- AddSWFAnnotationFromFile теперь отклоняет вызовы в режиме PDF/A. Аннотации SWF / RichMedia оборачивают Flash media, которые запрещены ISO 19005-1 §6.5.2 (никаких подтипов Movie / Sound) и подтверждены ISO 19005-2 §6.3.1 (никаких 3D / Sound / Screen / Movie). Facade возвращает 0 молча.
- AddEmbeddedFile и AddLinkToEmbeddedFile теперь отклоняют вызовы в режимах PDF/A-1 и PDF/A-2. ISO 19005-1 §6.1.11 запрещает /EF, а ISO 19005-2 §6.8 допускает только встроенные PDF/A-файлы; вместо рекурсивной проверки PDF/A-ности приложенного payload writer просто отказывает в вызове в этих режимах. PDF/A-3 (SetPDFAMode 5 или 6) остаётся разрешённым — см. v3.55.0 для автоматической инъекции /AFRelationship.
- SetOpenActionMenu теперь отклоняет значения MenuItem вне whitelist {NextPage, PrevPage, FirstPage, LastPage}, когда документ в режиме PDF/A. ISO 19005-1 §6.6.1 ограничивает named actions этим набором, так что ранее API молча производил несоответствующие Open-Action словари Find / Print / FullScreen, которые veraPDF отклонял.
- NewOptionalContentGroup теперь отклоняет вызовы в режимах PDF/A-1 (SetPDFAMode 1 или 2). ISO 19005-1 §6.1.13 запрещает ключ Catalog /OCProperties. PDF/A-2 (режимы 3/4) и PDF/A-3 (режимы 5/6) допускают optional content с ограничениями в их соответствующих §6.9, так что gate срабатывает только для PDF/A-1.
v3.55.0 2026-05-22
- Документы PDF/A-3 теперь автоматически получают запись /AFRelationship на каждом встроенном файле. Ранее файл PDF/A-3, созданный с библиотекой, мог провалить валидацию, потому что ISO 19005-3 Annex E, Table E.1 требует AFRelationship на каждой спецификации встроенного файла. Writer теперь инжектирует настроенное значение по умолчанию ('Unspecified' по умолчанию) на любой FileSpec dictionary, у которого отсутствует запись во время сохранения, отзеркаливая авто-инъекцию PDF/UA AFRelationship, введённую ранее. Только режимы PDF/A-3 (SetPDFAMode 5 = PDF/A-3b или 6 = PDF/A-3a) запускают авто-инъекцию; PDF/A-1 и PDF/A-2 по-прежнему сразу отклоняют встроенные файлы согласно ISO 19005-1 §6.1.11 и ISO 19005-2 §6.8.
- SetPDFA3DefaultAFRelationship — новый API, который переопределяет значение по умолчанию, записываемое writer-ом, когда у встроенного файла отсутствует запись /AFRelationship. Принимает значения ISO 19005-3 Table E.1: 'Source' (встроенный файл — исходный материал, который произвёл содержимое PDF), 'Data' (файл — структурированные данные, поддерживающие визуальную таблицу или диаграмму), 'Alternative' (альтернативная репрезентация, например аудио-версия), 'Supplement' (дополнительная репрезентация, например MathML-форма уравнения), 'Unspecified' (отношение не может быть охарактеризовано вышеперечисленным) или любое зарегистрированное second-class имя. Пустая строка сбрасывает в 'Unspecified'. Per-file overrides остаются доступны через SetEmbeddedFileAFRelationship.
- Новые API экспонируются на Delphi-фасаде как TPDFlib.SetPDFA3DefaultAFRelationship и через DLL как DLSetPDFA3DefaultAFRelationship (PWideChar) и DLSetPDFA3DefaultAFRelationshipA (PAnsiChar).
v3.54.0 2026-05-22
- LoadOutputIntentProfile — новый API, который заменяет связанный профиль OutputIntent sRGB внешним ICC-профилем, загруженным с диска. Требуется при производстве PDF/A-документов в цветовых пространствах DeviceCMYK или DeviceGray, поскольку библиотека поставляет только sRGB-профиль. Типичное использование: сначала вызвать SetPDFAMode (что инициализирует skeleton OutputIntent), затем LoadOutputIntentProfile('C:\\path\\to\\FOGRA39.icc', 'DeviceCMYK'), чтобы заменить байты профиля и пометить документ новым цветовым пространством. Возвращает 1 при успехе, 0 при file-not-found или неизвестном цветовом пространстве. Экспонируется на Delphi-фасаде как TPDFlib.LoadOutputIntentProfile и через DLL как DLLoadOutputIntentProfile (форма PWideChar) и DLLoadOutputIntentProfileA (форма PAnsiChar). ISO 19005-1 §6.2.2 разрешает любой зарегистрированный ICC-профиль в потоке DestOutputProfile.
- SetFillColorCMYK, SetTextColorCMYK, SetTextHighlightColorCMYK, SetTextUnderlineColorCMYK, AddSeparationColor, SetFillColorSep, SetLineColorSep, SetTextHighlightColorSep и SetTextColorSep теперь успешны в режиме PDF/A, когда OutputIntent profile документа — DeviceCMYK. Ранее эти API отклоняли каждый вызов в режиме PDF/A независимо от OutputIntent, что не позволяло производить соответствующие CMYK-документы. Gate теперь — PDFAMode = 0 OR OutputIntentColorSpace = 'DeviceCMYK', соответствуя правилу ISO 19005-1 §6.2.3.3, что DeviceCMYK разрешено, когда OutputIntent использует CMYK-профиль, и ISO 19005-1 §6.2.3.4, которое допускает Separation alternates, чьё базовое цветовое пространство также соответствует.
- SetTextShader теперь успешен в режиме PDF/A, когда OutputIntent profile — либо DeviceRGB, либо DeviceCMYK. Сами Shader-ы не запрещены PDF/A; валидатор (read side) проверяет, что внутреннее цветовое пространство shader-а соответствует OutputIntent. Предыдущее поведение строгого отклонения отказывало в соответствующем использовании shader-а.
- Разблокировка CMYK / Separation / Shader зависит от тега OutputIntentColorSpace, установленного AddOutputIntent и LoadOutputIntentProfile (введены в v3.53.0). Вызов SetPDFAMode без LoadOutputIntentProfile сохраняет цветовое пространство как DeviceRGB (связанный sRGB-профиль), так что CMYK-вызовы по-прежнему отклоняются по умолчанию — новое поведение opt-in через LoadOutputIntentProfile.
v3.53.0 2026-05-22
- Словарь OutputIntent теперь несёт полный набор полей skeleton PDF/A, рекомендуемых ISO 19005-1 §6.2.2 и Adobe Acrobat preflight: /OutputCondition (human-readable описание цветового условия), /Info (длинноформатный идентификационный текст) и /RegistryName (URL реестра, по умолчанию http://www.color.org). Значения по умолчанию — "sRGB IEC61966-2.1" / "sRGB IEC61966-2.1" / "http://www.color.org" для legacy single-argument call sites; новая перегрузка AddOutputIntent принимает четыре custom-поля напрямую, так что caller-ы могут заполнить их для собственных цветовых условий.
- AddOutputIntent получает новую пяти-аргументную перегрузку: AddOutputIntent(ColorSpace, OutputConditionIdentifier, OutputCondition, Info, RegistryName). Legacy single-argument форма продолжает работать без изменений; она теперь делегирует новой перегрузке с sRGB-значениями по умолчанию. Аргумент ColorSpace также выбирает количество компонентов /N, записываемое в словарь встроенного ICC-профиля (3 для DeviceRGB, 4 для DeviceCMYK, 1 для DeviceGray); сам встроенный профиль остаётся связанным sRGB-потоком до выхода предстоящего API LoadOutputIntentProfile в v3.54.0.
- TPDFDocument экспонирует OutputIntentColorSpace как read/write свойство, отслеживающее цветовое пространство последнего вызова AddOutputIntent. Это становится gate condition для writer-side ограничений CMYK / Separation / Shader в v3.54.0, где цветовые API, которые сегодня отклоняют каждый вызов в режиме PDF/A, будут отклонять только когда цветовое пространство не совпадает с OutputIntent.
v3.52.0 2026-05-22
- CheckCompliancePDFA теперь проверяет аннотации, graphics-state, действия и form XObjects, завершая покрытие read-side валидатором PDF/A глав ISO 19005-1 6.2-6.6 и эквивалентных differential rules PDF/A-2/-3. Валидатор сообщает 14 новых классов проблем (00050-00067): запрещённые подтипы аннотаций (00050; ISO 19005-1 §6.5.2 запрещает FileAttachment / Sound / Movie для PDF/A-1, а ISO 19005-2 §6.3.1 запрещает 3D / Sound / Screen / Movie для PDF/A-2 и PDF/A-3), /CA аннотации, отличное от 1.0 (00051; §6.5.3), /F аннотации отсутствует или Print=0 / Hidden=1 / Invisible=1 / NoView=1 (00052; §6.5.3, с исключением /Subtype /Popup), /AA аннотации (00054; §6.6.2), словарь appearance аннотации с ключами, отличными от /N, или несоответствующим значением /N (00055; §6.5.3 Cor2), аннотация Widget с /A (00056; §6.9), ExtGState /TR (00058; §6.2.8), ExtGState /TR2, отличное от /Default (00059; §6.2.8), и только в PDF/A-1: ExtGState /SMask, отличное от /None (00061; §6.4), /BM, отличное от Normal или Compatible (00062; §6.4), /CA или /ca, отличное от 1.0 (00063; §6.4).
- Action-anywhere аудит (00064, 00065) заменяет OpenAction-only проверку из v3.50.0 полным sweep, который помечает запрещённые значения /S action (Launch, Sound, Movie, ResetForm, ImportData, JavaScript, Hide, SetState, NOP, Trans, GoTo3DView, Rendition, SetOCGState) и named actions, чей /N вне {NextPage, PrevPage, FirstPage, LastPage}, независимо от того, где живёт action (annotation /A, widget /A, outline /A, catalog /OpenAction и т.д.). ISO 19005-1 §6.6.1.
- XObject аудит (00066, 00067) сообщает о PostScript и Reference XObjects, плюс запрещённых ключах на Form XObjects (/OPI, /PS, /Subtype2 = /PS) и Image XObjects (/Alternates, /OPI, /Interpolate true). ISO 19005-1 §6.2.4 - §6.2.7.
v3.51.0 2026-05-22
- CheckCompliancePDFA теперь проверяет соответствие шрифтов и цветовых пространств в дополнение к структурным проверкам, добавленным в v3.50.0. Валидатор сообщает девять новых классов проблем: как минимум одна программа шрифта не встроена (00030; ISO 19005-1 §6.3.4 требует, чтобы каждая программа шрифта, включая Standard 14 substitutions, была встроена), Type 1 subset без /CharSet в его FontDescriptor (00031; §6.3.5), CIDFont subset без /CIDSet (00032; §6.3.5), CIDFontType2 без /CIDToGIDMap (00033; §6.3.3.2 Cor2), non-symbolic TrueType с несоответствующим /Encoding (00034; §6.3.7 Cor2 требует WinAnsi/MacRoman напрямую или как BaseEncoding, без /Differences), symbolic TrueType, который всё ещё несёт /Encoding (00035; §6.3.7 Cor2), как минимум один шрифт без /ToUnicode в документах PDF/A-Na или PDF/A-Nu (00036; §6.3.8 four-class exemption применено), ICCBased цветовое пространство, которое не встраивает свой profile stream (00037; §6.2.3.2), и файл, который использует и DeviceRGB, и DeviceCMYK (00038; §6.2.3.3 запрещает смесь).
- Проверка /ToUnicode (00036) ограничена уровнями соответствия A и U, потому что только эти уровни требуют Unicode mapping согласно ISO 19005-1 §6.3.8 и ISO 19005-2 §6.2.11.7. Файлы уровня B (PDF/A-1b, PDF/A-2b, PDF/A-3b) не помечаются. Four-class exemption распознаёт предопределённые кодировки (MacRomanEncoding, MacExpertEncoding, WinAnsiEncoding), Standard 14 Type 1 BaseFonts как proxy для шрифтов имён глифов Adobe Standard Latin / Symbol, и Type 0 шрифты, чей descendant CIDFont использует реестры Adobe-GB1, Adobe-CNS1, Adobe-Japan1 или Adobe-Korea1.
- Аудит шрифтов обходит каждый Font dictionary, классифицирует его по Subtype (Type1, MMType1, TrueType, Type3, Type0 с его descendant CIDFontType0 или CIDFontType2), затем диспетчерезует соответствующие проверки. Композитные шрифты Type 0 делегируют проверки embedding и subset своему descendant CIDFont, сохраняя /ToUnicode на обёртке Type 0. Subset detection использует стандартную конвенцию six-uppercase-letter префикса.
v3.50.0 2026-05-22
- CheckCompliancePDFA теперь сообщает 15 дополнительных проблем несоответствия PDF/A, которые валидатор ранее упускал: отсутствующий trailer /ID array (00013), отсутствующий Document Catalog /Metadata stream (00014), /Filter, применённый к /Metadata stream (00015), словари потоков, которые ссылаются на внешние файлы через /F, /FFilter или /FDecodeParms (00016), встроенные файлы, декларированные через /EF в любом file-specification dictionary или через запись Name tree /EmbeddedFiles в документах PDF/A-1 (00017, 00018), /OpenAction, указывающий на запрещённый тип действия (00019), /AA additional-action словари в Document Catalog или на любой Page (00020, 00021), фильтры JBIG2Decode или JPXDecode в документах PDF/A-1 (00022, 00023), Crypt-фильтры, чей /Name не /Identity (00024), /Requirements в Document Catalog (00025), /Perms с ключами, отличными от /UR3 и /DocMDP (00026), и /AcroForm /NeedAppearances, установленный в true (00027). Валидатор теперь помечает запрещённые типы действий Catalog /OpenAction (/Launch, /Sound, /Movie, /ResetForm, /ImportData, /JavaScript, /Hide, /SetState, /NOP, /Trans, /GoTo3DView, /Rendition, /SetOCGState) и значения named-action /N вне allowlist {NextPage, PrevPage, FirstPage, LastPage} согласно ISO 19005-1 §6.6.1.
- PDFAID парсер принимает U conformance suffix (PDF/A-2U, PDF/A-3U) наряду с существующими вариантами A и B, так что CheckCompliancePDFA больше не поднимает ложное предупреждение "00005 PDFA Mark NOT Found or invalid" при сканировании файла PDF/A-2U или PDF/A-3U, произведённого другим инструментом. Уровни соответствия Unicode-mapping, добавленные в ISO 19005-2:2011, теперь распознаются валидатором.
- Filter-specific проверки (JBIG2Decode, JPXDecode) и embedded-file проверки (/EF, /EmbeddedFiles) остаются ограничены PDF/A-1, потому что ISO 19005-2 §6.2.8.3 и §6.8 явно ослабляют эти ограничения для PDF/A-2 и PDF/A-3. Document-structure проверки (/Metadata, /AcroForm /NeedAppearances, /OpenAction, /AA, /Requirements, /Perms) применяются к каждой части PDF/A.
v3.49.0 2026-05-21
- AddLinkToImportData создаёт аннотацию Link, действие которой — PDF-действие импорта данных (/S /ImportData), заполняющее поля AcroForm документа из внешнего файла FDF при клике пользователя по ссылке (ISO 32000-1 §12.6.4.8, Table 198). Параметр FileName ссылается как словарь filespec, с теми же правилами нормализации пути, что используют AddLinkToFile / AddLinkToFileEx (обратные слэши преобразуются в прямые согласно ISO 32000-1 §7.11.2.1). Бит 0 Options переключает видимую рамку, а биты 1–3 выбирают режим подсветки ссылки (Invert, Outline, Push), соответствуя существующим соглашениям AddLinkTo*. PDF 1.4 или выше. НЕ разрешено в PDF/A, так как действие ссылается на внешний ресурс; фасад в режиме PDF/A молча возвращает 0. Доступно в библиотеке Delphi и в DLL-интерфейсе как DLAddLinkToImportData / DLAddLinkToImportDataA (формы PWideChar и PAnsiChar).
v3.48.0 2026-05-21
- AddLinkToHideField создаёт аннотацию Link, действие которой — PDF-действие скрытия (/S /Hide), переключающее видимость одного или нескольких полей AcroForm при клике пользователя по ссылке (ISO 32000-1 §12.6.4.10, Table 196). FieldNames принимает одно или несколько полностью квалифицированных имён полей, разделённых запятыми, точками с запятой или переводами строк; одиночное имя выводится в /T как текстовая строка, а два и более имени — как массив, обе формы допускаются спецификацией. HideFlag выбирает направление видимости: ненулевое значение скрывает перечисленные поля (/H true), а нулевое — показывает их (/H false). Бит 0 Options переключает видимую рамку, а биты 1–3 выбирают режим подсветки ссылки (Invert, Outline, Push), соответствуя AddLinkToWeb / AddLinkToNamedAction. PDF 1.2 или выше. Совместимо с PDF/A, так как внешние ресурсы не используются. Доступно в библиотеке Delphi и в DLL-интерфейсе как DLAddLinkToHideField / DLAddLinkToHideFieldA (формы PWideChar и PAnsiChar).
v3.47.0 2026-05-21
- AddLinkToNamedAction создаёт аннотацию Link, действие которой — PDF-именованное действие (/S /Named), запускающее одну из четырёх стандартизированных команд навигации просмотрщика, определённых в ISO 32000-1 §12.6.4.11, Table 194: NextPage, PrevPage, FirstPage и LastPage. Параметр NamedActionType выбирает команду (0=NextPage, 1=PrevPage, 2=FirstPage, 3=LastPage); значения вне этого диапазона возвращаются к NextPage, так что writer всегда выводит соответствующее спецификации имя /N. Бит 0 Options переключает видимую рамку, а биты 1–3 выбирают режим подсветки ссылки (Invert, Outline, Push), соответствуя существующим соглашениям AddLinkToWeb / AddLinkToPage. Аннотация требует PDF 1.1 или выше и совместима с PDF/A, так как внешние ресурсы не используются. Доступно в библиотеке Delphi и в DLL-интерфейсах.
v3.46.1 2026-05-21
- AddCaretAnnotation создаёт каретную разметочную аннотацию (PDF /Subtype /Caret) в заданном прямоугольнике, отмечая позицию на странице, где текст или содержимое было вставлено, опущено или иначе требует внимания рецензента. Поддерживает два типа символов (None и Paragraph) через SymbolType (0 / 1), настраиваемый цвет, непрозрачность, заголовок, содержание и временные метки создания/изменения. Определено в ISO 32000-1 §12.5.6.11. PDF 1.5 или выше. Доступно в библиотеке Delphi и DLL-интерфейсах.
- Эта запись завершает заполнение геометрических аннотаций, начатое с v3.44.0 Square+Circle. PDFlibPas теперь создаёт аннотации Text, Stamp, FreeText, TextMarkup (Highlight/Underline/Squiggly/StrikeOut), Square, Circle, Line, Polygon, PolyLine, Ink и Caret, в дополнение к существующей поддержке Link, FileAttachment, SVG, U3D и SWF.
v3.46.0 2026-05-21
- AddInkAnnotation создаёт ink-разметочную аннотацию (PDF /Subtype /Ink), представляющую рукописные штрихи или произвольные пометки, нарисованные на странице. Штрихи передаются как одна строка, в которой несколько штрихов разделяются '|' или переводом строки, а внутри каждого штриха координатные пары следуют тому же формату пробел/запятая/точка с запятой/табуляция, что и в AddPolygonAnnotation. Например "100 100 110 105 120 110 | 200 200 210 205" описывает два отдельных штриха. Поддерживает настраиваемую ширину рамки, цвет чернил, непрозрачность, заголовок, содержание и временные метки. Определено в ISO 32000-1 §12.5.6.13. PDF 1.3 или выше. Доступно в библиотеке Delphi и DLL-интерфейсах.
- Каждый штрих должен содержать чётное количество значений (минимум четыре), иначе вызов возвращает 0 и аннотация не записывается. /Rect вычисляется автоматически из объединённого диапазона всех штрихов плюс небольшой отступ, чтобы штрихи оставались внутри ограничивающего прямоугольника аннотации.
v3.45.0 2026-05-21
- AddPolygonAnnotation создаёт замкнутую полигональную разметочную аннотацию (PDF /Subtype /Polygon) с вершинами, переданными в виде строки координатных пар, разделённых пробелами, запятыми, точками с запятой или табуляцией (например "100 100 200 100 200 200 100 200"). Поддерживает настраиваемую ширину рамки, цвет рамки, опциональный цвет внутренней заливки, непрозрачность, заголовок, содержание и временные метки. Определено в ISO 32000-1 §12.5.6.9. PDF 1.5 или выше. Доступно в библиотеке Delphi и DLL-интерфейсах.
- AddPolyLineAnnotation создаёт открытую полилинейную разметочную аннотацию (PDF /Subtype /PolyLine) с тем же форматом строки вершин и настраиваемыми стилями концов линии на каждом терминале (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash). Определено в ISO 32000-1 §12.5.6.9. PDF 1.5 или выше. Доступно в библиотеке Delphi и DLL-интерфейсах.
- Обе аннотации требуют минимум двух точек вершин (четыре числа) и чётное общее количество чисел; вызов возвращает 0, если строку вершин не удаётся разобрать в корректный список пар. /Rect вычисляется из диапазона вершин плюс отступ, пропорциональный ширине рамки, чтобы декорации концов оставались видимыми.
- Обе аннотации поднимают версию документа до PDF 1.5 при выводе под более низкой блокировкой минимальной версии.
v3.44.1 2026-05-21
- AddLineAnnotation создаёт линейную разметочную аннотацию (PDF /Subtype /Line) между двумя конечными точками, с настраиваемой шириной рамки, цветом линии, опциональным цветом внутренней заливки, стилями концов линии для обоих концов (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash), непрозрачностью, заголовком, содержанием и временными метками создания/изменения. Определено в ISO 32000-1 §12.5.6.7. PDF 1.3 или выше. Доступно в библиотеке Delphi и DLL-интерфейсах.
- /Rect аннотации вычисляется из двух конечных точек плюс отступ, пропорциональный ширине рамки, чтобы декорации концов оставались внутри ограничивающего прямоугольника аннотации.
v3.44.0 2026-05-21
- AddSquareAnnotation создаёт прямоугольную разметочную аннотацию (PDF /Subtype /Square) в заданном прямоугольнике с настраиваемой шириной рамки, цветом рамки, опциональным цветом внутренней заливки, непрозрачностью, заголовком, содержанием и временными метками создания/изменения. Определено в ISO 32000-1 §12.5.6.8. PDF 1.3 или выше. Доступно в библиотеке Delphi и DLL-интерфейсах.
- AddCircleAnnotation создаёт эллиптическую разметочную аннотацию (PDF /Subtype /Circle), вписанную в заданный прямоугольник, с теми же настраиваемыми рамкой, заливкой, непрозрачностью, заголовком, содержанием и временными метками, что и AddSquareAnnotation. Определено в ISO 32000-1 §12.5.6.8. PDF 1.3 или выше. Доступно в библиотеке Delphi и DLL-интерфейсах.
- Обе новые аннотации автоматически поднимают версию документа до PDF 1.3 при выводе под более низкой блокировкой минимальной версии и выводят стандартный набор полей разметочной аннотации (/Type /Subtype /Rect /C /IC /BS /Border /CA /F /M /CreationDate /NM /T /Contents /Subj /P), так что существующие рабочие процессы рецензирования в Acrobat, Foxit и Edge могут редактировать их после создания.
v3.43.0 2026-05-20
- SetStructElemSpaceBefore и SetStructElemSpaceAfter устанавливают атрибуты /SpaceBefore и /SpaceAfter (Layout owner) на текущем открытом структурном элементе, выражая интервал перед и после блочных элементов в пунктах. Определено в ISO 32000-1 §14.8.5.4.2 Table 340. Доступно в библиотеке Delphi, ActiveX (Dispids 73008051/73008052) и DLL-интерфейсах.
- SetStructElemStartIndent и SetStructElemEndIndent устанавливают атрибуты /StartIndent и /EndIndent (Layout owner), выражая отступ от начальной и конечной кромок прямоугольника содержимого с учётом направления письма, в пунктах. Определено в ISO 32000-1 §14.8.5.4.2 Table 340. Доступно в библиотеке Delphi, ActiveX (Dispids 73008053/73008054) и DLL-интерфейсах.
- SetStructElemColor устанавливает атрибут /Color (Layout owner) как тройку RGB (каждый компонент 0.0-1.0), описывая цвет переднего плана элемента для движков перекомпоновки и нижестоящих проверщиков цветового контраста. Определено в ISO 32000-1 §14.8.5.4.2 Table 340. Доступно в библиотеке Delphi, ActiveX (Dispid 73008055) и DLL-интерфейсах.
- Исправлена ошибка сериализации в BuildStructElemDictRef: значения числовых атрибутов из одного токена (такие как SpaceBefore, SpaceAfter, StartIndent, EndIndent) записывались как PDF-имена вместо PDF-чисел. Исправление применяется к ветвям атрибутов с одним и несколькими владельцами.
v3.42.0 2026-05-20
- CheckCompliancePDFA теперь корректно проверяет все шесть режимов PDF/A (1a, 1b, 2a, 2b, 3a, 3b). Проверка PDFAID (код 00005) принимает любой из шести допустимых XMP-маркеров вместо только '1B'. Проверка верхней границы версии (00002) применяет 1.4 для PDF/A-1 и 1.7 для PDF/A-2 и PDF/A-3.
- Проверка OCProperties (код 00003) теперь условная: она применяется только к документам PDF/A-1, где опциональное содержимое (слои) запрещено. PDF/A-2 и PDF/A-3 разрешают слои и больше не помечаются.
- Добавлены три новые проверки соответствия: код 00006 помечает зашифрованные документы (шифрование запрещено во всех версиях PDF/A); код 00007 помечает документы, в которых отсутствует запись OutputIntents в каталоге (требуется во всех версиях PDF/A); коды 00011 и 00012 помечают документы, в которых отсутствует MarkInfo или StructTreeRoot, когда уровень соответствия — -a (доступность).
v3.41.0 2026-05-20
- Режим PDF/A теперь принудительно блокирует запрещённые операции на уровне API. Когда активен режим PDF/A (любой из режимов 1-6), вызовы SetEncryption, AddSeparationColor, SetFillColorCMYK, SetTextColorCMYK или любого другого CMYK/Separation/Shader API возвращают 0 и не дают эффекта, в соответствии с требованием PDF/A об едином sRGB output intent.
- Прозрачность запрещена в PDF/A-1 (режимы 1 и 2): SetTransparency, SetBlendMode и SetPageTransparencyGroup возвращают 0 и являются no-op, когда активный режим — 1 или 2. PDF/A-2 и PDF/A-3 (режимы 3-6) разрешают ограниченную прозрачность и не ограничены.
- Действия JavaScript запрещены во всех режимах PDF/A (1-6): SetOpenActionJavaScript, PageJavaScriptAction, DocJavaScriptAction, AddGlobalJavaScript и AddLinkToJavaScript возвращают 0 и являются no-op, когда активен любой режим PDF/A. ISO 19005-1 §6.6.1 явно запрещает JavaScript в документах PDF/A.
- API вложения файлов (EmbedFile, AddFileAttachment) заблокированы в режимах PDF/A-1 и PDF/A-2 (1-4). Они остаются функциональными в PDF/A-3 (режимы 5 и 6), который явно разрешает произвольные встроенные файлы.
v3.40.0 2026-05-20
- SetPDFAMode теперь поддерживает уровни соответствия PDF/A-2 и PDF/A-3. Передайте NewMode=3 для PDF/A-2b, 4 для PDF/A-2a, 5 для PDF/A-3b или 6 для PDF/A-3a. PDF/A-2 нацелен на PDF 1.7 и разрешает слои, интерактивные формы, изображения JPEG2000 и ограниченную прозрачность. PDF/A-3 расширяет PDF/A-2, разрешая произвольные встроенные файлы (любой MIME-тип). Все варианты -a автоматически записывают /MarkInfo и теги структуры PDF с тегами, необходимые для уровня соответствия доступности.
- Исправлено: SetPDFAMode(1) (PDF/A-1a) ранее был no-op из-за внутренней ошибки маршрутизации, введённой в v3.20.0. Теперь корректно записывает /MarkInfo и /OutputIntents и устанавливает XMP pdfaid:part=1/conformance=A.
- GetInformation(201) возвращает '1' - '6', соответствующее активному режиму PDF/A, в соответствии с новой нумерацией режимов.
v3.39.0 2026-05-20
- SetStructElemWritingMode устанавливает атрибут /WritingMode (Layout owner) на текущем открытом структурном элементе. Допустимые значения: LrTb (слева направо, по умолчанию для латинских шрифтов), RlTb (справа налево, для арабского и иврита) и TbRl (сверху вниз справа налево, для традиционного вертикального текста CJK). Определено в ISO 32000-1 §14.8.5.4.2 Table 340. Доступно в библиотеке Delphi, ActiveX (Dispid 73008049) и DLL-интерфейсах.
- SetStructElemListNumbering устанавливает атрибут /ListNumbering (List owner) на текущем открытом структурном элементе. Поддерживаемые значения включают None, Disc, Circle, Square (маркеры без порядка) и Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha (упорядоченная нумерация). Атрибут устанавливается на элементе L (list) и позволяет вспомогательным технологиям корректно объявлять тип списка. Определено в ISO 32000-1 §14.8.5.3.2 Table 336. Доступно в библиотеке Delphi, ActiveX (Dispid 73008050) и DLL-интерфейсах.
v3.38.0 2026-05-20
- SetStructElemColSpan устанавливает атрибут /ColSpan (Table owner) на текущем открытом структурном элементе, указывая, сколько столбцов охватывает ячейка. Определено в ISO 32000-1 §14.8.5.7.2 Table 337. Доступно в библиотеке Delphi, ActiveX (Dispid 73008047) и DLL-интерфейсах.
- SetStructElemRowSpan устанавливает атрибут /RowSpan (Table owner) на текущем открытом структурном элементе, указывая, сколько строк охватывает ячейка. Определено в ISO 32000-1 §14.8.5.7.2 Table 337. Доступно в библиотеке Delphi, ActiveX (Dispid 73008048) и DLL-интерфейсах.
- Обе функции — удобные обёртки, эквивалентные вызову AddTagAttribute с Owner='Table' и соответствующим именем атрибута. Они дополняют SetStructElemScope для полностью описанных ячеек таблиц в сложных таблицах или таблицах с охватывающими заголовками.
v3.37.2 2026-05-20
- GetPDFUADiagnostics теперь сообщает FORM-NO-TOOLTIP:N, когда N интерактивных полей форм (аннотации Widget) не имеют записи TU (всплывающая подсказка / доступное имя). ISO 14289-1 §7.18.4 требует, чтобы все интерактивные поля форм содержали запись TU, чтобы вспомогательная технология могла объявлять назначение поля пользователю при получении полем фокуса. /TU — это доступное имя, которое произносят программы чтения с экрана; оно отличается от /T, которое является частичным именем поля, используемым для программного доступа и отправки форм.
v3.37.1 2026-05-20
- GetPDFUADiagnostics теперь сообщает LIST-STRUCT:N, когда N структурных элементов LI или LBody находятся вне их обязательного родительского элемента. ISO 32000-1 §14.8.4.4 требует, чтобы LI был прямым потомком L (list), а LBody — прямым потомком LI (list item). Неправильно вложенные списки не позволяют вспомогательным технологиям корректно обходить и объявлять содержимое списка и могут вызывать сбои проверки структуры документа в валидаторах PDF/UA-1.
v3.37.0 2026-05-20
- BeginTagEx2 — новый API, который открывает структурный элемент и устанавливает все основные свойства элемента за один вызов. В дополнение к параметрам TagType, AltText, ActualText и Lang функции BeginTagEx, BeginTagEx2 принимает Title (/T, для панели навигации тегов), ElemID (/ID, уникальный идентификатор элемента) и Expansion (/E, полный текст аббревиатуры или акронима). Передача пустой строки для любого из этих трёх дополнительных параметров эквивалентна опусканию соответствующего сеттера. BeginTagEx2 уменьшает шаблонный код для хорошо описанных элементов — вместо вызова BeginTagEx, за которым следуют отдельные вызовы SetStructElemTitle, SetStructElemID и SetStructElemExpansion, все семь свойств могут быть установлены за один вызов. Функция доступна в библиотеке Delphi, ActiveX (Dispid 73008046) и DLL-интерфейсах.
v3.36.1 2026-05-20
- GetPDFUADiagnostics теперь сообщает TABLE-TH-NO-SCOPE:N, когда N структурных элементов TH (ячейка заголовка таблицы) не имеют атрибута Scope. ISO 32000-1 §14.8.4.3.4 Table 337 определяет Scope (Row, Column или Both) как атрибут, описывающий, к каким ячейкам данных применяется ячейка заголовка. Без него программы чтения с экрана и другие вспомогательные технологии не могут надёжно связать ячейки заголовков с ячейками данных в сложных или многозаголовочных таблицах, что требуется ISO 14289-1 §7.5. Вызывайте SetStructElemAttr('Table','Scope', 'Column') (или 'Row' / 'Both') сразу после тегирования каждого элемента TH.
v3.36.0 2026-05-20
- SetStructElemExpansion — новый API, устанавливающий запись /E (expansion text) на текущем открытом структурном элементе (ISO 32000-1 §14.9.5). Expansion-текст — это полностью записанная форма аббревиатуры или акронима, содержащегося в элементе — например "World Wide Web" для Span, текст которого — "WWW". Программы чтения с экрана произносят раскрытие вместо попытки прочитать аббревиатурные символы, что критично для доступности технического и научного контента. PDF/UA-1 (ISO 14289-1 §7.2) требует, чтобы естественный язык был однозначно определим; /E — стандартный механизм для аббревиатур и акронимов. Функция доступна в библиотеке Delphi, ActiveX и DLL-интерфейсах.
v3.35.1 2026-05-20
- GetPDFUADiagnostics теперь сообщает DOCINFO-TITLE-MISSING, когда запись /Title словаря информации документа отсутствует или пуста. PDF/UA-1 (ISO 14289-1) требует названия документа, чтобы программы чтения с экрана могли объявить его при открытии документа. Существующая проверка DISPLAYDOCTITLE-FALSE подтверждает, что название показано в строке заголовка просмотрщика; DOCINFO-TITLE-MISSING дополняет её — она подтверждает, что само значение названия установлено. Вызывайте SetDocumentInfo('Title', ...), чтобы передать значение.
v3.35.0 2026-05-20
- SetStructElemTitle — новый API, устанавливающий запись /T (title) на текущем открытом структурном элементе (ISO 32000-1 §14.7.2 Table 324). Название — это человекочитаемая метка, идентифицирующая конкретный экземпляр элемента — например "Chapter 1", "Summary Table" или "Figure 3: Quarterly Sales" — и отображается в панели навигации тегов PDF-просмотрщиков и используется инструментами доработки доступности. /T отличается от /Alt (альтернативный текст для пользователей с нарушениями отображения) и /ActualText (коррекция текста на уровне глифов); он наиболее полезен на нетекстовых элементах-контейнерах, таких как Table, Figure, Form, Sect и Div. Передайте пустую строку, чтобы очистить ранее установленное значение. Функция доступна в библиотеке Delphi, ActiveX и DLL-интерфейсах.
v3.34.0 2026-05-20
- SetStructElemAltText — новый API, устанавливающий запись /Alt на текущем открытом структурном элементе (ISO 32000-1 §14.9.3). Он эквивалентен передаче AltText в BeginTag, но позволяет установить или обновить описание альтернативного текста после открытия элемента — полезно, когда описание вычисляется отдельно от типа элемента. PDF/UA-1 (ISO 14289-1 §7.5) требует Alt-текст на элементах Figure и Formula; GetPDFUADiagnostics уже сообщает FIGURE-NO-ALT:N для отсутствующих значений. Функция доступна в библиотеке Delphi, ActiveX и DLL-интерфейсах.
v3.33.1 2026-05-20
- GetPDFUADiagnostics теперь включает проверку ROLEMAP-UNMAPPED:N, обнаруживающую пользовательские имена типов структурных элементов, используемых в документе, но не имеющих записи в словаре /RoleMap. ISO 14289-1 §7.1 и ISO 32000-1 §14.7.3 требуют, чтобы каждый нестандартный структурный тип был сопоставлен со стандартным типом PDF (таким как P, Span или Figure), чтобы вспомогательная технология могла определить, как обрабатывать элемент. Когда найдено N неотображённых типов, описание проблемы включает список имён типов, чтобы вызывающая сторона знала, какие записи AddRoleMap нужны. Все 49 стандартных структурных типов, определённых в ISO 32000-1 Table 333 (PDF 1.7), распознаются и исключаются из отчёта.
v3.33.0 2026-05-20
- SetStructElemLang — новый API, устанавливающий запись /Lang на текущем открытом структурном элементе (ISO 32000-1 §14.9.2). Языковой тег переопределяет язык уровня документа, объявленный SetDocumentLanguage или SetPDFUAMode, для элемента и всех его потомков, позволяя многоязычным документам помечать каждый фрагмент его правильным языковым тегом BCP 47 (например 'en-US', 'fr', 'zh-Hant-TW'). Программы чтения с экрана используют /Lang на уровне элемента для выбора подходящего движка преобразования текста в речь или голоса при чтении документа вслух. Функция доступна в библиотеке Delphi, ActiveX и DLL-интерфейсах.
v3.32.0 2026-05-20
- SetStructElemActualText — новый API, устанавливающий запись /ActualText на текущем открытом структурном элементе (ISO 32000-1 §14.9.4). Используйте его для указания точного Unicode-текста, который представляет последовательность глифов, когда извлечение из потока содержимого даст неверный результат — наиболее распространённые случаи — это глифы лигатур OpenType (U+FB00 ff, U+FB01 fi, U+FB02 fl) и аббревиатуры с неочевидным раскрытием. ActualText дополняет, а не заменяет отображаемое содержимое; он переопределяет то, что вспомогательная технология и средства извлечения текста читают для этого элемента, не подавляя визуальное отображение. Функция доступна в библиотеке Delphi, ActiveX и DLL-интерфейсах.
v3.31.1 2026-05-20
- GetPDFUADiagnostics теперь проверяет структурные элементы Formula в дополнение к элементам Figure при сообщении об отсутствующем Alt-тексте (FIGURE-NO-ALT:N). ISO 32000-1 §14.9.3 требует альтернативных описаний как для графических фигур, так и для математических формул; ранее сканировались только элементы Figure.
- GetPDFUADiagnostics теперь сообщает PDF-VERSION-LOW, когда версия PDF документа ниже 1.7. PDF/UA-1 (ISO 14289-1) определён для PDF 1.7 (ISO 32000-1:2008); документы PDF 1.5 или 1.6 не удовлетворяют требованиям базовой спецификации. Вызывайте SetPDFUAMode, чтобы автоматически поднять версию до 1.7.
v3.31.0 2026-05-19
- Идентификаторы структурных элементов и связывание заголовков таблиц теперь поддерживаются. SetStructElemID присваивает уникальный строковый идентификатор (/ID) текущему открытому структурному элементу; идентификаторы собираются в name tree /IDTree на корне дерева структуры при сохранении документа, позволяя инструментам доступности и перекрёстным ссылкам находить элементы по ID (ISO 32000-1 §14.7.4). SetStructElemHeaders связывает текущую ячейку таблицы (TD или TH) с одной или несколькими ячейками заголовков через разделённый запятыми список ранее присвоенных идентификаторов, записывая массив /Headers в словаре владельца атрибутов Table (ISO 32000-1 §14.8.5.7.2). Вместе эти две функции поддерживают сложную разметку таблиц для PDF/UA-1 (ISO 14289-1 §7.10) и WCAG 2.x SC 1.3.1. Обе функции доступны в библиотеке Delphi, ActiveX и DLL-интерфейсах. AddTagAttribute теперь также корректно обрабатывает атрибут /Headers со значениями, разделёнными запятыми, записываемыми как массивы PDF-текстовых строк.
v3.30.1 2026-05-19
- GetPDFUADiagnostics теперь включает проверку HEADING-LEVEL-SKIP:N, обнаруживающую скачки уровня заголовка в порядке документа (например, H1, за которым сразу следует H3 без H2 между ними). Проверка выполняет предварительный обход всего дерева структурных элементов и подсчитывает каждый случай, когда следующий уровень заголовка превышает предыдущий более чем на единицу. Общие элементы H обрабатываются как H1. Возврат к заголовку более высокого уровня (H3 → H1) не считается пропуском. WCAG 2.x Success Criterion 1.3.1 и ISO 14289-1 §7.1 требуют, чтобы заголовки вкладывались без пробелов.
v3.30.0 2026-05-19
- Атрибуты структурных элементов теперь поддерживаются для tagged PDF и документов PDF/UA. Три новые API-функции позволяют присоединять атрибуты к структурному элементу, строящемуся на стеке тегов: AddTagAttribute (общего назначения, любой owner/имя/значение), SetStructElemScope (удобная обёртка, устанавливающая атрибут /Scope под owner Table, для ячеек заголовков TH — ISO 32000-1 §14.8.5.7.2) и SetStructElemBBox (удобная обёртка, устанавливающая атрибут /BBox под owner Layout, для фигур и других визуально размещённых элементов — ISO 32000-1 §14.8.5.4). При сохранении документа атрибуты записываются как словари атрибутов /A в каждом структурном элементе; несколько атрибутов одного владельца группируются в один словарь, а атрибуты от разных владельцев записываются как массив словарей. Все три функции доступны в библиотеке Delphi, ActiveX и DLL-интерфейсах.
v3.29.1 2026-05-19
- GetPDFUADiagnostics теперь включает две дополнительные проверки: отсутствуют ли в документе какие-либо структурные элементы Figure со значением Alt-текста (сообщается как FIGURE-NO-ALT:N, согласно ISO 14289-1 §7.5 и ISO 32000-1 §14.9.3), и есть ли структурные элементы, всё ещё открытые из-за того, что EndTag не был вызван (сообщается как STRUCT-UNCLOSED:N). Проверка фигур выполняет полный рекурсивный обход дерева структурных элементов, охватывая элементы на всех глубинах вложенности.
v3.29.0 2026-05-19
- GetPDFUADiagnostics — новый диагностический API, проверяющий документ на потенциальные проблемы соответствия PDF/UA-1 (ISO 14289-1) и возвращающий разделённый переводами строк список находок. Выполняются шесть проверок: установлен ли MarkInfo/Marked (tagged PDF), есть ли в каталоге документа запись /Lang, истинно ли ViewerPreferences/DisplayDocTitle, содержит ли XMP-метаданные идентификатор pdfuaid:part, количество не освобождённых аннотаций без записи Contents и количество встроенных файлов без записи AFRelationship. Каждая находка идентифицируется коротким кодом (например LANG-MISSING, ANNOT-NO-CONTENTS:3), за которым следует человекочитаемое описание. Возвращает пустую строку, когда проблем не найдено. Доступно в библиотеке Delphi, ActiveX и DLL-интерфейсах.
v3.28.5 2026-05-19
- Улучшение доступности аннотаций PDF/UA-1: когда аннотация FileAttachment не имеет записи Contents и поля /T, имя файла из спецификации встроенного файла аннотации (/FS /UF или /F) теперь используется как резервное доступное описание. Это завершает резервную цепочку Contents аннотаций: /T → URI ссылки → имя штампа → имя файла FileAttachment. Программы чтения с экрана получают имя присоединённого файла вместо тишины, удовлетворяя ISO 14289-1 §7.18.1 для наиболее распространённых типов аннотаций.
v3.28.4 2026-05-19
- Улучшение доступности аннотаций PDF/UA-1: когда аннотация Stamp не имеет записи Contents (или она пуста) и поля /T, имя типа штампа из записи /Name аннотации теперь используется как резервное доступное описание (например "Approved", "Draft", "Confidential", "Final"). Это расширяет резервную цепочку Contents аннотаций, введённую в v3.28.3, для покрытия аннотаций штампов, которые распространены в рабочих процессах с просмотренными или одобренными документами и часто не имеют явного значения Contents.
v3.28.3 2026-05-19
- Улучшение доступности аннотаций PDF/UA-1: когда аннотация Link не имеет записи Contents (или она пуста) и поля /T, URI из URI-действия аннотации теперь используется как резервное доступное описание. Это применяется только во время обработки SetPDFUAMode и только к аннотациям Link, несущим действие /URI. Программы чтения с экрана получают URL как метку последней инстанции, удовлетворяя ISO 14289-1 §7.18.1 в распространённом случае, когда авторы создают гиперссылки, не предоставляя человекочитаемого описания.
v3.28.2 2026-05-19
- SetEmbeddedFileAFRelationship — новый API для явной установки значения AFRelationship в словаре спецификации файла встроенного файла. Требуется ISO 14289-1 (PDF/UA-1) §7.11, это позволяет вызывающим сторонам указать семантическое отношение встроенного файла к содержимому документа, выбрав один из пяти допустимых значений: Source, Data, Alternative, Supplement или Unspecified. Когда активен SetPDFUAMode, любому встроенному файлу без ключа AFRelationship автоматически присваивается Unspecified; используйте эту функцию, чтобы переопределить это значение по умолчанию перед сохранением. Доступно в библиотеке Delphi, ActiveX и DLL-интерфейсах.
v3.28.1 2026-05-19
- Когда SetPDFUAMode вызывается для документа, чьи XMP-метаданные несут общее название библиотеки по умолчанию, а не специфическое для документа, название теперь автоматически заменяется значением из записи /Info Title документа (если она присутствует). Это гарантирует, что XMP-пакет pdfuaid:part-1 отражает фактическое название документа, а не заполнитель, удовлетворяя ожиданиям проверщиков PDF/UA-1.
- Парсер XMP (LoadFromString) теперь читает значение dc:title из существующих XMP-метаданных при загрузке документа, поэтому round-trip PDF, который уже имеет dc:title, корректно сохраняет это название вместо возврата к заполнителю по умолчанию.
v3.28.0 2026-05-19
- BeginArtifactEx(ArtifactType, ArtifactSubtype) — новый API tagged-PDF, расширяющий BeginArtifact для выражения как /Type артефакта, так и /Subtype Pagination в одном вызове. Когда оба параметра непустые, записывается оператор /Artifact << /Type /T /Subtype /S >> BMC, позволяя полностью специфицированные Pagination-артефакты, такие как заголовки и подвалы согласно ISO 32000-1 §14.8.2.2.1. Если только один параметр непустой, используется соответствующая форма с одним ключом. Точки входа DLL DLBeginArtifactEx и DLBeginArtifactExA также экспортируются.
v3.27.2 2026-05-19
- BeginArtifact теперь корректно различает типы артефактов от подтипов нумерации страниц. Когда аргумент — Pagination, Layout или Page (типы артефактов согласно ISO 32000-1 §14.8.2.2.1 Table 330), оператор marked-content записывает /Type, а не /Subtype. Другие значения, такие как Header, Footer и Watermark, продолжают записываться как /Subtype. Это исправляет ранее неверный вывод, который записывал /Subtype /Pagination, когда вызывающая сторона намеревалась отметить артефакт нумерации страниц.
v3.27.1 2026-05-19
- Когда активен режим PDF/UA и документ содержит встроенные файлы, каждый словарь спецификации файла, в котором отсутствует запись AFRelationship, теперь автоматически получает её при сохранении. Записываемое значение — /Unspecified, удовлетворяющее требованию ISO 14289-1 §7.11, что каждый встроенный файл должен нести ключ AFRelationship. Это применяется как к файлам, добавленным через EmbedFile, так и к встроенным файлам, уже присутствующим в загруженном документе.
v3.27.0 2026-05-19
- AddRoleMap(CustomType, StandardType) — новый API tagged-PDF, регистрирующий отображение из имени типа пользовательского (нестандартного) структурного элемента в стандартный PDF-тип структуры. При сохранении отображения записываются в словарь RoleMap на корне дерева структуры, удовлетворяя требованию ISO 14289-1 §7.1 для документов, использующих имена тегов, специфичные для приложения. Можно зарегистрировать несколько отображений; дубликатные ключи перезаписываются последним вызовом. Точки входа DLL DLAddRoleMap и DLAddRoleMapA также экспортируются.
v3.26.0 2026-05-19
- BeginTagEx(TagType, AltText, ActualText, Lang) — новый API tagged-PDF, расширяющий BeginTag явным атрибутом естественного языка. Когда Lang непустой, он записывается в атрибут /Lang структурного элемента, позволяя аннотацию языка на уровне элемента, требуемую ISO 14289-1 §7.2 для многоязычных документов. Передайте пустую строку Lang, чтобы вести себя идентично BeginTag. Точки входа DLL DLBeginTagEx и DLBeginTagExA также экспортируются.
v3.25.1 2026-05-19
- Не subset-нутые TrueType-шрифты, загруженные с кодовой страницей Windows по умолчанию (WinAnsiEncoding), теперь получают поток ToUnicode CMap, обеспечивая надёжное извлечение Unicode-текста и copy/paste для этих шрифтов. Ранее поток ToUnicode записывался только тогда, когда присутствовало явное переопределение кодовой страницы или массив Differences; распространённый путь кодирования по умолчанию пропускал его.
- То же исправление применяется к TrueType-шрифтам, загруженным с явной не-дефолтной кодовой страницей, но без массива Differences, и к шрифтам, загруженным через packaged-font формат.
v3.25.0 2026-05-19
- Когда активен режим PDF/UA, не освобождённые аннотации (все типы, кроме Widget, PrinterMark и TrapNet), у которых отсутствует непустая запись Contents, теперь автоматически получают её при сохранении. Значение /T (название / автор) аннотации используется как резервное, удовлетворяя ISO 14289-1 §7.18.1 для аннотаций, несущих название, но без явного доступного описания.
v3.24.0 2026-05-19
- Когда активен режим PDF/UA, интерактивные поля форм, в которых отсутствует запись TU (всплывающая подсказка / альтернативное описание), теперь автоматически получают её при сохранении. Частичное имя поля (запись /T) используется как резервное значение, обеспечивая, что программы чтения с экрана могут идентифицировать каждое поле. Кнопки Push корректно исключаются из этого требования согласно ISO 14289-1 §7.18.4.
v3.23.1 2026-05-19
- GetInformation(200) возвращает '1', когда режим PDF/UA-1 активен на выбранном документе, позволяя вызывающим сторонам запрашивать статус режима соответствия во время выполнения.
- GetInformation(201) возвращает '1' для PDF/A-1a, '2' для PDF/A-1b или пустую строку, когда режим PDF/A выключен.
- GetInformation(311) и GetInformation(312) теперь корректно возвращают строку требования версии и имя функции из самого последнего конфликта блокировки версий (ранее объявлено в записи v3.20.3, но ещё не реализовано).
- GetInformation(313) возвращает строку версии PDF, на которой в данный момент заблокирована цель сохранения, или пустую строку для документов со свободным версионированием.
v3.23.0 2026-05-19
- SetMarkInfo(Marked) теперь является публичным API, позволяя устанавливать флаг MarkInfo.Marked независимо от полной настройки PDF/UA-1, выполняемой SetPDFUAMode. Когда Marked равен 1, MarkInfo.Suspects также устанавливается в false, как требует ISO 14289-1 §7.18.6.
- Когда активен режим PDF/UA, все страницы автоматически получают запись /Tabs /S при сохранении, удовлетворяя структурное требование порядка табуляции ISO 14289-1 §7.18.4.
- Добавлена справочная HTML-документация для SetPDFUAMode, SetDocumentLanguage, SetMarkInfo, BeginTag, EndTag, BeginArtifact и EndArtifact, с полными таблицами синтаксиса и примерами использования.
v3.22.0 2026-05-19
- BeginTag(TagType, AltText, ActualText) открывает структурный элемент tagged-PDF в текущем потоке содержимого, записывая оператор BDC с автоматически назначенным MCID и регистрируя элемент в дереве структуры документа. TagType — любой стандартный PDF-тип структуры (P, H1, Figure, Table и т.д.). AltText и ActualText — опциональные строки доступности, закодированные как PDF-текстовые строки (UTF-16BE).
- EndTag закрывает самый последний открытый структурный элемент, записывая соответствующий оператор EMC в поток содержимого.
- BeginArtifact(SubType) отмечает регион содержимого как PDF-артефакт (артефакт нумерации страниц, фон и т.д.), записывая оператор BMC. SubType опционален; когда предоставлен, он записывается как /Artifact << /Subtype /SubType >>.
- EndArtifact закрывает регион артефакта оператором EMC.
- При сохранении, когда зарегистрированы любые tagged-структурные элементы, библиотека автоматически строит полный StructTreeRoot, назначает ключи StructParents затронутым страницам и записывает number tree ParentTree, удовлетворяя требования ISO 32000-1 §14.7 для tagged PDF.
- Стандартные шрифты Type 1 (семейство Helvetica, Times, Courier, Symbol) и встроенные шрифты Type 1 с кодировкой WinAnsi теперь получают поток ToUnicode CMap, обеспечивая надёжное извлечение Unicode-текста и copy/paste для этих типов шрифтов.
v3.21.0 2026-05-19
- SetPDFUAMode(Language) активирует режим соответствия PDF/UA-1 (ISO 14289-1): автоматически поднимает документ до PDF 1.7, записывает MarkInfo.Marked и MarkInfo.Suspects, включает DisplayDocTitle в ViewerPreferences, устанавливает Catalog.Lang, когда Language непустой, и записывает запись пространства имён XMP pdfuaid:part = 1, требуемую ISO 14289-1 раздел 6.7.11.
- SetDocumentLanguage(Language) записывает запись Catalog /Lang напрямую, позволяя объявлять язык документа независимо от режима PDF/UA.
- MarkInfo.Suspects теперь устанавливается в false всякий раз, когда MarkInfo.Marked устанавливается в true, удовлетворяя структурное требование tagged-PDF ISO 14289-1 (раздел 7.18.6).
- Encrypt теперь принудительно устанавливает флаг разрешения CanCopyAccess (копирование контента для доступности), когда документ в режиме PDF/UA, как требует ISO 14289-1 раздел 7.17.
- Поля форм Choice (выпадающий список) больше не несут бессмысленного жёстко закодированного значения всплывающей подсказки; TU оставлен неустановленным, чтобы вызывающая сторона могла назначить осмысленную метку через API свойства поля формы.
v3.20.3 2026-05-19
- Encrypt и AddSWFAnnotationFromFile теперь немедленно возвращают 0 с LastErrorCode 602, когда версия сохранения заблокирована ниже минимума, требуемого выбранной силой шифрования или типом аннотации, вместо молчаливого продолжения и сбоя только во время сохранения.
- GetInformation(311) и GetInformation(312) теперь отражают конфликтующее требование версии во время записи, когда заблокированная версия блокирует функции уровня расширений, такие как AES-256 или аннотации RichMedia.
v3.20.2 2026-05-19
- AddU3DAnnotationFromFile теперь автоматически поднимает версию документа до PDF 1.6, когда 3D-аннотация добавляется в документ более низкой версии, в соответствии с поведением автоматического подъёма версии всех других точек входа API PDF 1.6+.
v3.20.1 2026-05-17
- Цели сохранения PDF 1.2 теперь строго соблюдаются как контракты PDF 1.2. Сохранение объектов PDF 1.3+, таких как данные TrimBox страницы, под целью PDF 1.2 завершается ошибкой до записи вывода вместо вывода файла со смешанными версиями.
- Соответствие уровню расширений Adobe PDF 1.7 теперь является частью предварительной проверки сохранения. AESV3, AES-256, RichMedia, Projection, геопространственные словари и subfilters подписи ETSI проверяются относительно требуемого ExtensionLevel.
- Шифрование AES-256, аннотации RichMedia, геопространственные словари и subfilters подписи ETSI теперь объявляют соответствующую запись Adobe Extensions, когда PDFlib автоматически поднимает документ до содержимого расширений PDF 1.7.
- Сохранения добавлением (Append) теперь используют тот же шлюз соответствия версии, что и полные сохранения.
- Связанные опциональные runtime-DLL PDFium были обновлены для Win32 и Win64. GDI+ остаётся рендерером по умолчанию; PDFium остаётся opt-in через SetPDFiumFileName и SelectRenderer(3).
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 207/207 каждый, а C++Builder Win64x GoogleTest прошёл 61 тест с 2 существующими тестами, зависящими от образцов, пропущенными.
v3.20.0 2026-05-17
- Восемь дополнительных точек входа writer PDFlib теперь маршрутизируются через Phase 3 EnsureMinVersion, так что версия документа автоматически поднимается до минимума, требуемого выводимой функцией: SetDocumentMetadata (PDF 1.4 - /Metadata XMP stream) SetPDFAMode(1 or 2) (PDF 1.4 - /MarkInfo + /OutputIntents) PageJavaScriptAction (PDF 1.5 - Page /AA + JavaScript) DocJavaScriptAction (PDF 1.4 - Catalog /AA + JavaScript) SetTabOrderMode (PDF 1.5 - Page /Tabs) NewOptionalContentGroup (PDF 1.5 - /Type /OCG) SetNeedAppearances (PDF 1.5 - AcroForm /NeedAppearances) NewFormField(ftSignature) (PDF 1.5 - AcroForm /SigFlags AppendOnly)
- В сочетании с набором v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) и набором v3.17.0 (восемь записей JavaScript / встроенных файлов / XFA / SWF) PDFlib теперь автоматически поднимает FVersion на двадцати одной точке входа writer.
- NewOptionalContentGroup ранее поднимал FVersion напрямую; теперь он проходит через EnsureMinVersion, так что LockSaveVersion соблюдается, а подъём записывается в AutoBumpedFeatures.
v3.19.0 2026-05-17
- Соответствие версии PDF во время сохранения и загрузки теперь также распознаёт четыре ранее отложенные функции: Btn /Ff bit 15 NoToggleToOff (только radio-button) -> PDF 1.4 DeviceN /Subtype /NChannel (уточнение цветового пространства) -> PDF 1.6 FontFile3 /Subtype /OpenType (тип программы шрифта) -> PDF 1.6 Sig /SubFilter ETSI.CAdES.detached или ETSI.RFC3161 -> PDF 1.7
- Правило NChannel сопоставляет форму массива цветового пространства DeviceN [/DeviceN names alternateSpace tintTransform attributes], когда словарь атрибутов на индексе 4 несёт /Subtype /NChannel.
- Правило FontFile3 OpenType срабатывает только тогда, когда поток достигается через родительский ключ с именем 'FontFile3', так что не связанные потоки, которые случайно несут /Subtype /OpenType, не помечаются.
- Таблица PDFFeatureRules теперь несёт 103 правила (99 + 4 новых).
v3.18.6 2026-05-17
- Соответствие версии PDF во время сохранения и загрузки теперь распознаёт /AA (additional actions) с учётом типа контейнера: Catalog /AA (триггеры уровня документа) -> PDF 1.4 Annot /AA (триггеры аннотаций) -> PDF 1.4 Page /AA (триггеры страницы) -> PDF 1.5
- Form-field /AA (PDF 1.2) остаётся охваченным существующим контрактом сохранения PDF 1.3; правило не требуется.
- Таблица PDFFeatureRules теперь несёт 99 правил (96 + 3 новых).
v3.18.5 2026-05-17
- Соответствие версии PDF во время сохранения и загрузки теперь корректно классифицирует Page /Tabs как функцию PDF 1.5; ранее она была ошибочно классифицирована как PDF 1.4. Документ изменений спецификации PDF 1.4 (Adobe TN #5409) не перечисляет /Tabs, а PDF 1.5 Table 8.10 вводит "Tabs (Optional; PDF 1.5)".
- Новое правило: AcroForm /NeedAppearances распознаётся как функция PDF 1.5 согласно PDF 1.5 Table 218.
- Таблица PDFFeatureRules теперь несёт 96 правил (95 + 1 новое).
v3.18.4 2026-05-13
- PDFlibZLib теперь всегда использует встроенный статический бэкенд zlib-ng object на обычных сборках библиотеки, удаляя оставшийся резервный путь System.ZLib.
- Регрессионное покрытие zlib-ng теперь включает payload граничных размеров, данные PNG-подобных scanline, сохранённые многоблочные потоки и известные потоки zlib через Delphi и C++Builder test runners.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 194/194 каждый, а C++Builder Win64x GoogleTest прошёл 58 тестов с 2 существующими тестами, зависящими от образцов, пропущенными.
v3.18.3 2026-05-12
- Демо Delphi и C++Builder, генерирующие PDF или текстовый вывод, теперь автоматически открывают сгенерированный документ после успешного сохранения.
- Упаковщик инсталлятора теперь держит build-артефакты вне папок демо и делает образцы C++Builder плюс DLL и модули ActiveX/OCX компонентами opt-in; их соответствующие файлы устанавливаются только тогда, когда компонент выбран.
v3.18.2 2026-05-12
- Демо EditFormField для Delphi и C++Builder теперь очищают /NeedAppearances перед обновлением значений полей, так что каждое отредактированное текстовое поле получает обновлённый поток нормального внешнего вида в сохранённом PDF.
- Это поддерживает сохранённый поток /AP в синхронизации с сохранённым значением /V и избегает зависимых от просмотрщика различий, при которых фокусирование поля раскрывает текст, отсутствовавший в статическом внешнем виде поля.
v3.18.1 2026-05-10
- Соответствие версии PDF во время сохранения и загрузки теперь также распознаёт битовые флаги полей форм /Ff и бит AcroForm /SigFlags AppendOnly: /Ff bit 21 (FileSelect, mask 1048576) -> PDF 1.4 /Ff bit 22 (MultiSelect, mask 2097152) -> PDF 1.4 /Ff bit 23 (DoNotSpellCheck, mask 4194304) -> PDF 1.4 /Ff bit 24 (DoNotScroll, mask 8388608) -> PDF 1.4 /Ff bit 25 (Comb, mask 16777216) -> PDF 1.5 /Ff bit 26 (RichText / RadiosInUnison, 33554432) -> PDF 1.5 /Ff bit 27 (CommitOnSelChange, mask 67108864) -> PDF 1.5 /SigFlags bit 2 (AppendOnly, mask 2) -> PDF 1.5
- Наследование /Parent не отслеживается: только словари, явно несущие /Ff или /SigFlags, запускают правила.
- Таблица PDFFeatureRules теперь несёт 95 правил (87 + 8 новых битового уровня).
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 191/191 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.18.0 2026-05-10
- Соответствие версии PDF во время сохранения и загрузки теперь также распознаёт девять дополнительных подключей и битовых функций: битовые флаги аннотаций (/F mask): Locked (128) -> PDF 1.4 ToggleNoView (256) -> PDF 1.5 LockedContents (512) -> PDF 1.7 отличительные подключи каталога и страницы: /BoxColorInfo (page) -> PDF 1.4 /Permissions, /Legal, /PresSteps -> PDF 1.5 /VP (page geospatial viewport) -> PDF 1.6 /Collection (catalog portable collection) -> PDF 1.7
- Таблица PDFFeatureRules теперь несёт 87 правил (78 уровня главы + 9 подключа / битового уровня).
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 189/189 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.17.0 2026-05-10
- Восемь дополнительных точек входа writer PDFlib теперь маршрутизируются через Phase 3 EnsureMinVersion, так что версия документа автоматически поднимается до минимума, требуемого выводимой функцией: AddLinkToJavaScript, SetOpenActionJavaScript, AddGlobalJavaScript, FormFieldJavaScriptAction (PDF 1.3 - JavaScript actions) AddEmbeddedFile, AddFileAttachment (PDF 1.3 - file attachments) SetXFAFromString (PDF 1.5 - XFA forms) AddSWFAnnotationFromFile (PDF 1.7 - RichMedia annotation)
- В сочетании с набором v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) PDFlib теперь покрывает тринадцать точек входа writer высоких версий полностью.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 187/187 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.16.3 2026-05-10
- Новый API PDFlib: LockSaveVersion(Version) фиксирует документ на Version и останавливает Phase 3 writer-side EnsureMinVersion от автоматического подъёма выше неё. UnlockSaveVersion очищает блокировку.
- Шлюз времени сохранения не изменён: функции, выводимые writer выше заблокированной версии, по-прежнему создают LastErrorCode 602 во время сохранения вместо молчаливого подъёма заголовка.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 184/184 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.16.2 2026-05-10
- Загруженные PDF теперь предоставляют contributor-only представление обнаружения функций во время загрузки через GetInformation(103) ("ContributorFeatures"). Список содержит только функции, чья минимально требуемая версия строго больше HeaderVersion (ключ 100), так что он напрямую отвечает на "почему эффективная версия выше заголовка файла?".
- GetInformation(101) ("DetectedFeatures") не изменён и по-прежнему перечисляет каждую сопоставленную функцию независимо от вклада.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 181/181 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.16.1 2026-05-10
- Расширено покрытие тестов обнаружения на стороне loader шестью дополнительными синтетическими фикстурами: in-page transparency ExtGState (без подъёма версии), Catalog /MarkInfo (PDF 1.3 -> PDF 1.4), /OCProperties + OCG content (PDF 1.4 -> PDF 1.5), /Type /3DStream (PDF 1.5 -> PDF 1.6), мультифункциональная комбинационная фикстура и проверка стабильности снимка.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 179/179 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.16.0 2026-05-10
- Загруженные PDF-документы теперь проходят через проход обнаружения версии, управляемый содержимым: каждый косвенный объект проходится через таблицу feature-to-minimum-version, используемую шлюзом времени сохранения, и FVersion поднимается выше литерального значения заголовка %PDF-X.Y, когда содержимое действительно требует более высокой версии. Например запись /UserUnit на странице поднимает эффективную версию до PDF 1.6, даже когда заголовок файла говорит PDF 1.4.
- Новые ключи GetInformation: 100 возвращает HeaderVersion (литерал %PDF-X.Y), 101 возвращает DetectedFeatures (CRLF-разделённые функции, сопоставленные при загрузке), 102 возвращает AutoBumpedFeatures (CRLF-разделённые функции, которые запустили writer-side EnsureMinVersion).
- Шлюз времени сохранения не затронут: документы, чья эффективная версия была поднята при загрузке, затем явно понижена через SetInformation(0, ...), по-прежнему создают LastErrorCode 602 во время сохранения.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 173/173 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.15.0 2026-05-10
- Точки входа writer, производящие функции, требующие определённой минимальной версии PDF, теперь автоматически поднимают версию PDF документа. Вызов SetTransparency для документа, помеченного как PDF 1.3, теперь продвигает заголовок до PDF 1.4 вместо сбоя сохранения с LastErrorCode 602.
- Подключил тот же автоподъём к SetPageUserUnit (>=1.6), Encrypt с Strength 1/2/3/4 (>=1.4/1.6/1.7/1.7 соответственно) и двухстраничные варианты SetPageLayout (>=1.5).
- Изменение поведения по сравнению с 3.14.x: приложения, ранее полагавшиеся на шлюз v3.12.6 "save target rejects writer-emitted features", теперь успешны на поднятой версии. Загруженные PDF, уже содержащие функции более высоких версий, по-прежнему проходят через существующий шлюз времени сохранения, поэтому загрузка tagged PDF и выбор PDF 1.3 по-прежнему завершается с LastErrorCode 602.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 170/170 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.14.3 2026-05-10
- Соответствие версии PDF во время сохранения теперь также распознаёт оставшиеся типы 3D-словарей PDF 1.6 (/Type /3DStream /3DRef /3DBackground /3DRenderMode /3DLightingScheme /3DCrossSection /3DNode) и подтипы аннотаций PDF 1.7 Redact, RichMedia и Projection плюс сопутствующие словари /Type /Requirement и /ReqHandler.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 168/168 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.14.2 2026-05-10
- Соответствие версии PDF во время сохранения теперь также распознаёт функции PDF 1.5: формы /XFA, /AlternatePresentations, name tree /Renditions, мультимедийные словари /Type /Rendition /MediaCriteria /MediaPermissions /MediaPlayers и подтип аннотации Screen.
- Сохранение как PDF 1.4 теперь отклоняет документы, несущие эти функции, с LastErrorCode 602.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 166/166 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.14.1 2026-05-10
- Соответствие версии PDF во время сохранения теперь также распознаёт функции PDF 1.4: словари tagged-PDF /StructTreeRoot /MarkInfo и StructElem, записи документа /Lang и страницы /Tabs, словари /OutputIntents и /OutputIntent, подпись прав использования /UR3 и подтипы аннотаций PDF 1.4 Polygon, PolyLine, Caret, Ink, Popup и Watermark.
- Сохранение как PDF 1.3 теперь отклоняет документы, несущие эти функции, с LastErrorCode 602.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 165/165 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.14.0 2026-05-10
- Соответствие версии PDF во время сохранения теперь также распознаёт функции PDF 1.3, такие как smooth shading, объекты функций, цветовые пространства ICCBased и DeviceN, записи страницы /TrimBox /BleedBox /ArtBox, ToUnicode CMaps, file attachment и аннотации /Sound и /Movie, словари /Type /Filespec и /Type /EmbeddedFile, ключи /Group /EF /Alternates /Mask и действия JavaScript.
- Вызывающие стороны PDF 1.2 теперь сохраняют под контрактом PDF 1.3: литеральный заголовок %PDF-1.2 сохраняется, но шлюз принимает функции PDF 1.3. Функции PDF 1.4 и более поздних версий по-прежнему отклоняются с LastErrorCode 602.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 162/162 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.13.0 2026-05-10
- Рефакторил шлюз соответствия версии PDF, отклоняющий функции более поздних версий во время сохранения, в выделенный модуль, так что набор правил может расти без перетряхивания ядра документа.
- Без изменений видимого пользователю поведения по сравнению с v3.12.7: те же функции вне версии по-прежнему отклоняются с LastErrorCode 602.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 155/155 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.12.7 2026-05-09
- Расширено покрытие автоматизированных тестов для рабочего процесса прямого рендеринга PdfToImage как в Delphi DUnitX, так и в C++Builder GoogleTest наборах.
- VCL GUI test runner Delphi теперь регистрирует фикстуры Syntax и XRef, соответствующие покрытию консольного runner.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 147/147 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
v3.12.6 2026-05-09
- Сохранение как PDF 1.3, 1.4, 1.5, 1.6 или 1.7 теперь принудительно соблюдает выбранную версию как контракт вывода полного сохранения.
- Полные сохранения удаляют переопределения /Version каталога, удаляют неподдерживаемые записи расширений каталога и метаданных для более низких целей и подавляют потоки XMP-метаданных PDF 1.4 при сохранении как PDF 1.3.
- SaveToFile, SaveToString и SaveToStream теперь завершаются с LastErrorCode 602, когда выбранная целевая версия PDF ниже, чем функции, всё ещё присутствующие в документе, такие как прозрачность, опциональное содержимое, JPX, UserUnit, 3D или функции AES crypt-filter.
v3.12.5 2026-05-09
- Улучшил разбор литеральных строк PDF 1.7, чтобы неизвестные escape-последовательности игнорировали обратный слэш, как требует стандарт.
- Восьмеричные escape литеральных строк теперь потребляют только восьмеричные цифры и сохраняют последующую не-восьмеричную цифру как обычные данные строки.
- Добавлено регрессионное покрытие для неизвестных escape литеральных строк и смешанных восьмеричных/не-восьмеричных escape-последовательностей.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 141/141 каждый.
v3.12.4 2026-05-09
- Улучшил лексический разбор PDF 1.7, чтобы объекты имени теперь корректно останавливались на разделителе правой фигурной скобки.
- Исправил загрузку SmartAccess записей xref stream сжатых объектов, чей номер потока объектов больше байтовой длины PDF.
- Добавлено регрессионное покрытие для разделителей правой фигурной скобки имени и разреженных записей xref stream сжатых объектов.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 139/139 каждый.
v3.12.3 2026-05-08
- Улучшил совместимость с зашифрованными документами PDF 1.7 для файлов стандартного обработчика безопасности, использующих StrF, StmF, EFF, Identity, None или именованные crypt filter в стиле StdCF.
- Потоки метаданных теперь соблюдают EncryptMetadata=false во время рабочих процессов расшифровки, шифрования и копирования/сохранения вместо обработки как обычные потоки.
- Потоки встроенных файлов теперь несут /Type /EmbeddedFile и используют путь решения crypt-filter встроенного файла при загрузке или сохранении зашифрованных документов.
- Внешние потоки встроенных файлов теперь повышают FDecodeParms до DecodeParms, когда FFilter повышается до Filter, сохраняя параметры декодирования потока.
- Новые зашифрованные AES PDF теперь записывают значения Length crypt-filter как битовые длины, соответствуя контракту словаря crypt filter PDF 1.7.
- Значения Prev/XRefStm XRef stream и большие числовые смещения теперь сохраняют 64-битную точность через пути парсера и SmartAccess.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 137/137 каждый.
v3.12.2 2026-05-08
- Улучшил совместимость декодирования потоков PDF 1.7. Общее декодирование потоков теперь соблюдает /DP как alias для DecodeParms, разрешает косвенные записи массива decode-параметров и принимает стандартные сокращения фильтров /AHx и /LZW.
- Вывод PDF большого файла теперь записывает смещения xref, startxref, linearization и ByteRange цифровой подписи через пути 64-битного форматирования вместо сужения этих значений через 32-битные целочисленные хелперы.
- Загруженные документы теперь обрабатывают запись /Version каталога как эффективную версию PDF, когда она новее, чем версия заголовка файла.
- Переписанные трейлеры xref-stream больше не сохраняют ключи DecodeParms только для потоков, когда PDFlibPas сохраняет их как классические словари трейлеров.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 134/134 каждый.
v3.12.1 2026-05-06
- Сгенерированные PDF теперь открываются с первой страницей, размер которой подогнан под доступную высоту окна просмотрщика, так что вся первая страница видна сверху донизу при наибольшем масштабе, помещающемся в окно. Настройте пользовательский OpenAction (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) на документе, чтобы переопределить это значение по умолчанию.
v3.12.0 2026-05-06
- Статические бэкенды Windows теперь включают объекты libjpeg-turbo NASM SIMD для Win32 и Win64, плюс объекты zlib-ng x86 SIMD dispatch для набора zlib-ng Win64x.
- Переработал скрипты пересборки zlib-ng, так что Win64x bcc64x и диагностические MSVC-сборки компилируют generic, SSE2, SSSE3, SSE4.1/SSE4.2, PCLMULQDQ и AVX2 исходные файлы с feature-флагами на файл вместо опоры на один глобальный переключатель компилятора.
- Добавил выровненные по 32 байтам CRT-заглушки malloc/calloc/realloc/free для статических C-библиотек и исправил TPDFJPEGImage.Compress для освобождения буферов jpeg_mem_dest через тот же C-путь free, который их выделил.
- Расширил публичные заметки проверки, чтобы выделить строгое автоматизированное покрытие за этим релизом: сборки библиотек, циклы сжатия, вывод HelloWorld /FlateDecode, рендеринг JPEG, рабочие процессы изображений, шрифты, формы, безопасность, подписание, печать и рабочие процессы, производные от демо C++Builder.
v3.11.0 2026-05-05
- Переключил Windows Flate сжатие и распаковку на zlib-ng в zlib-совместимом режиме. Win32, Delphi Win64 и C++Builder Win64x теперь связывают ABI-совместимые наборы статических объектов zlib-ng из Lib\thirdparty\Win32, Lib\thirdparty\Win64 и Lib\thirdparty\Win64x.
- Путь Win64 больше не маршрутизируется через юнит Delphi System.ZLib, так что сжатие/распаковка PDF-потоков может получить выгоду от бэкенда zlib-ng так же, как 32-битная сборка.
- Добавил небольшой объект моста zlib-ng для сборок Win64, так что код Pascal сохраняет стабильные zlib-совместимые точки входа, пока Delphi и C++Builder потребляют свои собственные linker-совместимые наборы объектов.
- Обновил все проекты демо C++Builder для определения PDFLIB_CPPBUILDER, соответствующего GoogleTest runner и предотвращающего связывание демо Win64x с объектами zlib-ng Delphi Win64.
v3.10.3 2026-05-01
- Расширил набор C++Builder GoogleTest, чтобы покрыть каждое демо под Demo\C++Builder. Макет фазы 1 из 7 фикстур вырос до 15 фикстур / 52 случаев GoogleTest, все проходят на Win64x. Новые покрытые демо: AddFormattedTitle, AddTextImage, AddTrueTypeSubsettedFont, AddWebLink, CanvasText, CaptureToNewSize, CopyPageRanges, CreateWithImage, CreateWithImageToStream, DoInTheStream, DrawWrappedText, EditFormField, EmbeddedFonts, ExtractAnnotAttach, ExtractEmbeddedFonts, ExtractImage, ImageToPdf, ImportEMF, MultiFunction (renderer switch), PageOperations, PdfDecrypt, PdfPermission, PrintPDF, TextMeasure, TextPaging.
v3.10.2 2026-05-01
- Добавил C++Builder GoogleTest runner под Tests\C++Builder, который упражняет Lib\PDFlibrary.pas через те же {$JPHNE}-выведенные HPP-заголовки, используемые демо C++Builder. Первая фаза зеркалирует семь основных сценариев Delphi (HelloWorld, DrawShapes, CreateTable, PdfEncrypt, ExtractText, PdfSigning, PdfToImage rendering) как 17 случаев GoogleTest, все проходят на Win64x.
- Расширил набор Delphi DUnitX с Tests.Print, покрывающим демо PrintPDF и ShowPrinterBins (перечисление принтера по умолчанию, настройка пользовательского принтера, опции печати, перенаправление задания печати в файл) и тест переключения renderer в Tests.Render, упражняющий выбор движка GDI+ / PDFium / Cairo демо MultiFunction на одном исходном PDF.
v3.10.1 2026-05-01
- Добавлены 57 именованных размеров страницы в SetPageSize, поэтому те же канонические имена размеров страниц работают и здесь: SIZE8X11, QUADA0, DOUBA0, B0PLUS, ENVB4/B5/C6/DL/MONARCH, ENV9/10/11, ANSIA/B/C/D/E, ARCHA/B/C/D/E1/E, SHIROKU, G1K, USBC/EUBC/ASBC, ID1/ID2/ID3, ONEINCH/TWOINCH/L2INCH/USVISA, P2R..P24R / S8R / P4D photo prints, plus the Chinese / Taiwanese octavo and sextodecimo sheet formats LARGE/STANDARD/CROWN/ROC 8K and the matching 16K halves.
v3.10.0 2026-04-30
- Добавил нативные C++Builder версии для каждого образца Delphi под Demo. Демо создания PDF, манипуляции страницами, шрифтов, изображений, безопасности, подписания, рендеринга и печати теперь могут быть собраны и запущены из C++Builder без каких-либо обёрток на стороне Delphi.
- Каждое новое демо живёт в Demo\C++Builder\<Name>\ как консольный проект, который потребляет Lib\PDFlibrary.pas напрямую и поставляется с входными файлами, необходимыми для запуска.
- Добавил краткий английский Readme.txt в каждую папку демо Delphi, описывающий, что демо показывает, на каком API оно фокусируется и как его запустить; HTML-обзор по адресу Demo\Delphi\index.html ссылается на все из них, сгруппированные по теме.
- Зеркалировал тот же Readme.txt для каждого демо C++Builder с секцией Run, переписанной для консольного рабочего процесса (аргументы argv вместо Open/SaveDialogs); соответствующий Demo\C++Builder\index.html перечисляет каждое демо C++Builder с теми же группами тем.
- Исправил утечку памяти в демо ImportEMF (экземпляр TPDFlib был создан, но никогда не освобождён).
v3.9.14 2026-04-30
- Исправил демо копирования диапазона страниц, чтобы оно действительно копировало страницы вместо постоянного сообщения об ошибке.
- Привёл в порядок демо wrapped-text и HTML pagination, чтобы каждое из них фокусировалось на собственном API и запускалось с одной кнопки.
- Переименовал два проекта демо (EmbeddedFonts и PdfPermission), чтобы скомпилированные исполняемые файлы соответствовали именам папок, а не более старым прототипным именам.
v3.9.13 2026-04-30
- Исправил ошибку позиции потока во внутреннем буферном считывателе: чтения двухбайтовых слов продвигали курсор чтения на четыре байта вместо двух. В буферах длиннее двух байтов последующие чтения попадали на неверное смещение и молча возвращали некорректные данные. Эффект был наиболее заметен при разборе двоичных структур данных, которые чередуют чтения байтов и слов.
- Введён автоматизированный набор тестов DUnitX (консольный и VCL GUI runners), покрывающий утилитарные юниты — буфер, AES, ZLib, Unicode и хеширование digest — и рабочие процессы уровня библиотеки, включая создание документов, сохранение в файл и в поток, round-trip загрузки и шифрование AES-128/AES-256.
v3.9.12 2026-04-30
- Рендеринг изображений GDI+ теперь по умолчанию использует гладкую высококачественную бикубическую интерполяцию при масштабировании растровых изображений до экранного или экспортного разрешения. Ранее по умолчанию был nearest-neighbour, что давало видимые ступенчатые артефакты на маленьких изображениях (логотипы, миниатюры), увеличенных для экранного предварительного просмотра или high-DPI экспорта. Вызывающие стороны, предпочитающие более резкий режим nearest-neighbour, могут восстановить старое поведение через SetGDIPlusOptions.
v3.9.11 2026-04-30
- Исправил рендеринг Cairo PDF-изображений, использующих color-key прозрачность (массив color-range /Mask в словаре изображения). Ранее, когда страница содержала изображение с этой формой прозрачности, renderer Cairo полностью опускал изображение вместо его композиции на фон страницы. Исправление выводит альфа-канал на пиксель из объявленных диапазонов color-key и рендерит результат как прозрачное изображение, давая вывод, визуально согласованный с GDI+ renderer.
v3.9.10 2026-04-30
- Исправил регрессию рендеринга Cairo, где всё содержимое страницы, следующее за последовательностью обрезанного изображения, было некорректно ограничено прямоугольником обрезки изображения. PDF-страницы, которые сохраняют состояние графики, применяют clip path, рисуют изображение, затем восстанавливают состояние — распространённый макетный приём для изображений в рамках или с границами — рендерили весь последующий текст, формы и графику только внутри обрезанного региона. Сохранение и восстановление состояния Cairo теперь корректно отображаются в операторы q/Q PDF, так что регион обрезки отбрасывается после рисования изображения.
v3.9.9 2026-04-29
- Добавил движок рендеринга PDF на основе Cairo как третий вариант рендеринга наряду с GDI+ и PDFium. Вызовите SelectRenderer(2) перед рендерингом, чтобы активировать его; движок требует cairo.dll из связанной папки DLL\Cairo. Рендеринг Cairo поддерживает те же режимы вывода, что и GDI+: экспорт битмап-файла и потока (BMP, JPEG, PNG, GIF, TIFF, G4 TIFF), рендеринг в device-context и прямой вывод на принтер.
- Демо MultiFunction View/Print теперь предоставляет трёхсторонний селектор renderer, чтобы пользователи могли сравнивать вывод GDI+, PDFium и Cairo бок о бок на одном документе без каких-либо изменений кода.
v3.9.8 2026-04-29
- Подавил две ложные диагностики компилятора в Win32 C-runtime shim, которые появлялись на RAD Studio 13.1 и позже. Предупреждение об устаревании (W1000) поднималось, потому что capability guard версии компилятора не распространялся на компиляторы новее Delphi 2009, заставляя их компилироваться против устаревшего API менеджера памяти. Подсказка о неиспользуемой переменной (H2164) поднималась для внутренней переменной совместимости, нужной только для сборок Delphi 7; теперь она ограничена условным блоком этой версии. Обе проблемы были только диагностическими без воздействия на время выполнения.
v3.9.7 2026-04-29
- Добавил опциональный рендеринг страниц на основе PDFium на Windows, включая BMP stream рендеринг, рендеринг device-context, рендеринг в память и вывод на принтер.
- Обновил демо Delphi MultiFunction View/Print селектором renderer, чтобы пользователи могли переключаться между существующим renderer GDI+ и PDFium.
v3.9.6 2026-04-29
- Добавил отдельные скрипты Inno Setup для полного пакета PDFlibPas и пробного пакета, с release-ориентированными исключениями для метаданных source-control, build-выводов, IDE-кешей, локальных файлов агента и связанных third-party исходных деревьев, не входящих в поставляемый пакет.
- Пробный инсталлятор теперь собирает и упаковывает пробные двоичные библиотеки для RAD Studio 11.3, 12.3 и 13.1, плюс пробные демо Delphi, перед генерацией исполняемого файла setup.
v3.9.5 2026-04-29
- Исправил сборки Win32-библиотеки под RAD Studio 9.0 / Delphi XE2. Скрипт сборки передавал флаг выходного каталога DCU, который существует только с Delphi 2010 и далее; компилятор XE2 интерпретировал флаг иначе, производя искажённый выходной путь и фатальную ошибку до обработки любого исходного файла. Скрипт теперь автоматически выбирает соответствующий флаг на основе версии целевого компилятора.
- Исправил связанный compiler-version guard в исходниках библиотеки, который вызывал name-qualified runtime-функцию, введённую в XE4, под условием XE2+. Сборки, нацеленные на XE2 и XE3, теперь разрешают правильный compatibility-импорт.
v3.9.4 2026-04-29
- Исправил настройку принтера для сетевых и серверных общих принтеров путём применения настроек лотка бумаги, носителя, дуплекса, качества и других настроек печати через handle DEVMODE принтера вместо handle device context принтера.
v3.9.3 2026-04-29
- Обновил связанный AES-бэкенд до исходников Brian Gladman 2018 AES как на Win32, так и на Win64. Воспроизводимые скрипты сборки теперь позволяют пересобирать статические AES-объекты из исходников в любое время. Дефект ABI в Pascal-биндингах был обнаружен и исправлен в процессе: функции AES-CBC encrypt и decrypt не имели объявления C calling-convention, так что сборки Win32 молча передавали аргументы в неверном порядке регистров, потенциально производя некорректный зашифрованный вывод. Сборки Win64 не были затронуты, потому что платформа принудительно соблюдает единое calling convention.
- Усилил third-party rebuild-скрипты, чтобы MSVC-основанные скрипты zlib, JPEG и CRT-stub могли запускаться из корня репозитория, а также из каталога thirdparty; ранее они требовали, чтобы рабочий каталог был установлен на папку thirdparty.
v3.9.2 2026-04-29
- Обновил бэкенд JPEG 2000 с устаревшего OpenJPEG 1.5 до OpenJPEG 2.5.4 как на Win32, так и на Win64. Обе платформы теперь используют статическое объектное связывание, так что кодирование и декодирование JPEG 2000 работает без дополнительной runtime DLL. Современный кодек приносит текущую обработку заголовков JP2/J2K, callback-driven stream API и накопленные исправления багов и безопасности от upstream-проекта. Публичный API TJpeg2000Bitmap не изменён.
v3.9.1 2026-04-29
- Исправил рендеринг JPEG-страниц и экспорт изображений после обновления libjpeg-turbo, восстановив конвертацию PdfToImage JPG и вывод TPDFJPEGImage.SaveToStream на Win32 и Win64.
- Скорректировал ABI-биндинги Win32 libjpeg-turbo, чтобы callbacks, выравнивание структур, boolean-поля и memory-backed JPEG destinations соответствовали libjpeg-turbo 3.1.90.
- Исправил распаковку Win32 FlateDecode stream с связанным бэкендом zlib 1.3.2, восстановив загрузку PDF xref stream для файлов, таких как образец документа PdfToImage.
v3.9.0 2026-04-29
- Обновил связанный JPEG 2000 бэкенд с устаревшего OpenJPEG 1.5 до OpenJPEG 2.5.4. Загрузка и сохранение JPEG 2000 теперь используют современный кодек, callback-driven stream API и текущую обработку заголовков JP2/J2K, сохраняя при этом публичный API TJpeg2000Bitmap.
- Вывод JPEG 2000 теперь автоматически выбирает корректное количество разрешений OpenJPEG для маленьких изображений, и статический бэкенд Win32 больше не зависит от отсутствующих экспортов хелперов MSVCRT.
v3.8.1 2026-04-29
- Устранил все 16 косметических предупреждений компоновщика W1028 "Bad global symbol definition" на Win32 и Win64. Переименования на уровне исходников удаляют избыточные дубликаты на стороне Pascal (jpeg_std_error и заглушки allocator jmemnobs теперь разрешаются исключительно из слоя obj); три оставшихся символа obj bcc32 / vc64 (jpeg_natural_order, jpeg_aritab, jpeg_nbits_table), которые должны оставаться разрешёнными по связыванию против данных на стороне Pascal, теперь лишаются своих COFF-имён символов через проход post-processing ObjConv во время thirdparty\build-jpeg-vc64.bat. Без изменения публичного API; чистый вывод компоновщика для сборок Delphi Win32 и Win64.
v3.8.0 2026-04-29
- JPEG-кодек Win64 обновлён с libjpeg в стиле IJG до libjpeg-turbo 3.1.90, завершая миграцию JPEG, начатую в v3.7.0 (Win32). Пути Win32 и Win64 теперь разделяют один и тот же современный JPEG-кодек, с теми же SIMD-оптимизированными внутренними циклами и 30+ накопленными исправлениями CVE / fuzz от upstream. Публичный API PDFlibPas не изменён.
v3.7.0 2026-04-28
- JPEG-кодек Win32 обновлён с IJG libjpeg-6b до libjpeg-turbo 3.1.90. Значительно более быстрое кодирование/декодирование JPEG через SIMD-оптимизированные внутренние циклы, плюс 30+ исправлений CVE / fuzz, накопленных в libjpeg-turbo upstream. Публичный API PDFlibPas (класс TPDFJPEGImage, функции DumpJPEG) не изменён; существующие пути кода PDF/JPEG работают быстрее без необходимости каких-либо изменений в исходниках.
v3.6.0 2026-04-28
- Win32 zlib обновлён с 1.2.x до 1.3.2. Включает стандартные 25+ исправлений CVE / fuzz, накопленных upstream с 1.2.8, плюс новые точки входа inflateBack9 / inflateTree9, используемые потоками с 64-битным окном. Публичный API PDFlibPas (DeflateStr / InflateStr / InflateStrParms) не изменён.
- Путь zlib Win64 не изменён в этом релизе — он продолжает использовать связанный с Delphi юнит System.ZLib.
- Активировал Win64 link-time CRT shim PDFlibCLibs.pas (введён в v3.5.0) для пути zlib Win32, предоставляя символы memcpy / memset / malloc / free, на которые ссылаются новые obj-файлы zlib 1.3.2.
v3.5.0 2026-04-28
- Поставил свежую инфраструктуру сборки для связанных C-библиотек изображений / сжатия: zlib 1.3.2, libjpeg-turbo 3.1.90, libtiff 4.7.1. Скрипты сборки как для Embarcadero bcc32 (Win32), так и для MSVC cl.exe (Win64) живут в Lib/thirdparty/ рядом с исходными деревьями, так что любой с RAD Studio + VS2022 может пересобрать статические obj-файлы из чистых исходников.
- Добавил инфраструктуру сборки для OpenJPEG 2.5.4. Само исходное дерево OpenJPEG получается независимо пользователем (git clone uclouvain/openjpeg в Lib/thirdparty/OpenJPEG/), так что его можно обновить без касания конфигурации сборки PDFlibPas.
- Добавлен Lib/PDFlibCLibs.pas, Win64 link-time CRT shim, используемый backend Win64. Он закрывает разрыв между C obj-файлами, скомпилированными MSVC, и Win64-компоновщиками Delphi (dcc64 / Win64x ld.lld / BCB ilink64), которые не подключают msvcrt.dll автоматически.
v3.4.0 2026-04-28
- Усилил генерацию ключа шифрования, AES initialization vector и блока разрешений Perms против предсказуемых источников случайных чисел. Зашифрованные PDF, созданные на системах, запущенных близко к одному и тому же wall-clock времени, больше не могут быть тривиально скоррелированы; документы AES-256 теперь сохраняют свою полную силу ключа.
- Усилил разбор словаря изображения против некорректных или враждебных PDF, объявляющих необоснованные счётчики компонентов Width, Height, BitsPerComponent или DeviceN. Значения вне диапазона ограничиваются до любой арифметики на pixel-буфере, предотвращая сбои при открытии таких файлов.
- Усилил обход cross-reference и page-tree против документов, чьи цепочки /Prev xref или ссылки /Parent страницы образуют цикл или чрезмерно глубоки. Reader теперь чисто отклоняет некорректные структуры вместо рекурсии до исчерпания стека.
v3.3.1 2026-04-27
- Упростил per-component скрипты сборки Windows. Папки DLL/, OCX/ и Dylib/ больше не несут отдельных вариантов build12-* / build13-*: каждая платформа теперь имеет один скрипт build-Win32 / build-Win64, который привязывается к последней RAD Studio и принимает опциональный аргумент "debug".
- Добавил inline rationale-комментарии вокруг исправлений рендеринга PDFlibRenderer.pas, которые уже присутствовали в начальной Git baseline. Комментарии документируют, почему SetPen масштабирует ширины обводки на активную трансформацию canvas, и почему операторы d0/d1 CharProc шрифта Type 3 должны потреблять свои операнды. Поведение runtime не изменилось.
v3.3.0 2026-04-26
- Исправил рендеринг трансформированной обводки в PDFlibRenderer.pas. SetPen теперь применяет текущий масштаб canvas-трансформации к ширинам линии PDF перед вызовом Picasso, предотвращая увеличенные или уменьшенные обводки на путях, чьи координаты уже были трансформированы. Это исправляет контуры глифов Type 3, которые могли рендериться как толстые, нерегулярные блоки.
- Исправил обработку операторов d0/d1 CharProc шрифта Type 3 в парсере content stream. d0 теперь потребляет свои два операнда ширины, а d1 потребляет свои шесть операндов ширины/bounding box перед запуском последующих команд рисования, предотвращая искажение геометрии глифов или пути устаревшими операндами.