Журнал изменений
История выпусков
« Вернуться к указателю документации
История версий библиотеки PDFlibPas. Записи перечислены от самых новых к самым старым; каждая версия соответствует семантическому версионированию согласно политике выпусков проекта.
Последний выпуск
- Последняя версия: v3.75.6; Дата выпуска: 2026-06-23
Version 3.333.0
Added
- Инспекция инкрементных редакций. Подпись покрывает байты редакции, в которую она записана, а всё добавленное впоследствии является отдельным обновлением, содержимое которого определяет, остаётся ли подпись действительной для документа в его текущем виде.
GetDocumentRevisionCount,GetDocumentRevisionStartиGetDocumentRevisionEndрасполагают эти редакции, аGetSignatureRevisionIndexуказывает, на какой из них заканчивается подпись GetDocumentRevisionKindсообщает, что сделало обновление, как наиболее существенное из затронутых им объектов: учётные данные, материал проверки, метку времени документа, подпись, поле формы, аннотацию или содержимое документа. Поэтому добавление материала проверки для долгосрочной проверки больше не выглядит как редактирование документаGetDocumentRevisionChangesперечисляет каждый объект, который обновление добавило, изменило или удалило, вместе с тем, чем является каждый из них, а для изменённого словаря — какие ключи фактически отличаютсяGetDocumentRevisionsCompleteсообщает, удалось ли восстановить всю историю. Цепь, которая разорвана, циклична или длиннее, чем проследит средство чтения, оставляет самые старые обновления невидимыми, и тогда счётчики являются нижней границей, а не ответом- Объект, более ранняя версия которого не может быть прочитана или тело потока которого никогда не сравнивалось, сообщается как неопределённый, а не как безвредный: обновление, переписывающее страницу, но оставляющее её словарь нетронутым, не принимается за перепаковку
Version 3.332.0
Added
ApplyPAdESLongTermValidationповышает уже подписанный PDF до PAdES-B-LT за один вызов. Он строит путь сертификатов подписанта из самой подписи, собирает материал OCSP и CRL для каждого звена через адреса, указанные сертификатами, и записывает сертификаты и данные об отзыве в хранилище безопасности документа с записью VRI для подписи в рамках одного инкрементного обновления.ApplyPAdESLongTermValidationToStreamзаписывает результат в поток вместо файла- Поведение настраивается через маску параметров
PADES_LTV_*: писать ли запись VRI, опрашивать ли OCSP-ответчики, откатываться ли к CRL, следовать ли по адресам издателей для завершения пути и пропускать ли отзыв для самовыпущенного корня - Пустое имя поля обрабатывает каждую подпись в одну редакцию; именованное поле обрабатывает только указанную
GetPAdESLTVCertificateCount,GetPAdESLTVCRLCount,GetPAdESLTVOCSPCountиGetPAdESLTVErrorсообщают, что собрал последний вызов и почему он преждевременно остановился, поэтому частичный результат из-за недостижимого ответчика виден, а не скрыт- Материал, идентичный уже подготовленному, записывается один раз и используется по ссылке всеми подписями, которым он нужен, а подпись без читаемого сертификата сообщается как ошибка, а не выдаётся за успешное повышение
Version 3.331.0
Added
- Подпись несёт собственный путь сертификации, поэтому материал, необходимый профилю долгосрочной проверки, можно прочитать только из подписанного файла.
GetSignatureSignerCertificateDER,GetSignatureEmbeddedCertificateCountиGetSignatureEmbeddedCertificateDERвозвращают сертификаты, встраиваемые подписью, аGetSignatureCertificateChainLengthиGetSignatureCertificateChainDERупорядочивают их в путь от подписанта наружу GetSignatureContentsHashHexвозвращает ключ, по которому адресуется записьAddPAdESDSSVRI, вычисляемый из самой подписи- Сертификат подписанта сопоставляется независимо от того, идентифицирует ли подпись его по издателю и серийному номеру или по идентификатору ключа субъекта, а путь останавливается на последнем издателе, который подпись фактически содержит, а не делает вид, что он полон
Fixed
- Средство чтения DER отвергает объявленную длину элемента, превышающую данные, вместо того чтобы позволить почти максимальному значению переполнить проверку границ, а обход расширений сертификата больше не читает за концом усечённого или слишком длинного сертификата. Оба пути достижимы из специально составленного документа, поэтому указанные методы доступа остаются безопасными на недоверенных входных данных
- Методы доступа к подписи читают документ через общий дескриптор, поэтому они отвечают, пока средство проверки или просмотра уже открыло файл, вместо того чтобы завершаться ошибкой, как если бы подпись отсутствовала
Version 3.330.0
Added
- OCSP status requests.
BuildOCSPRequestencodes an RFC 6960 request for a certificate and its issuer,FetchOCSPResponseposts it to the responder and returns the reply, andAddPAdESDSSOCSPFromCertificatesdoes both and files the result in the document security store - The responder address is optional: when it is omitted, the one the certificate itself names is used, so a caller that has the certificate chain needs no further configuration
- A certificate pair that does not actually belong together is refused before anything is sent, instead of producing the "unknown" answer such a request earns from the responder and which reads like a revocation problem
- Only a successful response is stored; a responder that answered
tryLaterorunauthorizedis reported throughGetTimeStampErrorrather than filed as if it were a status answer
Version 3.329.0
Fixed
- Reusing one result array across successive enumeration calls no longer leaks the strings held in the array slots that a later call does not fill. This affected the documented "call once for the count, resize, call again" pattern whenever a later call returned fewer items than the array could hold, and the stranded text accumulated for the lifetime of the process
- Affected entry points include
EnumPageContentStates,EnumPageContentStatesEx,EnumAttachments,EnumDocumentFonts,EnumPageElements,EnumNamedDestinations,EnumSignatures,EnumFormFields,GetFormValues,GetTextInAreaEx, and the text-search, form-field-action and certificate enumeration calls
Changed
- The result-array parameter of those calls is now passed as
varrather thanout. Existing Delphi and C++Builder code compiles and links unchanged; the only visible difference is that array slots past the returned count keep whatever they held before instead of being silently blanked
Version 3.328.0
Added
- Certificates now tell the library where their status can be checked:
GetCertificateOCSPURLs,GetCertificateIssuerURLsandGetCertificateCRLURLsread the responder, issuing-certificate and CRL addresses out of a certificate, so assembling long-term validation material no longer requires knowing where a given authority publishes FetchRevocationMaterialdownloads material from those addresses, andAddPAdESDSSCRLFromURLandAddPAdESDSSCertificateFromURLdownload and file it in the document security store in one step- Addresses that name no fetchable resource, such as a directory name or a mail address, are skipped rather than reported as something that can be downloaded
Version 3.327.0
Added
- A built-in RFC 3161 time-stamp client.
SetTimeStampServerandSetTimeStampOptionsconfigure the authority, hash algorithm, requested policy, nonce use and timeout;FetchTimeStampTokenreturns a TimeStampToken for any digest ApplyPAdESSignatureTimeStampcompletes a PAdES-B-T signature in one call: it hashes the signature value, obtains the token from the configured authority and attaches it as the signature time-stamp attribute, replacing the previous three-step exchange the caller had to wire up itself- When a nonce is used the token is checked to carry the same value back, so a replayed or substituted response is rejected instead of being embedded in the document
GetTimeStampStatusandGetTimeStampErrorreport the authority's own status and failure text, so a refused request explains itself
Version 3.326.0
Added
- The PDFium renderer now writes the same image formats the GDI+ and Cairo renderers write.
RenderPageToFile,RenderPageToStreamandRenderPagesToFilesaccept BMP (option 0), JPEG (1), PNG (5), GIF (6), TIFF (7) and G4 TIFF (10) afterSelectRenderer(3), instead of accepting BMP alone - The JPEG quality set through
SetJPEGQualityand the active TIFF compression settings now apply to PDFium output as well, so switching renderers no longer changes the encoding of the file that is produced
Fixed
- Requesting PNG or any other non-BMP format from the PDFium renderer used to return 0 and leave an empty file behind. Applications that offered a renderer choice silently produced unreadable output whenever PDFium was the selected engine
- Asking the PDFium renderer for a metafile format it cannot produce (WMF, EMF, EPS, EMF+, HTML5) now reports which formats are available through
LastRenderErrorinstead of naming BMP as the only option
Version 3.324.0
Changed
- The PDFium renderer now feeds the document to the engine through a streaming data source instead of one resident buffer. Rendering and printing previously serialised the document and then copied it again into a string, so every page cost twice the document size in memory; the copy is gone and PDFium reads only the blocks it needs
- Rendering a page range to files parses the document once for the whole batch instead of once per page, so a long range no longer re-reads the entire file for every image it writes
- Older PDFium builds that do not export the streaming entry point keep working unchanged through the in-memory path
Fixed
- The renderer smoke test located the optional PDFium and Cairo libraries one directory too high and silently skipped both engines; it now finds them and exercises the real rendering paths
Version 3.323.0
Added
CreateValidationReportиSaveValidationReportформируют структурированный отчёт о проверке соответствия PDF/A и PDF/UA-1 в формате XML или JSON. Каждая находка содержит идентификатор правила, стандарт, которому оно принадлежит, краткое имя правила, пункт ISO, который оно обеспечивает, уровень серьёзности и число затронутых объектов, а отчёт завершается сводками «пройдено/не пройдено» по каждому стандарту и по документу в целом- Стандарт, который не был запрошен, отображается как
not-checked, а не как молчаливое прохождение, поэтому частичный прогон нельзя спутать с чистым результатом - Сборочные конвейеры теперь могут опираться на идентификатор правила или пункт ISO вместо сопоставления подстрок в тексте: семейство отчётов preflight сначала строит человекочитаемый отчёт и преобразует его текст в JSON, HTML или CSV, тогда как отчёт о проверке собирается непосредственно из выходных данных проверок и сохраняет машиночитаемые поля без изменений
Version 3.322.0
Added
- Справочник теперь документирует четыре внешне объявленных публичных типа, используемых на всём интерфейсе
TPDFlib, для которых ранее не было отдельной страницы:TPDFlibProgressEvent,TPDFlibLogger,TPDFlibCertificateInfoиTPDFlibWatermarkBase, что завершает охват публичных типов событий, логгера, результата-перечисления и водяных знаков
Version 3.321.0
Added
CheckDocumentPolicyоценивает декларативные внутренние правила видаFonts.NotEmbedded = 0,Security.Encrypted = noилиDocument.Pages <= 500применительно к документу и сообщает по каждому правилу о прохождении или сбое с фактическим значением, превращая контроль при приёме документов для издательств, архивов и типографий в конфигурацию вместо рукописного кода проверки
Version 3.320.1
Fixed
- Отрисовка текста в режиме PDF/A без предварительной загрузки шрифта больше не вызывает сбой: PDF/A требует встраивания каждой шрифтовой программы, поэтому неявный переход на встроенный шрифт отклонялся и не оставлял выбранного шрифта, а
DrawTextи остальные текстовые вызовы падали вместо отрисовки - Путь неявного шрифта теперь подбирает реальный встраиваемый шрифт, пока активен режим PDF/A, поэтому текст, нарисованный без явного вызова
AddTrueTypeFont, встраивается и остаётся соответствующим стандарту; прямой вызовAddStandardFontпо-прежнему отклоняется в режиме PDF/A - На узлах, где невозможно подобрать встраиваемый шрифт, отрисовка откатывается на встроенные метрики вместо сбоя и сообщает о нарушении соответствия через
LastErrorCode605, так что файл можно перехватить до публикации как соответствующий
Version 3.320.0
Added
GetDocumentFeatureReportвозвращает структурированный отчёт о свойствах за один вызов — метаданные документа, количества страниц и объектов, состояние шифрования, инвентарные списки шрифтов и изображений, разметка и закладки, поля форм, подписи, вложения и побайтовая разбивка по категориям — заменяя десятки отдельных запросов, которые каталогизирующему или приёмному конвейеру прежде приходилось собирать вручную
Version 3.319.0
Added
SetCollectionView,AddCollectionField,SetCollectionSortиSetCollectionItemValueстроят PDF-портфели поверх существующих вложений, поэтому набор внедрённых файлов представляется как обозримый пакет с собственными столбцами, порядком сортировки и значениями для каждого файла вместо простого списка вложенийGetCollectionViewиGetCollectionFieldCountсообщают режим представления и число объявленных столбцов загруженного портфеля
Version 3.318.1
Fixed
- Опция 12 извлечения текста (игнорировать повёрнутый текст) теперь отбрасывает повёрнутые фрагменты независимо от направления поворота: четверть оборота по часовой стрелке и четверть оборота против часовой стрелки раньше обрабатывались по-разному, поэтому боковые заметки на полях отбрасывались в одном направлении и возвращались в другом
- Та же опция сохраняет наклонный текст, который лишь скошен, например синтетический курсив, а допуск теперь масштабируется с размером текста и трансформацией страницы, поэтому крупные наклонные заголовки больше не отбрасываются как повёрнутые
Version 3.318.0
Added
DecodeAllStreamsразворачивает сжатые потоки документа на месте, поэтому сохранение даёт копию, чьи потоки содержимого, метаданные и структуру можно читать напрямую инструментами сравнения, экспертного анализа и сопровождения; изображения, потоки с предсказанием и потоки перекрёстных ссылок сохраняют своё кодирование, а потоки объектов сначала материализуются, так что ничего не теряется
Version 3.317.0
Added
SetTrappedиGetTrappedобъявляют и считывают состояние треппинга документа, требуемое для PDF/X, записывая его как имя/Trapped, как предусматривает спецификация, а не как текстовую строкуSetOutputIntentSubtypeиGetOutputIntentSubtypeпереопределяют подтип выходного профиля, поэтому загруженный цветовой профиль может описывать печатное условиеGTS_PDFXвместо архивного условияGTS_PDFA1, создаваемого режимами PDF/A
Version 3.316.0
Added
SetEncryptEmbeddedFilesOnlyиGetEncryptEmbeddedFilesOnlyограничивают AES-шифрование внедрёнными файлами: документ открывается и отображается в любой программе просмотра без запроса пароля, тогда как вложения остаются зашифрованными — стандартное соглашение для счетов-фактур, медицинских карт и материалов дел, у которых титульные страницы открыты, а содержимое — нет
Version 3.315.0
Added
- Опция 18 извлечения текста поворачивает фрагменты, нарисованные под углом 90, 180 или 270 градусов, в горизонтальную систему чтения и группирует каждую четверть оборота отдельно, поэтому повёрнутые заметки на полях, заголовки таблиц и подписи осей диаграмм извлекаются как читаемые строки, а не перемешиваются с прямым текстом или отбрасываются
Fixed
DASetTextExtractionOptionsпринимает опцию 16 (удаление переносов) и опцию 17 (разделение слов по межсимвольным промежуткам) вместо того, чтобы их отклонять, а путь прямого доступа теперь передаёт извлекателю опции 15, 16 и 17, поэтому удаление линий подчёркивания, расшифровка переносов и разделение по промежуткам применяются к дескрипторам файлов так же, как и к загруженному документу
Version 3.314.0
Added
GetFontHasToUnicodeсообщает, содержит ли выбранный шрифт отображение Unicode, а инвентарный список шрифтов получает соответствующее полеHasToUnicodeдля каждого шрифта и сводкуNoToUnicodeCount, поэтому документы можно проверять на наличие безопасных для извлечения и пригодных для PDF/A-*u или PDF/UA шрифтов перед обработкой
Version 3.313.0
Added
SetPDFAModeполучает режим 8 для PDF/A-2u (ISO 19005-2 Level U) — уровень соответствия, который объявляет отображения текста в Unicode, не допуская внедрённых файлов, что завершает семейство PDF/A-2 рядом с существующими режимами 2b и 2a
Version 3.312.0
Added
GetObjectByPathиGetObjectByPathCountсчитывают любой узел дерева объектов через выражения-пути видаRoot/Pages/Kids[0]/MediaBox[2]илиpages[0]/Type— типы, скалярные значения, сериализованные формы и счётчики элементов за один вызов, заменяя рукописный обход объектов для выборки метаданных, точечных проверок соответствия и диагностических процедур поддержки
Version 3.311.0
Added
SetBlackPointCompensationобъявляет компенсацию чёрной точки (ON, OFF или Default) для последующей отрисовки через графическое состояние/UseBlackPtCompиз PDF 2.0, позволяя цветопробе и пробному выводу зафиксировать тёмные ICC-преобразования, ранее зависевшие от просмотрщика; версия документа повышается автоматически, а режимы PDF/A отклоняют это состояние
Version 3.310.0
Added
SetCompressionLevelиGetCompressionLevelоткрывают уровень deflate для каждого сжатия, выполняемого библиотекой: 0 сохраняет стандартный движок с ускорением SIMD, 1 отдаёт приоритет пропускной способности, а 9 минимизирует размер архивовRecompressStreamsповторно сжимает deflate каждый поток с обычным FlateDecode выбранного документа на текущем уровне и сохраняет меньший из вариантов кодирования для каждого потока, уменьшая размеры документов, изначально сохранённых с быстрой настройкой сжатия, не затрагивая их содержимое
Version 3.309.0
Added
SetObjectStreamModeиGetObjectStreamModeдобавляют трёхпозиционное управление потоками объектов: отключить, генерировать (по умолчанию) или сохранить, где «сохранить» удерживает исходное сжатое группирование загруженного файла'и записывает контейнеры дословно, делая преобразования существующих файлов PDF 1.5+ дешевле, поскольку ничего не распаковывается и не перегруппировывается
Changed
- В режиме сохранения элементы, изменённые с момента загрузки, повышаются до объектов верхнего уровня, чтобы их изменения были сохранены, а любой оставшийся сжатый элемент автоматически выбирает форму бинарного потока перекрёстных ссылок
Version 3.308.0
Added
CheckDocumentStructureвыполняет одновызовую проверку структурного здоровья: каждый объект и поток пропускаются через свой декодер, обычные Flate-потоки строго сверяются с zlib-маркером конца, чтобы выявлять усечённые данные, а отчёт помечает отсутствующие трейлеры, неразрешимые каталоги и страницы, неподдерживаемые обработчики шифрования и файлы, восстановленные побайтовым сканированием, с выводом по каждому объекту и итоговой строкой
Version 3.307.0
Fixed
- Повреждённые документы, использующие потоки перекрёстных ссылок, теперь восстанавливаются успешно: исходная реконструкция извлекает члены сжатых потоков объектов, а при полном отсутствии ключевого слова trailer где-либо в файле синтезирует трейлер из новейшего достижимого каталога документа, поэтому некорректное смещение startxref больше не делает такие файлы неоткрываемыми
Version 3.306.0
Added
ExportDocumentDataзаписывает информационные ключи документа, всё дерево закладок и диапазоны меток страниц как редактируемый обычный текст в классическом построчном формате dump_dataImportDocumentDataприменяет тот же формат обратно — информационные ключи обновляются, дерево закладок перестраивается с уровнями вложенности и целевыми страницами, а диапазоны меток страниц заменяются — что позволяет выполнять массовое редактирование закладок и миграцию метаданных между документами одним вызовом в каждом направлении
Version 3.305.0
Added
AuditDocumentSpaceразбивает использование байтов в документе по категориям — изображения, шрифтовые программы и словари, потоки содержимого, форм XObjects, потоки объектов, внедрённые файлы, метаданные, дерево структуры, аннотации, дерево страниц и прочее — с количеством объектов, итогами по байтам и процентами, отвечая, почему файл имеет такой размер и какая оптимизация окупается лучше всего
Version 3.304.0
Added
StructTreeItemCount,GetStructTreeItemTextиGetStructTreeItemIntPropertyсчитывают дерево структуры размеченного документа как плоский список элементов в порядке обхода в глубину — типы элементов (исходные и через role-map), альтернативный и фактический текст, язык, заголовки, идентификаторы размеченного содержимого, номера страниц и родительские/дочерние связи
Changed
- Считыватель дерева структуры защищён от повреждённых документов: циклы ссылок, выходящие за пределы номера объектов и деревья с вложенностью более 64 уровней отсекаются вместо зацикливания
Version 3.303.1
Fixed
- Полупрозрачные подложки-штампы, создаваемые
StampTextиStampImage, больше не пропускают свою прозрачность в исходное содержимое страницы — состояние прозрачности теперь ограничено самим штампом, поэтому страница сохраняет полную непрозрачность
Version 3.303.0
Added
OverlayDocumentPagesнакладывает страницы другого открытого документа на страницы выбранного документа — по одной исходной странице на каждую целевую страницу, поверх или под существующим содержимым — фирменные бланки, непрерывные фоны страниц и сканированные шаблоны форм за один вызов- Исчерпание источника настраивается: остановка, циклический перебор страниц источника или повтор последней страницы источника; дополнительная опция предотвращает увеличение штампа сверх его естественного размера
Changed
- Штампы документа подгоняются под CropBox целевой страницы и размещаются прямо на страницах, содержащих запись
/Rotate, а каждая исходная страница импортируется один раз как общий Form XObject, поэтому повторяющиеся шаблоны никогда не дублируют свои ресурсы
Version 3.302.0
Fixed
- Пароли AES-256 теперь обрабатываются с помощью SASLprep (RFC 4013) перед хешированием, поэтому пароли, содержащие не-ASCII пробелы, мягкие дефисы, символы совместимости или комбинирующие последовательности, корректно открываются в Acrobat и других соответствующих стандарту программах просмотра
- При открытии документов AES-256 сначала пробуется стандартный подготовленный пароль с откатом к устаревшей байтовой форме, поэтому файлы, записанные более ранними версиями с не-ASCII паролями, продолжают открываться
Added
- Код ошибки 604 сообщает об отклонении пароля AES-256 процедурой SASLprep из-за наличия запрещённых кодовых точек или нарушения двунаправленных правил
Version 3.301.0
Added
SplitDocumentToFilesразрезает выбранный документ на пакет выходных файлов с фиксированным числом страниц в каждом, используя плейсхолдер имени файла%p
Changed
- Пакетное разрезание анализирует исходный документ один раз и копирует каждый фрагмент из той же структуры в памяти, заменяя повторный полный разбор, который цикл по
ExtractFilePagesвыполняет для каждого диапазона
Version 3.300.0
Added
CollateDocumentsобъединяет страницы из нескольких открытых документов в выбранный документ поочерёдно, забирая настраиваемое число страниц из каждого источника за раунд (A1, B1, A2, B2, …)CollateDocumentsExпринимает список диапазонов страниц для каждого источника, где убывающие диапазоны вида3-1обращают источник, поэтому прямой и перевёрнутый обратный проходы сканера сливаются в порядок чтения за один вызов
Changed
- Слияния с чередованием импортируют каждый источник через единую карту объектов и чередуют страницы переупорядочиванием, поэтому шрифты и изображения, общие внутри источника, записываются только один раз независимо от размера группы
Version 3.299.0
Added
SetDeterministicDocumentIDиGetDeterministicDocumentIDпереключают файловый идентификатор трейлера на воспроизводимое значение, поэтому одинаковые входные данные дают идентичные выходные байты для кэширования сборок, хранения по содержимому и побайтового сравнения регрессийSetDocumentIDSeedзадаёт явное начальное значение для воспроизводимого идентификатора файла; без него идентификатор выводится из метаданных документа, заголовка версии и количества страниц
Changed
- Воспроизводимые идентификаторы файла обновляются только при полных сохранениях; инкрементальные обновления и зашифрованные документы сохраняют существующий идентификатор, поэтому подписи и защищённые паролем файлы продолжают открываться корректно
Version 3.298.0
Added
AddLinkToArticleThreadиSetOutlineArticleThreadсоединяют хотспоты страницы и закладки с нитью статьи или бусиной посредством стандартных действий ThreadAddActionNextArticleThreadиPDF_ACTION_BUILDER_THREADдобавляют действия Thread в цепочечные, формовые, страничные и документные рабочие процессы действий
Changed
- Цели действий Thread используют стабильные косвенные ссылки на нить и бусину и отклоняют недопустимые индексы без изменения целевого контейнера
- Построители действий поля формы отклоняют дополнительные действия, пока активен режим PDF/A, сохраняя запрет PDF/A на словари
/AAполей и виджетов
Version 3.297.0
Added
- Справочник по плоской DLL
DLтеперь документирует каждую точку входа ANSI с суффиксомA(char), добавляя 353 справочные страницы, отражающие аналоги в Unicode с точными сигнатурами DelphiPAnsiCharи Cconst char * - Перестроены
BufferUtilities,DirectAccessFunctionalityиMiscellaneousFunctionsкак чистые индексные страницы групп функций на основе общей схемы категорий, исправлены повреждённая разметка, неверно помеченные разделы и отсутствующие индикаторы - Индекс навигации и общий поисковый индекс теперь охватывают всю поверхность DLL как для вызывающих Unicode, так и для ANSI
Fixed
- Удалена устаревшая запись
SetLogger, не имевшая соответствующего символа в исходном коде; документированное свойство —Logger
Version 3.296.0
Added
AddAlternateImage,AlternateImageCount,GetAlternateImageInfoиRemoveAlternateImageобеспечивают типизированное создание и проверку вариантов изображений для экрана и печати- Альтернативные изображения можно связывать с группой дополнительного содержимого или словарём членства, при этом один вариант для каждого базового изображения можно выбрать в качестве варианта по умолчанию для печати
Changed
- Встроенное средство отрисовки теперь выбирает альтернативные изображения дополнительного содержимого, когда базовое изображение скрыто, и учитывает вариант по умолчанию для печати при выводе на принтер
FindImagesтеперь регистрирует альтернативные XObject изображений, доступные из ресурсов страницы, чтобы импортируемые варианты получали пригодные дескрипторы изображений
Version 3.295.0
Added
AddArticleThreadсоздаёт соответствующие стандартам ленты статей для навигации с типизированными метаданными, упорядоченными прямоугольниками страниц, циклическими ссылками бусин и массивами бусин для каждой страницыArticleThreadCount,GetArticleThreadInfoиGetArticleThreadBeadпроверяют созданные или импортированные ленты статей с ограниченным обходом повреждённых циклов ссылок
Changed
DeletePagesтеперь удаляет ленты статей, теряющие все бусины, и восстанавливает циклические ссылки выживших лент- Отслеживание удалённых страниц теперь сохраняет стабильные косвенные ссылки на страницы, поэтому очистка оглавления и статей не может сместиться при перемещении курсора дерева страниц
Version 3.294.0
Added
SearchTextBatchвыполняет поиск по нескольким текстовым запросам, пока извлечение каждой страницы находится в памяти, и возвращает исходный индекс запроса с нулевой базой с каждым совпадениемSearchTextBatchEachобеспечивает такой же однопроходный поиск через потоковый обратный вызов с отчётами о прогрессе и отменой
Changed
- Поиск по одному запросу и пакетный текстовый поиск теперь используют общее ядро сопоставления, сохраняя семантику учёта регистра, целых слов и диапазона страниц, избегая при этом повторного извлечения страниц, свёртки текста и вычисления геометрии совпадений
Version 3.293.1
Fixed
- Растеризация меш-шейдинга больше не вызывает ошибку компиляции в любой версии Delphi, устраняя
E2089 Invalid typecastпри приведении вещественных чисел к плавающей точке в модуле отрисовки GDI+ - Параллельный пакетный рендеринг страниц теперь компилируется в Delphi XE5 и XE6, где
System.Threadingнедоступен; более старые наборы инструментов откатываются к последовательному пути рендеринга, как и в системах, отличных от Windows - Определение возможностей принтера больше не вызывает ошибку несовместимых типов в старых версиях Delphi за счёт приведения вызова
SetPrinterв соответствие с остальным кодом печати - Перечисление хранилища сертификатов теперь собирается в RAD Studio 10.3 Rio, где ранее происходил сбой с внутренней ошибкой компилятора при оптимизации процедуры перечисления
Version 3.293.0
Added
- Словари членства дополнительного содержимого теперь можно создавать, обновлять и перечислять с политиками совместимости
AnyOn,AllOn,AnyOffиAllOff - Вложенные выражения видимости
/VEдля PDF 1.6 поддерживаютAnd,OrиNotчерез компактное префиксное представление, общее для Delphi и C++Builder
Changed
- Области дополнительного содержимого, потоки содержимого, захваченные страницы, изображения, поля форм и аннотации теперь принимают либо дескриптор группы, либо дескриптор членства
- При отрисовке допустимые выражения
/VEвычисляются первыми, с откатом к/OCGsи/Pдля некорректных или неподдерживаемых выражений
Fixed
- Вложенное дополнительное содержимое больше не может делать содержимое видимым, когда охватывающая группа или членство скрыты
- Словари членства без действующих групп дополнительного содержимого теперь оставляют видимость без изменений, как требует спецификация PDF
Version 3.292.0
Added
EnumAttachmentsтеперь сообщает даты создания и изменения, шестнадцатеричные контрольные суммы, связи связанных файлов и номера объектов спецификации файла как для вложений документа, так и для вложений-аннотацийValidateAttachmentChecksumпо запросу сверяет полезную нагрузку вложения с сохранённой контрольной суммой, а новые внедряемые файлы теперь автоматически получают метаданные контрольной суммы
Fixed
SetEmbeddedFileAFRelationshipтеперь принимает те же индексы внедрённых файлов с базой 1, что и остальной API вложений, включая документы с одним вложением
Version 3.291.0
Added
DeduplicateResourcesтеперь объединяет точные дубликаты потоков изображений, Form, узоров, шейдинга, функций, профилей ICC, программ шрифтов, CMap, CharProc Type 3, внедрённых файлов, метаданных и PostScript по всему загруженному документу- Дедупликация ресурсов предоставляет независимые флаги типов, анализ пробного запуска, необязательный сбор объектов-сирот и подробную статистику хеширования, сравнения, полезной нагрузки, ссылок и по категориям
Changed
- Обнаружение дубликатов канонизирует полные словари потоков независимо от порядка ключей, хеширует каждую полезную нагрузку-кандидат один раз с SHA-256 и побайтово подтверждает совпадающие корзины перед перенаправлением ссылок
- Группы точной эквивалентности сохраняют наименьший номер объекта и поколение для детерминированного вывода, тогда как некорректные циклы прямых объектов и семантические различия словарей остаются не объединёнными
Version 3.290.0
Changed
PurgeUnusedResourcesтеперь вычисляет транзитивное замыкание зависимостей по мозаичным узорам, глифам Type 3, состояниям внешнего вида аннотаций, группам мягкой маски ExtGState, изображениям, шейдингам и вложенным цветовым пространствам- Параметры очистки по умолчанию теперь включают анализ зависимостей узоров, Type 3, внешнего вида, мягкой маски и изображений с независимыми флагами для вызывающих, которым требуется более узкое сканирование
- Вложенные программные потоки и записи зависимостей кэшируются, области общих ресурсов приватизируются перед обрезкой, а некорректные циклы ограничиваются защитой активных потоков и глубины
Fixed
- Ресурсы страниц, используемые только через цветовые пространства изображений, базы Indexed, альтернативы Separation или DeviceN, базовые пространства Pattern, альтернативы ICCBased или словари шейдинга больше не удаляются как неиспользуемые
- Ресурсы, используемые только CharProc Type 3, ячейками мозаичных узоров, внешними видами аннотаций или группами мягкой маски прозрачности, больше не удаляются из собственной или унаследованной области
Version 3.289.0
Added
PurgeUnusedResourcesтеперь удаляет именованные ресурсы страниц, на которые не ссылаются выбранные слои содержимого, и может возвращать подробную статистику по категориям- Очистка ресурсов теперь поддерживает диапазоны страниц, отчёты пробного запуска, прогресс и отмену, рекурсивный анализ Form XObject, удаление устаревших ProcSet и необязательный сбор объектов-сирот
Changed
- Анализ ресурсов теперь следует чувствительности к регистру имён PDF, унаследованным ресурсам Form, пользовательским цветовым пространствам встроенных изображений и всем семи стандартным категориям ресурсов
- Повторяющиеся программы Form кэшируются, наборы используемых ресурсов используют отсортированный поиск, а записи словаря удаляются в порядке убывания для предсказуемой производительности на больших документах
Fixed
- Удаление записей словаря теперь аннулирует индексы ключей больших словарей, поэтому последующие поиски не могут возвращать устаревшие записи
- Некорректные потоки и неизвестные операторы по умолчанию сохраняют свою полную область ресурсов, а общие или унаследованные словари ресурсов клонируются перед изменением
Version 3.288.0
Added
- Цифровые подписи теперь могут создавать полные структуры сертификации DocMDP и блокировки полей FieldMDP с отчётами о структурных разрешениях для каждой выбранной подписи
- Метки времени документа RFC 3161, метки времени подписи, внедрение токенов PAdES-B-T, проверка цепочки сертификатов, свидетельства OCSP и материал проверки DSS или VRI теперь имеют полные рабочие процессы создания и проверки
- Аннотации RichMedia теперь поддерживают внедрённые ассеты, параметры активации и деактивации, внешний вид плакатов, перечисление, извлечение и удаление
- Печать плакатов теперь поддерживает векторную раскладку страниц, метки нахлёста и обрезки, размещение с учётом жёстких полей и многоразовые планы тайлинга
- Помеченные таблицы теперь создают семантическую структуру Table, TR, TH и TD со стабильными идентификаторами, ассоциациями заголовков, объединениями, повторяющимися заголовками и декором в виде артефактов
- Средство просмотра теперь предоставляет редактирование AcroForm с клавиатурным доступом для полей текста, выбора, флажков, переключателей и кнопок, передавая действия ведущему приложению
Changed
- Функциональный шейдинг Type 1 и меш-шейдинг с Type 4 по Type 7 теперь отрисовываются через встроенное вычисление функций и ограниченную тесселяцию меша
- Отрисовка цвета ICCBased теперь использует общие кэшированные преобразования для изображений и шейдингов, сохраняя калиброванное поведение цветового пространства
- Инкрементальное сохранение теперь согласованно перестраивает потоки объектов и потоки перекрёстных ссылок, а выбранные подписи проверяются относительно их собственной подписанной ревизии
Fixed
- Запросы меток времени подписи SHA-1 теперь хешируют значение подписи подписавшего с SHA-1 вместо отката к SHA-256
- Отклонённые замены блокировки полей больше не отбрасывают ранее действительную конфигурацию блокировки полей
- Радио-виджеты с повторяющимися именами состояний внешнего вида теперь сохраняют выбранный виджет и оставляют родственные виджеты выключенными
Version 3.287.0
Changed
- Словари встроенных изображений теперь следуют границам комментариев, разделителей, литералов, шестнадцатеричных значений, массивов и словарей PDF с ограниченной вложенностью
- Полезные нагрузки встроенных изображений теперь используют осведомлённое о формате завершение для данных raw, DCT, ASCII85, ASCIIHex, RunLength и Flate
- Обнаружение полезной нагрузки Flate теперь выполняет один ограниченный inflate от смещения потока содержимого с точным учётом сжатых байтов, тогда как цепочечные фильтры без потерь используют общий потолок выходных данных
- Потоки ASCII85, ASCIIHex, LZW, predictor, цветовых профилей и вспомогательных изображений теперь обеспечивают ограниченный промежуточный вывод без избыточных временных выделений
Fixed
- Некорректные или усечённые встроенные изображения больше не читают за пределами исходных данных, не зацикливаются на незавершённых значениях и не сохраняют устаревшее состояние при повторном использовании декодера
- Упакованные строки изображений теперь вычисляют биты компонентов перед округлением до байтов, предотвращая неверные длины для низкобитовых изображений RGB и многострочных изображений
- Цветовые пространства ресурсов теперь сохраняют свои исходные имена, выводя количества компонентов Lab, косвенных ICCBased и DeviceN и декодируя потоки палитры Indexed в строгих пределах
- Границы встроенных изображений теперь единообразно отклоняют недопустимые размеры, битовые глубины, неподдерживаемые фильтры, небезопасные цепочки фильтров, сжатые потоки и неоднозначные конечные маркеры
- Отрисовка цвета Indexed теперь проверяет каждый доступ к палитре и отклоняет усечённые данные поиска вместо чтения за пределами декодированной таблицы
- Предикторы PNG с 10 по 15 теперь корректно декодируются для потоков Flate и LZW, отклоняют недопустимые фильтры строк и проверяют все размеры строк и состояний перед выделением памяти
- Полезные нагрузки JPEG и JPEG 2000 теперь проверяют свои закодированные размеры, компоненты, точность, структуру маркеров, длины блоков и занимаемый объём декодированного хранилища перед выделением изображения
- Проверка встроенных изображений теперь ограничивает хранение как упакованных, так и развёрнутых растровых данных и ограничивает профили ICC, глобальные данные JBIG2 и параметры терминального фильтра
- Двоичные полезные нагрузки фильтра, содержащие встроенный текст конечного маркера, теперь продолжают до первого кандидата, проходящего ограниченную проверку формата
Version 3.286.0
Changed
- Content stream tokenization now follows PDF whitespace, comment, delimiter, literal string, hexadecimal string, and name boundaries
- Text splitting and resource replacement now use geometrically grown output buffers for linear processing of large content streams
- Reusable content stream processors now reset derived output and parser state before every
Processcall
Fixed
- Malformed or truncated literal and hexadecimal strings no longer read beyond the source buffer or emit an extra empty token
- Resource replacement now preserves case-sensitive PDF name semantics, accepts optional leading slashes, and updates duplicate mappings deterministically
- XObject and shading operands at the beginning of a stream are now excluded from text output, while unmatched restore operators no longer cancel later saved graphics states
Version 3.285.0
Changed
- LZW encoding now uses constant-time dictionary lookup and buffered stream writes, while decoding uses compact prefix and suffix tables with geometric output growth
- Flate predictor decoding now processes rows directly in the output buffer and supports packed, 8-bit, and 16-bit TIFF samples with arbitrary colour counts
- Stored Deflate streams now write into an exact pre-sized result, and zlib wrappers release temporary buffers safely when compression or decompression fails
Fixed
- LZW code-width changes now follow PDF
EarlyChangesemantics across 9-bit through 12-bit codes, including dictionary resets andEarlyChange=0 - LZW decoding now rejects invalid future codes and truncated bit streams without reading beyond the source buffer
- PNG predictors now use the ceiling byte width of a pixel, preserve previous decoded rows, and safely pad a partial final row
- TIFF predictor decoding now handles 1-bit, 2-bit, 4-bit, 8-bit, and 16-bit components consistently in both LZW and Flate paths
Version 3.284.0
Changed
- Buffer searches now scan fixed 64 KiB blocks, use byte lookup tables for set membership, and preserve the caller's position across every search path
- Unicode, Latin-1, hexadecimal digest, and ARC4 conversions now reserve bounded output once instead of repeatedly growing strings or temporary arrays
- ASCII85 encoding now reads input streams in 32 KiB blocks, while decoding uses exact integer arithmetic and writes directly into a pre-sized output buffer
- MD5 string hashing now avoids a temporary memory stream, digest comparison examines every byte, and ARC4 key scheduling no longer allocates an expanded key array
Fixed
DistanceToAnyBytenow returns the correct offset beyond its first block instead of rereading the same prefix and overcounting skipped bytes- Stream-backed buffer reads now honour the actual byte count returned by custom streams, shrinking results and advancing positions only by bytes received
- Buffer length reductions now clamp the current position, and nil pointer or stream sources behave as empty inputs instead of exposing invalid memory
- Latin-1 decoding now maps the complete byte range 0x00-0xFF instead of replacing bytes 0x7F-0xFF
- ASCII85 decoding now preserves the valid maximum 32-bit group
s8W-!and stops at the first end marker without floating-point boundary loss
Version 3.283.0
Added
TPDFlibSignatureVerifiercan now enumerate signature fields and CMS signers, open files, streams, or strings, and verify a selected field and signer by index or field name- Detailed verification reports now separate cryptographic integrity from signed-revision coverage, current-file coverage, later revisions, strict Contents-gap validation, and native crypto errors
Changed
- Detached CMS validation now streams both ByteRange segments through Windows CryptoAPI in bounded chunks instead of materialising the complete PDF in memory
- Signature fields under nested AcroForm Kids arrays and inherited
/FT /Sigentries are now enumerated with fully qualified names, and direct signature value dictionaries are supported
Fixed
- ByteRange validation now rejects overflow, overlap, truncation, a gap that is not exactly the selected hexadecimal
/Contentstoken, and a signed revision that does not end at its own%%EOF - Certificate lookup no longer falls back to an unrelated embedded certificate when the selected CMS signer identifier has no exact issuer-and-serial match
- Incremental updates that use cross-reference streams now include the cross-reference stream object's own type 1 entry, preventing strict PDF validators from reporting a missing self entry after signing
Version 3.282.1
Changed
- Full saves now rebuild imported object streams from the live object graph, preserve private trailer roots, and retain free-object generations without reusing structural object numbers
- Cross-reference streams now size their offset fields for large files, preallocate their payload, include their own entry, and preserve trailer extension keys
Fixed
- Object-stream packing now writes real
/ObjStmcontainers and type 2 member entries instead of only switching to an xref stream - Garbage collection no longer writes missing object numbers as in-use entries at offset zero and now emits a linked free-object chain in both plaintext and stream cross-references
- Loaded packed PDFs can now be saved repeatedly with packing enabled or disabled without retaining stale object streams, losing live members, or requiring cross-reference repair
Version 3.282.0
Added
- Imported ICCBased colours now use the embedded ICC profile across vector painting, function and mesh shadings, indexed palettes, raw bitmap, CCITT and JBIG2 images, CMYK JPEG images, and JPEG 2000 images
Changed
- ICC transforms now use a bounded Windows Color System lookup table with multilinear interpolation, replacing the temporary PNG round trip used during image rendering
- The renderer now honours content-stream and graphics-state rendering intents, ICCBased
/Range, image/Decode, and original-domain colour-key masks while validating profile channel counts against the PDF colour-space dictionary - Repeated uses of the same profile and rendering intent now share one lookup table across vector colours, patterns, shadings, and images
Fixed
- Encrypted ICC profile streams are now decrypted only while decoded and restored afterward, and embedded profiles are no longer compressed twice while writing image output
Version 3.281.0
Added
- The built-in GDI+ renderer now paints imported PDF function-based shadings and free-form, lattice, Coons, and tensor mesh shadings (types 1 and 4-7), including transparency and clipping
- Shading dictionaries now support component Function arrays, calibrated Lab, CalGray, and CalRGB spaces, Separation and DeviceN tint transforms, PatternType 2 Background fills, and BBox clipping across the GDI+ and Cairo renderers
Changed
- Type 1 shading functions now use bounded adaptive colour sampling with additional quarter-cell probes for higher narrow-feature accuracy and lower work on constant or smooth regions
- PatternType 2 matrices around mesh shadings are now composed exactly once in both GDI+ and Cairo, preserving translated, scaled, and rotated pattern placement
- Mesh colour components are now interpolated in their source colour space before Function evaluation and conversion to RGB, preserving nonlinear functions, DeviceCMYK gradients, and the correct ordering for managed colour transforms
- Coons and tensor surfaces now use bounded device-pixel error subdivision for smoother high-curvature output at large render sizes
- Encrypted shading and Function streams are decoded through the document crypt callbacks, and Type 5 vertex records honour their required byte alignment
Version 3.280.1
Fixed
MergeFileList/MergeFileListFast/MergeFileListStrictleaked aTSmartPDFReader/TSmartPDFDocumentpair (and everything they own) when a non-PDF file appeared in the merge list: the reader and document were constructed before thetryblock that frees them, so a parse failure on the malformed file's content orphaned the already-constructed reader instead of being cleaned up by the surrounding exception handler; construction now happens inside the protectingtryin both the single-file and multi-file prescan paths- Mesh shading parsing (
TPLMeshShading.Parse, shading types 1 and 4-7) leaked the decoded/Functionobject on every parse - every early-exit path and the normal completion skipped freeing it; the function is now released in afinallyblock regardless of howParseexits TPDFlibSignDoc.Closenow nils its smart-reader/document/info fields after freeing them, and the exception paths inOpen,OpenStreamandOpenStringnow release any partially-constructed smart objects instead of only clearing the stream reference, preventing a leak when opening a signing target fails partway through
Version 3.280.0
Added
- Error category enumeration
TPDFlibErrorCategory(ecSuccess/ecStructure/ecSave/ecCrypto/ecGeneric/ecCompliance/ecAcroForm) layered on top of the existing numericLastErrorCodetaxonomy, so callers can classify failures without memorising code ranges; exposed viaTPDFlib.LastErrorCategory,TPDFlib.ErrorCategory(Code)andTPDFlib.ErrorMessage(Code) - Form-field error codes 701-704 (field not found, field read-only, no AcroForm, invalid value) with human-readable messages, letting callers distinguish "field is locked" from "no such field" instead of receiving a single generic failure
SetFormFieldValueForcedforce-write variant that bypasses the read-only guard, used internally bySetFormValues(SkipReadOnly=False)so bulk imports can still overwrite locked fields when the caller explicitly opts out
Changed
SetFormFieldValuenow setsLastErrorCodeto 701/702/703 on failure (field not found / read-only / no AcroForm) instead of returning 0 silently;LastErrorCategoryis a non-consuming read so callers can inspect the category before retrieving the numeric code
Version 3.279.0
Added
ReplacePageRangesreplaces visual page content from another open document without changing the target page count or target page object identities, preserving bookmarks, links, annotations, and form widgets already attached to those pages
Changed
- Cross-document page copying no longer creates and removes an extra placeholder page before importing the requested range
Version 3.278.0
Added
PrintPagesAdvancedapplies copies, collation, duplex, orientation, color, quality, paper-size and input-bin settings to arbitraryPrintPagesrange expressions while retaining one printer profile and one print job
Changed
- Advanced print settings are validated before the job starts, positive print-quality values above the four named presets are applied as DPI, and paper or input-bin identifiers may use the full positive range supported by the corresponding
DEVMODEfields
Fixed
- Damaged cross-reference recovery now dispatches its bounded block reads through the traditional
TStream.Readoverride on Win64, preserving instrumentation and custom-stream behavior while retaining 64 KiB sequential I/O
Version 3.277.0
Changed
- Damaged cross-reference recovery now scans source data in 64 KiB sequential blocks instead of seeking once for every matching character, keeping auxiliary memory bounded while scaling to large PDF files and non-memory streams
- Recovery validates complete indirect-object tokens, skips object-like data inside comments, strings, and streams, confirms stream endings with a following
endobjtoken, preserves headers split across read boundaries, and selects the last valid trailer dictionary
Fixed
- Trailer reconstruction now supports nested dictionaries and delimiter text inside literal strings and is no longer truncated to the first 2048 bytes or the first apparent
>>pair
Version 3.276.0
Added
ActivateWebLinksandActivateWebLinksExscan existing page text once per page and create non-duplicate URI link annotations for HTTP, HTTPS,www., FTP,mailto:, and bare email targets with selectable detection and border options- Generated links use matched-character geometry, precise quadrilaterals for rotated or skewed text when permitted, PDF/A print flags, progress and cancellation support, and selected-page restoration; tagged PDF and PDF/UA documents are protected from incomplete structure-tree updates
Changed
SetAutoCreateWebLinksnow uses the same boundary-aware detector and target normalization when creating links for newly drawn text, addingwww., FTP, and bare email support
Fixed
- Updating annotation
/Contents, name, date, title, or subject properties no longer overwrites the subtype of an existing action dictionary, so URI and other actions remain valid after annotation metadata changes
Version 3.275.0
Added
ExtractPageRangeText,SavePageRangeTextToStream, andSavePageRangeTextToFileextract a parsed page range in one traversal with caller-defined page separators; stream and file output writes UTF-8 data incrementally so large documents do not require a complete document-sized text bufferSetPageBoxRangeandRemovePageBoxRangeapply page-boundary changes across the standard page-range syntax while preserving the caller's selected pageSetPageTransitionRangeandSetPageTransitionRangeExapply legacy or extended presentation transitions to page ranges with per-page progress and cancellation supportGeneratePageThumbnailsrenders requested pages directly into reusable memory and attaches their/Thumbimages without intermediate files or nested progress operations
Version 3.274.0
Fixed
- GDI+ rendering of axial shading patterns now honours the PDF
/Extendarray:SetupGDIPlusPatternpassesWrapModeClampwhen either end is extended (matching the Cairo backend) instead of always usingWrapModeTile, so end colours paint the area outside the gradient axis correctly
Added
- The scroll-hint bubble (
"Page N / M") shown while dragging the vertical scrollbar now auto-hides after 3 seconds of inactivity via aWM_TIMERhandler, so it no longer lingers until a separate scroll event dismisses it ZoomInStep/ZoomOutStepnow snap ontoActualSize(100%),FitWidthandFitPagepercentages when they fall between the current zoom and the next preset on the 14-step ladder, matching the behaviour of professional PDF viewers- The viewer disk page cache writes a build-version marker (
cache.version) and wipes the whole cache root when the library version changes, so a build upgrade never reuses stale bitmaps rendered by an older code path
Version 3.273.1
Fixed
- Object-stream container and xref-stream objects created during save were leaked because they bypassed
TPDFStructure.AddObjectregistration; both call sites now use theNewStreamWithDictownership-tracking factory, eliminating theTPDFStreamleak reported by the test runner underReportMemoryLeaksOnShutdown - Cross-reference stream
/Sizewas off by one: it must be one past the highest object number in the whole file, and the xref stream is itself an indirect object numberedMaxObj+1, so/Sizeis nowMaxObj+2
Changed
- Peephole content-stream optimiser now also removes identity text-matrix operators (
1 0 0 1 0 0 Tm), covering bothcmandTmwith the same six-operand identity check - Mark-sweep GC preserves object 1 (the
/Linearizedparameter dictionary) when the source document was loaded linearized, since that dictionary is never referenced from/Rootbut must survive
Version 3.273.0
Added
- Object-stream packing on save (
TPDFDocument.PackObjectsIntoStreams) collects eligible non-stream indirect objects, serialises them into PDF 1.5 object streams (/Type /ObjStm) with Flate compression, and emits a binary cross-reference stream (/Type /XRef) carrying type-0, type-1 and type-2 entries, reducing the size of saved files 10-40% on object-dense documents TPDFlibSaveOptions.PackObjectStreamsflag plusTPDFlib.SetPackObjectStreams/GetPackObjectStreamsAPI; defaults to enabled, auto-gated by PDF version (1.5+ activates packing and xref streams, 1.4 and below keep the traditional plaintext xref for compatibility), andTPDFlib.GetLastSaveUsedObjectStreamsreports whether the last save actually packed
Version 3.272.0
Added
- Mark-sweep garbage collection of unreferenced indirect objects (
TPDFDocument.GarbageCollectUnusedObjects) walks the object graph from the trailer roots (/Root,/Info,/Encrypt) and removes every indirect object that is not reachable, stopping the file-size growth that accumulates when pages are deleted and their font, content and XObject resources become orphans TPDFlibSaveOptions.GarbageCollectflag plusTPDFlib.SetGarbageCollect/GetGarbageCollectAPI let callers opt in to GC during a full save (defaults to off for backward compatibility), andTPDFlib.GarbageCollectObjectsruns GC immediately and returns the number of orphaned objects removed
Version 3.271.0
Added
- Peephole content-stream optimiser (
TPDFContentPeepholeOptimizer) rewrites a parsed page content stream before Flate compression, removing semantically redundant PDF operators: identitycmmatrices, emptyq/Qpairs, emptyBT/ETobjects, no-op paths terminated bynwith no clip, duplicate graphics-state setters (colour, line width, cap/join, dash, text state), and deadnafter a painting operator - all transforms are output-equivalent so visible page output is unchanged TPDFlibSaveOptions.OptimizeContentStreamsflag and matchingTPDFlib.SetOptimizeContentStreams/GetOptimizeContentStreamsAPI let callers opt in or out of the peephole rewrite duringCompressContent/CompressPage; enabled by default
Changed
TPDFDocument.CompressPagenow forwards the optimisation flag to the page tree so the peephole pass runs insideTPDFPageTree.Compressbefore the existing Flate compression, stacking operator-level reduction on top of byte-level compression
Version 3.270.0
Added
- New
PLParseDefaultAppearancedecodes a/DAdefault-appearance byte string (ISO 32000-2 12.7.4.3) into the font resource name, font size and fill colour, covering therg,kandGcolour operators so form-field and annotation appearance generators can paint text with the author-intended styling
Changed
- Page content-stream assembly (
TPDFRenderer.GetContents) now concatenates multi-part/Contentsarrays through aTStringBuilderinstead of repeatedResult := Result + chunk, removing the O(n^2) string growth that penalised pages with many content-stream parts
Version 3.269.0
Added
- New
BeginMarkedContent/EndMarkedContentwrite inline marked-content sequences with accessibility properties (/Alt,/ActualText,/Lang,/E) directly in the BDC property list per ISO 32000-2 14.9.2–14.9.5, so screen readers and accessibility tooling can read substitute text without a structure-tree entry - Annotation reader exposes
GetAnnotEffectiveBorderimplementing the Errata #287 precedence (border style dict/BSwins over the legacy/Borderarray) and resolving width, style and dash pattern into one call - Signature documents expose
GetSignatureSeedValueto read the seed-value dictionary (/SV, ISO 32000-2 12.7.5.5 Tables 236–237): required filter, allowed SubFilters and allowed digest methods, so a signer can honour the constraints the author embedded GetSignatureFieldLockreads the/LockFieldMDP seed dictionary (Table 238): action (/All,/Include,/Exclude) and the affected field names that must be locked at sign time
Version 3.268.0
Added
- New
PLParsePDFDateparses ISO 32000-2 7.9.4 date strings (D:YYYYMMDDHHmmSSOHH'mm') into a localTDateTime, honouring the mandatoryD:prefix, the field-dependency ladder (each field only when all preceding fields are present) and the UT offset (+/-/Zwith optional apostrophe-minute), returning the local equivalent of the documented instant - Text-string decoding (
PLDecodeTextString) now recognises the PDF 2.0 UTF-8 BOM (EF BB BF) per 7.9.2.2.1, so UTF-8-authored metadata decodes correctly instead of being misread as PDFDocEncoding - File specifications expose
GetFileNamehonouring the PDF 2.0 precedence (Path > UF > F) per Errata #444, plusGetEmbeddedFileStreamandGetRelatedFilesaccessors for the/EFand/RFdictionaries - Annotation readers expose appearance-precedence helpers
GetAnnotNormalAppearance,GetAnnotDefaultAppearanceandGetAnnotOffStateAppearanceimplementing the Errata #23/#34/#42/#170 rules (AP/N is authoritative; DA is the byte-string fallback; Off state lives under the nameOff) - PDF/UA validation reports a new code 10045 when a non-standard structure type fails to terminate at a standard type through the role-map chain (ISO 14289-1:2014 7.1), with cycle protection to a depth of 8
- PDF/A and PDF/UA font audits now validate that embedded CIDFontType2 fonts carry a
/CIDToGIDMapwhose value is either the nameIdentityor a stream, not merely present (ISO 32000-1 9.7.4)
Changed
- Name-tree lookup (
NameTreeLookup) now binary-searches the sortedNamesarray per ISO 32000-2 7.9.6 before falling back to a linear scan, turning large EmbeddedFiles/JavaScript/Dests lookups from O(n) into O(log n) on conformant files - PDF/UA standard-structure-type set expanded with PDF 2.0 additions (
Artifact,DocumentFragment,FENote,MarkedContent,Title) so the role-map no-remap and chain-termination checks recognise the full tag vocabulary
Version 3.267.0
Added
EnumPageContentStatesExcan recursively enumerate Form XObject instructions with configurable depth, cycle protection and depth-first execution ordering- Content snapshots now expose invocation-tree identity, containing stream and parent XObject information, resource-scope identity, Form traversal status and descendant counts
- Standalone content trackers can register scoped fonts and initialise isolated Form execution state with matrix concatenation and bounding-box clipping
Changed
- Recursive content tracing selects each Form resource dictionary independently, inherits invoking resources for compatible legacy Forms, preserves inherited font identity and caches decoded Form programs across repeated invocations
Version 3.266.0
Added
- Text runs returned by
GetTextRunsnow carry the glyph origin (OriginX/OriginY) and the full text matrix components (Tm11/Tm12/Tm21/Tm22/TmDX/TmDY) captured by replaying BT, Td, TD, Tm and T* alongside the show operators, so consumers can locate glyphs without a separate text-funnel pass - Mesh shading decoding now routes Lab, CalRGB and CalGray colour spaces through the colour manager instead of falling through to black, producing correct fills for non-DeviceRGB free-form and coons patches
- Redaction now emits a real
/Subtype /Redactannotation with/Rect,/ICinterior colour and optional overlay text alongside the existing content removal, so redaction-aware viewers mark the sanitized region - Library operations emit structured log records at load and save boundaries through the previously dormant
Logger, with ISO-8601 UTC timestamps and a cachedTStreamWriterfile sink that no longer reopens the log file on every line - New
Tests.Memoryfixture guards create/draw/save/free andNewDocumentcycles against heap regression, and the console test runner now enablesReportMemoryLeaksOnShutdown - EMF interpretation now counts unknown or private records via the
UnknownRecordCountproperty so silent metafile gaps are observable
Changed
- Dictionary key lookup (
TPDFDictionary.FindIndexByKeyName) builds a lazy open-addressing hash index for dictionaries with more than 16 entries, turning the linear scan that dominated renderer Resources/ColorSpace/Font/ExtGState lookups into an O(1) probe - sRGB gamma conversion (
XYZ2RGB) uses a shared 4096-entry lookup table instead of threePower(x, 1/2.4)calls per pixel, and Lab-to-XYZ cubing now uses direct multiplies; both are the dominant per-pixel cost when decoding Lab or ICC-based images - Page lookup (
TPDFPageTree.GetPage) returns the cached page dictionary on repeat access instead of re-walking the page tree every call - Content-stream operator dispatch (
ContentOperatorFromName) buckets the 73 operators by first byte, cutting the per-token linear scan to a short residual compare - PDF/A colour-space audit now recurses into the base or alternate space of Indexed, Separation, DeviceN and ICCBased up to a depth of 8, so a hidden DeviceCMYK tint transform or bare Lab name is flagged rather than passing silently
- Shaped-font finalize now walks the used-glyph set recorded at draw time instead of scanning all 65536 glyph slots four times per save
- String escape routines (literal-string, XFDF, stamp and variable token expansion) build output through
TStringBuilderor two-pass allocation, removing O(n^2) concatenation from save and form-export hot paths - AES stream encrypt/decrypt reuse their chunk buffer across loop iterations instead of reallocating per block
- Composite-glyph parsing in the TrueType parser grows the components array geometrically instead of one element at a time
- Mesh shading
ReadBitsreads the minimum covering bytes in one pass andWriteBitspre-sizes the output buffer, eliminating per-bit reallocation - Painter circle control point uses a precomputed kappa constant and arc squaring uses
Sqrinstead ofPower
Fixed
- Fixed a non-Windows compile break in
PDFlibParallelwhere the stub body signature forPDFlibRenderPagesParalleldid not match the interface declaration
Version 3.265.0
Added
- Added 59 C++Builder console demos to align the C++Builder demo suite with Delphi, bringing the total from 33 to 92 demos covering the same API surfaces
- Added Demo/C++Builder/index.html expansion from 35 to 92 entries with Navigation, Color & ICC, Barcode & media, and Structure & compliance sections
Fixed
- Fixed all 33 existing C++Builder cbproj files that were missing 20 library units (PDFlibMeshShading, PDFlibGraphics, PDFlibWindows, PDFlibParallel, PDFlibLogger, PDFlibMail, PDFlibViewer, etc) from their DelphiCompile list, which prevented every C++Builder demo from compiling
Version 3.264.0
Added
- Content graphics-state snapshots now resolve
Dooperands as image, form or PostScript XObjects and report their resource names, object numbers and transformed bounds - Form snapshots expose the original
/Matrixand/BBoxtogether with resource, group, transparency-group and reference-form indicators - Standalone content trackers can pre-register XObject streams through
RegisterXObject
Changed
- Page content-state enumeration now precompiles selected-page XObject resources and calculates invocation bounds from all four transformed corners
Version 3.263.0
Added
- Content graphics-state snapshots now expose current path bounds, current point, path complexity, pending clipping rules and effective clipping bounds
- Standalone content trackers can initialise an explicit clipping boundary through
SetInitialClipBounds
Changed
- Page content-state enumeration now follows delayed
WandW*clipping, exact transformed cubic extrema,q/Qclipping restoration and selected-pageCropBoxboundaries
Version 3.262.0
Added
- Content graphics-state snapshots now report font writing mode, exact per-instruction text displacement and whether font metrics were resolved
- Standalone content trackers can provide font measurements through
OnMeasureText
Changed
- Page content-state enumeration now advances text matrices for
Tj,TJ,'and"using simple or composite font metrics, horizontal scaling, spacing and vertical writing rules
Version 3.261.0
Added
- Content graphics-state tracing can now resolve page
ExtGStateresources, including transparency, blending, overprint, soft masks, device controls and embedded font references TPDFContentStateTrackercan pre-register external graphics-state dictionaries for standalone content-program analysis
Changed
- External graphics-state parameters now apply cumulatively and participate in complete
q/Qsave and restore snapshots
Version 3.260.0
Added
- Added single-pass effective graphics-state tracing for structured content programs and complete selected pages
- Snapshots expose CTM, text matrices, line style, dash pattern, colours, text state and graphics-state stack depth before or after each instruction
Changed
- Image placement enumeration now maps all four unit-square corners, producing correct bounds under rotation and shear
Version 3.259.0
Added
- Added typed time, special-pattern and arbitrary-mask helpers for interactive form fields
- Added range validation with independently optional zero-safe bounds
- Added sum, average, product, minimum and maximum field calculations with automatic calculation-order registration
Security
- Generated JavaScript string values now escape quotes, backslashes, control characters and JavaScript line separators
Version 3.258.0
Added
- Added typed
SetOCGStateaction creation for form-field events, existing actions and action chains - Optional-content actions preserve left-to-right state changes, repeated groups and the optional radio-button relationship preference
Changed
- Optional-content action enumeration now returns canonical group handles that round-trip through the writer APIs
Version 3.257.0
Added
- Added complete explicit remote-destination writing with zero-based pages, all standard fit types, nullable XYZ values and tri-state window preferences
- Added complete launch-action writing for portable files, Windows parameters, default directories and open or print operations
- Existing action handles can now update these payloads or append them to action chains without container-specific duplicate APIs
Security
- Remote go-to and launch action builders now reject PDF/A mode before modifying an action chain
Version 3.256.0
Added
- Remote go-to action inspection now reports named and explicit destinations, zero-based target pages, fit types, coordinates and zoom values
- Launch action inspection now reports Windows application parameters, default directories and open or print operations
- Action information distinguishes an absent
/NewWindowpreference from an explicit false value and identifies array-based targets
Version 3.255.0
Added
- Added typed builders for remote named-destination and external application launch actions
- URI action builders now support coordinate-map requests through the standard
/IsMapflag - The new action kinds work across lifecycle, form-field and chained-action APIs through the existing extended builder interface
Version 3.254.0
Added
- Added 14 Delphi API-coverage demos for library surfaces that had no dedicated demo: OutlineBuilder, NamedDestinations, DocumentActions, EmbeddedFiles, LinearizeDemo, BarcodeGallery, XfaFields, TaggedPDF, OutputIntent, HtmlTextFlow, RichMediaAnnotations, MailSendDemo, TextBlockExtraction, and PadesDssDemo
- Added a Navigation section, Color & ICC section, Barcode & media section, and Structure & compliance section to the Delphi demo index, bringing the total from 56 to 92 listed demos
- Added Readme.en-us.html guides for the 20 demos that previously shipped without one
Changed
- Applied the project Formatter.config across all Delphi demo sources so operator spacing, indentation, and keyword casing follow one style, and set NewLineBeforeThen to False so If...Then stays on a single line
- Hardened error handling across the classic GUI demos: SaveToFile return values are now consistently checked, TPDFlib and secondary object lifetimes are always protected by try/finally, and failure messages include LastErrorCode
Fixed
- Fixed inverted SaveToFile polarity in ImageToPdf that treated success as failure, and stopped AddTrueTypeSubsettedFont from opening a stale file when the save failed
- Fixed resource leaks in CreateWithImageToStream, DoInTheStream, CanvasText, ExtractText, ExtractImage, PdfDecrypt, PdfEncrypt, and PdfPermission where TPDFlib, TStream, TBitmap, TOpenDialog, or TStringList instances could escape on an exception path
- Removed dead code in AddFormattedTitle (unused RectParts allocation, redundant try/except around StrToFloatDef) and MultiFunction (overwritten SetTextSize call)
Version 3.253.0
Added
- Added typed action details for thread, sound, movie, optional-content, rendition, transition and 3D-view actions
- Added reusable action-handle lookup and ordered optional-content state enumeration
- Added complete PDF transition records covering replacement, Fly, Push, Cover, Uncover and Fade styles
Fixed
- Wipe and Glitter transitions now store their direction in
/Di, read page display duration from the page dictionary and clear both transition and timing entries - Standard pre-PDF-1.5 transition styles no longer force a PDF 1.5 output version
Version 3.252.0
Added
- Added single-pass form-field action discovery with typed action details across primary, widget and field triggers
- Added complete calculation-order enumeration, per-field lookup and removal for interactive forms
- Extended bulk form-field snapshots with calculation order and action count
Changed
- Widget lifecycle triggers now support page-open, page-close, page-visible and page-hidden actions with the required PDF 1.5 version handling
Version 3.251.0
Added
- Added single-pass named-destination enumeration across legacy catalog entries and modern name trees with resolved page and view parameters
- Added named-destination removal, complete push-button captions, button text positioning and form-field mapping names
- Extended bulk form-field snapshots with mapping names, button captions and button text position
Fixed
- Name-tree editing now supports direct destination values and uses unambiguous multi-node index encoding
Version 3.250.0
Added
- Added single-pass form field snapshots with field identity, type, page, flags, values and Choice state
- Added typed Choice-field flag queries plus validated selected-index and top-visible-index accessors
Fixed
- Single-selection Choice fields no longer retain a multi-selection
/Iarray, and switching from multi-select to single-select now replaces the old/Varray with a string value
Version 3.249.0
Added
- Added one-pass stateful text search traversal so applications can iterate cached hits without extracting pages twice
- Added bulk form value export and name-based application with optional read-only field protection
Version 3.248.0
Added
- Added retained Viewer selections with page-space geometry, extracted text, enumeration, clearing and a vetoable marquee event
- Added exact current-viewport bitmap capture and file output including persistent overlays
Version 3.247.0
Added
- Added independent Viewer controls for user form editing and annotation activation
- Added configurable foreground colour for text and choice form editors
Version 3.246.0
Added
- Added typed line ending styles, shape interior colours, link highlight modes, FreeText alignment, Text annotation open state and Caret symbols
- Annotation setters validate compatible subtypes and automatically raise the minimum PDF version where required
Version 3.245.1
Fixed
- Corrected FastReport export page sizing and memo layout so A4 reports retain their intended scale, text stays within memo bounds and unconfigured memo frames remain hidden
Version 3.245.0
Added
- Added
OnPasswordso applications can supply another password after an encrypted document rejects the initial credential - Password retries now work consistently for file, stream and string loads, expose the next attempt number and allow the handler to cancel
Security
- Password callbacks are limited to sixteen total attempts and every retry uses a fresh parser and decryption state
Version 3.244.0
Added
- Added
SetXMPPropertyExfor safely writing scalar properties in caller-defined XMP namespaces - Custom XMP values are escaped through the XML DOM, repeated writes replace the matching namespace property and invalid or reserved XML names are rejected
Version 3.243.0
Added
- Added typed document lifecycle actions for before close, before save, after save, before print and after print triggers
- Added typed page open and close actions with shared support for URI, named, JavaScript, form and destination action builders
- Added action inspection and removal methods for every document and page lifecycle trigger
Version 3.242.0
Added
- Added
SaveChangesto append changes to the originally loaded file and automatically reload the updated xref chain for repeated incremental saves SaveChangesvalidates the reload password before writing and preserves the selected public document handle after reload
Changed
AppendToFilenow rejects a target whose current length differs from the loaded source, preventing stale incremental offsets from being appended to an externally changed file
Version 3.241.0
Added
- Added
GetLastOutlineandGetLastChildOutlinefor direct access to the tail of a bookmark list - Added
GetOutlineChildCountandGetOutlineSiblingIndexfor lightweight bookmark tree inspection without allocating a full tree snapshot
Version 3.240.0
Added
- Added
SaveAllAttachmentsExwith overwrite, skip and automatic rename conflict policies plus a per-attachment naming callback - Attachment exports now reduce requested names to safe leaf names and protect Windows reserved device names
Fixed
- Fixed
SaveAllAttachmentsreturning without writing files because its attachment snapshot was counted but not allocated and populated
Version 3.239.0
Added
- Added
OnPageMouseDown,OnPageMouseMoveandOnPageMouseUpso Viewer hosts receive one-based page numbers and top-down PDF point coordinates independent of zoom, scrolling and view rotation - Added
RegionAtClientPoint,ActiveRegionandOnActiveRegionChangeto distinguish links, non-link annotations and form fields as the pointer enters or leaves them - Added
CreatePDFlibViewerDefaultPopupMenuandInstallPDFlibViewerDefaultPopupMenu, which compose the existing Viewer action classes into a ready context menu for copy, zoom, fit, rotate, navigation, save and print
Version 3.238.0
Added
- Added
OnOperationProgresswith typed operation kind, lifecycle phase, current and total units, percentage and detail text while preserving the classicOnProgresspercentage callback - Load, save, search, merge and page-render file, stream and string entry points now report starting and terminal phases; operations with intermediate progress also report
opRunning - Setting
CancelduringopStartingoropRunningactivates the existingAbortstate, providing one cancellation path for old and new callers
Fixed
LoadFromFilenow preserves error code 404 for a wrong password instead of overwriting it with the generic load error 401 after cleanup
Version 3.237.0
Added
- Added
SearchTextEachandTPDFlibSearchHitEventto emit every text hit immediately without allocating or sizing a result array SearchTextandSearchTextEachnow report page progress throughOnProgressand honour bothAbortand callback cancellation; callback cancellation uses the existing abort state untilResetAbort- The Viewer search panel and search-highlight layer now consume the streaming API in one pass, removing their former 256-row and 512-highlight limits
Fixed
- Whole-word search now continues past an earlier substring occurrence in the same text block to find a later correctly bounded match
Version 3.236.0
Added
- Added
GetPrinterCapabilitiesto capture a live printer-driver snapshot without starting a print job - The typed
TPDFlibPrinterCapabilitiesresult includes paper IDs, names and millimetre dimensions, input-bin IDs and names, duplex, colour, landscape and collation support, the printer port and the maximum driver-reported copy count - Drivers that omit paper or bin metadata still return the remaining capabilities with empty arrays, while invalid printer names return a fully cleared snapshot
Version 3.235.0
Added
- Added
SendDocumentByMailfor saving the loaded document to a temporary PDF and delivering it as an SMTP attachment through the built-in Windows CDO provider - Added the reference-counted
IPDFlibMailProviderextension point so applications can supply another transport, support non-Windows hosts and test mail workflows without network access - Each send uses an isolated temporary directory, sanitises the attachment display name and removes both the PDF and its directory after the provider returns;
GetLastMailErrorreports validation, save, transport and platform failures
Version 3.234.0
Added
- Added variable placeholders to stamp, header and footer text:
<%PageNo%>,<%TotalPages%>,<%ShortDate%>,<%LongDate%>,<%ShortTime%>and<%LongTime%>expand per page alongside the classic &-tokens - Any custom
<%name%>placeholder resolves through the newOnCalcVariableevent, which receives the name and the page number and supplies the replacement - running numbers, batch codes and client fields stamp without pre-processing the text; without a handler unknown placeholders stay verbatim
Version 3.233.0
Added
- Added superscript/subscript detection to text extraction: the new
GetTextBlockVAlignreports each extracted text block's baseline classification (0 = baseline, 1 = superscript, 2 = subscript) relative to its visual line, so chemical formulas, exponents and footnote markers can be recognised - A block classifies as super-/subscript when it is markedly smaller than the line's dominant text and its vertical centre sits above/below the dominant centre within one text height
Version 3.232.0
Added
- Added character-level word splitting to text extraction:
SetTextExtractionOptions(17, 1)re-splits show-text runs that carry no space characters into words wherever a per-character advance step is much wider than the run's median glyph advance - documents that paint whole lines as a single operator with kerning gaps standing in for spaces now extract as separate words inGetPageTextmodes 7 and 9-11 - The advance arrays stay aligned with the widened text, so block quads and per-character width outputs remain consistent
Version 3.231.0
Added
- Added layout-preserving fixed-grid text export:
GetPageText(11)maps the page geometry onto a monospace character grid - rows cluster by baseline, every block lands at its column computed from the average character width, and shorter cells pad with real spaces - so tables and forms keep their visual alignment in plain-text viewers, terminals and diffs without relying on tab stops - The reference page for
GetPageTextnow documents the reading-order (9), tab-separated table (10) and fixed-grid (11) modes
Version 3.230.0
Added
- Added dehyphenation to text extraction:
SetTextExtractionOptions(16, 1)re-joins words hyphenated across line breaks ("inter-" at a line end followed by "national" becomes "international") in the line-oriented outputs ofGetPageTextmodes 7 and 9 - The heuristic only merges when a letter precedes the hyphen and a lowercase letter starts the next line, so numeric ranges, proper nouns and sentence-initial capitals keep their hyphens
Version 3.229.0
Added
- Added the
OnBeforeSnapshotevent to theTPDFlibViewercontrol: it fires before a snapshot drag is captured with the dragged region, and setting Handled cancels the default clipboard capture so applications can process the region themselves - Exposed
PrefetchEnabled: the background pre-render worker can now be switched off and on at run time (the worker stops immediately and restarts on the open document) - Exposed
DiskCacheMaxDocuments: the number of documents the cross-session disk page cache keeps before pruning is now tunable (default 10)
Version 3.228.0
Added
- Added precise navigation to the
TPDFlibViewercontrol:GoToPagePointjumps to a page and scrolls a given page point to the top-left of the viewport, so link destinations and search hits land exactly in view - Added programmatic scroll control:
ScrollBypixel stepping, read/writeHScrollPos/VScrollPosproperties (ideal for synchronising two side-by-side viewers over the same document), andGetScrollPosForPagereporting each page's scroll anchor in continuous mode - Added public coordinate bridges
ClientPointToPageandPageRectToClientRectconverting between client pixels and page user space through zoom, rotation and scroll; the internal hit-testing now shares the exact geometry of the paint path and also works on unparented (headless) controls
Version 3.227.0
Added
- Added view-state events to the
TPDFlibViewercontrol:OnZoomChangefires on every effective-zoom move (explicit zoom, preset steps, fit-mode recomputation on resize, rotation or DPI change) andOnHScroll/OnVScrollfollow the scroll position, so toolbars and status displays stay in sync without polling - Dragging the vertical scrollbar thumb now shows a floating "Page N / M" bubble that previews the page the view will land on - a big help in long documents; the
ScrollHintEnabledproperty (on by default) turns it off
Version 3.226.0
Added
- Completed the fill-and-save loop in the
TPDFlibViewercontrol:SaveToFileandSaveToStreamwrite the displayed document - committed form edits included - back to disk or a stream (any open in-place editor commits first) - Multiline text fields now edit in a proper multi-line memo: Enter inserts a line break, Ctrl+Enter commits, Escape cancels; single-line fields keep the plain Enter-commits behaviour
- Tab and Shift+Tab cycle the in-place editor through the document's editable text and choice fields, following each field's page;
FocusNextFormFieldexposes the same navigation programmatically
Version 3.225.0
Added
- Added preset-ladder zooming to the
TPDFlibViewercontrol:ZoomInStepandZoomOutStepsnap the zoom to the standard preset sequence (1, 5, 10, 25, 50, 75, 100, 150, 200, 400, 800, 1600, 2400, 3200 percent), starting from the zoom currently in effect so fit modes step naturally; the toolbar zoom actions now use the same ladder - Ctrl+mouse wheel now zooms along the preset ladder while a plain wheel keeps scrolling
- Added keyboard shortcuts: Ctrl+'+'/'-' step the zoom, Ctrl+1/2/3 switch to actual size, fit width and fit page, and Shift+Up/Down jump to the first and last page
Version 3.224.0
Added
- Added
CreateSelfSignedCertificatewith Delphi, DLL and ActiveX entry points: generates a self-signed RSA certificate (SHA-256 signature, configurable subject, validity and key length) and exports it with its private key to a password-protected PFX file, ready forSignFileand the sign-process APIs - so signing workflows can be built and tested without an external certificate authority - The certificate is created in a throwaway key container that is deleted after the export; only the PFX keeps the key material. Self-signed certificates are meant for testing and internal documents - viewers flag them as untrusted unless installed explicitly
Version 3.223.0
Added
- Added
TPDFlibShapeWatermarkto the composable watermark layer: rectangles, circles, ellipses, polygons, Bezier curve chains and straight lines stamp onto a page range with fill and stroke colours, line width and opacity, through the sameApplyWatermarkentry point as text and image watermarks - Rectangle, circle and ellipse shapes size themselves from Width/Height; polygon, curve and line shapes take their geometry from
SetPoints(local X,Y pairs), so the nine-point Position grid and custom placement apply to every shape kind; degenerate geometry (too few points) is rejected
Version 3.222.0
Added
- Added
AddLinkToEmbeddedPDFwith Delphi, DLL and ActiveX entry points: a page hotspot that opens a PDF embedded in the current document (by its EmbeddedFiles name) and jumps to a chosen page there, using the standard embedded go-to (/GoToE) action of ISO 32000-1 §12.6.4.4 with an optional new-window request; the document version rises to PDF 1.6 automatically GetAnnotActionInfoand its outline/form-field siblings now recognise embedded go-to actions, reporting the newakGoToEkind together with the embedded target name, the parent/child target relationship, the optional file specification and the /NewWindow flag
Version 3.221.0
Added
- Added
SetSignProcessAppearanceTextwith Delphi, DLL and ActiveX entry points: digital signatures can now show an automatically generated visible text appearance composed of the signer name, reason, location and signing date, with optional descriptive labels ("Signed by:", "Reason:", ...) selected through a bit mask - The text block lays out inside the signature field rectangle in Helvetica with a configurable colour; font size 0 auto-fits the lines to the field. A field image set through
SetSignProcessFieldImageFromFilekeeps precedence, and document time-stamp processes ignore the text appearance
Version 3.220.0
Added
- Added interactive form filling to the
TPDFlibViewercontrol: clicking a checkbox or radio button toggles it, and clicking a text or choice field opens an in-place editor over the field (Enter commits, Escape cancels, leaving the editor commits); read-only fields are left alone and the changed page re-renders automatically - Every write fires the new
OnFormFieldValueChangedevent, andHighlightFormFieldswithFormHighlightColorpaints a translucent backdrop over each fillable area so users can spot form fields - Added the programmatic counterparts
FormFieldAtPagePoint,GetFormFieldPageRect,ToggleCheckBoxField,SetFormFieldValueAndRefresh,BeginEditFormFieldandCommitInplaceEditor, driving the same machinery without mouse input
Version 3.219.0
Added
- Added annotation interaction to the
TPDFlibViewercontrol: clicking a non-link annotation fires the newOnAnnotClickevent with the page, annotation index and subtype, andAnnotAtPagePointexposes the hit test programmatically (Popup companions are skipped) - Hovering an annotation now shows its Contents text as the control's hint (the
AnnotHintsswitch, on by default, works with the standardShowHintproperty) - Added
SaveAnnotAttachmentToFileto write a FileAttachment annotation's embedded file to disk, completing click-to-save attachment workflows in the viewer
Version 3.218.0
Added
- Added a cross-session disk page cache to the
TPDFlibViewercontrol: settingDiskCacheFolderpersists rendered pages on disk so a recently viewed document reopens instantly without re-rendering - Cached pages are keyed by a fingerprint of the document's path, size and last write time, so editing the file automatically invalidates its stale pages; the cache keeps up to ten documents and prunes the least recently used ones
- Added the
DiskCacheHitscounter reporting how many page renderings the disk cache saved
Version 3.217.0
Added
- Added the
PDFlibViewerActionsunit with twenty ready-madeTActiondescendants forTPDFlibViewer, so toolbars and menus work without glue code: page navigation (First/Prior/Next/Last), zoom (In/Out/FitWidth/FitPage/ActualSize), view rotation (clockwise/anticlockwise), printing, file open and save-as dialogs, copy selected text, and the five mouse-tool mode switches - Each action targets a viewer through its
Viewerproperty and keeps its enabled state (document open, page position, selection present) and checked state (active zoom fit or mouse tool) up to date automatically; all actions register in the losLab PDF category for the Action List editor - Added
TPDFlibViewer.EffectiveZoomPercentreporting the zoom actually in effect (including computed fit-width/fit-page factors) so zoom steps can build on it
Version 3.216.0
Added
- Added search-hit highlighting to the
TPDFlibViewercontrol:HighlightSearchHitssearches the whole document and paints a translucent bar over every match that stays in place while scrolling, zooming and rotating, withClearSearchHighlights,SearchHighlightCountand a configurableSearchHighlightColor TPDFlibSearchPanel.RunSearchnow also paints the hit bars in the attached viewer (the newHighlightInViewproperty, on by default, turns this off), so search results are visible on the pages, not just in the hit list
Version 3.215.0
Added
- Added mouse tool modes to the
TPDFlibViewercontrol through the newViewerModeproperty:vmSelecttext selection (default),vmHandpan-by-dragging with a grab cursor (a plain click still follows links),vmZoommarquee zoom that magnifies the dragged band to fill the viewport,vmSnapshotregion capture to the clipboard, andvmHighlightpersistent translucent region highlighting - Added
CaptureRegionto render any client region (pages plus highlights) into a caller-owned bitmap, theOnSnapshotevent andSnapshotToClipboardswitch for snapshot handling, andAddHighlightRegion/ClearHighlightRegions/HighlightRegionCountwith a configurableHighlightColorfor page-anchored highlights that survive zoom, rotation and navigation
Version 3.214.0
Added
- Added printing to the
TPDFlibViewercontrol:PrintDocshows the standard Windows print dialog (printer choice, page range, copies, collation) and hands the job to the library's printing engine, whilePrintDoc(False)prints the whole document to the default printer without any UI - Added
PrintDocRangefor fully programmatic viewer printing with an explicit printer name, page range, copy count and collation flag
Version 3.213.0
Added
- Added view rotation to the
TPDFlibViewercontrol:RotateClockwise90andRotateAntiClockwise90turn the displayed pages in 90-degree steps, and theViewRotationproperty reads or sets the angle directly (0, 90, 180 or 270) - Rotation is a pure view attribute: the document is never modified, link clicking and text selection keep working at every angle, fit-width and fit-page zoom modes adapt to the rotated page shape, and opening a new document resets the view to 0 degrees
- Rotated page bitmaps are cached per angle, so switching between angles reuses previous renderings instead of re-rendering
Version 3.212.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept simple FormCalc-style predicate selectors such as$data.Receipt.Detail.[Total_Price > 200].Descriptionand update every matching data node when a predicate selects a subset
Version 3.211.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept Data DOM class selectors#dataGroupand#dataValuewith numeric or wildcard occurrences, allowing class-based paths such as$data.Receipt.#dataGroup[0].#dataValue[0]
Version 3.210.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept the$recordroot in non-record-processing packets, so paths such as$record.Taxand$record/Detail[0]/Total_Priceresolve from the outer data record element
Version 3.209.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard border style attributes
width,style, anddashesfrom PDF annotation/BSvalues, and annotation imports restore those attributes on inserted annotations
Version 3.208.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard
creationdateandopacityattributes from PDF annotation/CreationDateand/CAvalues, and annotation imports restore those attributes on inserted annotations
Version 3.207.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard
flagsnames from PDF annotation/Fvalues, and annotation imports restore those names to the inserted annotation flags
Version 3.206.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept direct child wildcard selectors such as$data.Receipt.*.Total_Priceto read or update matching child branches without selecting same-name fields on the parent node
Version 3.205.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept descendant selectors such as$data..Total_Priceand$data.Receipt..Total_Priceto read or update the first matching descendant data node
Version 3.204.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept theparentproperty in paths such as$data.Receipt.Detail[1].parent.Taxto read or update a selected node's parent sibling data
Version 3.203.0
Changed
- Improved XFA datasets SOM occurrence handling:
GetXFAFormFieldValueandSetXFAFormFieldValuenow support[*]selectors such as$data.Receipt.Detail[*].Total_Priceto read or update every matching repeated data node
Version 3.202.0
Changed
- Improved XFA SOM path compatibility: XFA datasets and template field APIs now preserve literal periods in slash-delimited field paths and accept escaped periods such as
Line\.Itemin dot-delimited SOM paths
Version 3.201.0
Changed
- Improved XFA datasets path compatibility: XFA field value APIs now accept slash-delimited paths after standard data SOM roots such as
$data/...,xfa.datasets.data/..., andxfa.datasets/...
Version 3.200.0
Changed
- Improved XFA datasets SOM compatibility: XFA field value APIs now accept the standard
!data...short form, including slash-delimited!data/...paths
Version 3.199.0
Changed
- Improved XFA template path compatibility: template editing APIs now accept slash-delimited field paths returned by XFA field-name enumeration, including
$template/...paths
Version 3.198.0
Changed
- Improved XFA datasets namespace compatibility: field value APIs now read and update data nodes by local XML name when the business data inside the datasets packet uses its own namespace prefix, and field-name enumeration returns prefix-free paths
Version 3.197.0
Changed
- Improved XFDF annotation interchange: annotation exports now include the common
nameanddateattributes from PDF/NMand/M, annotation imports restore those values on inserted annotations, andSetAnnotStrPropertynow accepts tag 104 for annotation modified dates
Version 3.196.0
Changed
- Improved XFA field-name enumeration: field list APIs now scan every top-level data record in the datasets packet and return leaf data fields without adding container groups as fields
Version 3.195.0
Changed
- Improved XFA datasets compatibility: XFA field value APIs now read and update complete XDP packets whose datasets packet uses an unprefixed
dataelement
Version 3.194.0
Fixed
- Improved XFA template field updates: XFA template field APIs now accept standard template SOM roots such as
$templateandxfa.template, and template-only changes in complete XDP streams are saved correctly
Version 3.193.0
Changed
- Improved XFA field addressing: XFA field value APIs now accept standard data SOM roots such as
$dataandxfa.datasets.datain addition to relative field paths
Version 3.192.0
Changed
- Improved XFA XML packet handling: XFA streams with UTF-16 byte order marks or UTF-16 XML byte patterns now decode before XML parsing, so UTF-16 encoded form values remain available through XFA field read/write APIs
Version 3.191.0
Changed
- Improved XFA packet authoring:
SetXFAFromStringnow creates the requiredAcroFormcontainer when a document does not already have form data, replaces stale parsed XFA state when a complete XFA packet is stored, and keeps the saved packet available through XFA field read/write APIs
Version 3.190.0
Changed
- Improved XFDF annotation interchange: annotation exports now write the common
colorattribute from the PDF/CRGB array, and annotation imports now restorecolor="#RRGGBB"values into the inserted annotation color array
Version 3.189.0
Added
- Added XFDF annotation interchange APIs:
ExportAnnotationsToXFDF,ExportAnnotationsToXFDFString,ImportAnnotationsFromXFDFandImportAnnotationsFromXFDFStringnow read and write ISO 19444<annots>data for text-style annotation comments, including page, rectangle, title, subject and plain contents data
Version 3.188.0
Changed
- Improved XFDF rich text field import: fields with
<value-richtext>now preserve the rich text XML in the fieldRVvalue while still applying the plain<value>fallback when present
Version 3.187.0
Changed
- Improved XFDF form-data interchange for multi-select choice fields: repeated
<value>elements now import into the selected-value array, and exporting a multi-select choice field now writes one<value>element per selected item instead of flattening them into one escaped text node
Version 3.186.0
Changed
- Improved XFDF form-data export for rich text fields: fields with an
RVrich text value now include a<value-richtext>element while preserving the plain<value>fallback
Version 3.185.0
Changed
- Improved XFDF form-data import for rich text fields: when a field provides
<value-richtext>without a plain<value>, the importer now extracts the XHTML text content and applies it to the matching AcroForm field instead of skipping the field
Version 3.184.0
Changed
- Improved XFDF form-data interchange: exports now use the standard XFDF namespace with
xml:space="preserve", emit nested<field>elements for hierarchical AcroForm names, skip non-terminal parent field values, write file exports as UTF-8, and import whitespace-flexible XFDF with nested fields, single-quoted attributes, CDATA, XML entities, and numeric character references
Version 3.183.0
Added
- Added
SanitizeDocument(Flags)which strips sensitive content in one call: removes all global JavaScript, removes the catalog OpenAction, strips /A actions from every annotation, blanks Author/Subject/Keywords/Creator/Producer metadata (both /Info and XMP), and optionally deletes all annotations. Flag bitsSANITIZE_JAVASCRIPT/SANITIZE_ACTIONS/SANITIZE_METADATA/SANITIZE_ANNOTATIONS/SANITIZE_OPEN_ACTIONcombine;SANITIZE_ALLapplies every strip. Closes the classic data-leak hole where redaction removes visible content but leaves metadata or hidden scripts recoverable - Added
TPDFAnnots.RemoveAnnotAction(Index)to strip the /A action dictionary from an individual annotation (used by SanitizeDocument, also useful standalone)
Version 3.182.0
Added
- Image elements returned by
EnumPageElementsnow carry their real placement rectangle (Left/Top/Right/Bottom) instead of zeros. Backed by a newTPDFContentProgram.EnumImagePlacementsmethod that walks the content stream tracking the CTM (cm/q/Q) and maps eachDooperator's 1x1 unit square into page coordinates - Added four showcase demos: DocumentProperties (DocInfo/page-box/rotation/transition/viewer-preferences/XMP round-trip), FormProperties (per-field property grid: type/value/readonly/MaxLength/MultiLine/description), SignatureValidator (enumerate signature fields + verify + signer certificate), Reader (VCL TPDFlibViewer with open/navigate/zoom/copy-text)
Version 3.181.0
Added
- Added
SetXMPPropertyexposing the existing schema-aware XMP engine (PDFlibXMP) through the public facade: set any Dublin Core (dc:), XMP Basic (xmp:), Adobe PDF (pdf:), PDF/A ID (pdfaid:), PDF/UA ID (pdfuaid:), or XMP Media Management (xmpMM:) property by namespace + key without hand-writing RDF XML - Added
ImportFormDataFromFDF/ImportFormDataFromFDFStringwhich parse an FDF /Fields array (each<< /T (name) /V (value) >>) and apply each value to the matching AcroForm field by title, inverting the EscapePDFText octal/paren escaping. Closes the asymmetric export-only gap - Added
ExportFormDataToXFDF/ExportFormDataToXFDFString/ImportFormDataFromXFDF/ImportFormDataFromXFDFStringfor XFDF (XML Forms Data Format) bidirectional interchange - the modern XML counterpart of FDF - Made the six namespace-scoped XMP setters (
SetDublinCore,SetXMPBasic,SetAdobePDF,SetPDFA,SetPDFUA,SetXMPMM) public onTPDFlibXMPso advanced callers can drive the engine directly
Version 3.180.0
Added
- Added
SearchAndReplaceTextInContentwhich performs TRUE content-stream text replacement (rewriting the Tj/TJ/'/" show-text operators in place viaTPDFContentProgram.ReplaceTextRun), unlike the existing mask-basedSearchAndReplaceTextthat only overlays a rectangle on top of the original glyphs. The original text is gone from the stream and cannot be recovered. Locates hits viaSearchText, maps each hit rect to its covering instruction viaFindInstructionsInRect, rewrites, and writes the layer back
Version 3.179.0
Added
- Added a structured internal logger (
TPDFlibLogger) in a newLib/PDFlibLogger.pasunit with four levels (Debug/Info/Warn/Error), a host callback (OnLog), an optional thread-safe file sink, and an error-code-to-message map (PDFlibErrorMessage) that finally gives the existing numeric codes (1xx/3xx/4xx/5xx) human text. Exposed onTPDFlibvia theLoggerproperty - Added
RenderPagesToFilesParallelwhich renders a page range to one file per page using aTTaskpool with oneTPDFlibinstance per worker (TPDFlib is not thread-safe) and per-threadCoInitializefor GDI+ apartment safety. Scales near-linearly with CPU cores for CPU-bound raster output
Version 3.178.0
Added
- Added
EnumCertificatesto enumerate every certificate in a Windows system store ("MY", "Root", ...) returning subject, issuer, serial number, validity window, HasPrivateKey, and Qualified (eIDAS QCStatements extension, OID 0.4.0.1862.1.7, detected via a new built-in DER decoder in PDFlibASN1) - replaces the previous single-cert-by-CNSetSignProcessCertFromStorelimitation - Added
SetSignProcessCertFromStoreByHandleto select a signing certificate by raw PCCERT_CONTEXT handle obtained from enumeration, letting callers pick by any criterion (qualified filter, validity, fingerprint) rather than only by Subject CN - Added
RedactRegionwhich truly removes text, vector paths, and image XObjects whose painted area intersects a rectangle (editing the content stream so removed content cannot be recovered, unlikeMaskRectwhich only covers it), with optional black fill and /Redact annotation. Backed by a CTM-tracking content-stream analyser in PDFlibContentModel (FindInstructionsInRect) - Added minimal DER decoder functions (
DERDecodeLength,DERFindExtensionByOID) to PDFlibASN1 for in-process certificate extension inspection without CryptDecodeObjectEx
Version 3.177.0
Added
- Added page stitching APIs that compose existing pages into new layouts via vector Form XObject capture (preserving full vector fidelity, unlike content-stream concatenation):
StitchPageOverlayoverlays one page onto another at a position with optional opacity,StitchPagesSideBySideplaces two pages left/right on a new wider page, andStitchPagesVerticallystacks a page range into a new tall poster-style page - Added a composable watermark template layer in a new
Lib/PDFlibWatermark.pasunit:TPDFlibWatermarkBasewith nine-point positioning (wpTopLeft..wpBottomRightpluswpCustom),TPDFlibTextWatermark,TPDFlibImageWatermark, andTPDFlibCompositeWatermarkwhich applies a list of sub-watermarks recursively across a shared page range - Added
TPDFlib.ApplyWatermarkas a convenience entry point that delegates to a watermark template's own page range and settings
Version 3.176.0
Added
- Added named render-output format constants (
PDF_RENDER_BMP,PDF_RENDER_EMF,PDF_RENDER_EMFPLUS,PDF_RENDER_EMF_DUAL, etc.) that map 1:1 to the integerOptionsvalues accepted byRenderPageToFile,RenderPageToStream,RenderPagesToFiles, andRenderDocumentToFile - Added
TPDFlibMetafileFormatenum and the convenience methodsRenderPageToMetafileStreamandRenderPageToMetafileFile, which accept a named metafile variant (mfEMF, mfEMFPlus, mfEMFDual, mfWMF) instead of a bare integer - Added EMF+ Dual output mode (Options value 11 / mfEMFDual), which records both GDI and GDI+ commands in the same metafile for compatibility with older GDI-only consumers
- Added
TPDFlibClipboardFormatenum andRenderPageToClipboard, which places a rendered page on the Windows clipboard as an enhanced metafile (CF_ENHMETAFILE), a DIB bitmap (CF_DIB), the page Unicode text (CF_UNICODETEXT), or all three at once - Added a new
Lib/PDFlibClipboard.pasunit with low-level Win32 clipboard placement helpers used byRenderPageToClipboard - Added full per-monitor DPI awareness to
TPDFlibViewer: a new publicScreenDPIproperty, aCreateWndoverride that auto-detects the host monitor DPI viaGetDpiForWindow(with aGetDeviceCapsfallback), and aWM_DPICHANGEDhandler that rebuilds the layout and clears the bitmap cache when the window moves between monitors - Added
TPDFRenderer.SetEMFPlusMetafileTypeto select between EMF+ Only and EMF+ Dual recording at the renderer level
Fixed
- Fixed the
RenderPageToFilereference page where the Options value list was misplaced in the Page row and the Options cell was empty
Version 3.175.3
Added
- Added a Lib/PDFlibTableExport.pas unit that renders any TDataSet (FireDAC, ClientDataSet, query result) into a paginated PDF table with styled header, zebra striping, right-aligned numeric columns, and automatic page continuation, plus a Demo/Delphi/DataSetExport console demo that loads the RAD Studio customer.FDS sample via FireDAC and exports it
Version 3.175.2
Added
- Added end-to-end Demo/ReportBridges projects that build a minimal report in FastReport, QuickReport, and ReportBuilder and export it to PDF through the matching Addons bridge, with a dedicated build-ReportBridges.cmd that supplies the engine source paths and gating symbols so the standard demo build still compiles the projects as stubs
Version 3.175.1
Added
- Added a Delphi JBIG2 options matrix demo that sweeps SymbolExtract, SkipBlackDots, BlackDotSize, and LossyLevel combinations against CCITT G4 and Flate baselines, with per-row PDF, CSV, and summary outputs
- Added a Delphi Pattern showcase demo covering axial and radial RGB shaders, a Coons-patch mesh shader, and a custom tiling pattern applied as fill, stroke, and text colour
- Added a Delphi CCITT fax matrix demo comparing Group 3 1-D, Group 3 2-D, and Group 4 compression with BlackIs1 and Interpolate option bits, reporting each output size and the resulting /Filter name
- Added FastReport, QuickReport, and ReportBuilder export bridges under Addons that render a prepared report into a PDFlibPas PDF via the engine's native object, metafile, and DrawCommand surfaces respectively
Version 3.175.0
Changed
- Expanded the WorkflowGallery demo with an annotation variant matrix that records text highlight fills, markup styles, note icons, free text, caret, and stamp annotations in companion CSV and HTML reports
Version 3.174.0
Changed
- Expanded the C++Builder AdvancedWorkflowMatrix demo to map action navigation, PDF/A and AcroForm workflows, font diagnostics, streaming delivery, and the latest scan-compression helpers into the generated matrix reports
Version 3.173.0
Added
- Added the DeliveryWorkflowMatrix Delphi demo for streamed Web and CGI PDF output, page-thumbnail validation, and watermark delivery workflows using one generated PDF byte buffer
Version 3.172.0
Added
- Added outline tree convenience APIs for ordered sibling insertion, child creation, subtree deletion, and preorder outline enumeration with parent, sibling, level, destination page, open-state, and title details
Version 3.171.0
Added
- Added the FontDiagnosticsMatrix Delphi console demo for CJK and Unicode font paths, TrueType subset updates, installed-font probes, document font enumeration, and font diagnostics reports
Version 3.170.0
Added
- Added the CanvasMigrationMatrix Delphi console demo for Canvas DC migration, raw content and path entry points, Delphi color helpers, pattern-filled text, watermarking, page thumbnail workflows, and rendered validation previews
Version 3.169.0
Added
- Added dedicated LayerCompositionMatrix, TransparencyMaskMatrix, and ComplianceFormWorkflowMatrix Delphi console demos for optional-content print/export policy, Pattern/Form XObject composition, transparency mask comparison, PDF/A-1b success and failure examples, AcroForm action workflows, appearance rebuilds, and visible signature templates
Version 3.168.0
Added
- Added dedicated ImageCompressionMatrix and SecurityPermissionMatrix Delphi console demos with generated PDF, CSV, and HTML reports for image compression strategy selection, scan compression, JPEG render quality, and encrypted permission profile auditing
Version 3.167.0
Added
- Added named helper APIs for JBIG2 bitmap encoding, EMF import options, AcroForm event actions, and chained actions so callers can use explicit option switches instead of composing integer bitmasks manually
Version 3.166.0
Added
- Added a runnable C++Builder AdvancedWorkflowMatrix console demo with PDF, CSV, and HTML outputs that map advanced canvas migration, EMF import, image compression, AcroForm, signature, security, PDF/A, optional-content, pattern, and Form XObject workflows to C++Builder project entry points
Version 3.165.0
Added
- Added a Delphi action navigation matrix demo that demonstrates open-document actions, document-level JavaScript, embedded-file links, remote GoTo links, AcroForm event actions, Submit/Reset/Hide link helpers, and chained Next actions with PDF, CSV, and HTML outputs
Fixed
- Fixed remote file link helpers so AddLinkToFile, AddLinkToFileEx, AddLinkToFileDest, and local file launch links create one annotation and return instead of looping indefinitely
Version 3.164.0
Added
- Добавлен демонстрационный PDF/A guard matrix для Delphi, который проверяет ранний отказ или разрешённые пути при настройке режима PDF/A, прозрачности, blend modes, шифрования, JavaScript, мультимедиа, встроенных файлов и рабочих процессов файлов-приложений PDF/A-3, с генерируемыми PDF, CSV и HTML отчётами
Version 3.163.0
Added
- Добавлена явная матрица bridge ReportAdapter для путей экспорта FastReport, QuickReport, ReportBuilder, DBGrid и пользовательского canvas, включая CSV и HTML mapping output и PDF-страницу, показывающую повторно используемую стратегию adapter
Version 3.162.0
Added
- Добавлена матрица демонстраций advanced workflow, которая генерирует реальные результаты для миграции canvas, параметров import EMF, сравнений сжатия изображений, workflows действий AcroForm, видимых пустых подписей, прав доступа, проверок PDF/A-1b, optional content, patterns tiling, Form XObject, экспорта таблиц в стиле DBGrid и отчёта о пиковом потреблении памяти для больших файлов
Version 3.161.0
Added
- Добавлены helperы Delphi для компактного построения open-document action, действий событий видимости полей формы, установщиков цветов TColor и gray, а также прямой вставки raw content, path, text и matrix в content stream
Version 3.160.0
Added
- Добавлены helperы Delphi для сжатия сканированных изображений в JBIG2, однократной настройки image mask и color-key transparency, цепочки действий GoTo и читаемых имён событий AcroForm для JavaScript или назначения существующих actions
- Расширены ImportEMFFromFileEx и ImportEMFFromStreamEx так, что флаги Options могут принудительно включать import bitmap, разрешать JPEG-пересжатие цветных изображений EMF и запрашивать управляющие параметры обработки GDI+
Version 3.159.1
Changed
- Улучшены SaveToStream и сохранение bound output stream, так что большие объекты PDF stream пишутся ограниченными порциями, а не копируются каждый в одну промежуточную строку вывода
Version 3.159.0
Added
- Добавлены helperы размещения изображений, которые рисуют или вписывают заданное изображение и сразу освобождают его handle, с точками входа Delphi, DLL и ActiveX для снижения пикового потребления памяти в однократных сценариях генерации изображений
- Добавлен RenderPageToMonochromeFileEx для 1-битного BMP-рендера с преобразованием по порогу и очисткой изолированных чёрных пикселей перед workflows сжатия сканированных изображений
Version 3.158.1
Added
- Добавлены демонстрации Delphi для повторно используемых workflows экспортирования в стиле отчётов, импорта rich text из RichEdit в EMF и комбинированных сценариев thumbnail страницы, annotation, Form XObject, таблиц, сжатия, JavaScript и bound stream output
Version 3.158.0
Added
- Добавлены API управления шифрованием metadata с точками входа Delphi, DLL и ActiveX: SetEncryptMetadata может писать PDF Standard-security с нешифрованными XMP metadata streams, а GetEncryptMetadata сообщает о состоянии /EncryptMetadata в очереди или уже загруженном
Version 3.157.0
Added
- Добавлены прямые API рисования patterns tiling с точками входа Delphi, DLL и ActiveX: BeginTilingPattern создаёт временную поверхность рисования ячейки pattern, EndTilingPattern регистрирует её как повторно используемый pattern, а CancelTilingPattern отменяет построение, не оставляя именованный pattern
Version 3.156.0
Added
- Добавлены helperы bound output stream в Delphi: BeginOutputToStream, EndOutputStream, CancelOutputStream и OutputStreamActive позволяют коду streaming, web и report-export подключать целевой TStream, завершать его через существующий chunked writer или отменять ожидающий target без передачи владения stream
Version 3.155.0
Added
- Добавлены Abort, Aborted и ResetAbort для вызовов Delphi, DLL и ActiveX, чтобы приложения могли помечать экземпляр как отменённый и не запускать save или append output, пока флаг не будет очищен
Version 3.154.0
Added
- Добавлены helperы page-thumbnail для вариантов import изображений и источников в памяти, запросы и setters групп optional content по имени группы, а также SetOpenActionNamedDestination для перехода при открытии документа к именованным destinations
Fixed
- GetDestName теперь разрешает явные handle массивов destination, включая массивы, возвращённые из именованного open-document action
Version 3.153.0
Added
- Добавлены удобные API для chained form actions, триггеров полей Hide и ImportData, начальных состояний optional content group, необязательных import EMF и импортов прозрачных изображений color-key
Version 3.152.0
Added
- Добавлены автоматическое создание URL link при рисовании текста, helperы import изображений CCITT Group 3/4, helperы прямых изображений JBIG2, расширенные wrappers import EMF, helperы присоединения image mask, создание видимых полей подписи и helperы событий и actions полей формы для workflows JavaScript, SubmitForm и ResetForm
Version 3.151.0
Added
- Добавлены DrawPie, DrawChord, DrawEllipticPie и DrawEllipticChord для явного рисования замкнутых круговых и эллиптических дуг с outline, fill или fill-and-outline
Version 3.150.0
Added
- Добавлены NewGraphicsState и SetGraphicsState, чтобы вызывающие могли создавать повторно используемые ресурсы ExtGState для настроек прозрачности fill и stroke, line width, line cap, line join и miter-limit
Version 3.149.1
Fixed
- Исправлены дублирующиеся ActiveX dispatch IDs для методов Form XObject и miter-limit, чтобы поздно связанный COM-клиент однозначно разрешал каждый метод
Version 3.149.0
Added
- Добавлен SetMiterLimit для управления отношениями stroke miter-limit для путей, использующих miter joins
- BeginFormXObject, EndFormXObject и CancelFormXObject стали доступны через API DLL и ActiveX
Version 3.148.0
Added
- Добавлены повторно используемые API построения Form XObject: BeginFormXObject, EndFormXObject и CancelFormXObject позволяют рисовать повторно используемый шаблон обычными командами рисования страницы и размещать его многократно через API рисования захваченных страниц
Version 3.147.0
Added
- Добавлены SetTextTilingPattern и SetLineTilingPattern, чтобы patterns tiling захваченных страниц могли повторно использоваться для текста, underline и stroke-графики без дублирования команд рисования
Fixed
- Цвета shader и tiling patterns со stroke теперь пишут оператор stroking pattern color вместо обновления состояния nonstroking color
Version 3.146.0
Added
- Добавлены BeginOptionalContent и EndOptionalContent, чтобы вызывающие могли отмечать только последующие команды рисования с помощью optional content group без переписывания существующего content stream
Fixed
- Операторы marked-content для закрытия scope теперь немедленно flush-ятся при закрытии optional content, tagged PDF или artifact scopes в конце content stream
Version 3.145.0
Added
- Добавлен SetTransparencyEx, чтобы вызывающие могли задавать отдельные значения прозрачности fill и stroke для текста и графики, которые будут рисоваться позже, сохраняя при этом существующее поведение автоматического обновления до PDF 1.4
Version 3.144.0
Added
- Добавлен AddLinkToNamedDestination, чтобы hotspot страницы мог перейти к именованному destination внутри того же документа без разрешения target page при создании link
Fixed
- Читатели action annotation теперь возвращают no action для страниц без annotations вместо разыменования пустого annotation cache
Version 3.143.0
Added
- Добавлены API управления actions полей формы, чтобы вызывающие могли привязывать существующий action к field trigger, проверять типизированный trigger action и удалять основные или дополнительные actions поля
Fixed
- FormFieldJavaScriptAction теперь отклоняет документы PDF/A и недопустимые имена trigger вместо записи несоответствующих dictionaries actions полей
Version 3.142.0
Added
- Добавлены API action chaining, чтобы вызывающие могли добавлять next-actions URI, named и JavaScript к существующим annotation, outline или action поля формы и проверять chained actions через GetActionNextCount и GetActionNextInfo
Version 3.141.0
Added
- Added
AddLinkToSubmitFormandAddLinkToResetFormso page hotspots can submit or reset AcroForm fields through standard PDF actions without JavaScript
Version 3.140.0
Added
- Added
AppendToStreamso incremental update workflows can write directly to a caller-provided stream instead of first materialising the update as anAnsiString
Changed
SaveToStreamnow serializes directly into the target stream, andAppendToString(1)now returns only the incremental update section without copying the original source bytes into a temporary buffer
Version 3.139.0
Added
- Added
GetAnnotReplyToandGetAnnotReplyTypeso threaded annotation replies can be inspected through named read-side accessors instead of generic annotation property tags
Version 3.138.0
Added
- Added the Delphi
DocumentInspectionWorkbenchsample to batch-inspect PDFs with combined font diagnostics, image sampling, color-space discovery, load timing, and JSON, CSV, and HTML reports
Version 3.137.0
Added
- Added the Delphi
ImageDecodeBenchmarksample to measure page image discovery, decoded image bytes, and page color-space discovery with CSV and HTML timing reports
Version 3.136.0
Added
- Added
GetDocumentFontDiagnosticsandTPDFlibFontDiagnosticsto summarize document font embedding, subsetting, Standard 14, CID, Type3, and unknown-font counts in one call
Version 3.135.0
Added
TPDFlibSignatureVerifier.VerifySignerCertificateChainnow builds the embedded signer certificate chain with Windows CryptoAPI and returnsvsValidonly when the chain satisfies the Windows base trust policy, while self-signed or otherwise untrusted signer certificates returnvsInvalidwithout changingVerifySignature's content-integrity result
Version 3.134.0
Fixed
TPDFlibSignatureVerifier.VerifySignaturenow validates legacyadbe.pkcs7.sha1signatures, returningvsValidwhen the signed digest matches the covered/ByteRangebytes andvsInvalidafter covered content changes
Version 3.133.0
Добавлено
- Добавлены
RenderPagesToFilesиDARenderPagesToFilesдля рендеринга произвольных диапазонов страниц в пронумерованные выходные файлы с повторным использованием настроек рендеринга для выбранных страниц
Version 3.132.0
Добавлено
- Добавлены удобные методы штамповки
AddPageHeaderиAddPageFooter, которые размещают текст с фиксированным верхним или нижним отступом на каждой странице в диапазоне, с выравниванием по левому краю/по центру/по правому краю и раскрытием токенов (&Pтекущая страница,&Nвсего страниц,&Dдата,&Tзаголовок документа,&&буквенный амперсанд) - Методы
StampTextиStampImageс параметромsoUnderlayтеперь действительно размещают контент под существующим контентом страницы путем добавления нового слоя контента в начало (ранее он рисовался поверх, какsoOverlay); это реализовано с помощью нового метода дерева страницPrependContentLayer
Version 3.131.0
Добавлено
- Добавлен метод
ScalePage(ScaleX, ScaleY, Anchor), который масштабирует контент выбранной страницы путем оборачивания каждого слоя контента в блок графического состоянияq sx 0 0 sy tx ty cm ... Qи изменения размера MediaBox и CropBox; якорь сохраняет левое нижнее начало координат (0), центрирует контент (1) или сохраняет верхний левый угол (2) - Расширен
EnumPageElementsновым типом элементаekPath: теперь каждая страница также сообщает свои векторные контуры с ограничивающим прямоугольником, количеством точек, флагом замыкания и оператором заливки, извлеченными из потоков контента с помощью структурированной модели контента
Version 3.130.0
Добавлено
- Добавлены три API для оптимизации размера файла, которые сжимают загруженные документы при повторном сохранении:
SubsetEmbeddedFontsперезаписывает каждую встроенную программу шрифта TrueType (FontFile2), оставляя только символы Unicode, которые документ фактически отображает с помощью службы FontSub.dllCreateFontPackage;DownsampleImages(MaxDPI, Quality, Filter)декодирует каждый XObject изображения, разрешение которого превышает целевой DPI, выполняет его передискретизацию (box или bilinear) и повторно кодирует как JPEG или PNG;NormalizeLZWStreamsпереписывает каждый поток, все еще отфильтрованный с помощью LZWDecode, в FlateDecode через существующий декодер LZW и кодер Flate, сохраняя параметры Predictor
Version 3.129.0
Добавлено
- Добавлены API для создания сеточной заливки (mesh shading) для четырех типов заливки, для которых ранее поддерживалось только чтение/парсинг:
NewRGBFreeFormTriangleMesh(ShadingType 4, free-form Gouraud triangles),NewRGBLatticeTriangleMesh(ShadingType 5, lattice-form Gouraud),NewRGBCoonsPatchMesh(ShadingType 6, Coons patch mesh) иNewRGBTensorPatchMesh(ShadingType 7, tensor-product patch mesh) — каждый из них создает именованный шаблон сеточной заливки из плоского списка вершин или патчей с возможностью выбора битовой глубины координат/цвета и ограничивающего прямоугольника; их можно выбирать с помощьюSetFillShader/SetLineShader/SetTextShaderтак же, как существующие осевые (axial) и радиальные (radial) шейдеры
Version 3.128.0
Добавлено
- Добавлена панель эскизов для просмотрщика (viewer):
TPDFlibThumbnailBarотображает миниатюру каждой страницы, лениво рендерится при прокрутке строк в поле зрения, с номером страницы внизу; щелчок по эскизу заставляет прикрепленный просмотрщик перейти к этой странице — завершает семейство элементов управления просмотрщика (viewer, bookmark panel, search panel, thumbnails)
Version 3.127.0
Добавлено
- Добавлена панель поиска для просмотрщика:
TPDFlibSearchPanel.RunSearchищет по всему прикрепленному документу и выводит по одной строке на каждое совпадение с номером страницы и совпадающим текстом; щелчок по совпадению заставляет просмотрщик перейти к этой странице
Version 3.126.0
Добавлено
- Добавлена панель закладок для просмотрщика:
TPDFlibOutlineViewerвыводит дерево структуры документа с отступами и заставляет прикрепленный просмотрщик (черезAttachViewer) перейти на страницу назначения закладки при щелчке; она построена на основе многократно используемого базового класса панели, который позже используют другие боковые панели
Version 3.125.0
Добавлено
- Добавлено выделение текста в элемент управления просмотрщика: перетащите левой кнопкой мыши для выделения, нажмите Ctrl+C или вызовите
CopySelectedText, чтобы скопировать выделение в буфер обмена; захваченный текст доступен через свойствоSelectedText, упорядоченный сверху вниз с разрывами строк между абзацами (bands) - Добавлен метод
GetTextInRegion, который возвращает текст прямоугольной области страницы напрямую — тот же блочный поиск, который используется при выделении мышью, доступен для пользовательских интерфейсов выделения
Version 3.124.0
Добавлено
- Элемент управления просмотрщика теперь предварительно рендерит соседние страницы в фоновом потоке, поэтому переход вперед или назад отображает следующую страницу мгновенно; рабочий поток использует свой собственный экземпляр документа и передает готовые визуализации в кэш без блокировки пользовательского интерфейса (UI)
- В просмотрщик добавлена интерактивность ссылок: щелчок по аннотации ссылки вызывает
OnLinkClickс номером страницы и той же типизированной сводкой действий, которую создаетGetAnnotActionInfo(веб-адрес, место назначения в документе, именованное действие и т.д.);LinkActionAtPagePointоткрывает доступ к базовой проверке попадания (hit test) для пользовательской обработки
Version 3.123.0
Добавлено
- Элемент управления просмотрщика получил возможность непрерывной прокрутки:
SetDisplayModeпереключаетTPDFlibViewerмежду отображением одной страницы и непрерывной вертикальной прокруткой по всему документу; рендерятся только те страницы, которые видны в области просмотра, а текущая страница отслеживает позицию прокрутки (вызываяOnPageChange, когда страницы попадают в поле зрения) - Отрендеренные страницы теперь хранятся в кэше растровых изображений (least-recently-used bitmap cache), поэтому прокрутка вперед и назад не требует повторного рендеринга; лимит памяти по умолчанию составляет 128 МБ и настраивается с помощью
SetCacheLimit, при этом самые старые страницы вытесняются при уменьшении или заполнении кэша - В просмотрщик добавлена прокрутка колесиком мыши и навигация с помощью клавиатуры: PageUp/PageDown (постраничный переход в режиме одной страницы, переход по области просмотра в непрерывном режиме), клавиши со стрелками, Home и End
Version 3.122.0
Добавлено
- Добавлен элемент управления интерактивным просмотрщиком PDF:
TPDFlibViewer— это VCL-элемент с прокруткой, который открывает документ из файла или прикрепляется к существующему экземпляруTPDFlib, отображает страницы с помощью выбранного движка рендеринга (GDI+, Cairo или PDFium) и предлагает навигацию по страницам (GoToPage/NextPage/PrevPageс событиемOnPageChange) и управление масштабом — фиксированный процент, по ширине (fit-to-width) или по размеру страницы (fit-to-page), которые пересчитываются автоматически при изменении размера элемента; страницы шире области просмотра прокручиваются, более узкие центрируются - Добавлен пакет времени проектирования (design-time package) (
Package\\PDFlibViewerPkg.dpk), который регистрирует элемент управления на странице палитры losLab PDF для использования в IDE методом перетаскивания (drag-and-drop)
Version 3.121.0
Добавлено
- Автоматическое формирование (shaping) текста со сложной письменностью в
DrawText: текст, содержащий арабские, еврейские, индийские или другие символы сложной письменности, теперь обнаруживается и формируется автоматически — контекстные формы букв, обязательные лигатуры и порядок справа налево отображаются правильно без изменений в коде; имена standard-14 сопоставляются с метрически совместимыми установленными шрифтами (Helvetica с Arial, Times с Times New Roman, Courier с Courier New), аGetTextWidthизмеряет текст через тот же этап формирования, поэтому выравнивание остается согласованным; текст на латинице, кириллице, греческом и CJK сохраняет свой существующий путь отрисовки байт за байтом - Добавлен метод
SetTextShapingдля переключения автоматической маршрутизации (включено по умолчанию; передайте 0 для восстановления точного поведения, которое было до внедрения формирования текста)
Version 3.120.0
Изменено
- Сопутствующие шрифты (companion fonts) сформированного текста (shaped-text) теперь подмножаются (subsetted) во время сохранения только до тех глифов, которые отображает документ, что значительно уменьшает размер выходных файлов (полная программа шрифта размером более мегабайта уменьшается до использованных глифов); шрифт подмножества сохраняет свою нумерацию глифов, несет имя
BaseFontс тегом подмножества и реальные ширины/Wдля каждого глифа, а также получает карту ToUnicode, которая переводит каждый сформированный глиф обратно в его исходные символы — поэтому копирование или извлечение выводаDrawShapedTextвозвращает исходную строку, включая обе буквы, скрытые за лигатурой lam-alef
Version 3.119.0
Добавлено
- Добавлена отрисовка текста со сложной письменностью:
DrawShapedTextформирует арабские, еврейские и другие строки со сложной письменностью перед их отрисовкой — контекстные формы букв, обязательные лигатуры, такие как lam-alef, и порядок справа налево отображаются правильно — и записывает сформированные глифы с помощью сопутствующего шрифта Type0 (Identity-H), встраивая всю программу шрифта, поэтому формы, не имеющие собственного кода символа, рендерятся в точности; для каждого начертания (face) создается один сопутствующий шрифт, который повторно используется в последующих вызовах - Добавлен метод
GetShapedTextWidth, который измеряет текст через тот же этап формирования, поэтому лигированный текст измеряется по его истинной отрисованной ширине — используйте его для выравнивания по правому краю или центрирования сформированных абзацев
Version 3.118.0
Добавлено
- Добавлена основа для формирования текста со сложными скриптами (complex-script text shaping): новая привязка Uniscribe (usp10.dll) преобразует арабские, ивритские и другие строки со сложными скриптами в правильно упорядоченные и сформированные серии глифов — контекстные арабские формы, обязательные лигатуры, такие как lam-alef, и упорядочивание справа налево — сообщая индекс глифа шрифта, шаг (advance) и кластер исходного символа для каждого глифа; это движок формирования, на основе которого более поздние версии строят путь рисования, он загружается лениво, поэтому платформы без Uniscribe просто сохраняют существующий посимвольный путь.
Version 3.117.0
Добавлено
- Добавлена интроспекция профиля ICC:
GetOutputIntentICCInfoразбирает профиль ICC, прикрепленный к OutputIntent документа, и сообщает его версию, класс устройства, цветовое пространство данных, цветовое пространство подключения профиля (profile connection space), намерение рендеринга (rendering intent) и количество компонентов — полезно для проверки условий печати файлов PDF/A и PDF/X; обработка цветового пространства ICCBased в рендерере теперь также извлекает количество компонентов из самого заголовка профиля, когда цветовое пространство штриховки (shading) не содержит ни/Alternate, ни/N.
Version 3.116.0
Добавлено
- Добавлен режим извлечения текста с учетом таблиц: опция 10 в
GetPageTextгруппирует левые края текстовых блоков страницы в глобальные позиции столбцов и генерирует строки, разделенные табуляцией, так что табличные макеты извлекаются как готовые к импорту TSV, а вертикально выровненные ячейки остаются выровненными по строкам.
Version 3.115.0
Добавлено
- Добавлен спуск полос (page imposition):
ImposePagesNUpразмещает каждую страницу документа на новых листах в сетке n-up (2-up, 4-up, 9-up или в любом расположении Columns x Rows), при этом каждая страница подгоняется по размеру (aspect-fit) и центрируется в своей ячейке как живой векторный контент, или — с опцией буклета (booklet) — создает сброшюрованные листы (saddle-stitch), попарное расположение страниц на которых складывается в буклет при двусторонней печати и штабелировании.
Version 3.114.0
Добавлено
- Типизированные считыватели действий
GetAnnotActionInfoиGetOutlineActionInfoрасширены еще на четыре вида действий — Hide (с количеством скрытых целей и флагом hide/show), SubmitForm (URL-адрес отправки и количество полей), ResetForm (количество полей) и ImportData (исходный файл) — и открывают имя-нагрузку (name payload) для Named действий (например,NextPage); оба считывателя теперь используют один парсер, поэтому ссылки в аннотациях и закладки сообщают идентичную информацию.
Version 3.113.0
Добавлено
- Добавлены помощники форматирования полей форм:
SetFormFieldNumberFormat(десятичные знаки, стиль разделителя, отрицательный стиль и размещение валюты),SetFormFieldPercentFormatиSetFormFieldDateFormat(строки изображения даты Acrobat, такие какmm/dd/yyyy) каждый записывает стандартную пару форматирующего JavaScript Acrobat в дополнительные действия (additional actions) поля — фильтр нажатий клавиш плюс форматтер отображения — так что совместимые программы просмотра проверяют ввод и отображают отформатированные значения без JavaScript, написанного вручную.
Version 3.112.0
Добавлено
- Добавлено создание звуковых аннотаций:
AddSoundAnnotationFromFileчитает несжатый файл PCM WAV (8 или 16 бит, моно или стерео) и встраивает его семплы за аннотацией со значком динамика в виде потока/Soundв подписанной кодировке, ожидаемой звуковым механизмом PDF, завершая цикл с существующими считывателямиGetAnnotSoundToFile/GetAnnotSoundToString.
Version 3.111.0
Добавлено
- Добавлены древовидные ответы на аннотации (ISO 32000-1 §12.5.6.3):
AddAnnotationReplyдобавляет ответ к любой существующей аннотации в виде скрытой текстовой аннотации (Text annotation), чей/IRTссылается на цель с отношением ответа/RT, поэтому Acrobat и другие программы просмотра показывают его в ветке под целью в панели комментариев; комбинируйте сAddAnnotationStateи обменом комментариями FDF для полных циклов совместного рецензирования.
Version 3.110.0
Добавлено
- Добавлен рендеринг сеточных (mesh) и функциональных штриховок, завершающий поддержку всех семи типов штриховок PDF: штриховки в виде свободных треугольных сеток Гуро (free-form Gouraud triangle meshes, type 4), решетчатых сеток Гуро (lattice-form Gouraud meshes, type 5), патч-сеток Кунса (Coons patch meshes, type 6) и тензорно-произведенных патч-сеток (tensor-product patch meshes, type 7) декодируются из их упакованных битовых потоков данных — включая флаги общих ребер патчей (shared-edge patch flags), сопоставление значений
/Decodeи опциональные цветовые градиенты/Function— и отрисовываются через собственные сетчатые градиенты движка Cairo; функциональные штриховки (type 1) аппроксимируются путем выборки функции штриховки по ее области определения в мелкую сетку патчей; поддерживаемые цветовые пространства охватывают DeviceRGB, DeviceGray, DeviceCMYK и альтернативы ICCBased (движок GDI+ не имеет примитива сетчатого градиента и оставляет области с сетчатой штриховкой незакрашенными).
Version 3.109.0
Добавлено
- Завершена инфраструктура редактирования контента (фаза 4) с редактированием на уровне текста:
TPDFContentProgram.GetTextRunsперечисляет инструкции отображения текста страницы со шрифтовым ресурсом и размером, активными при каждой из них (отслеживание состояния шрифта через вложенность save/restore), аReplaceTextRunзаменяет отображаемый текст на месте — это настоящая замена потока контента, которая сохраняет исходную позицию, шрифт и цвет, в отличие от подходов на основе наложения, которые маскируют старый текст и рисуют поверх.
Version 3.108.0
Добавлено
- В инфраструктуру редактирования контента (фаза 3) добавлена объектная модель для геометрии страницы:
TPDFContentProgram.LiftPathподнимает объект пути (операторы построения move/line/curve/rectangle, плюс операторы обрезки и закраски, завершающие его) в редактируемыйTPDFPathиз подпутей и сегментов;TPDFPath.Transformприменяет аффинную матрицу к каждой точке (перемещение, масштабирование, поворот или наклон существующего рисунка);LowerPathзаписывает измененную геометрию обратно поверх исходных инструкций, готовых дляWritePageContentLayer.
Version 3.107.0
Добавлено
- Инфраструктура редактирования контента (фаза 2) расширена удобствами на уровне инструкций в
TPDFContentProgram:InsertFromSourceразбирает фрагмент контента и встраивает его инструкции в любую позицию;SetOperandперезаписывает один операнд из синтаксиса исходного кода (перенумеровать координату, перекрасить заливку);OperandTextсчитывает операнд обратно;InstructionGroup,FindNextOpиFindNextGroupвыполняют навигацию по списку инструкций по оператору или по категории оператора ISO 32000-1.
Version 3.106.0
Добавлено
- Добавлена первая фаза инфраструктуры структурированного редактирования контента:
ParsePageContentLayerдекодирует слой контента страницы в редактируемуюTPDFContentProgram— список инструкций, каждая из которых представляет оператор контента PDF (все 73 оператора из таблицы 51 ISO 32000-1) со своими декодированными объектами-операндами — иWritePageContentLayerсериализует программу обратно на страницу, чтобы вызывающие объекты могли разбирать, проверять, удалять или изменять порядок инструкций рисования и перезаписывать страницу;GetPageContentLayerCountсообщает количество слоев контента, которые редактируются независимо; генератор сохраняет поведение (немодифицированный цикл визуализируется с точностью до пикселя), неизвестные операторы сохраняются без изменений, а встроенные изображения переносятся как есть.
Version 3.105.0
Добавлено
- Добавлен режим извлечения текста в порядке чтения: опция 9 в
GetPageTextвозвращает текст страницы в порядке визуального чтения с использованием рекурсивного анализа пробелов (XY-cut), поэтому многоколоночные макеты выводятся колонка за колонкой — сначала заголовок на всю ширину, затем весь левый столбец, затем правый столбец — вместо чередования столбцов строка за строкой, как это делают геометрические порядки «сверху, затем слева».
Version 3.104.0
Добавлено
- Добавлена интроспекция сертификата подписанта в верификатор подписи:
GetSignerCertificateдекодирует полезную нагрузку PKCS#7 первого поля подписи и возвращает типизированную сводку встроенного сертификата подписанта — отображаемые имена субъекта и издателя (issuer), серийный номер в обычном шестнадцатеричном формате, окно срока действия UTC (NotBefore/NotAfter) и флаг удобства, сообщающий, находится ли сертификат в настоящее время в этом окне; подписант сопоставляется среди встроенных сертификатов по издателю и серийному номеру.
Version 3.103.0
Добавлено
- Добавлен
NewRGBRadialShader, радиальный аналогNewRGBAxialShader: регистрирует именованный радиальный градиент с двумя кругами (ShadingType 3, ISO 32000-1 §8.7.4.5.3), смешивающий два цвета RGB, с опциональным расширением цвета за пределы кругов; выберите его с помощью существующихSetFillShader,SetLineShaderилиSetTextShaderдля рисования круглых «светящихся» заливок (glow fills), обводок и текста.
Version 3.102.0
Добавлено
- Добавлен рендеринг радиального градиента (ShadingType 3) (ISO 32000-1 §8.7.4.5.4): теперь рендерер страниц отрисовывает радиальные штриховки с двумя кругами, используемые операторами
shи заливками шаблона штриховки (shading-pattern), в дополнение к ранее поддерживаемым осевым градиентам (ShadingType 2); поддерживается как через растровые движки GDI+, так и через Cairo, с многошаговыми цветовыми функциями (multi-stop colour functions), цветовыми пространствами DeviceRGB/DeviceCMYK/DeviceN/Separation/ICCBased и обработкой/Extend.
Version 3.101.0
Добавлено
- Добавлены эффекты облачной границы (ISO 32000-1 §12.5.4):
SetAnnotCloudyEffectпревращает границу аннотаций Square, Circle, Polygon или FreeText в «облако ревизий» из соединенных полукругов путем записи словаря эффектов границы/BE, при этом интенсивность 1 или 2 соответствует стилям Cloudy в Acrobat, а 0 снова удаляет эффект;GetAnnotCloudyEffectсчитывает настройку обратно (0 = нет облака, иначе интенсивность от 1 до 2).
Version 3.100.0
Добавлено
- Добавлены состояния обзора аннотаций (review states, ISO 32000-1 §12.5.6.3):
AddAnnotationStateзаписывает изменение статуса ревью для существующей аннотации путем добавления скрытой текстовой аннотации (Text annotation), чей/IRTуказывает на цель, а/State+/StateModelнесут статус, поддерживая модельReview(None/Accepted/Rejected/Cancelled/Completed) и модельMarked(Unmarked/Marked), используемые рабочим процессом комментирования Acrobat;GetAnnotStateиGetAnnotStateModelсчитывают записанные строки обратно из любой аннотации (пусто, когда отсутствуют).
Исправлено
- Исправлен сбой во время загрузки, из-за которого приложения, собранные на последних разрабатываемых версиях (development versions), не запускались (поиск имени сертификата Windows был привязан к несуществующей точке входа DLL), а также исправлены регрессии компиляции в импорте комментариев FDF, повороте диапазона страниц и путях флагов подписи.
Version 3.99.0
Added
- Добавлены API для чтения отпечатков документов и переходов страниц:
GetDocumentFileIDвозвращает постоянный идентификатор документа из массива/IDв trailer (первый элемент в шестнадцатеричной кодировке), который полезен в качестве стабильного ключа кэша или отпечатка документа;GetPageTransition— это аналог для чтения дляSetPageTransition, возвращающий стиль перехода как типизированное значениеTPDFlibPageTransitionплюс продолжительность отображения и продолжительность перехода путем обратного сопоставления сохраненных записей/Trans/S,/Dmи/M
Version 3.98.0
Added
- Добавлены средства вращения диапазона страниц и интроспекции миниатюр:
RotatePageRangeприменяет вращение на 0/90/180/270 ко всем страницам в диапазоне (обертывая существующую функциюRotatePageдля одной страницы, поэтому вызывающим программам больше не нужен цикл по страницам);HasPageThumbnailсообщает, содержит ли страница запись/Thumb;GetPageThumbnailInfoсчитывает ширину, высоту и количество бит на компонент изображения XObject миниатюры
Version 3.97.0
Added
- Добавлены расширенные средства чтения свойств аннотаций:
GetAnnotColorсчитывает массив цветов/C(0..1 RGB, с флагом HasColor, отличающим «нет явного цвета» от «явный черный»);GetAnnotBorderWidthсчитывает/BS /W, возвращаясь к устаревшему массиву/Border;GetAnnotOpacityсчитывает альфа-канал штриха/CA(по умолчанию 1.0);GetAnnotCreationDateсчитывает метку времени/CreationDate;GetAnnotFlagsсчитывает байт флагов видимости/печати/F
Version 3.96.0
Added
- Добавлены API интроспекции безопасности для чтения:
IsEncryptedсообщает, содержит ли загруженный документ словарь/Encrypt;GetEncryptionLevelвозвращает типизированную стойкость (0=none, 1=RC4-40, 2=RC4-128, 3=AES-128, 4=AES-256, 5=AES-256 Acrobat X), соответствующую параметрам шифрования для записи;GetUserPermissionsвозвращает исходное слово разрешений/Pдля прямого битового тестирования;IsOwnerPasswordсообщает, был ли документ открыт с учетными данными владельца
Version 3.95.0
Added
- Добавлены функции расширенной печати и замены текста:
PrintDocumentAdvancedуправляет полнымDEVMODEпринтера (двусторонняя печать, ориентация, цвет, качество печати, размер бумаги, лоток для бумаги) в дополнение к копиям/сортировке через типизированную записьTPDFlibPrintSettings, применяя каждое поле, отличное от поля по умолчанию, через существующий механизм профиля пользовательского принтера;SearchAndReplaceTextвыполняет поиск в диапазоне страниц и для каждого совпадения маскирует исходный текстовый блок непрозрачным белым прямоугольником и перерисовывает текст замены в начале блока выбранным шрифтом вызывающей программы, отражая поведение наложения-замены в PDFtoolkit SearchAndReplace
Version 3.94.0
Added
- Добавлен обмен аннотациями FDF («Экспорт/Импорт комментариев» Acrobat):
ExportAnnotationsToFDFStringиExportAnnotationsToFDFобходят/Annotsкаждой страницы и сериализуют каждую аннотацию как запись/Type /Annotвнутри массива FDF/Annots, содержащую/Subtype,/Contents,/Rect, метку автора/T,/Subjи индекс/Page, начинающийся с нуля;ImportAnnotationsFromFDFStringиImportAnnotationsFromFDFанализируют такой FDF с помощью небольшой машины состояний и воссоздают каждую запись как новую аннотацию на соответствующей странице, сохраняя полный словарь аннотаций, а не сворачивая его в липкую заметку
Version 3.93.0
Added
- Добавлены API для сертификации подписей и свойств полей форм:
SetSignProcessDocMDPпревращает следующую подпись, созданную процессом подписания, в сертифицирующую (авторскую) подпись путем добавления преобразования DocMDP/Referenceна уровне 1/2/3 (без изменений / заполнение форм / аннотации) и установки бита AppendOnly в AcroForm/SigFlags;GetSigFlags/SetSigFlagsнапрямую читают и пишут необработанный байт AcroForm/SigFlags;GetFormFieldIsComb,GetFormFieldIsMultiLine,GetFormFieldJustificationиGetFormFieldAllowedValuesпредставляют биты стиля/Ffдля каждого поля, выравнивание текста/Qи массив выбора/Optкак типизированные значения
Version 3.92.0
Added
- Добавлены удобные API для экспорта вложений и полей форм:
SaveAllAttachmentsобходит единый список вложений (/EmbeddedFilesна уровне документа плюс аннотации/FileAttachmentна каждой странице) и записывает каждый поток в каталог под именем его спецификации файла, устраняя коллизии с помощью числового суффикса;RemoveFormFieldByNameпреобразует полное имя поля в его индекс и удаляет его;RenameFormFieldпереименовывает поле по имени без отдельного поиска индекса
Version 3.91.0
Added
- Добавлены API перечисления для всего документа:
EnumDocumentFontsобходит каждый словарь Font (сначала вызываяFindFonts, если необходимо) и возвращает одинTPDFlibDocumentFontна каждый шрифт с номером его объекта, именем/BaseFont, типом, кодировкой и статусом внедрения/подмножества, устраняя необходимость вызоваSelectFontдля каждой записи и запроса скалярных геттеров;EnumAttachmentsобъединяет дерево имен/EmbeddedFilesна уровне документа с аннотациями/FileAttachmentна странице в единый списокTPDFlibAttachment, записывая источник каждой записи, индекс источника (начиная с 1), имя файла, подтип MIME, описание и размер в байтах
Version 3.90.0
Added
- Добавлены API интроспекции только для чтения для аннотаций, закладок и версии документа:
GetPDFVersionвозвращает строку эффективной версии PDF (например,1.7);GetAnnotType,GetAnnotTitle,GetAnnotSubject,GetAnnotContentsEx,GetAnnotModifiedDate,GetAnnotNameиGetAnnotRectExпредставляют поля каждой аннотации в виде именованных оболочек (поэтому вызывающим программам больше не нужны магические номера Tag свойств) над существующим кэшемAnalyseAnnot;GetOutlineLevelвозвращает глубину закладки относительно корня структуры (outline), аGetOutlineIsOpenсообщает, развернута ли она в средстве просмотра (отрицательный/Countозначает, что она свернута), отражая состояние макета, которое будет отображать панель закладок
Version 3.89.0
Добавлено
- Добавлен модуль кодера изображений JBIG2
PDFlibJBIG2Enc(TPLJBIG2Encoder.EncodeToByteArray), портированный из родственного продукта HotPDF, с двумя бэкендами: на Win64 арифметический кодер C++jbig2enc(ITU-T T.88) линкуется статически черезPDFlibJBIG2EncC+HPDFCLibs(228 объектов leptonica/jbig2enc в директорииthirdparty/Win64x/) и регистрируется как бэкенд по умолчанию, соответствуя производственному пути HotPDF; на других платформах или когдаUseExternalEncoderимеет значение False, fallback-вариант на чистом Pascal сжимает двухуровневые (bi-level) сканлайны кодером CCITT G4 и оборачивает их в заголовки сегментов JBIG2 (тип информации о странице 48 + тип немедленной общей области 38) - Добавлен модуль кодера LZW
PDFlibLZWEnc(TPLLZWEncoder.Compress), который является аналогом-кодером для существующего декодераPDFlibLZW: он генерирует поток/LZWDecodeпо спецификации PDF с кодами переменной ширины 9..12 бит, семантикой ClearCode/EOI и стандартной для PDF EarlyChange, а также опциональным предиктором TIFF 2 (горизонтальное дифференцирование), так что прохождение через декодер и обратно (round-trip) восстанавливает исходные байты
Version 3.88.0
Добавлено
- Добавлен модуль кодера двухуровневых (bi-level) изображений CCITT Group 3 / Group 4 (T.6)
PDFlibCCITTEnc(TPLCCITTEncoder), аналог-кодер для существующего декодераPDFlibCCITT: он кодирует битовый массив (bitmap)pf1bitв поток байт CCITT G3 1D / G3 2D / G4 (T.6) с помощьюCompressImage/Execute, портирован из родственного продукта HotPDF (оба имеют лицензию losLab); это предоставляет недостающий кодер, поэтому монохромные данные изображения могут быть получены для выводаCCITTFaxDecode, а полная интеграция в конвейер изображений и вывод G4 дляRenderPageToMonochromeFileбудет добавлена позже
Version 3.87.0
Добавлено
- Реализована криптографическая проверка подписей для отсоединенных (detached) подписей PKCS#7:
TPDFlibSignatureVerifier.VerifySignature(ранее заглушка, возвращающаяvsUnknown) теперь пересчитывает дайджест документа по двум сегментам/ByteRangeи проверяет его на соответствие подписанному атрибутуmessageDigestи открытому ключу подписанта через Windows CryptoAPI (CryptVerifyDetachedMessageSignature), возвращаяvsValid/vsInvalidдля подфильтровadbe.pkcs7.detachedиETSI.CAdES.detached; это первый уровень проверки, охватывающий только целостность дайджеста и подписи (цепочка сертификатов, проверка отзыва CRL/OCSP и проверка токена временной метки RFC 3161 пока остаются за рамками и будут добавлены на последующих уровнях)
Version 3.86.0
Добавлено
- Добавлен обратный вызов (callback) для каждой закладки во время объединения: событие
OnMergeOutlineсрабатывает для каждой исходной закладки верхнего уровня в то время, какMergeFileList/MergeFileListFast/MergeFileListStrictсвязывает объединенное дерево закладок, позволяя вызывающей стороне переименовывать (Title) или пропускать (Skip=True) входящую закладку до того, как она попадет в целевой документ; обратный вызов получает индекс исходного документа (начиная с 0), что позволяет применять политики для конкретных документов
Version 3.85.0
Добавлено
- Добавлено подписание из системного хранилища сертификатов Windows:
SetSignProcessCertFromStoreразрешает сертификат подписанта из именованного хранилища ("MY"/"Root"/...) по простому отображаемому имени субъекта (обычно CN, совпадение без учета регистра; пустое имя выбирает первый сертификат с закрытым ключом) и повторно использует существующий конвейер подписания PKCS#7, поэтому документ можно подписать без предоставления файла.pfx/.p12; используйте в паре сSetSignProcessKeysetдля выбора междуCURRENT_USER(1) иLOCAL_MACHINE(2)
Version 3.84.0
Добавлено
- Добавлено встраивание программы шрифтов для уже загруженных документов:
EmbedMissingFontsобходит каждый словарь шрифтов (Font), читает соответствующую установленную в системе программу шрифта по имениBaseFontи записываетFontFile2илиFontFile3обратно, возвращая количество шрифтов, для которых была добавлена программа;EmbedFontProgramвстраивает один шрифт по имени, используя установленный в системе шрифт;EmbedFontProgramFromFileвстраивает один шрифт, используя предоставленный вызывающей стороной файл.ttfили.otfдля шрифтов, не установленных в системе - Добавлена функция
SetEmbedAllFonts, защита на стороне записи, которая преобразуетAddTrueTypeFontсEmbed=0вEmbed=1, чтобы вновь созданные документы не могли случайно ссылаться на невстроенные системные шрифты, в том числе за пределами режима PDF/A
Version 3.83.0
Добавлено
- Добавлены удобные API для рендеринга:
RenderPageToMonochromeFileвыполняет рендеринг страницы в 1-битное монохромное растровое изображение (для сценариев факса/архивирования/OCR), понижая качество с 24 бит через GDI-сглаживание полутонами (halftone dithering), без изменения ядра рендеринга;RenderPageRegionToFileвыполняет рендеринг только указанного дочернего прямоугольника страницы (“Left,Top,Width,Height”) в растровое изображение, подключая ранее отключенный конвейер ClipRenderPageToDCClip
Version 3.82.0
Добавлено
- Добавлен экспорт данных форм FDF:
ExportFormDataToFDFзаписывает имена и значения всех полей формы текущего документа в отдельный файл FDF (массив/Fields, обернутый в%FDF-1.2),ExportFormDataToFDFStringвозвращает строку той же структуры, что облегчает хранение данных формы отдельно от PDF или последующее объединение; байты, не относящиеся к ASCII, экранируются тремя восьмеричными цифрами согласно ISO 32000-1
Version 3.81.0
Добавлено
- Добавлены удобные API для страниц и структуры:
SetPageTransitionзаписывает эффект перехода презентации для указанной страницы (17 стандартных переходов/Trans, включая Split/Blinds/Wipe/Dissolve/Glitter и т.д.) и продолжительность отображения страницы;GetPageFontCount,GetPageFontIDперечисляют шрифты, на которые ссылается указанная страница;SetMeasurementUnitпринимает типизированное перечисление единиц измерения (добавляя twips и points к существующим пикселям/миллиметрам/дюймам), в комплекте с помощниками преобразования единиц измеренияConvertToPoints,ConvertFromPoints;SaveToFileOptionsиспользует одну запись для объединения параметров сохранения, таких как сжатие, линеаризация и сохранение даты изменения
Version 3.80.0
Добавлено
- Добавлены удобные API для безопасности и подписей:
EncryptFileExпринимает типизированный набор именованных разрешений (TPDFlibUserPermissions, различающий печать с низким разрешением, печать с высоким разрешением и другие 8 именованных битов разрешений) вместо исходного целого числа битов разрешений;TPDFlibSignatureVerifier.GetSignatureMetadataнапрямую считывает имя поля, Filter, SubFilter, время подписи, причину, местоположение, контактную информацию, подписанта и выполняет структурную проверку ByteRange из словаря подписи без необходимости декодирования PKCS#7;PrintDocumentExзадает количество копий для печати и способ сортировки (сопоставления) за один вызов
Version 3.79.0
Добавлено
- Добавлены удобные API для редактирования:
MaskRectрисует на указанной странице непрозрачный залитый прямоугольник для покрытия области (маскирование/редактирование);SetPageThumbnailFromFileнапрямую прикрепляет/Thumbстраницы из файла изображения без загрязнения состояния рисования потока содержимого;FlattenFormFieldsOnPageRangeсглаживает (flatten) все поля формы по диапазону страниц (внешний вид запекается в статическое содержимое, а активные поля удаляются);InsertAnnotationвставляет уже созданный словарь аннотации в указанную позицию;NewMarkupAnnotationза один шаг создает аннотацию разметки в виде выделения (highlight)/зачеркивания (strikeout)/подчеркивания (underline)/волнистой линии (squiggly) и записывает quad-точки, цвет и прозрачность;StampText,StampImageнаносят водяные знаки по диапазону страниц, поддерживая прозрачность, угол поворота и позицию наложения
Version 3.78.0
Добавлено
- Добавлены API текстового запроса и перечисления элементов страницы:
SearchTextвыполняет поиск по диапазону страниц по поисковому запросу, возвращая номер страницы и ограничивающий прямоугольник для каждого совпадения, поддерживая параметры чувствительности к регистру и поиска целых слов;EnumPageElementsперечисляет все текстовые блоки и встроенные элементы изображений на указанной странице, единообразно возвращая тип элемента, прямоугольник, текст, имя шрифта и ID изображения;GetTextInAreaEx— это версияGetTextInAreaс прямоугольником, возвращающая каждый текстовый блок и его ограничивающий прямоугольник в пределах области
Version 3.77.0
Добавлено
- Добавлены API самоанализа только для чтения, устраняющие прежнюю асимметрию «можно писать, нельзя читать»:
FindOutlineByTitleнаходит закладку по заголовку (поддерживает три глубины: только на том же уровне/только дочерние/всё поддерево),GetOutlineActionInfoиGetAnnotActionInfoвозвращают тип действия закладки или аннотации (GoTo/GoToR/URI/Launch/Named/JavaScript) в типизированной структуре, а также полезную нагрузку URI, JavaScript, имени файла,GetOutlineDestinationInfoвозвращает целевую страницу и тип Fit (XYZ/Fit/FitH/FitV/FitR/FitB/FitBH/FitBV) вместе с координатами,EnumSignatures,GetSignatureFieldCount,GetSignatureFieldInfoперечисляют поля подписи и сообщают, подписаны ли они
Version 3.76.3
Изменено
- Профиль Factur-X EXTENDED в демо E-Invoice теперь использует стандартное значение conformance и стандартный guideline ID, а счёт ZUGFeRD 1.0 добавляет суммовые элементы
ChargeTotalAmountиAllowanceTotalAmount; все 6 профилей теперь выдают вывод PDF/A-3b и PDF/A-3u, проходящий как veraPDF (соответствие PDF/A), так и Mustang (бизнес-правила электронных счетов)
Version 3.76.2
Исправлено
- Метаданные XMP гибридных счетов Factur-X/ZUGFeRD теперь объявляют схему расширения PDF/A (
pdfaExtension:schemas) для описания свойств счётаfx:; ранее отсутствие этого объявления приводило к тому, что сгенерированный PDF/A-3 оценивался валидаторами вроде veraPDF как несоответствующий
Изменено
- XML счёта в демо E-Invoice теперь включает электронные адреса продавца и покупателя, а также телефон продавца, что позволяет большему числу профилей проходить проверку бизнес-правил ZUGFeRD/Factur-X
- Каталог профилей, построение XML и поток генерации PDF/A-3 в демо E-Invoice вынесены в общую unit, которую совместно используют как GUI, так и новый инструмент тестирования внешнего валидатора
Version 3.76.1
Исправлено
- Исправлен сбой в демо E-Invoice при нажатии «Сгенерировать»: встроенные стандартные шрифты недоступны в режиме PDF/A, поэтому демо теперь встраивает шрифт TrueType для отрисовки страницы счёта
Изменено
- Демо E-Invoice убирает опцию PDF/A-3a (редко используется в электронном выставлении счетов), а профиль XRechnung теперь по умолчанию использует PDF/A-3u
Version 3.76.0
Изменено
- GUI демо E-Invoice теперь управляется данными: номер счёта, дата выставления, покупатель и продавец, чистая сумма, налоговая ставка и валюта редактируемы, а XML счёта точно соответствует видимым суммам на странице вместо фиксированного содержимого-заполнителя
- Демо генерирует структурно корректный XML счёта для каждого профиля: Factur-X, XRechnung и ZUGFeRD 2.0 используют структуру
CrossIndustryInvoice, тогда как ZUGFeRD 1.0 COMFORT использует собственную структуруCrossIndustryDocumentсо строковыми позициями, итогами по налогам и условиями оплаты - Суммы записываются в XML в фиксированном английском формате с десятичной точкой, чтобы локализованные разделители тысяч или запятые не нарушали схему, а пользовательский ввод экранируется перед записью
- Демо добавляет интерактивный предпросмотр XML, самопроверки содержимого на уровне профиля, разбор одноимённого внешнего отчёта о проверке
.validation.jsonи при генерации явно загружает intent вывода ICC sRGB из репозитория
Version 3.75.6
Добавлено
SetPDFAModeдобавляет режим7, который позволяет создавать метаданные PDF/A-3u и по-прежнему разрешает связанные файлы PDF/A-3; демонстрация E-Invoice GUI также предоставляет вариант PDF/A-3u, а профиль ZUGFeRD 2.0 BASIC теперь по умолчанию использует PDF/A-3u
Version 3.75.5
Добавлено
- Добавляет демонстрацию Delphi E-Invoice GUI, которая позволяет выбирать профили Factur-X, ZUGFeRD и XRechnung, создавать гибридные счета PDF/A-3, встраивать соответствующее имя XML-файла и guideline ID, запускать проверку контейнера в интерфейсе и показывать XMP-сведения счета, проблемы проверки и извлеченный XML
Version 3.75.4
Добавлено
- Добавляет поддержку связанных файлов PDF/A-3 и XML электронных счетов:
AddPDFA3AssociatedFileFromStringможет создавать связанные файлы Catalog/AFнапрямую из байтов в памяти,AddFacturXAssociatedFileFromStringможет записывать XML Factur-X, ZUGFeRD и XRechnung, синхронизировать метаданные XMP и проверять сочетание имени файла, профиля, пространства имен XMP и XML guideline ID, а сторона чтения получает APIs обнаружения, проверки, списка проблем и извлечения XML
Version 3.75.3
Исправлено
- Функция объединения PDF: локальные переменные
GlobalRootObjNum,GlobalRootGenNum,StructRootGlobalObjNumиStructRootGlobalGenNumприсваивались только внутри условных блоков, что вызывало предупреждения W1036 “variable might not be initialized” в компиляторах Delphi Win64 26 и 29 (RAD Studio 12 и 16); добавлена инициализация нулями в начале функции
Version 3.75.2
Исправлено
- Совместимость сборки с несколькими версиями: цикл
forв парсере шестнадцатеричных строк (PDFlibStruct) использовал управляющую переменнуюInt64, которую Delphi XE3/XE5 (компиляторы 26/27) отклоняют как неординарную; переписано как циклWhile, чтобы восстановить совместимость с RAD Studio 12 и 14 - Проверка Reference XObject (
PDFlibPDFUA): указатель на словарьDне инициализировался на ветке, где объект не был ни stream, ни dictionary, что вызывало подсказку компилятора на всех целевых платформах; ветка перестроена так, чтобы всегда присваиватьDперед проверкойAssigned CreateFontPackagewrapper (PDFlibFont): подавлял ложное W1035 “return value might be undefined” в Delphi ≤ XE8, одновременно избегая взаимной подсказки H2077 о мёртвом присваивании в более новых компиляторах, через защиту{$IF CompilerVersion}- Запись DPI для BMP и путь инкрементального сохранения PDF: заменены устаревшие вызовы
TStream.Seek(Longint, Word)на присваиванияPosition :=(PDFlibPDFium,PDFlibDocument)
Version 3.75.1
Исправлено
- Парсер многостраничных TIFF: защитная проверка завершения цикла от чрезмерно больших счётчиков страниц не срабатывала, потому что
FPageCountбыл объявлен какWord(максимум 65 535), из-за чего сравнение> 65535всегда было ложным; изменено наInteger, чтобы защита теперь корректно срабатывала на патологических файлах - Парсер charset CFF/Type 2 (Format 1 и Format 2): удалены мёртвые присваивания
Done := True, которые сразу предшествовалиBreakи потому никогда не читались, что устранило подсказки компилятора
Version 3.75.0
Безопасность
- Усилен разбор ненадёжных встроенных шрифтов (TrueType, Type 1, CFF и CMap) против записи за границы, неограниченной рекурсии charstring и чрезмерных выделений памяти из-за повреждённых данных шрифта
- Усилена защита декодеров изображений (PNG, GIF, TIFF, JBIG2 и CCITT Group 3 и 4) от чтения и записи за границами, переполнения целых в расчётах ширины и высоты и разыменования пустой палитры из вредоносных изображений
- Усилена защита фильтров потоков (LZW, ASCII85 и предикторов Flate) от чтения за пределами буфера, деления на ноль и незавершающихся циклов на специально созданных данных потока
- Усилен разбор cross-reference, document-rebuild и name-tree против доступа за границы и бесконечных циклов, вызванных некорректными или циклическими данными cross-reference
- Расшифровка AES-CBC теперь проверяет выравнивание блоков шифртекста и обнуляет буфер вывода, предотвращая утечку неинициализированной памяти кучи в расшифрованные строки и потоки
Исправлено
- Дайджесты отсоединённых подписей SHA-256, SHA-384 и SHA-512 теперь создаются с правильным криптографическим провайдером; ранее они возвращали пустой дайджест и приводили к недействительным подписям
- Декодирование ASCII85 и RC4 больше не возвращает неинициализированные данные и не вызывает исключение на усечённом вводе или пустом ключе
- Цвет фона GIF теперь читается с правильным синим каналом вместо дублирования зелёного канала
Version 3.74.1
Исправлено
- Исправлена ошибка компиляции E2010 incompatible-types в поддержке данных проверки подписи PAdES (VRI), из-за которой библиотека не компилировалась
- Устранено последнее предупреждение компилятора и подсказки о неиспользуемых переменных; все сборки trial и release для Win32 и Win64 теперь компилируются без предупреждений
Version 3.74.0
Добавлено
- Прямые пути к файлам для
EncryptFileиDecryptFileтеперь читают PDF, чьи данные cross-reference находятся в cross-reference stream, включая инкрементально обновляемые цепочки и hybrid-reference файлы с боковой секцией/XRefStm, вместо перехода на более медленный полный reader: защита AES-256 для эталонного документа объёмом 1.25 GB сократилась примерно с 4.4 до 2.5 секунды, а расшифровка — с примерно 1.7 до 1.3 секунды - Перезаписи, которые содержат объекты, хранящиеся в сжатых object streams, теперь выводят trailer cross-reference stream, сохраняя эти объекты адресуемыми в зашифрованном или расшифрованном выводе
Исправлено
- Ревизия без документа
/IDв файле с инкрементальным обновлением больше не стирает идентификатор, унаследованный от более ранней ревизии, во время прямой перезаписи
Version 3.73.2
Изменено
DASaveAsFileтеперь агрегирует свои записи вывода и находит закрывающее ключевое слово каждого объекта без поэтапных выделений строк, сокращая переписывание эталонного документа объёмом 2 GB и более чем с миллионом объектов примерно с 57 до 11 секунд
Version 3.73.1
Изменено
- Прямые пути к файлам для
EncryptFileиDecryptFileтеперь читают источник через скользящее окно и агрегируют записи вывода, так что защита AES-256 очень больших PDF с миллионами объектов работает в несколько раз быстрее: на эталонном документе 2 GB шифрование сократилось примерно со 123 до 32 секунд, а расшифровка — примерно со 127 до 23 секунд - Тела объектов, помещающиеся в окно чтения, больше не извлекаются с диска дважды во время прямой перезаписи AES-256
Исправлено
- Прямые перезаписи AES-256 для hybrid-reference PDF (файлов с записью
/XRefStmв trailer) теперь откатываются к полному reader вместо риска потерять сжатые объекты - Разбор cross-reference в прямом пути к файлу больше не читает всё от секции cross-reference до конца файла сразу, что могло исчерпать память на многогигабайтных файлах, чья цепочка
/Prevуказывает близко к началу файла, а сломанная цепочка/Prevтеперь откатывается к полному reader вместо вывода неполного документа
Version 3.73.0
Добавлено
- Демо SigningWorkbench теперь выполняет полную криптографическую проверку дайджеста для отсоединённых CMS-подписей (
adbe.pkcs7.detachedиETSI.CAdES.detached) через Windows CryptoAPI: подписанные диапазоны байтов повторно хешируются и сверяются с CMS-подписью, изменённый документ помечается новым кодом отказа SG203, а каждая подпись получает полеdigestValidс тремя состояниями в отчётах JSON, CSV и HTML - Новые переключатели автоматизации SigningWorkbench:
--quietвыводит только сводку пакета и пути к отчётам,--fail-fastостанавливает пакет на первом сбойном файле, а JSON-отчёт теперь записывает версию библиотеки
Version 3.72.0
Добавлено
- Демо ComplianceWorkbench получает профессиональные пакетные рабочие процессы:
--policy-fileзагружает политику аудита из JSON-файла, чтобы команды могли версионировать и делиться своими правилами документов,--baselineсравнивает запуск с более ранним compliance-report.json и перечисляет новые сбои, исправленные файлы и файлы, которые по-прежнему не проходят проверку, а--preflight-detailsвстраивает строки проблем preflight в отчёты JSON и HTML - Новые переключатели автоматизации ComplianceWorkbench:
--quietвыводит только сводку пакета и пути к отчётам,--fail-fastостанавливает пакет на первом сбойном файле, а JSON-отчёт теперь записывает версию библиотеки
Version 3.71.2
Исправлено
AppendToFileснова добавляет инкрементальные обновления в тот же PDF-файл, который был загружен с помощьюLoadFromFile; потоковый загрузчик теперь удерживает исходный файл доступным для чтения, не блокируя дескриптор записи, необходимый для обновления
Version 3.71.1
Добавлено
- Отчёты ComplianceWorkbench и SigningWorkbench теперь включают метки серьёзности находок, поля максимальной серьёзности по файлу, сводки частоты серьёзности по пакету и совпадающий вывод JSON, CSV, HTML и консоли для более быстрой сортировки по политике
Version 3.71.0
Добавлено
- Проверка в демо SigningWorkbench теперь сообщает порядок ревизий и уровень сертификации DocMDP каждой подписи, помечает слабые алгоритмы сертификатных подписей MD5/SHA-1 и устаревший SubFilter adbe.pkcs7.sha1 с помощью
--forbid-weak-digest(SG303/SG405), самоподписанные сертификаты с--forbid-self-signed(SG406), документы без сертификационной подписи с--require-certified(SG304) и всегда проверяет, лежит ли время подписи внутри срока действия сертификата (SG407) - Режим подписания SigningWorkbench теперь использует API процесса подписи с новыми переключателями
--subfilter(sha1, detached или cades для подписей PAdES baseline signatures) и--digest(отautoдо sha512), а современныйadbe.pkcs7.detachedс SHA-256 теперь является настройкой подписания по умолчанию - Новый доступ только для чтения
TPDFlibSignDoc.GetSignatureDocMDPLevelByNameвозвращает уровень сертификации DocMDP для поля подписи по ISO 32000-1 §12.8.2.2
Version 3.70.0
Добавлено
- Демо ComplianceWorkbench теперь также применяет политики разрешений, метаданных и размера:
--require-print-allowedи--require-copy-allowedпроверяют биты разрешений документа (PC205/PC206),--require-authorи--require-creation-dateпроверяют полноту метаданных (PC306/PC307), а--max-pagesи--max-file-sizeограничивают масштаб документа (PC308/PC309) - Профиль archive теперь также требует автора и дату создания, а профиль accessible требует разрешение на копирование, на которое опираются вспомогательные технологии
- Отчёты ComplianceWorkbench теперь собирают сводку частоты кодов отказа по всему пакету, а метрики по файлу включают автора, дату создания, размер файла и состояния разрешений на печать и копирование
Version 3.69.1
Исправлено
DecryptFileснова снимает шифрование с документов, защищённых AES-128 и RC4, включая документы, которые содержат только пароль владельца; начиная с v3.67.4 быстрый путь для больших файлов ошибочно сообщал о таких документах как о защищённых неверным паролем (error 404) вместо передачи их обычному пути расшифровки, тогда как документы AES-256 не затрагивались
Version 3.69.0
Добавлено
- Новый Delphi-демо SigningWorkbench: консольный инструмент для работы с подписями и сертификатами, который проверяет поля подписи одного PDF или целого каталога (SubFilter, время подписи, покрытие ByteRange и сертификат подписи с проверками срока действия), пакетно подписывает PDF с сертификатом PKCS #12 и проводит аудит файлов PFX; каждое нарушение сопоставляется со стабильным кодом сбоя политики (SG101–SG501), а результаты записываются как отчёты JSON, CSV и HTML с локализованными руководствами для демо на всех 18 языках документации
- Новые методы доступа только для чтения подписи на
TPDFlibSignDoc:GetSignatureFieldNamesперечисляет поля подписи документа,GetSignatureTextValueByNameвозвращает время подписи /M, записи /Name, /Reason, /Location, /ContactInfo и /Type (с расшифровкой для зашифрованных документов), аGetSignatureValueByNameвозвращает /Filter, /SubFilter, /Contents и записи ByteRange по имени поля
Исправлено
- Исправлен импорт Windows CryptoAPI
CertCloseStore, который был объявлен без параметра flags и мог повредить стек вызывающего кода в Win32 при закрытии хранилища сертификатов
Version 3.68.0
Добавлено
- Новый Delphi-демо ComplianceWorkbench: консольный инструмент пакетного аудита политик, который проверяет один PDF или целый каталог на соответствие настраиваемой политике соответствия, охватывающей preflight PDF/A и PDF/UA, правила шифрования, диапазон версий PDF, Tagged PDF, linearization и заголовок документа, сообщает о каждом нарушении стабильным кодом сбоя политики (PC101–PC501) и записывает отчёты JSON, CSV и HTML с кодами выхода, удобными для автоматизации
- В новой поставке демо есть профили политик, которые объединяют распространённые наборы требований—archive, accessible, secure и web—с явными переключателями командной строки, переопределяющими значения профилей, и включают локализованные руководства для демо на всех 18 языках документации
Version 3.67.4
Изменено
EncryptFileиDecryptFileтеперь используют прямой путь переписывания AES-256 для больших PDF с classic-xref, передавая зашифрованные данные между файлами потоком вместо загрузки и повторной сериализации каждого объекта; эталонный файл 2 GB теперь завершает файловое шифрование и расшифровку AES-256 через Direct File API с кодом результата 1 иLastErrorCode0
Исправлено
- Исправлена обработка строковых токенов direct AES-256, чтобы разделители словаря не принимались за шестнадцатеричные строки, а зашифрованные пустые строки корректно расшифровывались
Version 3.67.3
Изменения
- Демонстрации Delphi и C++Builder для DrawShapes, CreateWithImage, CreateTable, EditFormField и EmbeddedFonts расширены: создаваемые PDF теперь показывают практические рабочие процессы рисования, размещения изображений, компоновки таблиц, оформления полей форм и сравнения встраивания шрифтов вместо минимального вывода одной операции
Исправления
- Демонстрация CreateTable теперь задаёт явный размер страницы A4 перед отрисовкой таблицы, избегая прежней неинициализированной переменной размера страницы в примере Delphi
Version 3.67.2
Исправлено
- Исправлена регрессия из ленивого обнаружения на стороне загрузчика, введенного в v3.67.0: обнаружение возможностей содержимого могло запускаться при сохранении и перезаписывать явно запрошенную версию сохранения (SetInformation 0) или заблокированную версию (LockSaveVersion), поэтому строгое сохранение в более низкую версию больше не отклоняло содержимое более высокой версии, а заблокированная версия могла повышаться; теперь обнаружение выполняется до любой явно заданной версии и никогда не запускается для документов, которые были созданы, а не загружены, восстанавливая поведение управления версиями до v3.67.0 и сохраняя выигрыш от ленивой загрузки
Version 3.67.1
Изменено
- Обнаружение возможностей теперь читает stream-объекты с помощью поверхностного разбора, который проверяет только словарь объекта и пропускает тело stream, поскольку сканирование никогда не анализирует содержимое stream; в документах с большими потоками изображений это избегает чтения байтов тела во время обнаружения, сокращая время чтения объектов за один проход обнаружения примерно на 40% (около 13 s вместо 20 s для файла 2 GB с 1,6 млн объектов), при этом список обнаруженных возможностей и эффективная версия PDF остаются идентичными
Version 3.67.0
Изменено
- Определение признаков содержимого на стороне загрузчика теперь выполняется отложенно (lazy) – вместо сканирования всего документа при загрузке оно запускается при первом использовании, когда запрашивается действующая версия PDF или список обнаруженных признаков либо когда документ сохраняется; операции только для чтения, такие как подсчёт страниц, извлечение текста или изображений и рендеринг, которые никогда не запрашивают версию и не пересохраняют, полностью пропускают сканирование, сокращая время загрузки очень больших документов примерно на 80% (около 10 с вместо 56 с для файла размером 2 ГБ с 1,6 миллиона объектов), при этом набор обнаруженных признаков и действующая версия PDF остаются идентичными после выполнения определения
Version 3.66.1
Изменено
- Загрузка очень больших многостраничных документов теперь существенно быстрее: определение признаков содержимого на стороне загрузчика пропускает проверки правил, которые не могут изменить результат – как уже сработавшие правила, так и правила, неприменимые к данному объекту – что сокращает время загрузки огромных файлов примерно вдвое, сохраняя обнаруженные признаки и действующую версию PDF идентичными
Version 3.66.0
Изменено
- Загрузка очень больших многостраничных документов теперь требует значительно меньше памяти в пике. Определение признаков содержимого на стороне загрузчика больше не материализует всю объектную модель целиком – вместо этого оно последовательно считывает объекты по одному через ридер с произвольным доступом – сокращая пиковый working set примерно на 90 % для огромных файлов при сохранении выявленных признаков и действующей версии PDF.
Version 3.65.0
Добавлено
- Теперь можно открывать документы размером более 2 GB. Прежний буфер в памяти, ограничивавший размер документа примерно 2 GB, удалён.
Изменено
- При загрузке PDF из файла данные объектов теперь читаются из источника по требованию, вместо буферизации всего документа в памяти, что значительно снижает пиковое использование памяти для больших файлов.
- Документ, загруженный из файла, удерживает этот файл открытым с общим доступом на чтение, пока документ не будет закрыт или очищен.
Исправлено
- Повышена устойчивость при загрузке документов, содержащих ведущие байты перед заголовком %PDF-, и при обработке некорректных данных cross-reference.
Version 3.64.0
Изменено
- Операции Direct API с очень большими или насыщенными объектами PDF-файлами – EncryptFile, DecryptFile и DASaveAsFile – теперь работают значительно быстрее и больше не зависают. Документ размером 2 GB примерно с 1,6 миллиона объектов, который ранее не удавалось обработать, теперь шифруется примерно за минуту, а время обработки растёт приблизительно линейно с размером документа, а не резко ухудшается с ростом числа объектов.
- Шифрование больших документов стало значительно быстрее – операция, которая ранее занимала много минут, теперь выполняется за секунды или примерно за минуту – без изменения стойкости шифрования, совместимости шифротекста и выходных данных.
Version 3.63.0
Исправлено
- Исправлен аварийный сбой процесса при загрузке больших PDF-файлов, внутренние байтовые смещения которых превышают 32-битную границу (около 2 GB); загрузчик теперь повсеместно использует 64-битные смещения, поэтому файлы размером около 2 GB загружаются надёжно, а файлы размером 2 GB и больше корректно сообщают об ошибке загрузки вместо аварийного завершения.
Version 3.62.0
Изменено
- Шифрование и расшифрование AES-256-CBC теперь используют аппаратно ускоренный путь AES-NI и в 32-разрядной Windows, а не только в 64-разрядной, по-прежнему с автоматическим переходом на переносимую реализацию на C на процессорах без AES-NI. Шифртекст не изменяется ни на одной платформе.
Version 3.61.0
Изменено
- Шифрование и расшифрование AES-256-CBC теперь используют аппаратно ускоренный бэкенд AES-NI в 64-разрядной Windows с автоматическим переходом на переносимую программную реализацию на процессорах без AES-NI. Шифртекст идентичен на всех платформах; изменяется только скорость парольного шифрования PDF AES-256.
Version 3.60.0
Добавлено
MergeFileListтеперь объединяет деревья логической структуры (Tagged PDF) входных документов в единое достижимое дерево структуры вместо того, чтобы сохранять только дерево первого документа, оставляя остальные недостижимыми объектами. Элементы структуры верхнего уровня, parent tree (с переотображёнными ключами страницы/StructParentsи аннотации/StructParent),/RoleMap,/ClassMapи/IDTreeобъединяются, а объединённый каталог помечается как Tagged (/MarkInfo /Marked true).
Изменено
- При объединении документов с конфликтующими ключами
/RoleMap,/ClassMapили/IDTreeсохраняется первое вхождение. Быстрый путь (MergeFileListFast) по-прежнему отбрасывает информацию о структуре.
Version 3.59.0
Изменено
MergeFileListтеперь объединяет документы за один проход (O(N) вместо O(N²)), что значительно ускоряет объединение множества файлов; также он получает объединение закладок из нескольких документов, добавленное в быстрый путь.- По умолчанию
MergeFileListтеперь пропускает нечитаемые или зашифрованные входные файлы и продолжает объединять остальные, вместо того чтобы прерывать всю операцию на первом неисправном файле. Используйте новуюMergeFileListStrict, чтобы восстановить прежнее поведение с остановкой при первом сбое. - Объекты логической структуры (Tagged PDF) из входных файлов теперь сохраняются в
MergeFileList(быстрый путь по-прежнему их отбрасывает).
Добавлено
MergeFileListStrictобъединяет список файлов, но останавливается на первом нечитаемом или зашифрованном файле, сохраняя строгую семантику остановки при сбое из предыдущих версий.
Version 3.58.0
Добавлено
MergeFileListFastтеперь объединяет закладки (структуру) документа из всех входных файлов, поэтому быстрый путь объединения сохраняет закладки в дополнение к полям форм AcroForm.- Объединённые закладки сохраняют свою иерархию и переходы на страницы; число закладок верхнего уровня в объединённом результате равно сумме входных файлов.
Version 3.57.1
Изменено
- Сохранение через Direct File API (
DASaveAsFile,DASaveToStream,DASaveCopyToStream) теперь значительно быстрее для очень больших документов: неизменённые объекты копируются напрямую из исходных байтов, а не разбираются и сериализуются заново. Повторное сохранение документа на 60 000 страниц / 883 МБ сократилось примерно с 33 секунд до около 23 секунд.
Version 3.57.0
Изменено
- Производительность
TPDFlib.MergeFileListFastпри слиянии нескольких документов оптимизирована ещё больше: неизменённые объекты без потоков в добавляемых документах теперь напрямую повторно используются из их исходных байтов с побайтовым смещением косвенных ссылок, что позволяет пропустить цикл разбора и повторной сериализации и повысить пропускную способность при работе с многостраничными документами. Результат слияния остаётся неизменным, с идентичным количеством страниц. - Объекты, содержащие потоки или принадлежащие дереву структуры, продолжают использовать существующий путь декодирования, поэтому более быстрый побайтовый путь применяется только там, где это доказуемо безопасно.
Version 3.56.44
Изменено
TPDFlib.MergeFileListFastоптимизирован за счет предварительного выделения метаданных объединения и записи неизмененных объектов первого документа из исходных данных. Это уменьшает нагрузку на память и лишнюю работу декодирования/вывода объектов при быстром объединении нескольких файлов.- GUI Delphi
MergePDFтеперь пакетно записывает результаты быстрого режима и избегает повторного сканирования всего текста memo, поэтому большие входные списки остаются более отзывчивыми после завершения объединения.
Version 3.56.43
Изменено
- Оптимизирован обычный путь объединения
TPDFlib.MergeFileList: промежуточные временные файлы теперь чередуются вместо копирования растущего объединенного PDF перед каждым дополнительным входным файлом. Это снижает дисковый ввод-вывод в сценариях с несколькими файлами и сохраняет существующий контракт возвращаемого счетчика.
Version 3.56.42
Добавлено
- Добавлены регрессионные AES-тесты для случаев, когда входной буфер и результат являются одним и тем же объектом при откате зашифрованных stream во время сохранения, включая большие payloads 504 KB, которые раньше выявляли сбой.
Изменено
- Обычный сценарий API
LoadFromFile,Encrypt,SaveToFile, повторная загрузка,DecryptиSaveToFileснова завершается для больших загруженных PDF, сохраняя оптимизацию расшифровки AES-CBC с уменьшенным копированием.
Исправлено
- Исправлен буферный путь расшифровки AES-256, добавленный в v3.56.41: вызывающий код теперь может записывать результат расшифровки обратно в тот же
AnsiString, который предоставил буфер шифротекста, без нарушения доступа.
Version 3.56.41
Добавлено
- Добавлен
TPDFlib.DACopyFileдля рабочих процессов Direct Access, которым нужны число страниц и неизмененная копия файла без построения полного обычного графа объектов. - Demo Delphi
HugeFileBenchmarkтеперь включает строкуdirect-copy, а также фильтры--opsи--skipдля целевых запусков на больших файлах.
Изменено
- Оптимизировано расшифрование AES-256 за счет буферных путей AES-CBC, используемых при расшифровании загруженных строк и stream, что уменьшает дополнительное копирование шифртекста для больших зашифрованных stream.
Version 3.56.40
Изменено
- Демонстрации
HelloWorldдля Delphi и C++Builder теперь создают более содержательный стартовый PDF с информацией о документе, выводом выбранным стандартным шрифтом, оформленным заголовочным блоком, простой векторной графикой и подсказками для следующих шагов, сохраняя тот же сценарий сборки и запуска. - Все заметки к демонстрациям Delphi и C++Builder заменены удобными для браузера страницами
Readme.html, включая вспомогательные заметки о паролях, ограниченных файлах и результатах подписи; индексы демонстраций теперь направляют пользователей к HTML-заметкам.
Version 3.56.39
Изменено
- Пути сохранения прямого файлового API теперь линейно строят таблицы поиска перекрестных ссылок, поэтому
DASaveAsFileи связанные пути прямого сохранения работают намного быстрее с PDF, где очень много объектов или плотные деревья страниц. - Оптимизированный writer сохраняет ту же семантику цепочки свободных объектов и избегает повторных сканирований номеров объектов при полной генерации xref, ускоряя крупные рабочие процессы прямого сохранения без изменения публичного API или контракта вывода.
Version 3.56.38
Изменено
- Рабочий процесс обычного API
LoadFromFile,Encrypt,SaveToFile, повторная загрузка,DecryptиSaveToFileтеперь сохраняет состояние шифрования до явногоDecrypt, совпадая с поведением API прямого доступа к файлам для больших устаревших PDF.
Исправлено
- Исправлен вывод шифрования обычного API:
Encryptтеперь создает или сохраняет trailer/IDдо записи данных безопасности AES-256, поэтому зашифрованные PDF после повторной загрузки снова определяются черезEncryptionStatus.
Version 3.56.37
Добавлено
- Добавлена функция
TPDFlib.ComparePreflightReports, построчный компаратор для текстовых preflight-отчетов, который игнорирует изменяемые строки временной меткиGenerated:и возвращает пустую строку, когда стабильное содержимое отчета совпадает. - Демонстрация Delphi
PreflightReportтеперь поддерживает--compare <file>в однофайловом режиме, записывает UTF-8-отчет.diff.txtи возвращает код выхода 2, если созданный текстовый отчет отличается от baseline.
Version 3.56.36
Добавлено
- Демонстрационная программа Delphi
PreflightReportтеперь поддерживает пакетную обработку каталогов с--input-dir,--output-dirи--recursive, создавая по одному отчету на PDF с именем<basename>.preflight.<ext>.
Изменено
- Пакетный режим записывает UTF-8 файл
preflight-summary.csv, где указаны каждый исходный PDF, статус pass/fail, количество проблем и путь к созданному отчету, сохраняя существующий контракт кодов выхода для автоматизации.
Version 3.56.35
Добавлено
ReportFormat = 3добавляет вывод CSV вTPDFlib.CreatePreflightReportExиTPDFlib.SavePreflightReportEx, создавая строки UTF-8 для метаданных отчета, каждой выбранной проверки соответствия, отдельных кодов и сообщений о проблемах, а также итоговой сводки.- Демонстрационная программа Delphi
PreflightReportтеперь поддерживает--format csvи--csv, поэтому командные preflight-запуски могут передавать данные в электронные таблицы или простые CI-парсеры без постобработки JSON или извлечения текста.
Version 3.56.34
Добавлено
- Добавлены API с выбором формата
TPDFlib.CreatePreflightReportExиTPDFlib.SavePreflightReportExдля создания preflight-отчетов PDF/A и PDF/UA-1 в виде обычного текста, JSON или автономного HTML при сохранении существующих текстовых API. - Демо Delphi
PreflightReportтеперь поддерживает--format text|json|html, а также сокращения--jsonи--html, поэтому один и тот же командный workflow может создавать отчеты для чтения человеком или машинно-читаемые CI-артефакты.
Version 3.56.33
Добавлено
- Добавлены
TPDFlib.CreatePreflightReportиTPDFlib.SavePreflightReport, чтобы приложения могли создавать переиспользуемые текстовые отчеты на основе встроенных проверок соответствия PDF/A и PDF/UA-1 без ручного перебора дескрипторов строковых списков.
Изменено
- Демо Delphi
PreflightReportтеперь напрямую вызывает API отчетов библиотеки, поэтому пример остается сфокусированным на командной строке, выбранных проверках, режиме первой ошибки и кодах выхода, удобных для автоматизации.
Version 3.56.32
Добавлено
- Добавлен новый консольный пример Delphi
PreflightReport: он запускает проверки PDF/A и PDF/UA-1 черезCheckFileCompliance, перечисляет списки проблем с помощьюGetStringListCountиGetStringListItemи записывает текстовый preflight-отчет.
Изменено
- Пример поддерживает параметры
--input,--output,--pdfa,--pdfua,--bothи--first-issue, а также коды завершения для автоматизации: проверка пройдена, проблемы найдены и ошибка выполнения.
Version 3.56.31
Изменено
GetCustomKeys(2)теперь последовательно скрывает системные записи каталога, управляемые библиотекой, включая/OutputIntents,/Extensions,/Requirements,/Collectionи/NeedsRendering.
Исправлено
- Настройки PDF/A, создаваемые функцией
SetPDFAMode, больше не отображаются в виде пользовательских ключей каталога, что позволяет разделить перечисление метаданных приложения от структур, обеспечивающих соответствие стандарту PDF.
Version 3.56.25
Изменено
- Функция 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.
Version 3.56.24
Изменено
- Функция аудита PDF/UA-1 теперь включает проверку уникальности тегов H ISO 14289-1 §7.4.4.
10044сообщает о любом узле структуры, содержащем более одного непосредственного дочернего элемента H —, что запрещено спецификацией для документов со строгой структурой, и это ограничение применяется к любому узлу дерева тегов независимо от общего режима структуры. Другое требование § 7.4.4 (документ должен быть либо со строгой, либо со слабой структурой, но не и то, и другое) требует эвристики на уровне всего документа и намеренно не включена в эту проверку. - Новый обход дерева структуры в порядке обхода (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness) подсчитывает непосредственные дочерние элементы H для каждого узла и рекурсивно обходит дерево в глубину. Использует тот же декодер K-образной формы, что и существующие обходы заголовков / списков / заметок.
Version 3.56.23
Добавлено
- Новая
Lib/PDFlibPDFUAFontInspect.pasреализует толерантный сканер каталога таблиц и парсер каталога подтаблиц cmap. Таблица списка глифов Adobe с 4281 именем, добавленная в качестве основы в предыдущем коммите инфраструктуры, теперь подключена через проверку Differences. Программы, которые не анализируются как SFNT (шрифт Type 1 PFB / PFA, OpenType коллекция, произвольный мусор), немедленно пропускаются. В слое аудита предпочтительнее ложные отрицательные результаты, чем ложные положительные.
Изменено
- Аудит 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.
Version 3.56.22
Изменено
- Аудит 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.
Version 3.56.21
Добавлено
- Новый
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; вызывающая сторона несет ответственность за то, чтобы не устанавливать оба значения одновременно.
Version 3.56.20
Добавлено
- Новая функция
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, могли распознать структуру без повторной обработки родительского пути.
Version 3.56.19
Добавлено
- Новый 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место. - Новый
SetSignProcessReserveContentsBytesрасширяет/Contentsместо в момент первоначальной подписи, чтобы добавленная после этого расширенная CMS поместилась без переполнения исходного резерва. Типичные TSA-выпущенные TimeStampTokens добавляют 2-6 KB к SignerInfo; укажите 1024-8192, чтобы оставить запас. Если запаса недостаточно, вызов расширения возвращает13(переполнение вывода).
Изменено
BuildPAdESSignatureTimeStampAttribute- это помощник, не требующий состояния, который оборачивает TSA-выпущенный TimeStampToken в атрибут CMS, которыйSignerInfo.unsignedAttrsожидает, поэтому вызывающие, у которых уже есть CMS библиотека, могут пропустить OID + SET этапов настройки.- Библиотека не поставляется с 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 путь к байтам.
Version 3.56.18
Добавлено
- Новые помощники ASN.1
DER_IntegerFromLittleEndian(обрабатывает порядок байтов Win32CRYPT_INTEGER_BLOB) иDER_ContextTagExplicit(оборачивает полезную нагрузку в контекстно-специфический тег) дополняют микро-кодировщикPDFlibASN1. Новые объявленияCERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXTвPDFlibCryptoAPIпредоставляют пути подписи доступ к проанализированным полям сертификата.
Изменено
- Атрибут 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.
Version 3.56.17
Добавлено
- Новый модуль
PDFlibASN1предоставляет узконаправленный DER (X.690) микро-энкодер — длину-префикс, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER — используемый для построения значения атрибутаSigningCertificateV2. Энкодер следует стандартным правилам для дуг OID в base-128 и опускает необязательное полеhashAlgorithm, когда оно лишь повторяло бы значение по умолчанию SHA-256, что совпадает с поведением OpenSSL и BouncyCastle.
Изменено
- Встроенный путь подписи
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несёт только требуемые атрибуты и ничего сверх. 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).
Version 3.56.16
Добавлено
- Новый
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.
Version 3.56.15
Добавлено
- Новый
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 без дополнительной разводки.
Version 3.56.14
Добавлено
- Новый 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.
Version 3.56.8
Изменено
- Базовое соответствие 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.
Version 3.56.13
Изменено
- Когда 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 замаскирует проблему во время сохранения, так что пользователи понимают и отсутствующий атрибут, и автоматическое поведение исправления.
Version 3.56.12
Изменено
- Аудит 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-словари.
Version 3.56.11
Изменено
- 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-тегу нужно одно из этих.
Version 3.56.10
Изменено
- Аудит 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.
Version 3.56.9
Изменено
- Аудит 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. Это избегает двойного подсчёта одного и того же нарушения под обоими кодами.
Version 3.56.7
Изменено
- Когда 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 автоматически удаляет их при сохранении.
Version 3.56.6
Изменено
- Аудит 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".
Version 3.56.5
Изменено
- Когда 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.
Version 3.56.4
Изменено
- 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 строковый список).
Version 3.56.3
Изменено
- Аудит 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, и наоборот.
Version 3.56.2
Изменено
- Аудит 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) по количеству объектов.
Version 3.56.1
Изменено
- Аудит 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-поверхности нет.
Version 3.56.0
Добавлено
- Новый 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-релизов поверх того же фреймворка аудита.
Version 3.55.6
Изменено
- Каждый свежесгенерированный 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.
Version 3.55.5
Изменено
- У 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, чтобы не оставить неоднозначности для валидатора.
Version 3.55.4
Изменено
- 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) помечают любой несоответствующий вывод во время валидации.
Version 3.55.3
Изменено
- Словари шрифтов 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) пометят отсутствие, так что пользователи увидят проблему во время валидации.
Version 3.55.2
Изменено
- 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), обеспечивает вторую линию защиты во время валидации для любого непрямого пути, который всё же протолкнёт запрещённый фильтр в вывод.
Version 3.55.1
Изменено
- 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.
Version 3.55.0
Изменено
- Документы 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).
Version 3.54.0
Изменено
- 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.
Version 3.53.0
Изменено
- Словарь 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.
Version 3.52.0
Изменено
- 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.
Version 3.51.0
Изменено
- 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 префикса.
Version 3.50.0
Изменено
- 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.
- 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.
Исправлено
- 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, теперь распознаются валидатором.
Version 3.49.0
Изменено
- 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).
Version 3.48.0
Изменено
- 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).
Version 3.47.0
Изменено
- 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-интерфейсах.
Version 3.46.1
Изменено
- 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.
Version 3.46.0
Изменено
- 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 вычисляется автоматически из объединённого диапазона всех штрихов плюс небольшой отступ, чтобы штрихи оставались внутри ограничивающего прямоугольника аннотации.
Version 3.45.0
Изменено
- 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 при выводе под более низкой блокировкой минимальной версии.
Version 3.44.1
Изменено
- 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 аннотации вычисляется из двух конечных точек плюс отступ, пропорциональный ширине рамки, чтобы декорации концов оставались внутри ограничивающего прямоугольника аннотации.
Version 3.44.0
Изменено
- 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 могут редактировать их после создания.
Version 3.43.0
Изменено
- 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-чисел. Исправление применяется к ветвям атрибутов с одним и несколькими владельцами.
Version 3.42.0
Изменено
- Добавлены три новые проверки соответствия: код 00006 помечает зашифрованные документы (шифрование запрещено во всех версиях PDF/A); код 00007 помечает документы, в которых отсутствует запись OutputIntents в каталоге (требуется во всех версиях PDF/A); коды 00011 и 00012 помечают документы, в которых отсутствует MarkInfo или StructTreeRoot, когда уровень соответствия — -a (доступность).
Исправлено
- 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 разрешают слои и больше не помечаются.
Version 3.41.0
Изменено
- Режим 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), который явно разрешает произвольные встроенные файлы.
Version 3.40.0
Добавлено
- 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 с тегами, необходимые для уровня соответствия доступности.
Изменено
- GetInformation(201) возвращает '1' - '6', соответствующее активному режиму PDF/A, в соответствии с новой нумерацией режимов.
Исправлено
- Исправлено: SetPDFAMode(1) (PDF/A-1a) ранее был no-op из-за внутренней ошибки маршрутизации, введённой в v3.20.0. Теперь корректно записывает /MarkInfo и /OutputIntents и устанавливает XMP pdfaid:part=1/conformance=A.
Version 3.39.0
Изменено
- 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-интерфейсах.
Version 3.38.0
Изменено
- 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 для полностью описанных ячеек таблиц в сложных таблицах или таблицах с охватывающими заголовками.
Version 3.37.2
Изменено
- GetPDFUADiagnostics теперь сообщает FORM-NO-TOOLTIP:N, когда N интерактивных полей форм (аннотации Widget) не имеют записи TU (всплывающая подсказка / доступное имя). ISO 14289-1 §7.18.4 требует, чтобы все интерактивные поля форм содержали запись TU, чтобы вспомогательная технология могла объявлять назначение поля пользователю при получении полем фокуса. /TU — это доступное имя, которое произносят программы чтения с экрана; оно отличается от /T, которое является частичным именем поля, используемым для программного доступа и отправки форм.
Version 3.37.1
Изменено
- GetPDFUADiagnostics теперь сообщает LIST-STRUCT:N, когда N структурных элементов LI или LBody находятся вне их обязательного родительского элемента. ISO 32000-1 §14.8.4.4 требует, чтобы LI был прямым потомком L (list), а LBody — прямым потомком LI (list item). Неправильно вложенные списки не позволяют вспомогательным технологиям корректно обходить и объявлять содержимое списка и могут вызывать сбои проверки структуры документа в валидаторах PDF/UA-1.
Version 3.37.0
Изменено
- BeginTagEx2 — новый API, который открывает структурный элемент и устанавливает все основные свойства элемента за один вызов. В дополнение к параметрам TagType, AltText, ActualText и Lang функции BeginTagEx, BeginTagEx2 принимает Title (/T, для панели навигации тегов), ElemID (/ID, уникальный идентификатор элемента) и Expansion (/E, полный текст аббревиатуры или акронима). Передача пустой строки для любого из этих трёх дополнительных параметров эквивалентна опусканию соответствующего сеттера. BeginTagEx2 уменьшает шаблонный код для хорошо описанных элементов — вместо вызова BeginTagEx, за которым следуют отдельные вызовы SetStructElemTitle, SetStructElemID и SetStructElemExpansion, все семь свойств могут быть установлены за один вызов. Функция доступна в библиотеке Delphi, ActiveX (Dispid 73008046) и DLL-интерфейсах.
Version 3.36.1
Изменено
- 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.
Version 3.36.0
Изменено
- 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-интерфейсах.
Version 3.35.1
Изменено
- GetPDFUADiagnostics теперь сообщает DOCINFO-TITLE-MISSING, когда запись /Title словаря информации документа отсутствует или пуста. PDF/UA-1 (ISO 14289-1) требует названия документа, чтобы программы чтения с экрана могли объявить его при открытии документа. Существующая проверка DISPLAYDOCTITLE-FALSE подтверждает, что название показано в строке заголовка просмотрщика; DOCINFO-TITLE-MISSING дополняет её — она подтверждает, что само значение названия установлено. Вызывайте SetDocumentInfo('Title', ...), чтобы передать значение.
Version 3.35.0
Изменено
- 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-интерфейсах.
Version 3.34.0
Изменено
- 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-интерфейсах.
Version 3.33.1
Добавлено
- 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), распознаются и исключаются из отчёта.
Version 3.33.0
Изменено
- SetStructElemLang — новый API, устанавливающий запись /Lang на текущем открытом структурном элементе (ISO 32000-1 §14.9.2). Языковой тег переопределяет язык уровня документа, объявленный SetDocumentLanguage или SetPDFUAMode, для элемента и всех его потомков, позволяя многоязычным документам помечать каждый фрагмент его правильным языковым тегом BCP 47 (например 'en-US', 'fr', 'zh-Hant-TW'). Программы чтения с экрана используют /Lang на уровне элемента для выбора подходящего движка преобразования текста в речь или голоса при чтении документа вслух. Функция доступна в библиотеке Delphi, ActiveX и DLL-интерфейсах.
Version 3.32.0
Изменено
- SetStructElemActualText — новый API, устанавливающий запись /ActualText на текущем открытом структурном элементе (ISO 32000-1 §14.9.4). Используйте его для указания точного Unicode-текста, который представляет последовательность глифов, когда извлечение из потока содержимого даст неверный результат — наиболее распространённые случаи — это глифы лигатур OpenType (U+FB00 ff, U+FB01 fi, U+FB02 fl) и аббревиатуры с неочевидным раскрытием. ActualText дополняет, а не заменяет отображаемое содержимое; он переопределяет то, что вспомогательная технология и средства извлечения текста читают для этого элемента, не подавляя визуальное отображение. Функция доступна в библиотеке Delphi, ActiveX и DLL-интерфейсах.
Version 3.31.1
Изменено
- 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.
Version 3.31.0
Исправлено
- Идентификаторы структурных элементов и связывание заголовков таблиц теперь поддерживаются. 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-текстовых строк.
Version 3.30.1
Добавлено
- 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 требуют, чтобы заголовки вкладывались без пробелов.
Version 3.30.0
Изменено
- Атрибуты структурных элементов теперь поддерживаются для 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-интерфейсах.
Version 3.29.1
Добавлено
- GetPDFUADiagnostics теперь включает две дополнительные проверки: отсутствуют ли в документе какие-либо структурные элементы Figure со значением Alt-текста (сообщается как FIGURE-NO-ALT:N, согласно ISO 14289-1 §7.5 и ISO 32000-1 §14.9.3), и есть ли структурные элементы, всё ещё открытые из-за того, что EndTag не был вызван (сообщается как STRUCT-UNCLOSED:N). Проверка фигур выполняет полный рекурсивный обход дерева структурных элементов, охватывая элементы на всех глубинах вложенности.
Version 3.29.0
Изменено
- 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-интерфейсах.
Version 3.28.5
Изменено
- Улучшение доступности аннотаций PDF/UA-1: когда аннотация FileAttachment не имеет записи Contents и поля /T, имя файла из спецификации встроенного файла аннотации (/FS /UF или /F) теперь используется как резервное доступное описание. Это завершает резервную цепочку Contents аннотаций: /T → URI ссылки → имя штампа → имя файла FileAttachment. Программы чтения с экрана получают имя присоединённого файла вместо тишины, удовлетворяя ISO 14289-1 §7.18.1 для наиболее распространённых типов аннотаций.
Version 3.28.4
Изменено
- Улучшение доступности аннотаций PDF/UA-1: когда аннотация Stamp не имеет записи Contents (или она пуста) и поля /T, имя типа штампа из записи /Name аннотации теперь используется как резервное доступное описание (например "Approved", "Draft", "Confidential", "Final"). Это расширяет резервную цепочку Contents аннотаций, введённую в v3.28.3, для покрытия аннотаций штампов, которые распространены в рабочих процессах с просмотренными или одобренными документами и часто не имеют явного значения Contents.
Version 3.28.3
Изменено
- Улучшение доступности аннотаций PDF/UA-1: когда аннотация Link не имеет записи Contents (или она пуста) и поля /T, URI из URI-действия аннотации теперь используется как резервное доступное описание. Это применяется только во время обработки SetPDFUAMode и только к аннотациям Link, несущим действие /URI. Программы чтения с экрана получают URL как метку последней инстанции, удовлетворяя ISO 14289-1 §7.18.1 в распространённом случае, когда авторы создают гиперссылки, не предоставляя человекочитаемого описания.
Version 3.28.2
Изменено
- SetEmbeddedFileAFRelationship — новый API для явной установки значения AFRelationship в словаре спецификации файла встроенного файла. Требуется ISO 14289-1 (PDF/UA-1) §7.11, это позволяет вызывающим сторонам указать семантическое отношение встроенного файла к содержимому документа, выбрав один из пяти допустимых значений: Source, Data, Alternative, Supplement или Unspecified. Когда активен SetPDFUAMode, любому встроенному файлу без ключа AFRelationship автоматически присваивается Unspecified; используйте эту функцию, чтобы переопределить это значение по умолчанию перед сохранением. Доступно в библиотеке Delphi, ActiveX и DLL-интерфейсах.
Version 3.28.1
Изменено
- Когда SetPDFUAMode вызывается для документа, чьи XMP-метаданные несут общее название библиотеки по умолчанию, а не специфическое для документа, название теперь автоматически заменяется значением из записи /Info Title документа (если она присутствует). Это гарантирует, что XMP-пакет pdfuaid:part-1 отражает фактическое название документа, а не заполнитель, удовлетворяя ожиданиям проверщиков PDF/UA-1.
- Парсер XMP (LoadFromString) теперь читает значение dc:title из существующих XMP-метаданных при загрузке документа, поэтому round-trip PDF, который уже имеет dc:title, корректно сохраняет это название вместо возврата к заполнителю по умолчанию.
Version 3.28.0
Изменено
- 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 также экспортируются.
Version 3.27.2
Исправлено
- BeginArtifact теперь корректно различает типы артефактов от подтипов нумерации страниц. Когда аргумент — Pagination, Layout или Page (типы артефактов согласно ISO 32000-1 §14.8.2.2.1 Table 330), оператор marked-content записывает /Type, а не /Subtype. Другие значения, такие как Header, Footer и Watermark, продолжают записываться как /Subtype. Это исправляет ранее неверный вывод, который записывал /Subtype /Pagination, когда вызывающая сторона намеревалась отметить артефакт нумерации страниц.
Version 3.27.1
Изменено
- Когда активен режим PDF/UA и документ содержит встроенные файлы, каждый словарь спецификации файла, в котором отсутствует запись AFRelationship, теперь автоматически получает её при сохранении. Записываемое значение — /Unspecified, удовлетворяющее требованию ISO 14289-1 §7.11, что каждый встроенный файл должен нести ключ AFRelationship. Это применяется как к файлам, добавленным через EmbedFile, так и к встроенным файлам, уже присутствующим в загруженном документе.
Version 3.27.0
Изменено
- AddRoleMap(CustomType, StandardType) — новый API tagged-PDF, регистрирующий отображение из имени типа пользовательского (нестандартного) структурного элемента в стандартный PDF-тип структуры. При сохранении отображения записываются в словарь RoleMap на корне дерева структуры, удовлетворяя требованию ISO 14289-1 §7.1 для документов, использующих имена тегов, специфичные для приложения. Можно зарегистрировать несколько отображений; дубликатные ключи перезаписываются последним вызовом. Точки входа DLL DLAddRoleMap и DLAddRoleMapA также экспортируются.
Version 3.26.0
Изменено
- BeginTagEx(TagType, AltText, ActualText, Lang) — новый API tagged-PDF, расширяющий BeginTag явным атрибутом естественного языка. Когда Lang непустой, он записывается в атрибут /Lang структурного элемента, позволяя аннотацию языка на уровне элемента, требуемую ISO 14289-1 §7.2 для многоязычных документов. Передайте пустую строку Lang, чтобы вести себя идентично BeginTag. Точки входа DLL DLBeginTagEx и DLBeginTagExA также экспортируются.
Version 3.25.1
Изменено
- Не subset-нутые TrueType-шрифты, загруженные с кодовой страницей Windows по умолчанию (WinAnsiEncoding), теперь получают поток ToUnicode CMap, обеспечивая надёжное извлечение Unicode-текста и copy/paste для этих шрифтов. Ранее поток ToUnicode записывался только тогда, когда присутствовало явное переопределение кодовой страницы или массив Differences; распространённый путь кодирования по умолчанию пропускал его.
- То же исправление применяется к TrueType-шрифтам, загруженным с явной не-дефолтной кодовой страницей, но без массива Differences, и к шрифтам, загруженным через packaged-font формат.
Version 3.25.0
Изменено
- Когда активен режим PDF/UA, не освобождённые аннотации (все типы, кроме Widget, PrinterMark и TrapNet), у которых отсутствует непустая запись Contents, теперь автоматически получают её при сохранении. Значение /T (название / автор) аннотации используется как резервное, удовлетворяя ISO 14289-1 §7.18.1 для аннотаций, несущих название, но без явного доступного описания.
Version 3.24.0
Изменено
- Когда активен режим PDF/UA, интерактивные поля форм, в которых отсутствует запись TU (всплывающая подсказка / альтернативное описание), теперь автоматически получают её при сохранении. Частичное имя поля (запись /T) используется как резервное значение, обеспечивая, что программы чтения с экрана могут идентифицировать каждое поле. Кнопки Push корректно исключаются из этого требования согласно ISO 14289-1 §7.18.4.
Version 3.23.1
Изменено
- GetInformation(200) возвращает '1', когда режим PDF/UA-1 активен на выбранном документе, позволяя вызывающим сторонам запрашивать статус режима соответствия во время выполнения.
- GetInformation(201) возвращает '1' для PDF/A-1a, '2' для PDF/A-1b или пустую строку, когда режим PDF/A выключен.
- GetInformation(313) возвращает строку версии PDF, на которой в данный момент заблокирована цель сохранения, или пустую строку для документов со свободным версионированием.
Исправлено
- GetInformation(311) и GetInformation(312) теперь корректно возвращают строку требования версии и имя функции из самого последнего конфликта блокировки версий (ранее объявлено в записи v3.20.3, но ещё не реализовано).
Version 3.23.0
Изменено
- 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, с полными таблицами синтаксиса и примерами использования.
Version 3.22.0
Изменено
- 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 для этих типов шрифтов.
Version 3.21.0
Изменено
- 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 свойства поля формы.
Version 3.20.3
Изменено
- Encrypt и AddSWFAnnotationFromFile теперь немедленно возвращают 0 с LastErrorCode 602, когда версия сохранения заблокирована ниже минимума, требуемого выбранной силой шифрования или типом аннотации, вместо молчаливого продолжения и сбоя только во время сохранения.
- GetInformation(311) и GetInformation(312) теперь отражают конфликтующее требование версии во время записи, когда заблокированная версия блокирует функции уровня расширений, такие как AES-256 или аннотации RichMedia.
Version 3.20.2
Изменено
- AddU3DAnnotationFromFile теперь автоматически поднимает версию документа до PDF 1.6, когда 3D-аннотация добавляется в документ более низкой версии, в соответствии с поведением автоматического подъёма версии всех других точек входа API PDF 1.6+.
Version 3.20.1
Изменено
- Цели сохранения 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 существующими тестами, зависящими от образцов, пропущенными.
Version 3.20.0
Изменено
- Восемь дополнительных точек входа 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.
Version 3.19.0
Изменено
- Соответствие версии 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 новых).
Version 3.18.6
Изменено
- Соответствие версии 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 новых).
Version 3.18.5
Добавлено
- Новое правило: AcroForm /NeedAppearances распознаётся как функция PDF 1.5 согласно PDF 1.5 Table 218.
Изменено
- Таблица PDFFeatureRules теперь несёт 96 правил (95 + 1 новое).
Исправлено
- Соответствие версии 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)".
Version 3.18.4
Добавлено
- Регрессионное покрытие zlib-ng теперь включает payload граничных размеров, данные PNG-подобных scanline, сохранённые многоблочные потоки и известные потоки zlib через Delphi и C++Builder test runners.
Изменено
- PDFlibZLib теперь всегда использует встроенный статический бэкенд zlib-ng object на обычных сборках библиотеки, удаляя оставшийся резервный путь System.ZLib.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 194/194 каждый, а C++Builder Win64x GoogleTest прошёл 58 тестов с 2 существующими тестами, зависящими от образцов, пропущенными.
Version 3.18.3
Изменено
- Демо Delphi и C++Builder, генерирующие PDF или текстовый вывод, теперь автоматически открывают сгенерированный документ после успешного сохранения.
- Упаковщик инсталлятора теперь держит build-артефакты вне папок демо и делает образцы C++Builder плюс DLL и модули ActiveX/OCX компонентами opt-in; их соответствующие файлы устанавливаются только тогда, когда компонент выбран.
Version 3.18.2
Изменено
- Демо EditFormField для Delphi и C++Builder теперь очищают /NeedAppearances перед обновлением значений полей, так что каждое отредактированное текстовое поле получает обновлённый поток нормального внешнего вида в сохранённом PDF.
- Это поддерживает сохранённый поток /AP в синхронизации с сохранённым значением /V и избегает зависимых от просмотрщика различий, при которых фокусирование поля раскрывает текст, отсутствовавший в статическом внешнем виде поля.
Version 3.18.1
Изменено
- Соответствие версии 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.
Version 3.18.0
Изменено
- Соответствие версии 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.
Version 3.17.0
Изменено
- Восемь дополнительных точек входа 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.
Version 3.16.3
Добавлено
- Новый 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.
Version 3.16.2
Изменено
- Загруженные PDF теперь предоставляют contributor-only представление обнаружения функций во время загрузки через GetInformation(103) ("ContributorFeatures"). Список содержит только функции, чья минимально требуемая версия строго больше HeaderVersion (ключ 100), так что он напрямую отвечает на "почему эффективная версия выше заголовка файла?".
- GetInformation(101) ("DetectedFeatures") не изменён и по-прежнему перечисляет каждую сопоставленную функцию независимо от вклада.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 181/181 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
Version 3.16.1
Добавлено
- Расширено покрытие тестов обнаружения на стороне 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.
Version 3.16.0
Добавлено
- Новые ключи GetInformation: 100 возвращает HeaderVersion (литерал %PDF-X.Y), 101 возвращает DetectedFeatures (CRLF-разделённые функции, сопоставленные при загрузке), 102 возвращает AutoBumpedFeatures (CRLF-разделённые функции, которые запустили writer-side EnsureMinVersion).
Изменено
- Загруженные PDF-документы теперь проходят через проход обнаружения версии, управляемый содержимым: каждый косвенный объект проходится через таблицу feature-to-minimum-version, используемую шлюзом времени сохранения, и FVersion поднимается выше литерального значения заголовка %PDF-X.Y, когда содержимое действительно требует более высокой версии. Например запись /UserUnit на странице поднимает эффективную версию до PDF 1.6, даже когда заголовок файла говорит PDF 1.4.
- Шлюз времени сохранения не затронут: документы, чья эффективная версия была поднята при загрузке, затем явно понижена через SetInformation(0, ...), по-прежнему создают LastErrorCode 602 во время сохранения.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 173/173 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
Version 3.15.0
Изменено
- Точки входа 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.
Version 3.14.3
Изменено
- Соответствие версии 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.
Version 3.14.2
Изменено
- Соответствие версии 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.
Version 3.14.1
Изменено
- Соответствие версии 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.
Version 3.14.0
Изменено
- Соответствие версии 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.
Version 3.13.0
Изменено
- Рефакторил шлюз соответствия версии PDF, отклоняющий функции более поздних версий во время сохранения, в выделенный модуль, так что набор правил может расти без перетряхивания ядра документа.
- Без изменений видимого пользователю поведения по сравнению с v3.12.7: те же функции вне версии по-прежнему отклоняются с LastErrorCode 602.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 155/155 каждый, а C++Builder Win64x GoogleTest прошёл 57/57.
Version 3.12.7
Добавлено
- Расширено покрытие автоматизированных тестов для рабочего процесса прямого рендеринга 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.
Version 3.12.6
Изменено
- Сохранение как 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.
Version 3.12.5
Добавлено
- Добавлено регрессионное покрытие для неизвестных escape литеральных строк и смешанных восьмеричных/не-восьмеричных escape-последовательностей.
Изменено
- Улучшил разбор литеральных строк PDF 1.7, чтобы неизвестные escape-последовательности игнорировали обратный слэш, как требует стандарт.
- Восьмеричные escape литеральных строк теперь потребляют только восьмеричные цифры и сохраняют последующую не-восьмеричную цифру как обычные данные строки.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 141/141 каждый.
Version 3.12.4
Добавлено
- Добавлено регрессионное покрытие для разделителей правой фигурной скобки имени и разреженных записей xref stream сжатых объектов.
Изменено
- Улучшил лексический разбор PDF 1.7, чтобы объекты имени теперь корректно останавливались на разделителе правой фигурной скобки.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 139/139 каждый.
Исправлено
- Исправил загрузку SmartAccess записей xref stream сжатых объектов, чей номер потока объектов больше байтовой длины PDF.
Version 3.12.3
Добавлено
- Новые зашифрованные AES PDF теперь записывают значения Length crypt-filter как битовые длины, соответствуя контракту словаря crypt filter PDF 1.7.
Изменено
- Улучшил совместимость с зашифрованными документами PDF 1.7 для файлов стандартного обработчика безопасности, использующих StrF, StmF, EFF, Identity, None или именованные crypt filter в стиле StdCF.
- Потоки метаданных теперь соблюдают EncryptMetadata=false во время рабочих процессов расшифровки, шифрования и копирования/сохранения вместо обработки как обычные потоки.
- Потоки встроенных файлов теперь несут /Type /EmbeddedFile и используют путь решения crypt-filter встроенного файла при загрузке или сохранении зашифрованных документов.
- Внешние потоки встроенных файлов теперь повышают FDecodeParms до DecodeParms, когда FFilter повышается до Filter, сохраняя параметры декодирования потока.
- Значения Prev/XRefStm XRef stream и большие числовые смещения теперь сохраняют 64-битную точность через пути парсера и SmartAccess.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 137/137 каждый.
Version 3.12.2
Изменено
- Улучшил совместимость декодирования потоков PDF 1.7. Общее декодирование потоков теперь соблюдает /DP как alias для DecodeParms, разрешает косвенные записи массива decode-параметров и принимает стандартные сокращения фильтров /AHx и /LZW.
- Вывод PDF большого файла теперь записывает смещения xref, startxref, linearization и ByteRange цифровой подписи через пути 64-битного форматирования вместо сужения этих значений через 32-битные целочисленные хелперы.
- Загруженные документы теперь обрабатывают запись /Version каталога как эффективную версию PDF, когда она новее, чем версия заголовка файла.
- Проверка: наборы Delphi Win32 и Win64 DUnitX прошли 134/134 каждый.
Исправлено
- Переписанные трейлеры xref-stream больше не сохраняют ключи DecodeParms только для потоков, когда PDFlibPas сохраняет их как классические словари трейлеров.
Version 3.12.1
Изменено
- Сгенерированные PDF теперь открываются с первой страницей, размер которой подогнан под доступную высоту окна просмотрщика, так что вся первая страница видна сверху донизу при наибольшем масштабе, помещающемся в окно. Настройте пользовательский OpenAction (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) на документе, чтобы переопределить это значение по умолчанию.
Version 3.12.0
Добавлено
- Добавил выровненные по 32 байтам CRT-заглушки malloc/calloc/realloc/free для статических C-библиотек и исправил TPDFJPEGImage.Compress для освобождения буферов jpeg_mem_dest через тот же C-путь free, который их выделил.
- Расширил публичные заметки проверки, чтобы выделить строгое автоматизированное покрытие за этим релизом: сборки библиотек, циклы сжатия, вывод HelloWorld /FlateDecode, рендеринг JPEG, рабочие процессы изображений, шрифты, формы, безопасность, подписание, печать и рабочие процессы, производные от демо C++Builder.
Изменено
- Статические бэкенды 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-флагами на файл вместо опоры на один глобальный переключатель компилятора.
Version 3.11.0
Добавлено
- Добавил небольшой объект моста zlib-ng для сборок Win64, так что код Pascal сохраняет стабильные zlib-совместимые точки входа, пока Delphi и C++Builder потребляют свои собственные linker-совместимые наборы объектов.
Изменено
- Переключил Windows Flate сжатие и распаковку на zlib-ng в zlib-совместимом режиме. Win32, Delphi Win64 и C++Builder Win64x теперь связывают ABI-совместимые наборы статических объектов zlib-ng из Lib\thirdparty\Win32, Lib\thirdparty\Win64 и Lib\thirdparty\Win64x.
- Обновил все проекты демо C++Builder для определения PDFLIB_CPPBUILDER, соответствующего GoogleTest runner и предотвращающего связывание демо Win64x с объектами zlib-ng Delphi Win64.
Исправлено
- Путь Win64 больше не маршрутизируется через юнит Delphi System.ZLib, так что сжатие/распаковка PDF-потоков может получить выгоду от бэкенда zlib-ng так же, как 32-битная сборка.
Version 3.10.3
Добавлено
- Расширил набор 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.
Version 3.10.2
Добавлено
- Добавил 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.
Version 3.10.1
Добавлено
- Добавлены 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.
Version 3.10.0
Добавлено
- Добавил нативные C++Builder версии для каждого образца Delphi под Demo. Демо создания PDF, манипуляции страницами, шрифтов, изображений, безопасности, подписания, рендеринга и печати теперь могут быть собраны и запущены из C++Builder без каких-либо обёрток на стороне Delphi.
- Добавил краткий английский Readme.txt в каждую папку демо Delphi, описывающий, что демо показывает, на каком API оно фокусируется и как его запустить; HTML-обзор по адресу Demo\Delphi\index.html ссылается на все из них, сгруппированные по теме.
Изменено
- Каждое новое демо живёт в Demo\C++Builder\<Name>\ как консольный проект, который потребляет Lib\PDFlibrary.pas напрямую и поставляется с входными файлами, необходимыми для запуска.
- Зеркалировал тот же Readme.txt для каждого демо C++Builder с секцией Run, переписанной для консольного рабочего процесса (аргументы argv вместо Open/SaveDialogs); соответствующий Demo\C++Builder\index.html перечисляет каждое демо C++Builder с теми же группами тем.
Исправлено
- Исправил утечку памяти в демо ImportEMF (экземпляр TPDFlib был создан, но никогда не освобождён).
Version 3.9.14
Изменено
- Привёл в порядок демо wrapped-text и HTML pagination, чтобы каждое из них фокусировалось на собственном API и запускалось с одной кнопки.
- Переименовал два проекта демо (EmbeddedFonts и PdfPermission), чтобы скомпилированные исполняемые файлы соответствовали именам папок, а не более старым прототипным именам.
Исправлено
- Исправил демо копирования диапазона страниц, чтобы оно действительно копировало страницы вместо постоянного сообщения об ошибке.
Version 3.9.13
Добавлено
- Введён автоматизированный набор тестов DUnitX (консольный и VCL GUI runners), покрывающий утилитарные юниты — буфер, AES, ZLib, Unicode и хеширование digest — и рабочие процессы уровня библиотеки, включая создание документов, сохранение в файл и в поток, round-trip загрузки и шифрование AES-128/AES-256.
Исправлено
- Исправил ошибку позиции потока во внутреннем буферном считывателе: чтения двухбайтовых слов продвигали курсор чтения на четыре байта вместо двух. В буферах длиннее двух байтов последующие чтения попадали на неверное смещение и молча возвращали некорректные данные. Эффект был наиболее заметен при разборе двоичных структур данных, которые чередуют чтения байтов и слов.
Version 3.9.12
Изменено
- Рендеринг изображений GDI+ теперь по умолчанию использует гладкую высококачественную бикубическую интерполяцию при масштабировании растровых изображений до экранного или экспортного разрешения. Ранее по умолчанию был nearest-neighbour, что давало видимые ступенчатые артефакты на маленьких изображениях (логотипы, миниатюры), увеличенных для экранного предварительного просмотра или high-DPI экспорта. Вызывающие стороны, предпочитающие более резкий режим nearest-neighbour, могут восстановить старое поведение через SetGDIPlusOptions.
Version 3.9.11
Исправлено
- Исправил рендеринг Cairo PDF-изображений, использующих color-key прозрачность (массив color-range /Mask в словаре изображения). Ранее, когда страница содержала изображение с этой формой прозрачности, renderer Cairo полностью опускал изображение вместо его композиции на фон страницы. Исправление выводит альфа-канал на пиксель из объявленных диапазонов color-key и рендерит результат как прозрачное изображение, давая вывод, визуально согласованный с GDI+ renderer.
Version 3.9.10
Исправлено
- Исправил регрессию рендеринга Cairo, где всё содержимое страницы, следующее за последовательностью обрезанного изображения, было некорректно ограничено прямоугольником обрезки изображения. PDF-страницы, которые сохраняют состояние графики, применяют clip path, рисуют изображение, затем восстанавливают состояние — распространённый макетный приём для изображений в рамках или с границами — рендерили весь последующий текст, формы и графику только внутри обрезанного региона. Сохранение и восстановление состояния Cairo теперь корректно отображаются в операторы q/Q PDF, так что регион обрезки отбрасывается после рисования изображения.
Version 3.9.9
Добавлено
- Добавил движок рендеринга 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 бок о бок на одном документе без каких-либо изменений кода.
Version 3.9.8
Исправлено
- Подавил две ложные диагностики компилятора в Win32 C-runtime shim, которые появлялись на RAD Studio 13.1 и позже. Предупреждение об устаревании (W1000) поднималось, потому что capability guard версии компилятора не распространялся на компиляторы новее Delphi 2009, заставляя их компилироваться против устаревшего API менеджера памяти. Подсказка о неиспользуемой переменной (H2164) поднималась для внутренней переменной совместимости, нужной только для сборок Delphi 7; теперь она ограничена условным блоком этой версии. Обе проблемы были только диагностическими без воздействия на время выполнения.
Version 3.9.7
Добавлено
- Добавил опциональный рендеринг страниц на основе PDFium на Windows, включая BMP stream рендеринг, рендеринг device-context, рендеринг в память и вывод на принтер.
Изменено
- Обновил демо Delphi MultiFunction View/Print селектором renderer, чтобы пользователи могли переключаться между существующим renderer GDI+ и PDFium.
Version 3.9.6
Добавлено
- Добавил отдельные скрипты Inno Setup для полного пакета PDFlibPas и пробного пакета, с release-ориентированными исключениями для метаданных source-control, build-выводов, IDE-кешей, локальных файлов агента и связанных third-party исходных деревьев, не входящих в поставляемый пакет.
Изменено
- Пробный инсталлятор теперь собирает и упаковывает пробные двоичные библиотеки для RAD Studio 11.3, 12.3 и 13.1, плюс пробные демо Delphi, перед генерацией исполняемого файла setup.
Version 3.9.5
Исправлено
- Исправил сборки Win32-библиотеки под RAD Studio 9.0 / Delphi XE2. Скрипт сборки передавал флаг выходного каталога DCU, который существует только с Delphi 2010 и далее; компилятор XE2 интерпретировал флаг иначе, производя искажённый выходной путь и фатальную ошибку до обработки любого исходного файла. Скрипт теперь автоматически выбирает соответствующий флаг на основе версии целевого компилятора.
- Исправил связанный compiler-version guard в исходниках библиотеки, который вызывал name-qualified runtime-функцию, введённую в XE4, под условием XE2+. Сборки, нацеленные на XE2 и XE3, теперь разрешают правильный compatibility-импорт.
Version 3.9.4
Исправлено
- Исправил настройку принтера для сетевых и серверных общих принтеров путём применения настроек лотка бумаги, носителя, дуплекса, качества и других настроек печати через handle DEVMODE принтера вместо handle device context принтера.
Version 3.9.3
Изменено
- Обновил связанный 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.
Version 3.9.2
Исправлено
- Обновил бэкенд JPEG 2000 с устаревшего OpenJPEG 1.5 до OpenJPEG 2.5.4 как на Win32, так и на Win64. Обе платформы теперь используют статическое объектное связывание, так что кодирование и декодирование JPEG 2000 работает без дополнительной runtime DLL. Современный кодек приносит текущую обработку заголовков JP2/J2K, callback-driven stream API и накопленные исправления багов и безопасности от upstream-проекта. Публичный API TJpeg2000Bitmap не изменён.
Version 3.9.1
Исправлено
- Исправил рендеринг 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.
Version 3.9.0
Изменено
- Обновил связанный JPEG 2000 бэкенд с устаревшего OpenJPEG 1.5 до OpenJPEG 2.5.4. Загрузка и сохранение JPEG 2000 теперь используют современный кодек, callback-driven stream API и текущую обработку заголовков JP2/J2K, сохраняя при этом публичный API TJpeg2000Bitmap.
Исправлено
- Вывод JPEG 2000 теперь автоматически выбирает корректное количество разрешений OpenJPEG для маленьких изображений, и статический бэкенд Win32 больше не зависит от отсутствующих экспортов хелперов MSVCRT.
Version 3.8.1
Исправлено
- Устранил все 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.
Version 3.8.0
Безопасность
- JPEG-кодек Win64 обновлён с libjpeg в стиле IJG до libjpeg-turbo 3.1.90, завершая миграцию JPEG, начатую в v3.7.0 (Win32). Пути Win32 и Win64 теперь разделяют один и тот же современный JPEG-кодек, с теми же SIMD-оптимизированными внутренними циклами и 30+ накопленными исправлениями CVE / fuzz от upstream. Публичный API PDFlibPas не изменён.
Version 3.7.0
Безопасность
- JPEG-кодек Win32 обновлён с IJG libjpeg-6b до libjpeg-turbo 3.1.90. Значительно более быстрое кодирование/декодирование JPEG через SIMD-оптимизированные внутренние циклы, плюс 30+ исправлений CVE / fuzz, накопленных в libjpeg-turbo upstream. Публичный API PDFlibPas (класс TPDFJPEGImage, функции DumpJPEG) не изменён; существующие пути кода PDF/JPEG работают быстрее без необходимости каких-либо изменений в исходниках.
Version 3.6.0
Изменено
- Путь 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.
Безопасность
- Win32 zlib обновлён с 1.2.x до 1.3.2. Включает стандартные 25+ исправлений CVE / fuzz, накопленных upstream с 1.2.8, плюс новые точки входа inflateBack9 / inflateTree9, используемые потоками с 64-битным окном. Публичный API PDFlibPas (DeflateStr / InflateStr / InflateStrParms) не изменён.
Version 3.5.0
Добавлено
- Добавил инфраструктуру сборки для 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 автоматически.
Изменено
- Поставил свежую инфраструктуру сборки для связанных 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-файлы из чистых исходников.
Version 3.4.0
Безопасность
- Усилил генерацию ключа шифрования, AES initialization vector и блока разрешений Perms против предсказуемых источников случайных чисел. Зашифрованные PDF, созданные на системах, запущенных близко к одному и тому же wall-clock времени, больше не могут быть тривиально скоррелированы; документы AES-256 теперь сохраняют свою полную силу ключа.
- Усилил разбор словаря изображения против некорректных или враждебных PDF, объявляющих необоснованные счётчики компонентов Width, Height, BitsPerComponent или DeviceN. Значения вне диапазона ограничиваются до любой арифметики на pixel-буфере, предотвращая сбои при открытии таких файлов.
- Усилил обход cross-reference и page-tree против документов, чьи цепочки /Prev xref или ссылки /Parent страницы образуют цикл или чрезмерно глубоки. Reader теперь чисто отклоняет некорректные структуры вместо рекурсии до исчерпания стека.
Version 3.3.1
Добавлено
- Добавил inline rationale-комментарии вокруг исправлений рендеринга PDFlibRenderer.pas, которые уже присутствовали в начальной Git baseline. Комментарии документируют, почему SetPen масштабирует ширины обводки на активную трансформацию canvas, и почему операторы d0/d1 CharProc шрифта Type 3 должны потреблять свои операнды. Поведение runtime не изменилось.
Исправлено
- Упростил per-component скрипты сборки Windows. Папки DLL/, OCX/ и Dylib/ больше не несут отдельных вариантов build12-* / build13-*: каждая платформа теперь имеет один скрипт build-Win32 / build-Win64, который привязывается к последней RAD Studio и принимает опциональный аргумент "debug".
Version 3.3.0
Исправлено
- Исправил рендеринг трансформированной обводки в PDFlibRenderer.pas. SetPen теперь применяет текущий масштаб canvas-трансформации к ширинам линии PDF перед вызовом Picasso, предотвращая увеличенные или уменьшенные обводки на путях, чьи координаты уже были трансформированы. Это исправляет контуры глифов Type 3, которые могли рендериться как толстые, нерегулярные блоки.
- Исправил обработку операторов d0/d1 CharProc шрифта Type 3 в парсере content stream. d0 теперь потребляет свои два операнда ширины, а d1 потребляет свои шесть операндов ширины/bounding box перед запуском последующих команд рисования, предотвращая искажение геометрии глифов или пути устаревшими операндами.