Бележки към изданието на PDFiumPas
Тази страница е локализирана за български и запазва имената на API, файловете и литералните стойности непроменени
История на версиите за видимите за потребителя функции, поправки, подобрения на viewer, генериране на документи, PDF/A output, rendering и актуализации на документацията в PDFiumPas
Последно издание
- Последна версия: 2.57.0; Дата на издаване:
Version 2.57.0
Добавено (Added)
TPdfThumbnailView.Orientationподдържа вертикални и хоризонтални оформления на миниатюри, запазвайки съществуващия вертикален подразбиранFirstVisiblePageIndex,LastVisiblePageIndexиEnsureCurrentPageVisibleизлагат и управляват изгледа на миниатюрите с едно-базирани индекси на страници
Променено (Changed)
- Промяната на
CurrentPageIndexвече превърта избраната миниатюра в видимост и в двете посоки - Тестовете на Delphi, Lazarus и C++Builder вече покриват подразбирани за ориентацията, превключване, видими диапазони и видимост на избраната страница
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.57.0 консистентно
Version 2.56.2
Променено (Changed)
HighlightSearchText,AddSearchTextHighlightиClearHighlightвече инвалидират само правоъгълниците на устройството за диапазони от търсене, които са добавени или премахнати, вместо да прерисуват целия визуализатор- Замяната на маркировки със същите съвпадения или добавянето на дублирани съвпадения вече не насрочва ненужно прерисуване
- Тестовете на Delphi, Lazarus и C++Builder вече покриват ограничена инвалидация, идемпотентни актуализации, изчистване и безопасност при неактивен изглед
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.56.2 консистентно
Version 2.56.1
Променено (Changed)
TPdfThumbnailViewвече преизползва рендерираните растрови изображения за страници, които остават видими между прерисувания и съседни позиции на превъртане- Кешът запазва само текущия видим диапазон от страници и освобождава записи точно когато страниците напуснат този диапазон, възложеният документ се промени или размерите на миниатюрите се променят
- Тестовете на Delphi, Lazarus и C++Builder вече покриват преизползване на кеша, подрязване на изгледа, инвалидация на размер, замяна на документ и унищожаване на компонент
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.56.1 консистентно
Version 2.56.0
Добавено (Added)
TPdfView.CutSelectedFormTextToClipboardиTPdfView.PasteFormTextFromClipboardпредоставят редактиране чрез Unicode-буферната обмена за фокусирания редактируем формулярен уиджет
Променено (Changed)
- Фокусираните редактори на формуляри вече обработват стандартните клавишни комбинации за копиране, изрязване, поставяне и избиране на всичко преди препращане на текстовия вход към PDFium
- Изрязването и поставянето отхвърлят полета само за четене и сесии без разрешение за попълване или промяна на формуляр, докато изрязването успешно копира преди премахване на избрания текст
- Тестовете на Delphi, Lazarus и C++Builder вече покриват липса на фокус, двупосочно преминаване на комбинациите и отхвърляне при само за четене
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.56.0 консистентно
Version 2.55.0
Добавено (Added)
TPdfView.AddSearchTextHighlightдобавя уникални съвпадения за друг термин за търсене към текущото наслагване на страницата, позволявайки на няколко заявки да останат маркирани заедно
Променено (Changed)
HighlightSearchTextостава точката за заместващ вход и вече споделя адитивния скенер, докато дублираните символни диапазони се игнорират иClearHighlightпремахва пълния натрупан набор- Тестовете на Delphi, Lazarus и C++Builder вече покриват натрупване на отделни заявки и подтискане на дублирани диапазони
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.55.0 консистентно
Version 2.54.0
Добавено (Added)
TPdfвече излага пълни снимки на обектите на страницата, пакетни актуализации на стилове, афинни преобразувания на обекти, сегменти на пътеки, пътеки за изрязване и дочерни обекти на Form XObject- Инспекцията на символи вече включва цветове за запълване и щрих, име и флагове на шрифта, свободни граници на глифа, ефективни матрици, манипулатори на текстови обекти и преобразуване на индекс символ към текст
- Анотациите вече двупосочно обработват геометрията на границата и потоците за външен вид normal, rollover и down
- Новите сурови и декодирани достъпъри за миниатюри, преобразувания на съдържанието на страницата и анотациите, и
RenderPageWithMatrixосигуряват директни пътища за разширено рендиране и редактиране
Променено (Changed)
- Промените в стила на обектите на страницата могат да бъдат потвърдени като една партида, така че PDFium да регенерира съдържанието на страницата само веднъж
- Рендирането с матрица използва съществуващия път на растрово изображение без копиране, когато оформлението на целевото растрово изображение е съвместимо
Version 2.53.1
Поправено (Fixed)
- Вграденият китайски надпис на менюто за копиране вече използва кодови точки на Unicode, независими от кодирането, и се показва правилно в Lazarus сборки
- По-старите вериги от инструменти на Delphi могат да компилират
FPdfAsync, когато техният модулWinapi.Windowsпропуска декларациятаGetTickCount64
Version 2.53.0
Добавено (Added)
- Новата тестова арматура
Tests.ApiCoverageпокрива публичните API на TPdf, които преди това са имали нулево покрытие от край до край:GetPageBox/SetPageBox(четене/запис на MediaBox/CropBox, грешки за липсваща рамка и двупосочно запазване),FlattenPage/FlattenAllPages(възвръщаема стойност и запазване на броя страници),GenerateFormAppearances(без операция за не-формулярни документи),SaveAsEncrypted/SaveAsEncryptedToStream(AES-256 с двупосочна обиколка на паролата — проверява, че шифрованият файл отказва да се отвори без паролата и се отваря с нея), валидиране на границите наDeletePage(страница 0 и извън диапазона повдигатEPdfError), и сантинелите за анотацииHasContents/HasAuthor, въведени във v2.38.0 (проверява, чеDefault(TPdfAnnotation)ги оставяFalse)
Version 2.52.0
Добавено (Added)
TPdfView.CopySelectedFormTextToClipboardкопира избора на текст във фокусирания AcroForm уиджет към буферната обмена на Windows катоCF_UNICODETEXT
Променено (Changed)
- Операциите за копиране на текст на страница и фокусиран формуляр вече споделят един и същ защитен записвач на Unicode-буферната обмена и оставят буферната обмена непроменена, когато техният избор е празен
- Тестовете на Delphi, Lazarus и C++Builder вече покриват неактивни или нефокусирани извиквания за копиране на формуляр и двупосочна обиколка на избрания фокусиран формуляр през буферната обмена на Windows
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.52.0 консистентно
Version 2.51.0
Добавено (Added)
TPdfView.SelectLineAtизбира визуалния текстов ред, съдържащ едно-базирана страница и нулево-базиран индекс на символ, без да изисква въвеждане с мишка
Променено (Changed)
- Програмният избор на ред, изборът с тройно клиикване и
Shift+HomeилиShift+Endвече споделят един модел за граници на ред, базиран на символнни кутии - Тестовете на Delphi, Lazarus и C++Builder вече покриват стабилен избор на ред и невалидни индекси на страници или символи
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.51.0 консистентно
Version 2.50.0
Добавено (Added)
TPdf.LoadDocumentвече приема нулево-базиран прозорецIndexиCountв буферTBytes, позволявайки на вградени PDF да се зареждат без заделяне на временен резен от масив от байтове
Променено (Changed)
- Зареждането на байтов диапазон отхвърля отрицателни или извънгранични прозорци преди промяна на състоянието на документа и запазва съществуващите опции за живот на буфериран и зает буфер
- Тестовете на Delphi, Lazarus и C++Builder вече покриват прозорци за вградени PDF и невалидни аргументи за байтов диапазон
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.50.0 консистентно
Version 2.49.1
Добавено (Added)
TPdfView.FitModeвече поддържаpfmFitHeightза побиране на текущата страница в видимата височина на изгледа с възможност за хоризонтално превъртане при нужда
Поправено (Fixed)
- Режимите на побиране вече сходят след като промяна на видимостта на лентата за превъртане промени клиентската област, запазвайки резултатите fit-page, fit-width и fit-height консистентни между VCL и LCL
- Тестовете на визуализатора Delphi, Lazarus и C++Builder вече покриват избора на
pfmFitHeightи двупосочните преобразувания на изброявания TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.49.1 консистентно
Version 2.49.0
Добавено (Added)
- Публичната повърхност на PDFium обвързване вече покрива всички 470 експортирани функции в прегледаните заглавки, включително достъп до описания на прикачени файлове чрез
FPDFAttachment_SetDescriptionиFPDFAttachment_GetDescription TPdfвече излага описания на прикачени файлове, валидност на кръстосани препратки, отмествания на края на trailer, ревизия на security-handler, 64-битово зареждане в памет, диапазони от байтове на подпис, диапазони от текст на уеб-връзки и разширени моментни снимки на данни на изображение, филтър, метаданни и ICC профил- Помощниците за формуляри вече поддържат нативен фокус на полета, заявки и актуализации на фокусирани опции за избор, препращане на колелцето на мишката, записваеми мастилени щрихи и наслагвания на формуляри след прогресивно рендиране
Променено (Changed)
FormFieldCount, индексите на полетата на формуляра и редът на табулация вече описват само анотации на уиджети вместо да включват несвързани анотации на страници- Безглавните
TPdfстраници вече влизат и напускат жизнения цикъл на страницата за попълване на формуляри, така че нативният фокус и API-тата за фокусирани полета работят безTPdfView - Експортите на описания на прикачени файлове са ограничени от възможности, така че приложенията, използващи по-стара компилация на PDFium, все още могат да зареждат библиотеката и да откриват недостъпната функция
Поправено (Fixed)
- Прогресивното рендиране на страници вече рисува контролите на формуляра, когато попълването на формуляри е активирано
- Тестовете Delphi, Lazarus и C++Builder вече покриват новата диагностика на документи, описания на прикачени файлове, мастилени пътища, поведение на формуляри, диапазони от байтове на подпис, диапазони на уеб-връзки и метаданни на изображения
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.49.0 консистентно
Version 2.48.0
Добавено (Added)
TPdfMatrixвече излага фабрики, клониране и присвояване, диагностика на крайно състояние и обратимост, сравнение на базата на толеранс, достъп до транслация, отчитане на детерминант и афинно разлагане- Композиция prepend, въртене чувствително към пивот, мащабиране, накланяне и обръщания, плюс съпоставяне на правоъгълници stretch, contain и cover поддържат работни процеси в локално пространство и побрани оформления без ръчна аритметика на коефициенти
- Немутиращ обратен достъп, обратно съпоставяне на точки, трансформации на вектори и четириъгълници, динамични партии от точки и правоъгълници, in-place варианти и еднопласови трансформирани граници разширяват повторно използваемата геометрична повърхност
Променено (Changed)
- Транслация, мащабиране и обръщания на оси вече актуализират само засегнатите коефициенти вместо да се маршрутизират през общо афино умножение
- Трансформацията на правоъгълници нормализира входа си веднъж, използва специализиран точен път, подравнен по оси, когато е възможно, и изчислява общи завъртени граници без временни записи на точки
- Партидните трансформации на точки и правоъгълници заделят един масив от резултати или използват повторно хранилището на извикващия, докато трансформираните граници на точки се акумулират в един проход без междинен масив
Поправено (Fixed)
- Съпоставянето на правоъгълници отхвърля резултати с нулев размер, крайни и с препълване на
Singleпреди публикуване на неизползваема матрица - Тестовете Delphi, Lazarus и C++Builder вече проверяват ред на композиция, инварианти на пивот, обратни двупосочни преобразувания, побрани правоъгълници, разлагане и поведение на масовата геометрия
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.48.0 консистентно
Version 2.47.0
Добавено (Added)
FPdfAsyncвече предоставя структурирани причини и съобщения за отменяне, премахваеми регистрации на обратно извикване, източници на базата на изтичане на време, чакане на отменяне и атомарни try-cancel операции чрез разширени интерфейси, които запазват оригиналното APITPdfFuture<T>.RunExдобавя конфигурируемо изпращане на отговор и приоритет на работника, докато пликовете на резултатите излагат идентификатори на операции, валидност на стойности, имена на класове на изключения, измерване на време на завършване и повторно използваеми помощници за завършванеTPdfAsyncExecutorдобавя повторно използваем фиксиран пул от работници с четири FIFO приоритетни ленти, опционално обратно налягане на ограничена опашка, отменяеми манипулатори на задачи, чакане чувствително към изтичане на време, моментни снимки на задачи, агрегирани статистики и грациозно изключване
Променено (Changed)
- Повтарящите се асинхронни задачи могат да използват повторно нишки на работници и операции на опашка O(1) вместо да създават нишка за всяка задача, докато синхронизираното завършване остава достъпно за UI хостове
- Грешките на executor и future запазват диагностика на клас и съобщение на изключение, отменянето запазва първоначалната си причина, а изключенията на обратно извикване остават изолирани от жизнения цикъл на работника и изключването
- Тестовете Delphi, Lazarus и C++Builder вече покриват разширената повърхност на отменяне, метаданни на future, контрол на задачи, обратно налягане, подреждане на приоритети, статистики, грешки и изключване
Поправено (Fixed)
- Едновременните собственици на отменяне вече получават детерминистичен резултат на първия писател вместо да разчитат на отделна последователност на наблюдение и отменяне
- Чакането на състояние на покой на главната нишка обработва синхронизирани отговори на задачи, предотвратявайки завършил работник да остави executor-а трайно в несъстояние на покой по време на координирано изключване
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.47.0 консистентно
Version 2.46.0
Добавено (Added)
FPdfAsn1вече излага класове на идентификатори, 64-битово кодиране и декодиране на high-tag-number, анализирани TLV записи, прозорци на child reader с нулево копиране, типизирани декодери на примитиви и резени на съдържание или кодирани стойности- DER писателите вече поддържат пълния 64-битов INTEGER диапазон без знак, валидирано произволно INTEGER съдържание, ENUMERATED, автоматичен избор на UTCTime или GeneralizedTime, application и private тагове, многустойностна SEQUENCE и канонично подреден SET OF изход
ValidateDerвръща грешки при валидация чувствителни към отместване, налагайки конфигурируеми ограничения за влагане, брой възли, дължина на съдържание, брой грешки, корен и опционално подреждане на SET
Променено (Changed)
- DER конкатениране и многустойностна композиция използват едно заделяне на изход, буферите на писателя излагат операции reserve, count, capacity и прехвърляне на собственост, а подреждането на SET OF вече използва
O(n log n)сортиране чрез сливане - Стойностите BOOLEAN, INTEGER, BIT STRING, OBJECT IDENTIFIER, NULL, UTF8String, PrintableString, IA5String, UTCTime и GeneralizedTime получават проверки на канонична форма по време на кодиране, типизирано декодиране или валидация
- Времевият пакет на Lazarus вече експортира
FPdfAsn1, а тестовите набори Delphi, Lazarus и C++Builder упражняват същата публична DER повърхност
Поправено (Fixed)
- Контекстно специфичните номера на тагове, по-големи от 30, вече не се отсичат в ниските пет бита на идентификатора
- Malformed high-tag идентификатори, не-минимални определени дължини, невалиден UTF-8, ненулево BIT STRING подложка, невалидни времеви полета, trailing корени и нарушения на ограничения на ресурси се отхвърлят детерминистично
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.46.0 консистентно
Version 2.45.0
Добавено (Added)
FPdfPreflightReportвече присвоява сериозност Info, Warning или Error на всеки проблем и излага API-та за сериозност, статус, категория, issue-code, lookup, search, flattening и филтриране на ниво стандарт и отчет- Отчетите preflight вече експортират SARIF 2.1.0, JUnit XML, NDJSON и нативен XML чрез съответстващи методи
To*иSave*ToFileза CI, автоматизация и стрийминг пайплайни - Стабилни SHA-256 отпечатъци на отчети идентифицират еквивалентни резултати от валидация независимо от изходните пътища и времевите марки на генериране
Променено (Changed)
- Отчетите JSON, CSV, text, Markdown и HTML вече включват сериозност и разширени обобщения на статус; HTML добавя достъпни надписи на таблици и обобщение на статус
- Конструирането на колекции от проблеми и стандарти използва геометричен растеж на капацитета, резултатите от заявки са предварително размерни, ескейпването на JSON пише в един ограничен буфер на изхода, а всички файлове на отчети използват един директен UTF-8 писател
- Обобщенията на категории проблеми използват детерминистично подреждане, времените марки включват милисекунди, JSON носи
formatVersion: 2, а клетките на CSV неутрализират формули на електронни таблици
Поправено (Fixed)
- Експортът на JSON вече запазва валидни допълнителни Unicode двойки и замества изолирани UTF-16 сурогатни кодови единици вместо да излъчва malformed скаларни данни
- Експортът на HTML вече ескейпва апострофи, а филтрираните изгледи на отчети притежават независими масиви от проблеми вместо да споделят изменимо хранилище на резултати
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора вече отчитат Version 2.45.0 консистентно
Version 2.44.0
Добавено (Added)
- Отметките и дестинациите разкриват състояние на отваряне, брой наследници, цели на действия, режими на показване на дестинацията и до четири параметъра на изгледа
Metadata,GrantedPermissions,UserGrantedPermissions,HasPermissionиUserHasPermissionпредоставят типизирани моментни снимки за инспекция на документа и заявки за праваExtractThumbnail(PageNumber)визуализира заявена страница, без да променя активната страница, а резултатите от времеви марки RFC 3161 разкриват политика, време на генериране и детайли за nonce
Променено (Changed)
- Пътищата за отметки, JavaScript, метаданни, дестинации и миниатюри използват валидирани двупасови буфери, геометрично нарастване на колекциите и обход, безопасен срещу цикли
- Следобработката при запазване разрешава активния каталог, дървото на страниците и действието за отваряне чрез текущата xref ревизия, кешира декодирани обектни потоци и сканира PDF речници с лексикални граници
- Споделеното анализиране на PDF вече налага точни заглавки на обекти, поколения, ключове на речници, дължини на потоци, геометрия на предиктор, целочислени диапазони и граници на коментари, литерални низове и шестнадесетични низове
- Валидирането на RFC 3161 отговор вече обвързва както nonce, така и SHA-256
messageImprint, изисква структурно валиден подписващ и прилага строги правила за DER дължина, OID, INTEGER и GeneralizedTime
Коригирано (Fixed)
- Инкременталните документи вече не избират неактивни дублирани каталози или повредени наставки на референции при добавяне на действие за отваряне по подразбиране
- Времевите токени с дълги DER дължини запазват пълния кодиран токен, докато повреденото подреждане на незадължителни полета на CMS и празни множества от подписващи се отхвърлят
- Чистите Delphi компилации вече записват полета за nonce семена на PAdES чрез подравнени безопасни копирования на байтове и предават байтове на XFA отговор с точния нативен тип указател
Version 2.43.0
Добавено (Added)
- Записите за XFDF полета и анотации вече разкриват флагове за присъствие, които разграничават пропусната XML стойност от изрично празна стойност
Променено (Changed)
- Импортирането на XFDF приема елементи и атрибути с префикс на пространство от имена, смесено текстово съдържание и CDATA съдържание, референции към обекти и стойности със значими разстояния, като същевременно отхвърля невалидни скаларни референции на Unicode
- Импортирането и експортирането на XFDF използват индексирано съпоставяне на полета и ограничени геометрични буфери, подобрявайки производителността и пиковото разпределение на паметта при дълбоко вложени формуляри, големи колекции от анотации, списъци с мастило, върхове и геометрични четириъгълници за маркиране
- Валидирането на PDF/A и PDF/UA използва ограничено нарастване за големи колекции от страници, потоци, имена на структури и RoleMap; разрешаването на RoleMap за PDF/UA вече следва директни масиви и индиректни обекти с имена или масиви от точното поколение
Коригирано (Fixed)
- Двупосочният обмен с XFDF вече запазва дълбоко вложени пътища на полета, изрично празни стойности на полета, изрично празно съдържание на анотации и разликата между липсващо и празно съдържание
- Невалидни зареждания на буфер на паметта и присвоявания на страници извън диапазона се отхвърлят, без да оставят частично състояние на документ или страница, а неуспешното нативно презареждане на страница запазва предишната активна страница
- Големи идентификатори за маркирано съдържание и буфери с метаданни за подписи се ограничават и валидират преди заделяне на памет или нативен достъп
Version 2.42.0
Добавено (Added)
TPdfMatrixвече предоставяInvert,TryInvert,TransformPointиTransformRectза съпоставяне на координати, тестване на попадение, нормализирани граници и изрично управление на сингулярна матрицаTPdf.WrapTextполучи претоварване наBreakLongWords, което разделя CJK и друг текст без интервали, като същевременно запазва валидните сурогатни двойки UTF-16 заедноTPdfAnnotation.AttachmentPointSetsизлага всеки четириъгълник в многоредови анотации за маркиране, докато съществуващото полеAttachmentPointsостава псевдоним за първия набор
Променено (Changed)
- Извличането на текст, изграждането на четимо съдържание, търсенето на думи и съпоставянето на отместването на изговорен текст вече използват ограничено заделяне на памет и пътища за двоично търсене, намалявайки повтарящите се заделяния на памет и линейните сканирания на големи страници
- Сериализацията на ASN.1 и генерирането на шифрован PDF вече използват геометрични изходни буфери; подреждането на криптираните обекти използва сортиране
O(n log n), а xref редовете се записват директно в крайния буфер WrapTextзапазва границите на редовете CR, LF и CRLF и използва повторно един нативен измервателен обект за цялата операция- Импортирането и експортирането на XFDF запазват всеки четириъгълник за маркиране; импортирането също така прилага RGB/interior цветове и парсира десетични координати независимо от локала на процеса
Коригирано (Fixed)
- Потребители на наследени функции могат отново да актуализират съдържанието и автора на анотацията, като присвоят непразни низове, без да задават по-новите маркери
HasContentsиHasAuthor - Изрично празни низове за анотации вече използват валиден завършващ с нула нативен буфер, така че изчистването на
/Contents,/Tи други незадължителни текстови ключове вече не предава nil указател към PDFium
Version 2.41.0
Променено (Changed)
- Докладите от preflight
SaveJsonToFile,SaveMarkdownToFileиSaveTextToFileвече записват UTF-8 в Delphi (съответстващо на съществуващияSaveHtmlToFile), вместо системната ANSI кодова страница; не-ASCII символите в пътищата до файлове, препоръките и бележките за обхвата се повреждаха в Delphi, когато се записваха чрез тези методи SaveCsvToFileвече записва UTF-8 с BOM префикс, така че Excel за Windows автоматично да разпознава кодирането; без BOM Excel третира UTF-8 CSV като кодова страница 1252 и поврежда всички не-ASCII символи
Коригирано (Fixed)
- Демонстрацията
ExtractImagesизтичаше кеширанитеTBitmapобекти вFExtractedImages, когато формата се затваряше без изричното им изчистване предварително; формата вече презаписваDestroy, за да извикаClearExtractedImages, освобождавайки всеки кеширан bitmap
Version 2.40.0
Променено (Changed)
TPdf.RenderPage(HDC, ...)вече маскира FPU/SSE изключенията около извикването наFPDF_RenderPage, съответствайки наTPdfView.RenderPage(HDC)(коригирано във v2.25.0) и всяка входна точка за рендериране, връщаща bitmap; претоварването на нивоTPdfдиректно към DC преди оставяше FPU изключенията немаскирани при компилатори преди D12
Коригирано (Fixed)
ColorToARGBвече връща напълно прозрачен пиксел (алфа 0) заclNoneиclDefaultвместо да третира сентинъл стойността като литерален RGB цвят; предишното поведение произвеждаше тъмно, почти непрозрачно запълване, когато извикващият подавашеclNoneс очакване за “без цвят”
Version 2.39.1
Коригирано (Fixed)
- Явните записвания в PDF 1.3 вече премахват записите
/SMask /None,/AIS falseи/TK true, които само повтарят първоначалното графично състояние, като същевременно продължават да отхвърлят нестандартно състояние на прозрачност
Version 2.39.0
Променено (Changed)
CreatePDFиImageToPDFвече използват потвърдени дестинации за запис и отчитат успех само когатоSaveAsзавърши успешноBatchExport,PDFtoJpgиSplitPDFвече разпределят уникални изходни директории, така че повтарящите се изпълнения и входовете с еднакви имена да запазват предишните резултатиSplitViewвече обвива търсенето веднъж, без да оставя скрито състояние на страницата след отмяна или липса на съвпадение, и прекъсва незавършените задачи за печат вместо да изпраща частичен изход
Коригирано (Fixed)
MergePDFвече отхвърля неправилно форматирани токени за диапазон от страници и изходни пътища, които презаписват източника, отброява действително импортираните страници и отказва да запише празен резултат- Демонстрациите на Delphi и C++Builder за
Attachmentвече ангажират записите по същия път чрез безопасно при откат заменяне на файлове, така че неуспешно преименуване да не може да изтрие оригиналния PDF
Version 2.38.0
Променено (Changed)
SetAnnotationDataвече предпазва записите на/Contentsи/Authorзад сентинълитеHasContents/HasAuthorвTPdfAnnotation, съответствайки на съществуващия моделHasName/HasSubject/HasIcon; преди тези две полета се записваха безусловно, така че присвояването на записDefault(TPdfAnnotation)за актуализиране само на цвят или флагове безшумно презаписваше съществуващото съдържание и автор на анотацията с празни низове;GetPageAnnotationвече задава сентинълите, така че цикълът на четене-модификация-запис запазва оригиналните стойности
Коригирано (Fixed)
GenerateFormAppearancesвече чете стойността на checkbox/radio бутона чрезFPDFAnnot_GetFormFieldValue(което преминава към родителския речник на полето съгласно ISO 32000-1 §12.7.5) вместоFPDFAnnot_GetStringValue(Annot, 'V', ...)(което чете речника на widget-а); widget-ът обикновено не съдържа/V, така че/ASникога не се синхронизираше с отметнатото състояние и плосък checkbox/radio се изобразяваше като неотметнат
Version 2.37.0
Променено (Changed)
ParseTsaUrlвече ограничава порта до1..65535след парсване; в противен случай твърде голяма стойност на порта би се превъртяла чрезDWORDурязване и би могла да съвпадне с валиден порт- XFDF
ParseFieldвече приема параметър за дълбочина (по подразбиране 0, ограничен до 64) и връща празно поле при достигане на лимита, така че зловредно вложена верига от 100 000 нива<field>вече не може да препълни стека
Коригирано (Fixed)
- TSA HTTP заявката вече предпазва от празно тяло на заявката, преди да подаде
@ReqDer[0]къмWinHttpSendRequest; раздвояването на динамичен масив с нулево съдържание би достъпило незаземен указател;BuildTimeStampReqвинаги връща непразна SEQUENCE, но мястото на извикване вече защитава договора
Бележки (Notes)
- Коментарът в заглавката на
FPdfTsaWinотносно проверката за отмяна на HTTPS е коригиран: WinHttp валидира веригата от сървърни сертификати по подразбиране, но **не** извършва проверка за отмяна чрез CRL/OCSP, освен ако това не е изрично активирано чрезWinHttpSetOption; предишната формулировка твърдеше, че проверката за отмяна “идва безплатно”, което беше подвеждащо
Version 2.36.0
Променено (Changed)
- TSA HTTP заявките вече изпращат изрично заглавие
Content-Lengthв допълнение към заглавиятаContent-TypeиAccept; WinHttp го генерира от общата дължина, но някои RFC 3161 проксита изискват изрично заглавие и отхвърлят заявката с411 Length Requiredбез него - Експортирането на XFDF вече премахва контролните знаци C0 (различни от TAB/LF/CR, които вече са ескейпнати), вместо да излъчва невалидна обратно наклонена черта-шестнадесетична последователност; предишното ескейпване
\-01Fне е валиден XML (обратно наклонената черта няма специално значение в XML), така че всеки съвместим четец би отхвърлил документа като неправилно форматиран InjectAssociatedFilesвече записва/Subtypeв речника на потока на EmbeddedFile, когато извикващият предоставиTAssociateFile.MIMEType; полето беше декларирано и документирано, но инжекторът преди това твърдо кодираше/Type /EmbeddedFileи го игнорираше (ISO 32000-2 §7.11.4 позволява/Subtypeв потока)
Коригирано (Fixed)
- Импортирането на XFDF пропускаше първия байт от съдържанието след UTF-8 BOM и първия байт, когато нямаше BOM:
BytesToAnsi(Bytes, 4, ...)(BOM) иBytesToAnsi(Bytes, 1, ...)(без BOM) използваха отмествания на старта с разлика от едно, тъй катоBytesToAnsiприема 0-базиран индекс на масив; извикванията вече използват3и0 ExtractSignatureValueимаше две грешки с висящиifотстъпи, при коитоR.Position:= CNсе изпълняваше безусловно за незадължителните разклоненияcertificates [0]иsignedAttrs [0]; разклоненията вече са обвити вbegin/end, така че позицията се придвижва напред само когато незадължителният TLV действително е бил прочетен (същият клас грешка е коригиран вAddSignatureTimestampToCmsвъв v2.22.0)
Version 2.35.0
Променено (Changed)
TFPDFAvail_IsDocAvail,TFPDFAvail_IsPageAvailиTFPDFAvail_IsFormAvailвече приематhints: PFX_DOWNLOADHINTSвместоvar hints: FX_DOWNLOADHINTS, така че документираният режимnullptrсамо за заявки (проверка на текущата наличност без искане на още данни) да бъде достъпен от Delphi; заглавката на PDFium изрично позволяваhintsда бъде null; предишнотоvarобвързване правеше това невъзможноTFPDF_SetSystemFontInfoвече приемаpFontInfo: PFPDF_SYSFONTINFOвместоvar pFontInfo: FPDF_SYSFONTINFO, така че извикващите да могат да подаватnil, за да кажат на PDFium да спре да използва предварително регистриран интерфейс на системни шрифтове (документираният път за деактивиране)TPdfThumbnailView.Paintвече изчисляваVisibleRowsпо същата формула каквато е вUpdateScrollBarRange(ClientHeight div RowHeight), така че броят на начертаните редове да съответства на размера на страницата на лентата за превъртане; предишната формула само за изчертаване ((ClientHeight - FMarginY) div RowHeight + 1) можеше да се различава с един ред при гранични височини, губейки изобразяване за ред извън страницата или пропускайки последния видим ред
Version 2.34.0
Добавено (Added)
TPdf.SaveAsEncrypted/SaveAsEncryptedToStream— API на високо ниво, което записва документа и след това го шифрова с PDF 2.0 AES-256-CBC (V=5/R=5/R=6); приемаTPdfEncryptOptionsс потребителска/собственическа парола, разрешения и ревизия; делегира наEncryptDocumentBytes- Шифроване на литерни низове StrF:
EncryptDocumentBytesвече шифрова(...)литерни низове в обекти без поток (речник Info и др.) в шестнадесетични низове AES-256-CBC, съответстващие на формата за шифроване на поток (16-байтов IV + PKCS7 шифрован текст); шестнадесетичните низове<...>остават непроменени
Version 2.33.0
Добавено (Added)
- Инжектор за пълно шифроване на документи с AES-256-CBC в
FPdfEncrypt.pas;EncryptDocumentBytesприема обикновен PDF и парола, шифрова всеки непряк обект на поток (16-байтов IV + AES-256-CBC PKCS7 под файловия ключ), коригира/Length, добавя обекта на речника/Encryptи възстановява пълна класическа таблица с препратки (cross-reference table) + трейлър с/Encryptи/ID; завършва стека за шифроване на PDF 2.0 (AES блок + GCM + SHA-512/384 + R6 деривация на ключ + речник + обхождане на документ) - Помощник
EncryptStreamPayload— форматът за поток PDF 2.0 AES-256 (IV, добавен в началото на AES-CBC-PKCS7 шифрован текст), годен за повторна употреба от извикващи, които управляват собственото си оформление на обекти
Version 2.32.0
Добавено (Added)
- Хеш SHA-512 / SHA-384 (FIPS 180-4) в новата секция
FPdfSha512.pas; чист Pascal, портнат от HotPDF; изисква се за итерацията на паролата с хеш PDF 2.0 R6, която се разклонява спрямо 128-битова mod-3 стойност, за да избере SHA-256/384/512 за всеки кръг; проверено съгласно FIPS-180-4 B.1 с известни отговори - Деривация на ключ за шифроване PDF 2.0 и конструктор на речник Encrypt в новата секция
FPdfEncrypt.pas; имплементира алгоритъм 2.B от ISO 32000-2 §7.6.4.3 (хеш танц R6: AES-128-CBC + итеративен избор на SHA-256/384/512), извежда 32-байтовия ключ за шифроване на файл плюс записите/O,/U,/OE,/UE,/Permsи изгражда речника Encrypt за V=5/R=5/R=6 с/CFM /AESV3; портнато от PDFlibPas, адаптирано към стил TBytes
Version 2.31.0
Добавено (Added)
- Примитиви за блоков шифър AES (FIPS 197) в новата секция
FPdfAes.pas; чист Pascal AES-128 и AES-256 блокови шифри плюс CBC помощници на режима и CSPRNG бекенд, портнати от HotPDF; тестове с известни отговори от FIPS-197 Appendix C.2 / C.3 проверяват коректността; това е криптографската основа за стека за шифроване на PDF 2.0 - Удостоверено шифроване AES-GCM (NIST SP 800-38D) в новата секция
FPdfAesGcm.pas; имплементира GHASH (GF(2^128) умножение), GCTR и конструкцията GCM AEAD върху AES блоковите примитиви; тестове на NIST GCM 1 и 3 (AES-128) съвпадат точно с авторитетния шифрован текст и таг; тест 13 (AES-256) е двупосочен; GCM е режимът по ISO/TS 32003 за PDF 2.0 - Валидиране на интегритета на PDF/A Level A ParentTree и ClassMap (ISO 19005-1 §6.8.3);
pvaiParentTreeMissingмаркира StructTreeRoot без числовото дърво /ParentTree;pvaiClassMapUnresolvedмаркира /C препратка към клас без /ClassMap
Version 2.30.0
Добавено (Added)
- Инжектиране на свързани файлове (
InjectAssociateFiles/TPdf.SaveAsWithAssociateFiles, ISO 32000-2 §7.11.4); новата секцияFPdfAssocFilesприкачва/AFмасиви от препратки към файлови спецификации към каталога или към речника на всяка страница, обхващайки всичките осем стойности за/AFRelationshipот ISO 32000-2 Table 45; използва повторно модела за инкрементално актуализиране, доказан отInjectPadesDssMarkers - Поддръжка на PDF/X-6 (ISO 15930-9:2020);
TPdfXConformanceдобавяpxc6; инжекторът и валидаторът го прокарват през идентификацията наpdfxid:GTS_PDFXVersion; PDF/X-6 е базираният на PDF 2.0 наследник на PDF/X-4 за пълен обмен - PDF/A забранява действието
/Thread(пропуск в белия списък на ISO 19005-1 §6.6.1); списъкът със забранени действия вече обхваща Thread редом с Launch, ResetForm, ImportData, SetOCGState, SetState, GoTo3DView, Rendition и Hide
Коригирано (Fixed)
- Пътят за валидиране на PDF/A-4e вече зачита същите проверки за маркирана структура (tagged-structure), MarkInfo и разделяне на думи като Level A; понижаването при запис от страна на v2.29.0 обхвана
PdfAIsLevelE, но три порта наValidatePdfAComplianceпроверяваха самоPdfAIsLevelA, така че документ PDF/A-4e без маркирана структура преминаваше безшумно - Отклонение на теста за OCG
/BaseState: преходът на PostProcess от v2.28.0 правилно разшири приемането до/ONили/OFF(ISO 32000-1 Table 8.70), но тестовете в Delphi и C++ все още очакваха/OFFда бъде отхвърлено; тестовете вече използват наистина невалидна стойност (/Undefined), а нов положителен тест фиксира приемането на/OFF - Прекомерно съвпадение на геопространствено
/Subtype /GEO:ContainsDictionarySubtype('GEO')съвпадаше с всеки речник, съдържащ токена, включително несвързани като излишен/ViewerPreferences << /Subtype /GEO >>; новиятContainsMeasureDictionarySubtypeдопълнително изисква/Type /Measureили ексклузивен за Measure съседен ключ, така че речниците без Measure вече не задействат изискването за ADBE ExtensionLevel 3
Version 2.29.0
Добавено (Added)
- Поддръжка на PDF/A-4 (ISO 19005-4:2020) във валидатора, инжектора XMP и слоя на обектния модел на Pdfium;
TPdfAConformanceдобавяpac4base,pac4fиpac4e; базовото ниво е PDF 2.0 (ISO 32000-2) и заменя старите нива A/B/U с base + F (form) + E (accessibility);ValidatePdfAчете пакет XMPpdfaid:part=4(базата пропуска елемента за съответствие),SaveAsPdfAго излъчва, аSignPadesWithPdfAприемаpac4baseкато дългосрочен архивен контейнер - Обвързване
FPDFBookmark_GetColor— последната необвързана публична експортна функция на PDFium (469/469);TBookmarkполучава полетаHasColorиColorпопълнени от масива/Cна отметката (ISO 32000-1 §12.3.3); обвързването използва толерантно зареждане, така че по-стари DLL файлове отпреди експортирането да продължат да работят - Проверка на версията на заглавката за PDF/E-1 (ISO 24517-1 §5)
pveiBadPdfVersion— PDF/E-1 е базиран на PDF 1.6 и заглавка, различна от 1.6, вече се маркира pvriEncryptVersionMismatchза PDF/R-1 (ISO 23504-1) — шифроването е разрешено само при заглавка%PDF-2.0; тяло 1.x, съдържащо/Encrypt, вече се маркира (преди това беше декларация без ефект)pvriBadMediaBoxза PDF/R-1 — всекиMediaBoxна страница трябва да бъде[0 0 w h];PdfRHasNonZeroMediaBoxOriginе независим от локала ASCII скенер, който пропуска MediaBoxes с косвена препраткаpvaiRoleMapUnresolvedза PDF/A Level A (ISO 19005-1 §6.8.3.4) — наличен, но непълен RoleMap, който оставя персонализираните структурни типове/Sнекартирани, вече се маркира, затваряйки пропуска от съществуващата проверка само за присъствиеpvaiRoleMapMissing
Коригирано (Fixed)
PdfVersionToName(20)връщаше"1.0"вместо"2.0", повреждайки записа/Versionна каталога и съобщенията на валидатора за всяко записване на PDF 2.0; форматиращият модул вече разделя major.minor изрично за кодове на версии>= 20- Енкодерът за отрицателни INTEGER на
FPdfAsn1.pasне се компилираше под Delphi 12 (E2015върхуInteger(-(V<0))), блокирайки целия тестов проект; коригирано чрез използване наInt64(-Ord(V<0))за маската за разширяване на знака - Списъкът със забранени анотации на PDF/A вече включва
/RichMediaвъв всички части (пропуснато по-рано; ISO 32000-1 §12.5.6.35 го забранява в PDF/A)
Version 2.28.0
Добавено (Added)
TPdfVersionвече включваpv20за PDF 2.0 (ISO 32000-2);DecodePdfVersion(20)връщаpv20вместоpvUnknown, аEncodePdfVersion(pv20)излъчва 20, така че версията на документ PDF 2.0 вече не се губи при обратно четене и може да бъде записана изрично
Променено (Changed)
DecodeDateвече парсва низове за дата в PDF с незадължителни крайни полета съгласно PDF Reference 3.8.3, вместо да изисква пълната форма от 23 знакаD:YYYYMMDDHHmmSSOHH'mm'; съвместимите съкратени дати катоD:20260712,D:20260712153000иD:20260712153000Zвече се приемат; преди те бяха отхвърляни от твърда проверка заLength=23; часовото отместване на часовата зона вече се валидира спрямо реалния диапазон UTC-12..UTC+14 range вместо> 23FPdfMeasure.MeasureTextвече кодира името на шрифта като FPCAnsiString/ DelphiUTF8Encode, съответствайки на другите места на извикване на FPDF_BYTESTRING в библиотеката, вместо просто преобразуване (cast) къмAnsiString, което повреждаше не-ASCII фамилии шрифтове чрез текущата кодова страница
Коригирано (Fixed)
- Пътят за отрицателни стойности в
TDerWriter.Integerсриваше или генерираше деформиран DER: цикълътwhile V <> -1 do V := V shr 8оставяшеInnerпразен приValue = -1(грешка в диапазона при последващияInner[Length(Inner)-1]) и прекомерно произвеждаше байтове за други отрицателни стойности; енкодерът вече извлича байтове от допълнение до две с изместване за разширяване на знака и спира правилно, когато остатъкът е просто разширение на знака; полетата CMS/PAdES INTEGER са положителни, така че това засяга само извикващи, подаващи отрицателни стойности, но пътят вече е правилен TPdf.GetCharacterOriginиTPdfView.GetCharacterOriginигнорираха върнатата стойност отFPDFText_GetCharOriginи връщаха неинициализирана точка при неуспех; резултатът вече е инициализиран с нула, а неуспешно четене връща началото (съвпадайки с договора наGetCharacterRectangle)
Version 2.27.0
Променено (Changed)
- Delphi, C++Builder и Lazarus демонстрациите
PDFViewerиMultiPageViewerвече обвиват търсенето веднъж, приематEnterиF3за следващ резултат, нулират контекста при промяна на опциите и запазватEscза отмяна на търсене или печат - Печатът следва текущото завъртане на визуализатора и избира портретна или пейзажна ориентация
- Трите
ViewerInteractionLabдемонстрации поддържатCtrl+A,Ctrl+C,Enter,F3иEscбез прихващане на нативните команди за избор и копиране
Поправено (Fixed)
- Отмяната на печат в C++Builder и Lazarus вече прекъсва задачата на принтера, а Lazarus излиза от всички вложени цикли за копиране, страници и сортиране
- Бутонът Cancel на Delphi
MultiPageViewerе свързан с обработчика, а полетата за търсене в C++Builder/Lazarus запазват редактирането с стрелки, Home и End
Version 2.26.0
Променено (Changed)
TPdf.GetObjectBitmap,TPdf.GetBitmap,TPdf.GetThumbnailи еквивалентите им вTPdfViewвече придобиват render lock околоFPDFImageObj_GetBitmap/FPDFPage_GetThumbnailAsBitmap, кактоRenderPage/RenderTile, за да няма състезание с едновременниUnloadPage/ReloadPageTPdf.RenderPageThumbnailвече уважава/Rotateи преизчислява мащабирането за/Rotate 90или270
Поправено (Fixed)
TPdfView.GetCharacterRectangleвече инициализира правоъгълника и връщаRect(0,0,0,0)при неуспешенGetCharBox- Второто извикване на
FPDFAction_GetURIPath/GetFilePathвGetLinkAnnotationsвече подаваsize-1, така че не записва извън буфера
Version 2.25.0
Променено (Changed)
TPdf.AddText,SetText,AddPathиInsertFormObjectFromXObjectвече обезсилват кешираната текстова страница и анотациите на връзките преди регенериранеTPdfView.RenderPage(HDC, ...)вече придобива render lock и маскира FPU/SSE изключения околоFPDF_RenderPage- Delphi демонстрацията
PrintPDFвече извикваPrinter.Abortпри отмяна
Поправено (Fixed)
- Астралните кодови точки от
FPDFText_GetUnicodeвече връщат U+FFFD чрезGetCharacterиGetCharcode; използвайтеGetTextза пълния UTF-16 - Отрицателен резултат от
FPDFLink_CountRectsвGetWebLinksвече се ограничава до нула TPdf.DestroyзаличаваPasswordчрезUniqueString+FillCharпреди освобождаване
Version 2.24.0
Добавено (Added)
TPdf.DeletePage,GetAttachment,GetAttachmentName,GetAttachmentType,SetAttachmentиDeleteAttachmentвече валидират индексите и повдигатEPdfErrorизвън диапазона
Поправено (Fixed)
- Поправени са течове на
FPDF_PAGEOBJECTпри грешки вTPdf.AddText,AddBitmapиAddJpegImage TPdf.UnloadPageвече унищожава изоставенотоFPathчрезFPDFPageObj_DestroyTPdf.InsertFormObjectFromXObjectвече извикваUpdatePage(FPDFPage_GenerateContent) след вмъкване
Version 2.23.0
Поправено (Fixed)
- Проверката на
/BaseStateприема и/OFFосвен/ONспоред ISO 32000-1 Table 8.70 - Проверката на
/Intentприема/Designи масиви като[/View /Design] - Откриването на Geospatial Measure вече не изисква
/Type /Measureза PDF 1.7/Extensions /ADBEExtensionLevel 3 и съпоставя само/Subtype /GEO
Version 2.22.0
Променено (Changed)
- Изчисленията за fit zoom на
TPdfView(GetPageZoom,GetPageWidthZoom,GetPageHeightZoom) вече използватClientWidth/ClientHeightвместоWidth/Height AddSignatureTimestampToCmsвече повдига изриченExceptionза нечетимото CMS SignerInfo поле и коригира липсващия блокbegin/endоколоsignedAttrs [0]
Поправено (Fixed)
- CNG ключът в
ResolveWinSignerвече се освобождава сNCryptFreeObjectпри грешка следCryptAcquireCertificatePrivateKey EcDsaP1363ToDerотхвърля нулева половинаrилиsвместоINTEGER 0
Version 2.21.12
Поправено (Fixed)
- Явното запазване в PDF 1.5 до PDF 1.7 вече отхвърля неправилно форматирани структури
/OCPropertiesна каталога, включително липсващи задължителни записи/OCGsили/D, невалидни стойности на конфигурация по подразбиране и записи на несписъчно състояние
Version 2.21.11
Поправено (Fixed)
- Явното запазване на версия PDF вече отхвърля директни или косвени записи на страница
/Annots, чиито речници на анотация пропускат задължителния запис/Subtypeили/Rect
Version 2.21.10
Поправено (Fixed)
- Явното запазване в PDF 1.7 вече изисква геопространствените речници
/Type /Measure /Subtype /GEOи анотации Projection да декларират/Extensions /ADBEс/BaseVersion /1.7и/ExtensionLevel 3или по-ново
Version 2.21.9
Поправено (Fixed)
- Явното запазване в PDF 1.7 вече изисква RichMedia анотации и действия
RichMediaExecuteда декларират/Extensions /ADBEс/BaseVersion /1.7и/ExtensionLevel 3или по-ново
Version 2.21.8
Поправено (Fixed)
- Явното запазване в PDF 1.7 вече изисква PRC 3D потоците да декларират
/Extensions /ADBEс/BaseVersion /1.7и/ExtensionLevel 1или по-ново, вместо да третира PRC като основна функция на PDF 1.7
Version 2.21.7
Поправено (Fixed)
- Явното запазване в PDF 1.4 и по-стари версии вече отхвърля записите
/SMaskInDataна XObject изображения, включително изрична стойност0, защото вградените JPEG 2000 канали за мека маска изискват PDF 1.5 или по-ново
Version 2.21.6
Поправено (Fixed)
- Явното запазване в PDF 1.4 и по-стари версии вече отхвърля 16-битови обекти от тип XObject, изискващи PDF 1.5 или по-ново, докато целите PDF 1.5 до PDF 1.7 запазват данните за изображение
/BitsPerComponent 16
Version 2.21.5
Поправено (Fixed)
- Явното запазване в PDF 1.4 и по-стари версии вече отхвърля стойностите
/PageLayout /TwoPageLeftи/TwoPageRightна каталога на документа, изискващи PDF 1.5 или по-ново, докато целите PDF 1.5 до PDF 1.7 запазват заявеното двустраничното оформление
Version 2.21.4
Поправено (Fixed)
- Явното запазване в PDF 1.3 вече отхвърля записите
/Langв каталога на документа, изискващи PDF 1.4 или по-ново, докато целите PDF 1.4 до PDF 1.7 запазват езиковия идентификатор
Version 2.21.3
Поправено (Fixed)
- Явното запазване в PDF 1.3 вече отхвърля дървета с имена
/EmbeddedFilesна документа, която изисква PDF 1.4 или по-ново, без да отхвърля потоци вградени файлове, сочени чрез по-стари спецификации на файлове
Version 2.21.2
Поправено (Fixed)
- Последна версия: 2.21.2; Дата на издаване:
Version 2.21.1
Поправено (Fixed)
- Валидацията на хибридни препратки вече прилага допълнителни записи
/XRefStmпреди класическите xref заплаздрьовеци от същата ревизия, така че компресираните анотации и други обекти с ограничена версия не се пропускат повече, когато таблицата за съвместимост ги означава като свободни
Version 2.21.0
Променено (Changed)
- Всички примери за прегледач Delphi, C++Builder и Lazarus вече могат да отварят PDF, подаден като първи аргумент на командния ред, а примерите
MultiPageViewerза C++Builder и Lazarus предоставят явни преки за избери всичко и копиране
Поправено (Fixed)
- Последна версия: 2.21.3; Дата на издаване:
Version 2.20.0
Променено (Changed)
- Всички примери за прегледач Delphi, C++Builder и Lazarus вече предоставят последователни преки за отваряне, търсене, запазване, печат, мащабиране и навигация, а всяка варианта
ViewerInteractionLabподдържа и преход между страници, валидирано ръчно мащабиране 10–600%, постоянни журнали на взаимодействията и проверки на координатите на щракване
Version 2.19.1
Поправено (Fixed)
- Последна версия: 2.21.4; Дата на издаване:
Version 2.19.0
Променено (Changed)
- Последна версия: 2.21.12; Дата на издаване:
Поправено (Fixed)
CJKTextLabв C++Builder вече измерва текст чрез експортираните функции за редактиране на PDFium, аMergePDFизбягва двусмислено VCL претоварване на съобщения, възстановявайки чисти компилации в RAD Studio 37
Version 2.18.3
Поправено (Fixed)
- PAdES B-LTA Document Time-stamp вече се регистрира като открито поле за подпис — невидим Widget, достъпен чрез
/Annotsна първата страница и/Fieldsна AcroForm (ETSI EN 319 142-1 §5.4.3) — вместо непостижим осиротял обект, който валидаторите за изброяване на полета за подпис не можеха да намерят; съществуващите анотации и полета се запазват
Version 2.18.2
Поправено (Fixed)
- PAdES подписването и класическото записване на кръстосани препратки вече издигат ясна грешка, когато байтово отместване надвишава фиксираната 10-цифрена ширина на полето (~9.3 GB), вместо да оставят мълчаливо неизписан заместителя
/ByteRange(произвеждайки невалиден подпис) или да препълват 20-байтовия xref ред (ISO 32000-1 §7.5.4); изходът на xref-stream използва 8-байтови бинарни полета и не е засегнат
Version 2.18.1
Поправено (Fixed)
- PAdES подписването вече разрешава косвени препратки към
/Annots,/AcroFormи/Fieldsна първата страница чрез целия обектен заглавен ред (ISO 32000-1 §7.5.3) и по действителния номер на генерацията на препратката; предишно търсене по подниз съответстваше на обектен номер вътре в по-дълъг такъв (разрешавайки5 0 Rкъм15 0 obj), а твърдо зададена генерация пропускаше обекти сgen>0, повреждайки масивите с полета за подпис или отхвърляйки валидни документи - Когато каталогът, първата страница,
/Annots,/AcroFormили/Fieldsсе намира в поток от обекти, подписването вече опитва отново върху разширено копие преди да откаже, вместо незабавно да отхвърли документа
Version 2.18.0
Добавено (Added)
ReadPdfVersionInfoдокладва версията от заглавието, ефективната версия на ядрото, заменящата версия от каталога и нивото на разширението на разработчиците на Adobe от PDF поток
Променено (Changed)
- Явното запазване в PDF 1.3-1.7 вече проверява структурите на каталога, ресурсите на страниците, XFA, редакцията и разширенията на разработчиците в техния обектен контекст; шифрован изходен документ с явна версия и инкрементална нормализация на PDF 1.3 се отхвърлят, за да се запази целостта на документа
- Записите чрез файлов път вече пишат в съседен временен файл и заменят целта само след успешна компресия, нормализация и проверки на версията
Поправено (Fixed)
- Изходът на PDF 1.3 вече носи изискания пълен ресурс
/ProcSetи премахва ключовете за прозрачност на PDF 1.4, когато те само повтарят началните стойности на графичното състояние на PDF 1.3 - Файловете с хибридна препратка, xref-stream и поток от обекти вече не се презаписват от класическия xref компресор, предотвратявайки изпускането на записи на компресирани обекти
- Имена, наподобяващи ключове за функции за прозрачност или каталог в низове, коментари или несвързани карти на ресурси, вече не причиняват неверни откази за целева версия
Version 2.17.0
Добавено (Added)
- PAdES подписите вече се регистрират като невидими Widget анотации в масива
/Annotsна първата страница и в масива/Fieldsна AcroForm, запазвайки съществуващите анотации и полета на формуляра
Променено (Changed)
- Инкременталните актуализации на PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA, PDF/VT и PAdES вече запазват представянето на кръстосани препратки на изходния документ: документите с xref-stream получават актуализация с xref-stream, съгласно изискването на ISO 32000-1 §7.5.8.1, докато класическите документи продължават да получават xref таблица
- Отместванията на кръстосаните препратки,
startxref,/Prev, стойностите на ByteRange за PAdES и обработката на SHA-256 обхват вече използват 64-битови позиции с поредно хеширане, позволявайки файлове по-големи от 2 GB в 64-битови компилации - Генерираните записваеми XMP пакети вече резервират 2048 байта отстъп преди затварящата инструкция на пакета
Version 2.16.10
Поправено (Fixed)
- Разширяването на потока от обекти вече не съживява остарели копия на обекти, мигрирани от инкрементална актуализация от потока от обекти в обикновена дефиниция (ISO 32000-1 §7.5.7); проверките за съответствие и инжектирането на маркери преди това разрешаваха остарелия каталог или речника на метаданните в такива файлове
Version 2.16.9
Поправено (Fixed)
- В Free Pascal текстовите низове, чийто вход не е валиден UTF-8, се разшируват байт по байт като Latin-1 и се записват като UTF-16BE шестнадесетични низове; предишните сурови байтове изтичаха в буквален низ, което не е допустимо кодиране на текстов низ в PDF 1.7
- Декодирането на поток вече разпознава необработени deflate данни без обвивката zlib RFC 1950 (честа грешка на дефектни записватели) и ги декомпресира в необработен режим, така че проверките за съответствие вече не стават мълчаливо слепи за такива потоци
Version 2.16.8
Поправено (Fixed)
- Инкременталните актуализации, записани от пътя за след-обработка при запис, вече обновяват втория (променящ се) елемент
/IDна трейлъра, съгласно изискването на ISO 32000-1 §14.4; преди и двата елемента се копираха дословно, така че инструментите за кеширане и синхронизация виждаха непроменен идентификатор след всяка актуализация
Version 2.16.7
Поправено (Fixed)
- Изтриването на тялото на потока, използвано от проверките за съответствие, вече изисква ключовата дума
streamда е последвана от край на ред (ISO 32000-1 §7.3.8.1); думата в буквален низ като(downstream)преди това изтриваше цялата следваща структура до следващияendstream, скривайки истинските нарушения от проверките на байтово ниво - Сканирането на забранени функции на PDF/X и PDF/E допълнително изтрива буквалните низове и коментарите (§7.2.2), така че стойност като
/Title (see /JavaScript docs)или коментиран токен вече не произвежда невярна констатация заJavaScript,AcroFormилиLZWDecode
Version 2.16.6
Поправено (Fixed)
- Записите в DPM на PDF/VT вече се проверяват при записване, съгласно документацията: имена на ключове, нарушаващи правилото NMTOKEN на ISO 16612-2 §6.6 или правилото за префикс на регистрант от Приложение E, и дублиращи се имена, се отхвърлят вместо да се записват в речника DPart — преди това имена, съдържащи интервал, се разцепваха на фиктивна двойка ключ/стойност и повреждаха речника
Version 2.16.5
Поправено (Fixed)
- Премахването на запис в речник, чиято стойност е шестнадесетичен низ (като
/Check <...>), вече премахва целия запис; инжекторите преди оставяха осиротял шестнадесетичен низ, произвеждайки синтактично повреден речник - Премахването на запис, чиято косвена препратка използва нови редове между токените (ISO 32000-1 §7.3.10 позволява произволни белини), вече не оставя номера на генерацията и ключовата дума
R
Version 2.16.4
Поправено (Fixed)
- Сканирането на максималния номер на обект вече не изисква заглавките на обектите да започват ред (ISO 32000-1 §7.5.3 позволява произволни белини или разделители преди тях), така че инжекторите вече не могат да разпределят номер на обект, съвпадащ с вграден заглавен ред
N G obj, и мълчаливо да повредят файла; номерата на обекти са ограничени от тавана от Приложение C - Потоци, чийто
/Lengthе косвена препратка, вече разрешават реферирания целочислен обект и използват стойността му, когато тя съответства на затварящияendstream; предишно такива потоци бяха ограничени от търсене по шаблон, което съкращаваше тела, законно съдържащи байтовата последователностendstream— типично за вградени PDF прикачени файлове
Version 2.16.3
Поправено (Fixed)
- Преходите за компресия на потоци пропускат документи с кръстосани препратки-потоци (PDF 1.5+ файлове без класическа ключова дума
trailer) непроменени; пътят за възстановяване преди погрешно разглеждашеstartxrefкато местоположение на таблицата и синтезираше предполагаем трейлър, което можеше да произведе неотварящ се файл - Компресорът пропуска XMP метаданните, за да може PDF/A документ да запази задължителния нефилтриран поток от метаданни (ISO 19005-1 §6.7.2), и оставя непроменени потоците на външни файлове (
/Fс/FFilter) - Реконструираната таблица на кръстосаните препратки сканира копие на документа с изтрити потоци, така че двоичното съдържание на потоци вече не може да имитира заглавки на обекти или да раздува таблицата;
/Sizeна реконструирания трейлър вече отразява действителната таблица и номерата на обектите са ограничени от тавана от Приложение C - Намирането на оригиналната таблица с кръстосани препратки приема само CR края на редове (ISO 32000-1 §7.5.1) и вече не може да съответства на буквите
xrefвътре вstartxref; сканирането на ключова дума на поток получи същата защита с опашкаendstream, използвана другаде, и вече напредва след пропуснати тела на потоци
Version 2.16.2
Поправено (Fixed)
- Анализирането на цели числа в четците на PDF на байтово ниво вече приема явния знак
+, разрешен от ISO 32000-1 §7.3.3, и отхвърля поредици от цифри, които биха препълнили, така че враждебни или повредени документи вече не могат да обвият анализираните дължини и отмествания в подвеждащи стойности
Version 2.16.1
Поправено (Fixed)
- Инжекторът на PDF/UA записва стойността
/Langна каталога като правилен PDF текстов низ; преди я прекарваше през XML екрана, така че езиков маркер, съдържащ&или скоби, произвеждаше повреден запис, а non-ASCII въведени данни се записваха като необработен UTF-8 - Записът
/ISO_PDFEVersionInfo на PDF/E използва споделения кодировач на текстови низове, поддържайки non-ASCII стойностите законни в PDF 1.7 - XML екранирането за XMP пакети отпуска управляващи символи, незаконни в XML 1.0, така че метаданни, копирани от повреден изходен документ, вече не могат да направят целия поток от метаданни некоректно формиран
- Преобразуването на PDF към XMP дата проверява, че полетата за дата са числови и допълва липсващото поле за минути, предотвратявайки неправилно формирани ISO 8601 дати в генерирания XMP; на платформи, различни от Windows, резервната времева марка вече включва часа на деня вместо само датата
Version 2.16.0
Добавено (Added)
- Декодирането на потоци вече реконструира предикторите
/DecodeParms(PNG предиктори 10-15 и TIFF предиктор 2, ISO 32000-1 §7.4.4.4) след FlateDecode, спазвайки/Colors,/BitsPerComponentи/Columns; потоци от обекти, компресирани с предиктор — честа практика при PDF 1.5+ записватели — преди показваха диференцирани байтове, така че обектите в тях бяха мълчаливо невидими за проверките за съответствие и инжектирането на маркери
Поправено (Fixed)
- Засичането на FlateDecode вече анализира стойността
/Filterкато име или масив вместо търсене по подниз, така че каскадни филтърни вериги и поява на думата в несвързани стойности вече не задействат фиктивно декомпресиране; неподдържаните вериги се връщат към суровите байтове, както преди
Version 2.15.1
Поправено (Fixed)
- Скенерът на речника вече пропуска буквалните низове, шестнадесетичните низове и коментарите, докато балансира
<</>>(ISO 32000-1 §7.2.2), така че речници, съдържащи стойности като(A >> B)или шестнадесетичен низ, прилепен до затварящия разделител, вече не се съкращават при анализирането на трейлъра, каталога и проверките за съответствие - Извличането на буквални низове вече декодира пълния набор от екранирани символи §7.3.4.2 Таблица 3 —
\n \r \t \b \f, осмично\ddd, продължения на ред и нормализиране на EOL без екраниране — вместо да копира екранирания символ буквално, възстановявайки правилните сравнения за/Producer,/GTS_PDFXVersionи/ISO_PDFEVersionпри записватели, ползващи осмично екраниране - Буквалните низове, записвани от инжекторите на маркери, вече екранират CR, LF и други управляващи символи, така че стойностите оцеляват байт по байт при нормализирането на края на реда при четца
Version 2.15.0
Поправено (Fixed)
- Инкременталните актуализации, записани от инжекторите на маркери PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA и PDF/VT и от пътищата за подписване и DSS на PAdES, вече запазват постоянния файлов идентификатор на изходния документ: първият елемент
/IDна трейлъра се пренася дословно, съгласно изискването на ISO 32000-1 §14.4, и само вторият (променящ се) елемент се опреснява; преди и двата елемента се регенерираха, така че системите за индексиране и работните потоци за дългосрочна валидация виждаха различна идентичност на документа след всяко запазване - PAdES подписите, инжектирането на DSS и Document Time-stamp на B-LTA вече пренасят напред препратката
/Infoна изходния трейлър (ISO 32000-1 §7.5.6), така че свойствата на документа вече не изчезват от панелите на четеца след подписване; трейлърът на Document Time-stamp също получава масива/ID - Резервният
/Infoна трейлъра за документи с кръстосани препратки-потоци вече намира речника на потока XRef правилно и запазва номера на генерацията на препратката; преди никога не съответстваше на съответстващи PDF 1.5+ файлове, мълчаливо изпускайки/Info
Version 2.14.4
Поправено (Fixed)
- Датата
/Mв речника на подписа, записвана отTPdf.SignPadesиSignPadesBytes, вече носи задължителния префиксD:и маркера за UTC отместванеZ, изискван от ISO 32000-1 §7.9.4; строгите валидатори преди отхвърляха времето на подписване като неправилно форматиран низ за дата
Version 2.14.3
Поправено (Fixed)
- Търсенето на ключове в речника в споделения PDF четец вече съответства на цели токени с имена (ISO 32000-1 §7.3.5); преди поток, чийто речник изброяваше
/Length1преди/Length(типично за потоци FontFile), се съкращаваше до грешния брой байтове, мълчаливо заслепявайки проверките на PDF/A, PDF/UA и другите, четящи шрифтове, CMap или потоци от метаданни - Търсенията на ключовете
/Encrypt,/Root,/Sizeи/Infoв трейлъра вече не съответстват на по-дълги ключове, споделящи същия префикс (като/EncryptMetadata) - Разширяването на потока от обекти вече не се доверява на повредена или враждебна стойност на
/N: нецелочислените стойности вече дават 0 вместо неинициализирано число, а горна граница, извлечена от/First, предотвратява прекомерни разпределения при сканиране на неправилно формирани документи
Version 2.14.2
Поправено (Fixed)
- Инжекторите на маркери PDF/X, PDF/VT, PDF/UA, PDF/E и PDF/R вече пренасят шифровани изходни документи непроменени вместо да добавят раздели за актуализация в обикновен текст; предишното поведение произвеждаше файлове, чийто последен трейлър губеше записа
/Encrypt(ISO 32000-1 §7.5.6), така че съответстващите четци неправилно четяха шифрованото тяло като обикновен текст TPdf.SignPades,SignPadesBytesиInjectPadesDssMarkersвече издигатEPadesCrypto, когато изходният документ е шифрован, вместо мълчаливо да излъчват повреден или неверифицируем файл; премахнете шифроването преди подписване или вграждане на DSS материал
Version 2.14.1
Поправено (Fixed)
TPdf.SignPadesиSignPadesBytesвече попълват всичките четири полета/ByteRangeна речника на подписа; преди последните три полета оставаха на своите нулеви заместители, така че произведените подписи декларираха празен байтов диапазон и се провалиха при верификацията от съответстващи валидатори- Речниците Document Time-stamp на PAdES B-LTA получават същата корекция за попълване на
/ByteRange ValidatePadesComplianceвече приема стандартното оформление на подписа, при което пропастта на байтовия диапазон съдържа шестнадесетичната стойност/Contents, и проверява, че вторият сегмент на диапазона завършва точно в края на файла; преди само диапазоните без пропаст преминаваха проверката за покритие
Version 2.14.0
Добавено (Added)
TPdf.ExportXFDFсериализира всяка стойност на поле от формуляр и анотация на всички страници в XFDF документ (ISO 19444-1), излъчвайки<fields>за йерархичните стойности на формуляра и<annots>за всички поддържани подтипове анотации (text, highlight, underline, strikeout, squiggly, line, circle, square, caret, polygon, polyline, stamp, ink, freetext, fileattachment, sound, link, redact)TPdf.ImportXFDFпрочита обратно XFDF документ в заредения PDF, пресъздавайки анотации на съответстващите страници и прилагайки стойностите на полетата към техните widget анотации- Записът
TPdfAnnotationполучиName(NM),Subject,ModificationDate(M),CreationDate,Icon,Opacity(CA), крайни точки на линии, върхове на полигон/полилиния и полета за жестовете на списъка с мастило, така че XFDF двупосочните конвертирания запазват пълните метаданни за анотациите - Нов пример
XfdfLabв наборите с демо за Delphi, C++Builder и Lazarus демонстрира двупосочното конвертиране при износ/внос
Version 2.13.6
Поправено (Fixed)
ValidatePdfAвече третира потоците/Metadataна каталога без/Type /Metadataили/Subtype /XMLкато липсващи XMP метаданни чрезpvaiMissingXmpMetadata- Докладите за предварителна проверка на PDF/A вече класифицират
pvaiMissingXmpMetadataкато Metadata и препоръчват поток/Metadataв каталога с/Type /Metadata,/Subtype /XML, нефилтриран XMP и маркериpdfaid
Version 2.13.5
Поправено (Fixed)
ValidatePdfAвече докладва Widget анотации без речник за изглед и анотации на PDF/A-2 / PDF/A-3, изискващи, но нямащи/AP, чрезpvaiAnnotationApDictViolation- Докладите за предварителна проверка на PDF/A вече категоризират
pvaiAnnotationApDictViolationкато съдържание, което инжектирането на маркери не може да поправи
Version 2.13.4
Поправено (Fixed)
ValidatePdfAвече докладва вградени изображения в PDF/A-2 и PDF/A-3, чиято стойност/Iили/Interpolateеtrue, чрезpvaiImageDictionaryViolation, съответствайки на съществуващото покритие на речника на Image XObject- Докладите за предварителна проверка на PDF/A вече категоризират
pvaiImageDictionaryViolationкато съдържание, което инжектирането на маркери не може да поправи
Version 2.13.3
Поправено (Fixed)
ValidatePdfAвече докладва вградени изображения в PDF/A-1, използващи филтри/LZWDecodeили съкратени/LZWв потоците от съдържание, чрезpvaiInlineImageLzwForbidden, съответствайки на съществуващото покритие на вградени изображения в PDF/A-2 и PDF/A-3- Скенерът на филтри за вградени изображения вече напредва след водещи имена на ресурси като
/GS1, избягвайки блокирания при сканиране на по-широките потоци от съдържание на PDF/A-1
Version 2.13.2
Добавено (Added)
TPdf.SetFocusedFormFieldTextзаписва текст в буфера за редактиране на текущото фокусирано поле от формуляра чрезFORM_ReplaceSelection, симетрично наFocusedFormFieldText. За AcroForm текстови/комбо полета стойността се фиксира в/Vпри загуба на фокус и се запазва; за XFA текстови полета записът попада само в паметния буфер (PDFium не излага публичен API за съгласуване на XFA стойности обратно към пакета с набори от данни, така че не се запазва при запис)- JavaScript хост платформата вече се прикачва винаги, когато V8 двигателят е наличен, независимо дали документът е XFA — така вграденият AcroForm JavaScript (скриптове на ниво doc, изчисления на полета,
app.alert) може да се изпълнява. Предиm_pJsPlatformсе свързваше само за XFA документи, оставяйки мълчаливо AcroForm JS деактивиран
Променено (Changed)
- Прикачването на JavaScript платформата вече е независимо от решението за XFA в
InitializeFormFill— таблицатаm_pJsPlatformсе изгражда винаги, когатоV8FeaturesAvailableе true, прилагана след свързването на версия/обратно извикване за XFA, а не вложена вътре в него
Version 2.13.1
Добавено (Added)
- Нови хост събития показват информация, която обратните извиквания за попълване на формуляри от v2.13.0 преди поглъщаха:
OnXfaUriAction,OnXfaPageCountChanged,OnXfaFocusChange,OnXfaEmail,OnXfaHttpRequest,OnXfaOpenFile,OnJavaScriptBeep,OnJavaScriptPrint,OnJavaScriptMail,OnJavaScriptSubmitForm. Всяко събитие по подразбиране се връща към съществуващото поведение без операция, когато не е присвоено, така че съществуващите хостове не са засегнати - Свойството
TPdf.XfaFormPacketsсамо за четене връща еднократна снимка на всички XFA пакети (TXfaPacketList), изпълнявайки типоветеTXfaPacket/TXfaPacketList, декларирани преди, но неизползвани - Специфичните за XFA кодове за грешка на PDFium
FPDF_ERR_XFALOAD/FPDF_ERR_XFALAYOUTвече са свързани и показани чрезLastPdfError, заменяйки общото „Неизвестна грешка" за грешки при зареждане/оформление на XFA
Променено (Changed)
FFI_DoURIActionWithKeyboardModifierвече проверяваOnXfaUriActionпреди да изпълни URI от XFA поле чрез shell, давайки на хоста право на вето (сигурност: злонамерено XFA поле преди можеше безусловно да стартира произволни URL адреси). Неприсвоените обработчици запазват предишното значение по подразбиране наShellExecuteWDecodeFormFieldTypeвече насочва типовете XFA полета чрезIsXfaFormFieldвместо чрез явен case с 8 клона, поддържайки enum в съответствие сFPDF_FORMFIELD_XFA_*по ординален отступ
Поправено (Fixed)
ValidatePdfAвече докладва твърдения за PDF/A-1, използващи PDF 1.5 кръстосани препратки-потоци или потоци от обекти с новия проблемpvaiPdfA1Pdf15Structure, продължавайки да позволява потоците от обекти за PDF/A-2 и PDF/A-3
Version 2.13.0
Добавено (Added)
- Пълна поддръжка на XFA (XML Forms Architecture) изпълнение:
TPdf.InitializeFormFillвече свързва всичките 14 обратни извикванияFPDF_FORMFILLINFOна версия 2 (FFI_DisplayCaret,FFI_GotoURL,FFI_PageEvent,FFI_PopupMenu,FFI_OpenFile,FFI_EmailTo,FFI_UploadTo,FFI_GetPlatform,FFI_GetLanguage,FFI_DownloadFromURL,FFI_PostRequestURL,FFI_PutRequestURL,FFI_OnFocusChange,FFI_DoURIActionWithKeyboardModifier) и прикачваIPDF_JsPlatform, за да може XFA-активиранpdfium.dllда изобразява и скриптира динамични XFA формуляри - Нов модул
Lib\FPdfXfa.pas, деклариращ XFA константите (FXFA_PAGEVIEWEVENT_*,FXFA_MENU_*,FXFA_SAVEAS_*,FPDF_FORMFIELD_XFA_*) и типоветеTXfaPacket/TXfaSaveFormat, преди референцирани само в коментари - Четец на статични XFA пакети в
TPdf:GetXfaPacketCount/GetXfaPacketName/GetXfaPacketContent/GetXfaPacketByNameплюсGetXfaTemplate/GetXfaDatasets/GetXfaConfigизвличат XFA пакетитеtemplate,datasetsиconfigкато необработен XML без нужда от XFA-активирано изпълнение — полезно за одит на съответствие и миграция на данни - Проби за възможности: глобална
XfaFeaturesAvailableи за документTPdf.XfaRuntimeAvailable(далиFPDF_LoadXFAдействително е успял) иTPdf.XfaStaticReadable(дали износите на четеца на пакети са разрешени) TPdfFormFieldTypeразширена сfiXfa,fiXfaCheckBox,fiXfaComboBox,fiXfaImageField,fiXfaListBox,fiXfaPushButton,fiXfaSignature,fiXfaTextField, сDecodeFormFieldType, съпоставящо новите стойностиFPDF_FORMFIELD_XFA_*- JavaScript хост събития в
TPdf:OnJavaScriptAlert,OnJavaScriptResponse,OnXfaGotoUrlиOnXfaRuntimeMissingпозволяват на хоста да персонализира JS диалозите и XFA навигацията или да реагира, когато XFA документ не може да изпълни двигателя - Нов пример
XfaLabза Delphi, демонстриращ XFA засичане, извличане на пакети, проби за възможности и резервния път при липсващо изпълнение
Променено (Changed)
TPdf.LoadDocumentвече предварително сканира входните данни за XFA маркери (/XFAв речника на AcroForm или/NeedsRenderingв каталога) и, когато са открити, автоматично избираpdfium.v8.dll, задавайкиEnableV8Engine := Trueпреди синглтон библиотеката да бъде заредена за първи път; щом обикновенpdfium.dllе зареден, процесът не може да превключи, така чеOnXfaRuntimeMissingсигнализира този случайTPdf.GetPageCountвече отразява броя на страниците, докладван от XFA двигателя чрезFFI_PageEventслед динамично репагиниране, вместо само статичното дърво от PDF страниците- Когато XFA документ е отворен, но изпълнението не е налично,
InitializeFormFillвече фиксираversion=1иxfa_disabled=1вместо да заявява версия 2 с неприсвоени обратни извиквания, което преди рискуваше дереференция на лош указател към обратно извикване
Version 2.12.2
Поправено (Fixed)
ValidatePdfAComplianceвече докладва използвани персонализирани XMP пространства от имена безpdfaExtension:schemas, продължавайки да приема стандартни метаданниpdfaidбез декларации за разширение- Проверката на вградени файлове в PDF/A-3 вече изисква и записите
/F, и/UFот горното ниво в речниците filespec и игнорира вложените ключове на потока/EFпри проверката на тези имена
Version 2.12.1
Поправено (Fixed)
ValidatePdfAComplianceвече декодира екранираните токени с имена на PDF преди да търси JavaScript, LZWDecode, Type1 и свързани забранени имена, така че обфускирани, но семантично идентични имена се докладват правилно- Проверките на PDF/A за вградени изображения вече отхвърлят стойностите на
/Filterи/F, ползващи/LZWDecode, съкратен/LZWили/Crypt, включително форми с масив и екранирано имен - Проверката на PDF/A вече докладва потоци от метаданни с забранени филтри, ICC профили на OutputIntent, чийто брой на компонентите
/Nлипсва или е несъответстващ, и спецификации на вградени файлове в PDF/A-3 с липсваща или невалидна/AFRelationship
Version 2.12.0
Добавено (Added)
- HTTP заявките на TSA вече задават явни 30 s таймаути за всяка фаза (разрешаване/свързване/изпращане/получаване) чрез
WinHttpSetTimeouts, така че бавен или недостъпен орган за времеви марки не може да блокира нишката за подписване неопределено, вместо да разчита на имплицитните стойности по подразбиране на WinHttp - Деривация на nonce за заявка за PAdES B-T / B-LTA времева марка, когато извикващият пропусне
TPadesSignOptions.Nonce: SHA-256 сгъване на монотонен брояч + системен часовник +GetTickCount64+ идентификатор на процес заменя предишния фиксиран резервен$100000000, така че две заявки, издадени в едната и съща милисекунда, вече не переизползват едно и също anti-replay nonce PdfInflateвече ограничава декомпресирания изход до 256 MiB, за да спре zlib-компресиран поток да изчерпа паметта при враждебен или повреден вход (т.нар. „zlib бомба"); ограничението е щедро за всякакъв реален PDF поток
Променено (Changed)
- Смесването на наслоявания на
TPdfView(маркиране за търсене, избор на текст, четене на дума, избор при разпростиране) вече не използва пиксел по пикселGetPixel/SetPixelV; правоъгълникът вече се смесва чрез 32-bpp извън-екраненTBitmapиScanLineв един проход, елиминирайки хиляди GDI kernel прехода на боядисване и правейки големите избори отзивчиви FPdfAsn1.TDerReader.ReadIntegerвече отхвърля INTEGER полета по-дълги от 8 байта (и 8-байтови отрицателни, чийто знаков бит би изисквалshl >= 64), връщайки 0 вместо да изчислява грешна стойност чрез неопределено поместване при CMS/PAdES ASN.1 входParseTimeStampRespвече не отразява обратно nonce от заявката катоTPadesTimestamp.Nonce; докато не кацне обходчикът TSTInfo, верифициращ върнатия nonce, полето остава 0, за да сигнализира „не е верифицирано" вместо да дава на извикващите фалшива увереност, че отговорът на времевата марка е актуален
Поправено (Fixed)
PointsToPixelsвръщаше входа непроменен за всяко DPI: делителят бешеPointsPerInch(константата 72) вместо буквалното 72, свеждайки формулата доResult := Points. Всеки външен извикващ, правещ преобразуване на точки→устройствени пиксели чрез тази помощна функция, вече получава правилнотоPoints × PixelsPerInch / 72PdfMaxObjNumподброявал документи, използващи потоци от обекти (PDF 1.5+ ObjStm): обектите, компресирани вътре в/ObjStm, нямат маркерN 0 obj, така че суровото сканиране на байтове ги пропускаше, а инжекторите, разпределящиMaxObj+1за нови обекти, можеха да се сблъскат со скрити членове на ObjStm и мълчаливо да повредят файла. Сканирането вече разширява потоците от обекти първо, за да бъде видим всеки номер на обектInjectPdfAMarkersвече не фалшифицира твърдение за съответствие с PDF/A при шифрован документ: PDF/A (ISO 19005-1 §7.1) забранява шифроването, а инжекторът преди копираше изходния файл с маркерите дори и следващата проверка да го отхвърляше. Когато е зададеноHasEncrypt, изходният файл вече се пренася непроменен. Нормалният пътTPdf.SaveAsPdfAвече премахва шифроването (saRemoveSecurity) преди инжектирането, така че това засяга само директни извикващиPdfReadStreamBytesвече отказва/Length, по-голяма от целия файл, преди разпределянето на резултантния буфер, затваряйки ранен път за разпределение при повреден или враждебен косвен размер
Version 2.11.0
Добавено (Added)
- Записът
FPDF_FILEHANDLERна PDFium вече декларира шестте си обратни извиквания (Release,GetSize,ReadBlock,WriteBlock,Flush,Truncate) като реални полета вместо коментари, съответствайки на оформлението на C заглавния файл. Обратните извиквания за прехвърляне на XFA FFI файлове (FFI_OpenFile/FFI_EmailTo/FFI_UploadTo/FFI_DownloadFromURL), връщащи или консумиращиPFPDF_FILEHANDLER, все още не са имплементирани в Pascal слоя за попълване на формуляри, но типът вече е структурно правилен за всеки бъдещ XFA path за изпращане/качване - Зареждането и разтоварването на библиотеката PDFium (
LoadLibrary/UnloadLibrary) вече се сериализират от глобален критичен раздел на процеса, така че две нишки за работникаTPdfFuture<T>(или нишка за работника, конкуриращи се с главната нишка) не могат и двете да наблюдаватPDFiumLibrary=0и да правят двойно свързване или да освобождават DLL, докато друга нишка е в средата на свързването - Раздел
initialization/finalizationвече извикваUnloadLibraryпри разтоварване на модула, осигурявайки изпълнението наFPDF_DestroyLibrary(присъединяване на нишка за работника, изхвърляне на V8 изолат, почистване на шрифта/кеша) вместо разчитане на ОС да рекламира DLL
Променено (Changed)
TPdf.SetActiveвече поглъща всяко изключение при зареждане (преди самоEPdfError), така че грешка в потока или нарушение на достъпа по време на настройка на формуляр/страница оставяActive=Falseвместо частично зареден компонент с неопределено състояние- Последователно кодиране на символи за аргументите на ключовете на метаданни на PDFium:
TPdf.GetMetaTextвече използва същото разделяне на FPCAnsiString/ DelphiUTF8EncodeкатоGetViewerPreferenceи пътищата за зареждане, вместо просто преобразуванеAnsiString(Tag) - Дедублирани помощни функции
BytesToAnsi,AnsiToBytes,WriteBytesиWriteStr:FPdfCompressвече ги импортира отFPdfPdfCommon(псевдонимите муWriteBytesToStream/WriteAnsiToStreamса пенсионирани) и излишното трияргументно претоварване наBytesToAnsiвFPdfPdfaе премахнато.FPdfAsn1запазва локалното си копие по дизайн, за да поддържа слоя за криптография свободен от модула за слой на съответствие
Поправено (Fixed)
- Изтичане на ресурси в
TPdf.LoadDocument(файл, памет,TBytes,TMemoryStream, персонализиран поток) иTPdf.CreateDocument: акоInitializeFormFillилиReloadPageса издигнали след успешно завършване наFPDF_LoadDocument/FPDF_CreateNewDocument, нативният манипулаторFPDF_DOCUMENTсе е изтичал, защотоFActiveвсе още е бил False по това време. Всеки път вече обвива настройката след зареждане вtry/exceptи затваря документа при неуспех, оставяйки компонента чисто неактивен - По-приятелска диагностика при зареждане на DLL на PDFium:
CheckLoadLibraryоткриваERROR_BAD_EXE_FORMAT(193) и докладва несъответствие на архитектура 32/64-бит, сочейки съответстващата компилацияDLLs/Win32илиDLLs/Win64, вместо да препраща само общата грешка на ОС.CheckGetProcAddressвече заявява, че разгърнатиятpdfium.dllе по-стар от свързването, когато необходим износ липсва, вместо обикновения текст „процедурата не е намерена" на ОС
Version 2.10.1
Поправено (Fixed)
- Стандартизация на SignerInfo sid в PAdES: идентификаторът на подписващия вече използва формата RFC 5652 §5.3
issuerAndSerialNumber(issuer Name + serialNumber, и двете извлечени дословно от DER сертификата на подписващия), заменяйки предишния нестандартенsubjectKeyIdentifier+ SHA-256 заместител на пълния сертификат, който Adobe Acrobat и други съвместими валидатори отхвърляха. Нов TbsCertificate DER обхождащ (ExtractIssuerAndSerial) чете SEQUENCE на издателя и INTEGER на серийния номер като сурови TLV байтове — серийните номера често надвишават диапазонаInt64, така че суровият TLV е задължителен. ФорматаsubjectKeyIdentifierостава като резерв само когато анализът на DER сертификата се провали
Променено (Changed)
TCmsSignerId.SerialNumber: Int64е заменен сSerialDer: TBytes(суровият serialNumber TLV). CMS конструкторът вгражда нарязания TLV дословно вIssuerAndSerialNumber, избягвайки препълване наInt64при 20-байтови серийни номера на CA (горна граница RFC 5280 §4.1.2.2)
Version 2.10.0
Добавено (Added)
- Дългосрочна валидация PAdES B-LT: когато
TPadesSignOptions.Level >= plB_LT,SignPadesBytesдобавя инкрементална актуализация, носеща речник/DSSс сертификата на подписващия и пълната междинна верига (самоподписаният корен е изключен според RFC 5652 §10.2.3), плюс маркера/Extensions /ESICLevel 1 (EN 319 142-1 §5.4.2) - Архивен печат на време PAdES B-LTA: когато
Level >= plB_LTAи е зададенTsaUrl, добавя се речник на подпис Document Time-stamp (/SubFilter /ETSI.RFC3161), чийто/ByteRangeобхваща целия файл; маркерът ESIC се повишава до Level 2. Това завършва четирите базови нива PAdES (B-B, B-T, B-LT, B-LTA) - Събиране на веригата от сертификати:
ResolveWinSignerвече извикваCertGetCertificateChainи попълваTPadesResolvedSigner.ChainCertDerс междинните CA сертификати, така че B-LT/DSS /Certsноси всеки сертификат, необходим за валидиране на подписа без външни справки.CertFreeCertificateContextвече е свързан, затваряйки изтичането на един контекст за подпис, отбелязано във v2.8.0 - Работен процес за интеграция с PDF/A:
TPdf.SignPadesWithPdfAпърво преобразува документа в PDF/A (най-високото ниво, което библиотеката излъчва днес), след което прилага заявената PAdES подпис — моделът на контейнер за дългосрочно архивиране, препоръчан от EN 319 142-1 Annex A.7
Version 2.9.0
Добавено (Added)
- Доверен печат на време PAdES B-T:
TPadesSignOptionsполучава полетаLevel,TsaUrlиNonce. КогатоLevel >= plB_Tи е зададенTsaUrl,SignPadesBytesизвлича стойността на подписа от построения CMS, заявява печат на време RFC 3161 върху нея и вгражда върнатия TimeStampToken като неподписан атрибут на SignerInfosignature-time-stamp— стъпката на доверено време B-T (EN 319 142-1 §6.3 изискване o) FPdfTsa: кросплатформен RFC 3161 клиент —BuildTimeStampReq(версия 1, SHA-256 messageImprint върху стойността на подписа, nonce, certReq=true),ParseTimeStampResp(приема PKIStatus 0/1, отхвърля 2+, извлича TimeStampToken ContentInfo дословно) иRequestTimestamp(еднократно build+POST+parse).PadesTsaAvailableограничава функцията на платформи без HTTP бекендFPdfTsaWin: Windows WinHttp бекенд, динамично свързан от winhttp.dll (нула нови зависимости при компилация; HTTPS се договаря от хранилището за сертификати на Windows). Повтаря модела на динамично свързване наFPdfCryptoWinFPdfCms:ExtractSignatureValueобхожда построен CMS, за да възстанови суровите подписни октети (входа за TSA хеш), аAddSignatureTimestampToCmsпрестроява ContentInfo с новunsignedAttrs [1](0xA1), носещ атрибута на печата на време. Валидаторът на етап 1 разпознава резултата като подпис B-T
Version 2.8.0
Добавено (Added)
- Стек за подписване PAdES B-B: четири нови чисто-Pascal/кросплатформени градивни блока (
FPdfSha256,FPdfAsn1,FPdfCms,FPdfCrypto) плюс Windows CNG бекенд (FPdfCryptoWin) позволяват наTPdf.SignPades/SignPadesToStreamда създават PAdES B-B подпис от край до край. Сертификатът на подписващия се разрешава по SHA-1 отпечатък от хранилището Current User “MY”; RSA-PSS (препоръчително), RSA PKCS#1 v1.5 и ECDSA се поддържат чрезNCryptSignHash FPdfSha256: самостоятелен SHA-256 FIPS 180-4 (Init/Update/Final + еднократни помощници). FPC 3.2.2 не предлага SHA-2 модул, така че библиотеката притежава такъв, за да държи всеки път на CMS кода върху единTSHA256Digestтип без разклоняване на RTLFPdfAsn1: DER енкодер (TDerWriter) и четец (TDerReader), покриващи SEQUENCE/SET/OID/INTEGER/OCTET STRING/UTCTime/GeneralizedTime/контекстно-специфични тагове с кодиране на определена дължина и обработка на IMPLICIT-тагове, които CMS изискваFPdfCms: CAdES SignedData конструктор (BuildSignedData), излъчващ подписаните атрибути content-type, message-digest и signing-certificate-v2, които PAdES baseline изисква, с опционални signing-time и commitment-type-indication. Дайджестът на signedAttrs се изчислява върху формата с SET-таг (0x31) и се преизлъчва с IMPLICIT [0] (0xA0) таг според RFC 5652 §5.4FPdfCrypto+FPdfCryptoWin: абстракция на криптографския бекенд сPadesCryptoAvailable/ResolvePadesSigner, а Windows реализацията свързва crypt32.dll / ncrypt.dll динамично (без нова зависимост от DLL при компилация). ECDSA подписите се прекодират от Windows формата IEEE P1363 r¦s в DERECDSA-Sig-Value, който CMS изискваSignPadesBytes: инжектиране на подпис на байтово ниво — резервира hex слот/Contentsс фиксирана ширина, изчислява обхващащия/ByteRange, прави дайджест на документа, строи и вгражда CMS и добавя инкременталната актуализация. Валидаторът (v2.7.0) разпознава резултата като PAdES B-B подпис
Version 2.7.0
Добавено (Added)
- Структурен валидатор на PAdES (ETSI EN 319 142-1 V1.2.1): новият модул
FPdfPadesи методътTPdf.ValidatePadesпроверяват речниците на стойността на подписа, достъпни от/ByteRange, обхождат CMSSignedDataвътре в/Contentsдостатъчно дълбоко, за да потвърдят отделимата CAdES форма, и засичат четирите базови нива (B-B, B-T, B-LT, B-LTA), както и речниците Document Time-stamp (/SubFilter /ETSI.RFC3161) - Набор от проблеми на PAdES на ниво клауза: 26
ppei*енума покриват приемливостта на/SubFilter(adbe.pkcs7.sha1иadbe.x509.rsa_sha1маркирани като забранени), покритието на файла от/ByteRange, забраната за/Cert, формата на CMSSignedData(единствен подписващ, отделим eContent, диапазон на версии), задължителните подписани атрибути (content-type,message-digest,signing-certificate/v2), забранените дайджести (MD5, SHA-1), взаимното изключване на/Reasonсрещуcommitment-type-indication(изискване d), изискването за доверено време B-T, маркера/DSS+/Certs+ ESIC Level 1 за B-LT и Document Time-stamp + ESIC Level 2 маркера за B-LTA - DSS инжектор:
TPdf.SaveAsPadesDss/SaveAsPadesDssToStreamдобавят инкрементална актуализация, носеща речник/DSS(с потокови масиви/Certs,/OCSPs,/CRLs) и маркера/Extensions /ESIC(Level 1 или 2) върху копие на документа, запазвайки оригиналните байтове — стъпката за вграждане на материалите за валидация B-LT/B-LTA (клауза 5.4.2) - Кросплатформен етап без зависимости: валидаторът и инжекторът са чисто-Pascal и работят на всяка поддържана IDE (Delphi, Lazarus, FPC, C++Builder); за това издание не се изисква криптографски бекенд и не се въвежда нова DLL зависимост
Version 2.6.0
Променено (Changed)
- Премахване на дублирането между стандартите: още седем дублирани помощни функции (PdfEnclosingObjNum, PdfDictRefNum, PdfExpandObjectStreams, PdfTextStr, ExtractLiteralString, ExtractXmpAttr) са премахнати от отделните стандартни модули и консолидирани в
FPdfPdfCommon, намалявайки около ~300 реда тежест за поддръжка на copy-paste код - Качество на PreflightReport: проблеми на content-клас за PDF/X и PDF/E, които преди това попадаха в общата категория “missing marker”, вече носят точни категории Content/Metadata/Security и препоръки, специфични за клаузата (около 15 енума за двата стандарта)
- Тестово покритие за PDF/E и PDF/R: още шест енума с нулево покритие получиха позитивни тестове (
pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden,pveiEmbeddedFilesForbidden,pvriBadHeader,pvriProhibitedInfoEntry) - Поправка на Lazarus компилацията:
Tests.PdfVT(модул само за Delphi DUnitX, добавен във v2.5.x) вече е изключен от проекта Lazarus, за да се възстанови компилирането
Version 2.5.3
Добавено (Added)
- Пълнота на OutputIntent (PDF/X-4 §6.2.4):
pvviOutputIntentSchemeмаркира OutputIntent, чийто/Sне е/GTS_PDFX;pvviOutputIntentMissingIdentifierмаркира липсващ/OutputConditionIdentifier - Освобождаване на Reference XObject за PDF/VT-2 (§6.2.2):
pvviReferenceXObjectForbiddenвече не се задейства за файлPDF/VT-2, който може законно да използва Reference XObjects върху база X-5g/5pg - Валидиране на символи на MIME границата (RFC 2046 §5.1.1):
vtmviBoundaryInvalidCharмаркира граница, чиито символи извън множеството bchars или чиято дължина надвишава 70
Поправено (Fixed)
InjectPdfVTMarkersвече записва Info/CreationDateи/ModDateот опциите за запис, така че полученият файл преминаваValidatePdfVTComplianceбез фалшивpvviInfoModDateMismatch(инжекторът преди пренаписваше XMP датите, но оставяше датите в Info речника остарели)
Version 2.5.2
Добавено (Added)
- Съгласуваност на Info
/ModDate(§6.3 NOTE 2, база PDF/X-4):pvviInfoModDateMismatchмаркира/ModDateв Info речник, който след нормализация от PDF-дата към XMP-дата не е равен наxmp:ModifyDate - Съответствие на inline части PDF/VT-2s (Annex A.2): MIME валидаторът вече стартира
ValidatePdfVTComplianceвърху всяка inlineapplication/pdfчаст и маркира тяло, което не е PDF/VT, чрезvtmviInlinePdfNotPdfVT
Version 2.5.1
Добавено (Added)
- Валидиране на сегментирането на DParts (ISO 16612-2 §6.5 Table 4):
pvviDPartsBadChunkingмаркира масив/DParts, чиито непоследни подмасиви нямат точно 8192 записа или чийто последен подмасив е извън 1..8192 - Съгласуваност на RecordLevel между потоци (Annex A.2): MIME валидаторът на PDF/VT-2s вече извлича
/RecordLevelна всеки inline PDF и маркира несъгласуваност чрезvtmviRecordLevelMismatch, допълвайки съществуващата проверка на NodeNameList - Подсказки за повтарящи се графични обекти (§6.7):
pvviGtsScopeInvalidValueмаркира/GTS_Scopeизвън {SingleUse, Record, File, Stream, Global, Unknown};pvviGtsScopeRecordWithoutRecordLevelмаркира/Recordбез/RecordLevel;pvviGtsXidNotUuidмаркира/GTS_XID, което не е RFC 4122 uuid: URI;pvviGtsEnvMissingмаркира липсващ/GTS_Env, когато/GTS_Scopeе Stream или Global (§6.7.4) - Засичане на препратки напред в MIME (Annex A.2):
vtmviForwardReferenceмаркира inline PDF, който цитира име на файл (чрез/EF /F), което не е въведено от по-ранна част на прикачване в потока
Поправено (Fixed)
ExtractNodeNameListFromPdfиExtractRecordLevelFromPdfвFPdfPdfvtMimeразрешават повтаряща се грешка off-by-one, при която отместването с база 1, върнато отAnsiFindKey, се трактуваше като абсолютно байтово отместване в разширения PDF
Version 2.5.0
Добавено (Added)
- Метаданни Document Part за PDF/VT (DPM, ISO 16612-2 §6.6):
TPdfVTSaveOptionsполучиDpmEntriesиDpmTarget, така че writer да може да прикачи речник/DPMкъм синтезирания DPart възел с валидиране на имената на ключовете срещу правилото за втори клас префикс от Annex E и правилата §6.6 NMTOKEN / уникалност / формаGTS_Managedот страна на валидатора - Потоков обмен PDF/VT-2s (Annex A): новият модул
FPdfPdfvtMimeпредоставяBuildPdfVT2sStreamиValidatePdfVT2sStreamза MIME пликаmultipart/mixed, носещ inline PDF/VT части плюс прикачени ICC профили, с правилото за подредба на заглавкатаX-PDFVT-Stream-version: 1и проверката за съгласуваност наNodeNameListмежду потоците TPdf.ValidatePdfVTвече изпълнява авторитетно преброяване на JavaScript-действия чрезFPDFDoc_GetJavaScriptActionCount, допълвайки сканирането на имена/JavaScriptна байтово ниво
Поправено (Fixed)
- Коректност на PDF/VT
Trappedвърху база PDF/X-4: стойността на енумаptvUnknownе премахната (PDF/X-4 забранява/Unknown),ptvUnspecifiedсе нормализира до/Falseпри запис (липсващ/Trappedсъщо е забранен), а новият проблемpvviTrappedInvalidмаркира липсваща илиUnknownстойност ValidatePdfVTComplianceвече разширява потоците от обекти (PdfExpandObjectStreams) преди сканиране, така че каталог, OutputIntent или речник Metadata, съхранявани в компресиран ObjStm (PDF 1.5+, типично за PDF/X-4 производители), са достъпни за търсене на байтово ниво
Променено (Changed)
- PDF/VT-1 вече наследява пълните забрани за съдържание на PDF/X-4:
pvviAcroFormForbidden(/AcroFormили/XFA),pvviAdditionalActionsForbidden(каталог/AA),pvviMissingTrimBoxиpvviReferenceXObjectForbidden(Reference XObject, само X-5g/5pg) - Премахване на дублирането между стандартите:
BuildDictObj,IccComponentCount, вграденият sRGB ICC профил (GetSrgbIccProfile),PdfTextStr,PdfEnclosingObjNum,PdfDictRefNumиPdfExpandObjectStreamsбяха повишени от утроени локални копия вFPdfPdfa/FPdfPdfx/FPdfPdfvtкъм единен каноничен дом вFPdfPdfCommon; 3144-байтовият ICC литерал вече съществува точно веднъж в кодовата база
Version 2.4.0
Коригирано (Fixed)
InjectPdfUaMarkersвече не изпуска референцията/Infoна trailer при база cross-reference-stream: локалниятSourceTrailerInfoRef(който нямаше xref-stream fallback) е заменен от споделенияPdfSourceTrailerInfoRef(пренесен от копието за PDF/A, което има този fallback от v2.0.0 насам)- Споделеният
PdfReadStreamBytesвече поддържа непреки референции/Length N G R(пренесени от локалното копие за PDF/A), така че валидаторите за PDF/VT, PDF/R и PDF/E вече не четат погрешно или пропускат потоци от XMP метаданни, създадени от инструменти, използващи indirect Length (Acrobat, Ghostscript)
Променено (Changed)
- Премахване на дублирането между стандартите: локалните копия на
PdfReadTrailerвFPdfPdfaиFPdfPdfx، локалните копия наSourceTrailerInfoRefвFPdfPdfaиFPdfPdfua, както и локалното копие наPdfReadStreamBytesвFPdfPdfaбяха изтрити — споделените версии наFPdfPdfCommonвече се прилагат навсякъде; това премахва около 330 реда дублиран код и елиминира нуждата от поддръжка за синхронизиране на копията - Покриване на липсващите тестове за PDF/X: седем енума за content-class, които преди това бяха без тестово покритие, получиха позитивни тестове (
pvxiLzwForbidden,pvxiJavaScriptForbidden,pvxiFormFieldsForbidden,pvxiAdditionalActions,pvxiEmbeddedFilesForbidden,pvxiMissingTrimBox,pvxiTrappedNotSet)
Version 2.3.0
Променено (Changed)
- Покриването на липсващите тестове за PDF/A продължава: още три енума с нулево покритие получиха позитивни тестове;
pvaiForbiddenRenderingIntent(§6.2.9) маркира нестандартно име за rendering-intent в content stream;pvaiJpeg2000Violation(§6.2.2) маркира JPXDecode изображение с/NumComponentsизвън {1,3,4} в Part 2;pvaiInlineImageLzwForbidden(§6.1.10) маркира вградено изображение, използващо LZW филтър в Part 2
Version 2.2.0
Променено (Changed)
- Регресионни тестове за поток от кръстосани препратки (cross-reference stream): съществуващият
Validate_XrefStreamTrailer_DetectsConformanceвече също проверява дали препратката/Metadataв каталога е разрешена и XMPpdfaid:partсе чете на базата на xref-stream (не само/Root+/ID). Нов тестInjectPdfA_XrefStreamBase_RoundTripsзащитава пътя за xref-stream на инжектора, добавен във версия v2.0.0. Два междустандартни теста (PdfE_XrefStreamBase_NotRejectedAsUnparsable,PdfR_XrefStreamBase_NotRejectedAsUnparsable) проверяват дали валидаторите за PDF/E и PDF/R вече не отхвърлят PDF файлове с xref-stream като неанализируеми - Покриване на тестовия дълг за PDF/A:
Validate_MinimalPdf_FlagsRequiredMarkersпотвърждава, че минимален празен PDF задействаpvaiMissingPdfAIdentifier,pvaiMissingOutputIntent,pvaiMissingIccProfile,pvaiMissingXmpMetadataиpvaiMissingXmpDates— затваряйки празнината в симетрията с валидаторите за PDF/E и PDF/X, които вече имаха еквивалентни тестове. Още две изброявания (enums) с нулево покритие получиха позитивни тестове:pvaiUnembeddedFontиpvaiSubsetMissingCidSet
Version 2.1.0
Поправено (Fixed)
- PDF/E беше невнимателно пропуснат при поправката за потоци от кръстосани препратки (cross-reference stream) във версия v2.0.0: както
InjectPdfEMarkers, така иValidatePdfEComplianceвсе още извиквахаPdfReadTrailerбезAcceptXrefStream, така че инжекторът за PDF/E безшумно се проваляше при изходни файлове с PDF 1.5+ (по подразбиране заSaveAsCopyна pdfium). Двете места на извикване вече подаватTrue - Споделеният алтернативен вариант (fallback) за потоци от кръстосани препратки (cross-reference stream) в
PdfReadTrailerвече съдържа защитата/Type /XRef, която локалните копия за PDF/A и PDF/X вече имаха, така че повредено отместване (offset) наstartxref, сочещо към несвързан речник, се проваля чисто, вместо да бъде грешно анализирано като trailer - Разрешаването на косвени препратки за
/LangвValidatePdfUaCompliance(v2.0.0) беше недостъпно:PdfFindObjDictнамира само речници<<, докато низовият обект/Langе(...)или<...>без речник. Заменено е с директно сканиране на тялото на обекта, което намира низовия токен
Променено (Changed)
- Седем дублиращи се помощни функции (PdfStructureBytes, PdfHasName, PdfCountName, BuildStreamObj), които бяха байтово идентични копия на споделените версии в
FPdfPdfCommon, бяха премахнати отFPdfPdfaиFPdfPdfua— споделените версии вече се прилагат навсякъде чрезuses
Version 2.0.0
Поправено (Fixed)
- Безшумен отказ при различни стандарти: споделената помощна функция
PdfReadTrailer(използвана от инжекторите на маркери и валидаторите за PDF/UA, PDF/X, PDF/VT и PDF/R) вече приема параметърAcceptXrefStreamи се връща към речника на обектите за поток от кръстосани препратки (cross-reference stream), когато липсва ключова думаtrailer(PDF 1.5+). Преди това изходният код отSaveAsCopyна pdfium (който използва поток от кръстосани препратки) водеше до безшумен отказ на всеки инжектор на маркери — изходните байтове се копираха непроменени и извикването все пак връщаше успех. Валидаторът за PDF/R-1.0 (чийто PDF 2.0 база винаги е поток от кръстосани препратки) на практика не правеше нищо. Зрялата имплементация на валидатора за PDF/A беше портирана към споделената помощна функция, така че всеки стандарт да се възползва от нея - Сканирането на речника на trailer в
InjectPdfUaMarkersиInjectPdfAMarkersвече използва чувствителния към дълбочинаPdfDictEndвместо просто търсене на>>, така че trailer, съдържащ вложен речник (например/Encrypt << ... >>), вече не се прекъсва преждевременно преди завършващия запис/Info
Променено (Changed)
TPdf.ValidatePdfUaвече потиска грубата проверка на байтово нивоpvuaiFontNotEmbedded, когато по-прецизният обектен модел на PdfiumpvuaiPdfiumFontNotEmbeddedвече се е задействал, така че предварителният отчет вече не съдържа два почти дублиращи се реда „embed your fonts“ за един и същ дефектpvuaiLangInvalidFormat(§7.2) вече разрешава косвена препратка/Lang(N 0 R) към нейния низов обект и валидира съдържанието, така че косвено рефериран езиков маркер вече не е сляпо петно
Version 1.99.0
Поправено (Fixed)
pvuaiLangInvalidFormat(§7.2) вече не пропуска неконтролирано шестнадесетично кодирани (hex-encoded)/Langнизове: двойките UTF-16BE (с BOMFE FF) и обикновените ASCII шестнадесетични низове вече се декодират и преминават през същата граматическа проверка за BCP 47, както и обикновените(...)низове, така че неправилен шестнадесетичен/Langсе улавя, а съответстващ (например UTF-16BEen-US) вече не е изложен на риск от погрешно маркиране
Променено (Changed)
pvuaiFontMissingToUnicode(§7.21.7) вече освобождава/MacExpertEncodingнаред с/WinAnsiEncodingи/MacRomanEncoding, съответствайки на четирите условия за освобождаване, изброени в клаузата
Version 1.98.0
Добавено (Added)
pvuaiNeedAppearancesTrue(§7.18.4) маркира AcroForm, чийто флаг/NeedAppearancesе true, поради което изгледите на уиджетите не са надеждно заключени и асистивните технологии не могат да ги свържат със структурното дърво. Портирано от валидатора за PDF/A и ограничено до наличието на/AcroFormза стесняване на повърхността за сканиране
Променено (Changed)
- veraPDF регресия на корпуса: свързани са двойките pass+fail за Reference-XObject по §7.20 and за subset CharSet/CIDSet по §7.21.4.2 в
Live_Corpus_ValidatePdfUaMatchesConformance. Пасовите образци за ToUnicode-forbidden-value по §7.21.7 и за media-clip по §7.18.6.2 също са свързани като защити срещу фалшиви положителни резултати (техните fail образци използват оформления на речници, които байтовото сканиране не улавя, така че е свързана само страната за преминаване) - Списъкът с твърдения (assertions) за преминаване през корпуса получи 15 нови защити срещу фалшиви положителни резултати, така че всяка активна байтова и структурна проверка
pvuai*вече се тества спрямо съответстващи образци (преди това само около 30 от 60-те активни проблема бяха защитени). Защитата заpvuaiLangInvalidFormatбеше умишлено пропусната, тъй като байтовият скенер консервативно маркира шестнадесетични/Langнизове, които не може да декодира
Version 1.97.0
Поправено (Fixed)
- Защита на
ValidatePdfUaStructureElements: обхождането на родителската веригаEnclosingTableвече включва брояч на преходите (ограничен от броя на елементите), така че неправилен цикълParentIndexв синтетичен масив от структурни елементи вече не може да блокира извикващия код. Заделянето на памет за масива с marked-content-ID вValidatePdfUaPageContentTaggingвече е ограничено до един милион записа, предотвратявайки заделяне на мулти-гигабайтова памет при повреден или злонамеренMarkedContentID
Променено (Changed)
- Коментарът към документацията на енума
pvuaiOrderedListMissingListNumberingвече точно описва какво прави проверката: маркира елементL, чиято стойност наListNumberingе извън набора от Таблица 347 на ISO 32000-1 (липсващ атрибут не се маркира). Предишният коментар подсказваше, че се откриват и подредени списъци без този атрибут, което имплементацията не прави - Двата образци за несъответствие на WMode
7.21.3.3-t02от корпуса за неуспешни тестове вече са свързани вLive_Corpus_ValidatePdfUaMatchesConformance— от версия v1.95.0 потокът CMap се декомпресира с FlateDecode, така че сравнението между речника и съдържанието се извършва върху четима страна. Остарелият коментар „не е свързан“ беше премахнат
Version 1.96.0
Добавено (Added)
- Консистентност между стандартите:
TPdf.ValidatePdfUaполучава две проверки, портирани от валидатора за PDF/A.pvuaiAnnotationFlagsViolation(§7.18.1) маркира неосвободена анотация с флаг Hidden / Invisible / NoView, което нарушава потока на четене на асистивните технологии.pvuaiActionTargetMissing(§7.18.5) маркира действие GoToR / URI / SubmitForm, на което липсва изисквания целеви ключ (/F+/D, /URI, /F), правейки връзката неизползваема за асистивните технологии
Поправено (Fixed)
- Сливане на структурното дърво между страници: цикълът за акумулиране на
AllElemsвTPdf.ValidatePdfUaвече пребазираParentIndexна всеки елемент от локалния за страницата масив към обединения масив. Без това дочерните елементи на страница 2 запазваха локалния си индекс на страницата, който сочеше към отрязъка на страница 1, като по този начин безшумно повреждаха всяка проверка, зависима от ParentIndex (структура на таблици/списъци, брой H-child по §7.4.4, EnclosingTable) - Парсване на RoleMap:
PdfReadRoleMapPairsвече не прекратява цялото сканиране на ключ/стойност, когато стойността е косвена препратка (N 0 R) или масив ([...]) — и двете валидни форми на RoleMap според ISO 32000-1 14.8.5.1. Сега той просто пропуска този запис (Continue), вместо да прекъсва сBreak, елиминирайки фалшивите положителни резултати заpvuaiRoleMapUnresolvedпри типове, съпоставени след запис с косвена препратка или масив
Променено (Changed)
FPdfPreflightReport: 18 активни стойности наTPdfUaValidationIssue, които преди това попадаха в общата категория и препоръка за „липсващ маркер“, вече носят точни категории (Structure / Content / Metadata / Security) и специфични за клаузите препоръки. Също така е коригирана правописната грешкаpuaNone / pua1→pucNone / puc1вPDFSpecComplianceMatrix.md
Version 1.95.0
Променено (Changed)
- Преглед на пълнотата и коректността на
TPdf.ValidatePdfUa: проверкатаpvuaiCMapWModeMismatchпо §7.21.3.3 и проверкатаpvuaiToUnicodeForbiddenValueпо §7.21.7 вече декомпресират потоците CMap / ToUnicode, компресирани сFlateDecode, преди сканиране (преди това се оценяваха само некомпресирани потоци, известен източник на фалшиви отрицателни резултати). Споделените помощни функцииPdfInflate/PdfReadAndDecodeStreamса преместени отFPdfPdfa/FPdfPdfxвFPdfPdfCommon, така че всеки модул за съвместимост споделя едно копие
Добавено (Added)
pvuaiSubsetCharSetEmpty(§7.21.4.2) маркира поднабор Type 1 наFontDescriptor, който носи ключ/CharSetс празна низова стойност — съществуващата проверкаpvuaiSubsetMissingCharSetулавяше само липсващ ключ. Празна стойност за/CIDSetне се маркира, тъй като шрифт без CID-ове може легитимно да носи празна растерна карта
Version 1.94.0
Добавено (Added)
- Вторият одит на
TPdf.ValidatePdfUaзатвори шест несъответствия по ISO 14289-1, открити чрез преглед клауза по клауза и повторно сканиране на вградените API-та на Pdfium, които вече са обвити, но не се използват от пътя за PDF/UA.pvuaiHeadingFormatInvalid(§7.4.3) маркира потребителски дефинирани заглавни тагове, които започват с H, но съдържат разделители, интервали или римски цифри вместо чисти арабски цифри.pvuaiMissingDocumentOutline(§7.17, препоръчително) маркира многостраничен документ без структура от отметки (bookmark outline), като едностраничните документи са освободени от това изискване.pvuaiStructElementLangInvalid(§7.2) маркира стойност/Langна структурен елемент, която не е валиден BCP 47 таг.pvuaiWidgetMissingPrintField(§7.14 / §7.18.4) маркира структурен елемент Widget, на който липсва собственикът на атрибута PrintField.pvuaiLinkNotInStructureTree(§7.18.5) маркира документ, чиито анотации/Subtype /Linkне са изложени като структурни елементи Link.pvuaiPdfiumAnnotationMissingContentsиpvuaiPdfiumLinkMissingContents(§7.18.1 / §7.18.5) добавят прецизно сканиране на анотации чрез обектния модел на Pdfium, което освобождава скрити, намиращи се извън crop-box, Popup и Widget анотации — елиминирайки фалшивите положителни резултати от байтовата евристика, която не може да прочете флаговете/Fили/Rect
Version 1.93.0
Добавено (Added)
TPdf.ValidatePdfUaвече добавя обхождане по обектния модел на Pdfium върху байтовия инспектор, отразявайки архитектурата на PDF/A от кръг 7: той обхожда текстовите обекти на всяка страница чрезFPDFTextObj_GetFont→FPDFFont_GetIsEmbedded(pvuaiPdfiumFontNotEmbedded, §7.21.4) и сканира всеки символ чрезFPDFText_HasUnicodeMapError(pvuaiPdfiumUnicodeMapError, §7.21.7) andFPDFText_GetUnicode(pvuaiPdfiumNotDefGlyph, §7.21.8) — много по-прецизно от байтовите евристики, които се задействат само когато липсват програми за шрифтове или изобщо не се появява/ToUnicode. Обхождането се прекратява по-рано на три нива: цикълът на страниците спира, когато и трите проблема от слоя на Pdfium вече са зададени, цикълът по обекти спира при първия невграден шрифт, а сканирането на символи пропуска проверката за.notdef, акоUnicodeMapErrorвече е възникнала. PDF/UA беше последният валидатор на PDF стандарти без слой на обектния модел на Pdfium
Version 1.92.0
Добавено (Added)
- Създаден е
Tests.PdfR— първият тестов файл за валидатора на PDF/R-1 (FPdfPdfr), покриващ валидация на хедъра, забрана за ObjStm, засичане на растерни маркери и защита от фалшиви положителни резултати за чисти файлове. Всичките шест тестови пакета за стандартите на PDF вече имат собствени тестови файлове: PdfA(80), PdfUa(101), PdfX(7), PdfE(5), PdfVT(15), PdfR(4) = общо 212 теста
Version 1.91.0
Добавено (Added)
ValidatePdfEиValidatePdfVTполучиха проверки на ниво съдържание, които преди бяха налични само във валидаторите за PDF/A, PDF/UA и PDF/X:pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden(само за PDF/E),pveiEmbeddedFilesForbidden(само за PDF/E),pveiOpiForbidden,pvviLzwForbidden,pvviJavaScriptForbidden,pvviEmbeddedFilesForbidden,pvviOpiForbidden.TPdf.ValidatePdfEиTPdf.ValidatePdfVTсъщо получават слой на обектния модел на Pdfium (pveiPdfiumFontNotEmbedded/pvviPdfiumFontNotEmbedded), който обхожда текстовите обекти на страниците чрезFPDFFont_GetIsEmbedded, като спира при първия невграден шрифт
Version 1.90.0
Добавено (Added)
TPdf.ValidatePdfXвече добавя обхождане по обектния модел на Pdfium върху байтовия инспектор: той обхожда текстовите обекти на всяка страница чрезFPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedи докладва невграден шрифт катоpvxiPdfiumFontNotEmbedded— по-прецизно от байтовата евристика, която се задейства само когато липсват програми за шрифтове. Обхождането спира предсрочно при първия намерен невграден шрифт
Променено (Changed)
- Обхождане на структурното дърво в
TPdf.ValidatePdfUa: повикването наValidatePdfUaPageContentTaggingза всяка страница (което изгражда карта на претенциите за marked-content-ID и извършва взаимна проверка на всеки текстов/графичен обект) вече се пропуска на следващите страници, след катоpvuaiUntaggedContentе намерен — структурните елементи все още се събират за проверките между страниците (уникален идентификатор на бележка, последователност от заглавия), но скъпото сканиране за маркиране на съдържанието на страница спира рано
Version 1.89.0
Променено (Changed)
- Производителност на слоя за обектния модел на Pdfium в
TPdf.ValidatePdfA: обхождането на страници/обекти вече се прекратява предсрочно на три нива — цикълът по страниците спира, когато всички приложими проблеми от слоя на Pdfium вече са намерени, цикълът по обекти спира, когато и двата проблема за обект (вграждане на шрифт + прозрачност) са зададени, а сканирането на символи в текстовата страница пропуска проверката за.notdef, когатоUnicodeMapErrorвече е възникнала. Проверките за наличност на API сAssigned()и флаговете за съответствие се кешират в локални булеви променливи веднъж преди цикъла, вместо да се оценяват повторно на всяка страница/обект/символ. При голям несъответстващ документ обхождането вече може да спре след първата страница вместо да се сканират всички страници; при съответстващ документ допълнителните разходи за страница са по-ниски (без повторни извиквания наAssigned)
Version 1.88.0
Добавено (Added)
ValidatePdfXполучи осем нови стойности наTPdfXValidationIssueна ниво съдържание, покриващи ограниченията за обмен при печат, които PDF/X налага отвъд маркерите за файлов формат:pvxiLzwForbidden(/LZWDecode),pvxiJavaScriptForbidden(/JavaScript),pvxiFormFieldsForbidden(/AcroForm//XFA),pvxiAdditionalActions(/AA),pvxiEmbeddedFilesForbidden(/EmbeddedFiles//FileAttachment),pvxiOpiForbidden(/OPI//Alternates),pvxiMissingTrimBox(липса на/TrimBoxна която и да е страница) иpvxiTrappedNotSet(/Trappedлипсва или е/Unknown). Валидаторът за PDF/X преди проверяваше само XMP/OutputIntent маркери; това е първото му преминаване на ниво съдържание. Споделените помощни функцииPdfStructureBytes/PdfHasName/PdfCountNameбяха добавени къмFPdfPdfCommon, така че всички модули за съответствие да могат да ги използват
Version 1.87.0
Добавено
- Валидирането по PDF/UA вече обхваща правилата за съставни шрифтове по ISO 14289-1 §7.21.3:
pvuaiCidSystemInfoMismatchмаркира шрифтове Type0, при които вграденият CMap и производният CIDFont се разминават вRegistry/Orderingили чийтоSupplementна CIDFont надвишава този на CMap,pvuaiCMapNotEmbeddedмаркира CMap-ове, реферирани по име (катоEncodingилиUseCMap), които не са предварително дефинирани CMap-ове от Таблица 118 на ISO 32000-1, аpvuaiCMapWModeMismatchмаркира вградени CMap-ове, чийтоWModeв речника се различава от WMode в съдържанието на потока им
Поправено
- Проверката
pvuaiCidFontMissingCidToGidMapпо §7.21.3.2 пропускаше речници CIDFontType2, при които двойката ключ/стойностSubtypeе разделена от нов ред; сега освен това маркира и стойност на именаCIDToGIDMap, различна отIdentity
Version 1.86.0
Добавено
- Валидирането по PDF/UA вече обхваща правилата за кодиране на TrueType по ISO 14289-1 §7.21.6:
pvuaiTrueTypeEncodingInvalidмаркира несимволни шрифтове TrueType, при коитоEncodingлипсва или не е нитоMacRomanEncoding, нитоWinAnsiEncoding(директно или чрезBaseEncoding), аpvuaiSymbolicTrueTypeEncodingмаркира символни шрифтове TrueType, носещи нестандартноEncodingиме
Version 1.85.1
Промени
- Проверката на реда с табулации по ISO 14289-1 §7.18.3 —
pvuaiMissingTabsOrder— вече се изпълнява за всяка страница поотделно: всяка страница, съдържаща анотации, трябва да декларира/Tabs /Sв собствения си речник на страницата, така че съответстваща съседна страница вече не маскира страница без такава декларация
Version 1.85.0
Добавено
- Валидирането по PDF/UA вече разграничава динамични от статични XFA форми съгласно ISO 14289-1 §7.15:
pvuaiXfaDynamicмаркира форми, чиято XFA конфигурация задаваdynamicRenderнаrequired
Промени
- Предишният флаг-кандидат за произволен XFA —
pvuaiXfaPresent— е оттеглен и вече не се предизвиква (статичният XFA съответства на §7.15); стойността на изброяването остава заради съвместимост на API
Version 1.84.0
Добавено
- Валидирането по PDF/UA вече открива немаркирано реално съдържание, изисквано от ISO 14289-1 §7.1:
pvuaiUntaggedContentмаркира рендерирани текстови и образни обекти, които не са включени в структурното дърво на страницата (чрез техните идентификатори на маркирано съдържание), нито са обозначени като Artifact - Нови помощни функции на ниво страница
GetPageContentMarkInfosиValidatePdfUaPageContentTaggingс записаTPdfPageContentMarkInfoза директна употреба
Version 1.83.0
Добавено
- Валидирането по PDF/UA вече налага модела на заглавия по ISO 14289-1 §7.4.4:
pvuaiHeadingModelMixedмаркира документи, смесващи общия тагHс номерирани заглавияH1..Hn, аpvuaiHeadingMultipleInNodeмаркира структурни възли, носещи повече от едно дете-заглавиеH
Version 1.82.0
Добавено
- Валидирането по PDF/UA вече разрешава RoleMap, изисквана от ISO 14289-1 §7.1:
pvuaiRoleMapRemapsStandardмаркира записи в RoleMap, предефиниращи стандартен тип структура, аpvuaiRoleMapUnresolvedмаркира използвани нестандартни типове структура, чиято верига в RoleMap е липсваща, прекъсната или циклична — непреки вериги, достигащи до стандартен тип, се приемат, а неизползваните записи в RoleMap никога не се преценяват - Нови помощни функции
PdfUaIsStandardStructType,PdfReadRoleMapPairs(с декодиране на PDF escaped имена#hh) иValidatePdfUaRoleMapUsageза директна употреба
Version 1.81.0
Добавено
- Валидирането по PDF/UA вече обхваща маркирането на списъци по ISO 32000-1, изисквано от ISO 14289-1 §7.6:
pvuaiListStructureInvalidмаркира елементи LI извън контейнер L и части Lbl/LBody извън елемент LI, като приема вложени списъци и законната употреба на Lbl в елементи Note и BibEntry
Version 1.80.0
Добавено
- Валидирането по PDF/UA вече обхваща маркирането на таблици по ISO 32000-1, изисквано от ISO 14289-1 §7.5:
pvuaiTableStructureInvalidмаркира клетки TH/TD извън ред TR и редове или групи от редове извън техния контейнер Table,pvuaiTableHeaderMissingScopeмаркира клетки-заглавия, чиято връзка не може да се определи нито чрез атрибут Scope, нито чрез асоциация Headers/ID, аpvuaiTableHeadersUndefinedIdмаркира реферирания Headers в документи, които не дефинират никакви идентификатори на структурни елементи TPdfStructureElementпредоставя атрибутите за таблициScope,HasHeaders,HeadersIds,ColSpanиRowSpan, разрешени по време на обхождането на структурното дърво
Промени
- Обхождането на структурното дърво вече прочита всички атрибути за оформление и таблици в единично преминаване над речниците на атрибутите на всеки елемент, вместо по едно сканиране за всеки атрибут
Version 1.79.1
Добавено
- Примерът
AnnotationsLabе портнат за Lazarus и C++Builder, присъединявайки се към съществуващия конзолен пример за Delphi
Корекции
TPdf.CreateAnnotationможеше да предизвика грешка „Cannot set attachment points” (Не могат да се зададат точки на прикачване) за анотации за маркиране, които използват четириъгълни точки (Highlight, Underline, StrikeOut, Squiggly), тъй като новата анотация все още нямаше слот за четириъгълник, който да замени; сега тя вместо това добавя първия четириъгълник
Version 1.79.0
Добавено
- Нов конзолен пример за Delphi
AnnotationsLab: създава анотации Text, Highlight, Square и Circle, записва ги в PDF, след което презарежда файла и изброява списъка с анотации на страницата
Version 1.78.0
Добавено
- Нови методи
TPdf.MeasureTextиTPdf.MeasureTextWidth: измерват визуализираната ширина и височина на низ за даден шрифт и размер (в потребителски единици на PDF, 1 единица = 1/72 инча) без добавяне на съдържание към страница, правейки възможна логиката за оформление и пренасяне на думи върхуAddText; предоставени от самостоятелния модулFPdfMeasureкато помощник на клас - Нов метод
TPdf.WrapText: алчно пренасяне на думи (greedy word wrap), изградено върхуMeasureTextWidth, което разделя текста на интервали и пакетира думи в редове, не по-широки от дадена ширина (PDF потребителски единици); твърде дълга единична дума получава свой собствен ред (без прекъсване в думата), връщайки обвитите редове като масив
Version 1.77.0
Добавено
ValidatePdfAполучи три нови стойностиTPdfAValidationIssue, покриващи клаузите, предварително оценени като „NO” или „reader behaviour” от предишния одит на пропуските (добавени към края на поредните номера, съществуващите стойности остават непроменени):pvaiPdfiumNotDefGlyph(PDF/A-2 6.2.11.8 — символ, който се разрешава до Unicode 0 без грешка при картографиране, симптом по време на изпълнение за референция на глиф.notdef; засича се чрез обектовия модел на Pdfium),pvaiWordBreakMissing(Level A 6.8.3.2 — низ за показване на поток от съдържание по-дълъг от 20 символа без интервал, вероятно нарушение на слети думи; груба евристика, която избягва CJK фалшиви положителни резултати) иpvaiLinkActionMissingTarget(6.6.3 — действие GoToR/URI/SubmitForm, на което липсва ключа за визуализация, така че четецът не може да го представи)
Version 1.76.0
Добавено (Added)
ValidatePdfAполучи три новиTPdfAValidationIssueстойности (добавени ординали, съществуващите стойности остават непроменени):pvaiNameNotValidUtf8(PDF/A-2/3 6.1.8 — токен/BaseFontили/FontName, съдържащ байтове ≥ 0x80, които не образуват валиден UTF-8),pvaiInlineImageLzwForbidden(PDF/A-2/3 6.1.10 — вградено изображение в потока на съдържанието на страницата използва филтър LZW или Crypt) иpvaiTrueTypeDifferencesForbidden(6.3.7 Cor.2 — несимволен TrueType шрифт, чийто речник Encoding носи/Differences)
Version 1.75.0
Добавени (Added)
ValidatePdfAполучи три нови стойности заTPdfAValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvaiIntegerImplementationLimit(PDF/A-2/3 6.1.13 — числов маркер, надвишаващ лимита за 32-битово цяло число със знак 2,147,483,647),pvaiBlendModeNotWhitelisted(PDF/A-2/3 6.2.10 — стойност на/BMизвън стандартния набор режими на смесване според ISO 32000-1 §11.3.5; допълваpvaiTransparentColorSpaceот PDF/A-1, който позволява само Normal/Compatible), иpvaiHexStringOddDigits(6.1.6 — шестнадесетичен низ<...>с нечетен брой шестнадесетични цифри)
Version 1.74.0
Добавени (Added)
ValidatePdfAполучи три нови стойности заTPdfAValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvaiPermissionsViolation(6.1.12 — речник/Perms, носещ/DigestLocation,/DigestMethodили/DigestValueзаедно с/DocMDP),pvaiTransActionForbidden(PDF/A-2 6.5.1 — действие за преход Trans, открито чрез шаблона на речника за действие/S /Trans, за да се избегне фалшиво съвпадение с/Transparency), иpvaiPdfiumObjectTransparency(PDF/A-1 6.4 — обект от страницата носи реална прозрачност споредFPDFPageObj_HasTransparency, разширявайки слоя на обектния модел на Pdfium, въведен във v1.73.0, за улавяне на ефекти на режими на смесване/меки маски (blend-mode/soft-mask), които сканирането на имена на ниво байтове може да пропусне)
Version 1.73.0
Добавени (Added)
TPdf.ValidatePdfAвече наслоява преминаване на обектния модел на Pdfium върху инспектора на ниво байтове: той обхожда текстовите обекти на всяка страница чрезFPDFPage_GetObject→FPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedи отчита невграден рендериран шрифт катоpvaiPdfiumFontNotEmbedded(ISO 19005 6.3.4), и зарежда всяка текстова страница, за да сканираFPDFText_HasUnicodeMapErrorи отчита повредено Unicode съпоставяне катоpvaiPdfiumUnicodeMapError(6.3.8). Това са проверки, които инспекторът на ниво байтове не може да направи — той вижда само маркери на имена, не и разрешени манипулатори на шрифтове или състояния на съпоставяне за всеки символ — и са обединени в резултата на ниво байтове. Самостоятелната функция на ниво байтовеValidatePdfAComplianceе непроменена
Version 1.72.0
Добавени (Added)
ValidatePdfAполучи пет нови стойности заTPdfAValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvaiNeedsRenderingPresent(PDF/A-2 6.4.2 — каталогът не трябва да носи/NeedsRendering),pvaiDestOutputProfileRef(PDF/A-3 6.2.3 — OutputIntent не трябва да носи/DestOutputProfileRef),pvaiEmbeddedFileMissingUF(PDF/A-3 6.8 — файлова спецификация с/EFтрябва също да носи/UF),pvaiXmpPacketBytesAttr(6.7.5 — заглавката на XMP пакета не трябва да носи оттегления атрибутbytes=илиencoding=), иpvaiAnnotationToggleNoView(PDF/A-2 6.3.2 — битът/FToggleNoView на анотацията, стойност 512, е забранен)
Version 1.71.0
Променени
ValidatePdfUaвече предизвикваpvuaiOrderedListMissingListNumbering(ISO 14289-1 7.6): обхождащият елемент на структурното дърво разрешава атрибута за оформлениеListNumberingна всекиLелемент чрез атрибутния API на Pdfium и маркира всяка стойност извън набора от Таблица 347 на ISO 32000-1 (Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha,None,Circle,Disc,Square). Липсващ атрибут не се маркира, тъй като списъкът може да бъде неподреден; това затваря последната останала празнина според ISO 14289-1, записана в края на кръг 5
Version 1.70.0
Добавени
ValidatePdfUaполучи четири нови стойности заTPdfUaValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvuaiSubsetMissingCidSet(ISO 14289-1 7.21.4.2 — CID подмножествотоFontDescriptorтрябва да декларира/CIDSet),pvuaiToUnicodeForbiddenValue(7.21.7 — ToUnicode CMap не трябва да съпоставя който и да е код сU+FEFFилиU+FFFE; некомпресираните потоци се сканират за изходните форми<FEFF>/<FFFE>),pvuaiLangInvalidFormat(7.2 —/Langтрябва да бъде валиден RFC 1766 / BCP 47 етикет; разрешаваща граматика приемаen,en-US,zh-Hans,es-419и маркира ясно несъответстващи стойности), иpvuaiOrderedListMissingListNumbering(7.6 — запазено за пълнота на API; все още не се предизвиква от валидатора, тъй като надеждното разграничаване на подредени от неподредени списъци изисква стойността на атрибутаListNumbering, която обхождащият елемент на структурното дърво не разкрива)
Version 1.69.0
Добавени
ValidatePdfUaполучи две нови стойности заTPdfUaValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvuaiWidgetOutsideForm(ISO 14289-1 7.18.4 — структурен елемент Widget трябва да бъде вложен вFormелемент; обхождащият елемент на структурното дърво сега проверява типа на прекия родител на всеки Widget) иpvuaiSubsetMissingCharSet(7.21.4.2 — подмножество от Тип 1FontDescriptorтрябва да декларира/CharSet, идентифицирано чрез шестбуквения+префикс на името на подмножеството в/FontName)
Version 1.68.0
Добавени
ValidatePdfUaполучи две нови стойности заTPdfUaValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvuaiUriActionIsMap(ISO 14289-1 7.18.5 — речник на действие за URI не трябва да носи/IsMapсъс стойностtrue, тъй като това деактивира достъпната цел на връзката) иpvuaiHeadingSequenceViolation(7.4.2 — номерираните заглавия трябва да започват отH1и низходящата последователност не трябва да пропуска междинно ниво, напр.H1→H3е нарушение). Проверката на заглавията е първото правило за PDF/UA на ниво структурно дърво във валидатора:ValidatePdfUaStructureElementsвече обхожда списъка с типизирани елементи и проверява последователносттаH1…H6(иH7+според 7.4.3) в реда на документа
Version 1.67.0
Добавени
ValidatePdfUaполучи пет нови стойности заTPdfUaValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvuaiLinkMissingContents(ISO 14289-1 7.18.5 — анотация Link трябва да носи алтернативно описание чрез/Contents),pvuaiAnnotationMissingContents(7.18.1 — всяка неосвободена анотация без/Contentsтрябва да има алтернативно описание; Popup и Widget са освободени),pvuaiEmbeddedFileMissingName(7.11 — речник на файлова спецификация трябва да съдържа/Fи/UF),pvuaiMediaClipMissingAlt(7.18.6.2 — речник с данни за мултимедиен клип трябва да съдържа/CTи/Alt), иpvuaiCidFontMissingCidToGidMap(7.21.3.2 — вграден Type 2 CIDFont трябва да съдържа/CIDToGIDMap)
Version 1.66.0
Добавени
ValidatePdfUaполучи пет нови стойности заTPdfUaValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvuaiRoleMapMissing(ISO 14289-1 7.1 — маркиран документ с нестандартни типове структура трябва да носи/RoleMap),pvuaiOptionalContentAsKey(7.10 — конфигурационен речник за незадължително съдържание не трябва да носи ключа за автоматично състояние/AS),pvuaiXfaPresent(7.15 — наличието на AcroForm/XFAсе маркира, тъй като динамичният XFA е забранен),pvuaiTrapNetAnnotation(7.18.2 — анотациите/TrapNetса забранени), иpvuaiReferenceXObject(7.20 — Reference XObjects, базирани на маркера/Ref, са забранени)
Коригирани
ValidatePdfUaвече не дава фалшиво положителни резултати заpvuaiEncryptionPresentпри всеки криптиран файл: PDF/UA позволява криптиране, стига ключът/Pв речника за криптиране да има зададена битова позиция 10 (стойност 1024), което предоставя достъп за помощни технологии (7.16). Точното нарушение сега се отчита чрез новияpvuaiEncryptionPBitMissing;pvuaiEncryptionPresentе запазен в изброяването за съвместимост на API, но вече не се предизвиква от валидатора на ниво байтове
Version 1.65.0
Добавени
ValidatePdfAполучи пет нови стойности заTPdfAValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvaiCidFontMissingCidToGidMap(ISO 19005-1 6.3.3.2 Cor.2 — вграден Type 2 CIDFont трябва да носи/CIDToGIDMap),pvaiSubsetMissingCharSet(6.3.5 — подмножество от Тип 1FontDescriptorтрябва да носи/CharSet),pvaiSubsetMissingCidSet(6.3.5 — CID подмножествотоFontDescriptorтрябва да носи/CIDSet),pvaiWidgetActionForbidden(6.6.1 — анотация Widget не трябва да носи/Aили/AA), иpvaiOptionalContentAsKey(ISO 19005-2 6.9 — конфигурационен речник за незадължително съдържание не трябва да носи ключа за автоматично състояние/AS, което е ново уместно, тъй като PDF/A-2 позволява незадължително съдържание)
Version 1.64.0
Добавени
ValidatePdfAполучи осем нови стойности заTPdfAValidationIssue(добавени поредни номера, съществуващите стойности са непроменени):pvaiHeaderBinaryMarkerMissing(ISO 19005-1 6.1.2 — заглавката%PDF-x.yтрябва да бъде последвана от коментар%с поне четири байта по-големи от 127),pvaiExternalStreamRef(6.1.7 — речник на поток не трябва да носи/F,/FFilterили/FDecodeParms),pvaiOutputIntentScheme(6.2.2 —/Sна OutputIntent трябва да бъде/GTS_PDFA1),pvaiInfoXmpDateMismatch(6.7.3 —CreationDate/ModDateв Info трябва също да присъстват катоxmp:CreateDate/xmp:ModifyDate),pvaiMarkInfoMissing(6.8.2.2 — Ниво A изисква/MarkInfoс/Marked true),pvaiAnnotationApDictViolation(6.5.3 Cor.2 — речникът/APна анотацията трябва да съдържа само/N),pvaiEmbeddedFileMissingAFRelationship(ISO 19005-3 Annex E.2 — всяка асоциирана файлова спецификация трябва да носи/AFRelationship), иpvaiJpeg2000Violation(ISO 19005-2 6.2.8.3 — JPEG2000 изображение трябва да декларира 1, 3 или 4 компонента)
Коригирани
ValidatePdfAвече не дава фалшиво положителни резултати заpvaiAnnotationFlagsViolationпри документи, които използват еднобуквено име на ресурс за шрифт, като/Font << /F 5 0 R >>; сканирането за флаг/Fсега е ограничено до контекст на анотация (/Subtypeот тип анотация), съответствайки на документираното поведение (6.5.3)ValidatePdfAвече отчита изискването на PDF/A-3 за асоциирани файлове за всеки файл: даден документ се маркира само когато във вградена/Type /Filespec, която реферира към вграден поток чрез/EF, липсва/AFRelationship, вместо предишната проверка на целия документ за кое да е или никое (ISO 19005-3 Annex E.2)- Добавено е оттегленото действие
/SetStateкъм набора от забранени действия заедно със/SetOCGState, така че името на действието от PDF Reference да се улавя директно (6.6.1)
Version 1.63.0
Добавено (Добавени)
- Добавени
TPdf.MeasureTextиTPdf.MeasureTextWidth: измерват ширината и височината на рендериран текст за зададени шрифт и размер без добавяне на съдържание към страницата (в PDF потребителски единици, 1 единица = 1/72 инча), което позволява изчисляване на оформлението и автоматично пренасяне на реда върхуAddText; предоставя се от самостоятелния модулFPdfMeasureкато class helper
Променено (Променени)
Demo\Delphi\MergePDF,Demo\CBuilder\MergePDFиDemo\Lazarus\MergePDFподобрени за трите IDE: избор на страничен диапазон за файл, опционална пътека за изход, повторения, журнал на изпълнението, бутон за отказ и резюме на обединяването; отметките и метаданните се импортират от първия източник- Демонстрациите
CreatePDFза трите IDE вече включват опция «Европейски текст» за записване на текст с акценти на чешки, френски, немски, испански, португалски, полски и турски език за проверка на избора на шрифт и обработката на Unicode (старият примерEuropeanTextе интегриран) - Премахнати примерите
ExtractTextPagesиEuropeanText: функционалността за екстракция на текст страница по страница отExtractTextPagesвече е покрита от опциите за диапазон и разделител вExtractText; многоезичното рендериране наEuropeanTextе интегрирано вCreatePDF
Version 1.62.2
Поправено (Коригирани)
- Прегенерирани са заглавните файлове на C++Builder (
.hpp) за всяка версия на RAD Studio и всяка платформа (Win32/Win64/Win64x); те бяха изостанали спрямо Pascal изходните файлове, оставяйки остарели сигнатури на функции и липсващи unit-и, които достигаха до потребителите на C++Builder чрез source distribution
Version 1.62.1
Поправено (Коригирани)
- Възстановена е компилацията на изходния код за RAD Studio 12 Athens и по-стари: присвояване на
TArray<Byte>в пътя за валидиране на PDF/UA използваше неявно преобразуване на масив, достъпно само в Delphi 13, и не се компилираше в по-стари IDE
Version 1.62.0
Добавено (Добавени)
TPdf.RenderPageThumbnailвизуализира всяка страница по индекс в bitmap, пригоден по аспект, без да променя текущата страница на документа, заредената страница или да задействаOnPageChange
Поправено (Коригирани)
TPdfThumbnailViewвече не управляваPageNumberна документа-домакин по време на рисуване; по-рано при всяко прерисуване страниците се презареждаха, се задействашеOnPageChangeи текстовата страница се изхвърляше, което можеше да наруши свързанTPdfViewи да предизвика цикли на прерисуване. Сега миниатюрите се рендират чрезRenderPageThumbnailбез такива странични ефекти- Съответствието с PDF/X вече проверява документи с cross-reference stream (PDF 1.6, типични за PDF/X-4) и обекти, съхранени в compressed object streams, вместо да обявява такива файлове изцяло за несъответстващи; маркерът
GTS_PDFXVersionсе чете както от XML-елементен, така и от RDF-атрибутен XMP формат - Проверката на PDF/R вече отчита
pvriInfoXmpMismatch, когато Info речникът и XMP не съвпадат за Producer или Creator; проблемът по-рано беше деклариран, но никога не се съобщаваше - Таймерите за попълване на формуляри се проследяват по заявка, така че документ, който стартира няколко таймера наведнъж (например JavaScript интервал заедно с мигането на курсора на полето), ги запазва всички вместо да губи всеки таймер освен най-новия
TPdfViewпри рисуване и публичните му методиRenderPage/RenderTileвече държат заключването за рендериране на документа, серийно спрямо рендерирането на същияTPdfот работна нишка (PDFium не е безопасен за нишки)- Текст извън ASCII, записван в метаданни на PDF/X, PDF/R и PDF/VT (OutputIntent condition names, Creator, Producer), вече се кодира като UTF-16BE низ според ISO 32000-1 §7.9.2.2 вместо суров UTF-8, който съвместимите четци биха прочели погрешно
- Помощните проверки за съответствие вече правилно четат вградени потоци с метаданни, чийто
/Lengthе индиректна препратка, зареждат изходните байтове сReadBuffer(така че краткото четене да се провали чисто) и отхвърлят отрицателноstartxrefотместване вместо да рискуват четене извън допустимия диапазон
Version 1.61.0
Променено (Променени)
- Корекции в декларациите на FFI/ABI, които може да изискват прекомпилиране на код, реализирал засегнатите callbacks: callback-ът за попълване на формуляри
FFI_OpenFileвече носиcdecl(Win32 конвенция на стека), а параметърътvalueнаFPDFAnnot_SetStringValueиFPDFAttachment_SetStringValueвече еFPDF_WIDESTRING(UTF-16LE), за да съвпада с хедърите на PDFium - Callback-ите за прогресивно зареждане
FX_FILEAVAIL.IsDataAvailиFX_DOWNLOADHINTS.AddSegmentвече приемат отмествания от типsize_t, аsize_tе с ширина на указател във Free Pascal / Lazarus Win64 (преди се отрязваше до 32 бита), което поправя извикванията на API за достъпност на данните иoutsize_tна FPC Win64
Поправено (Коригирани)
- Безопасност на паметта: use-after-free на таймера за попълване на формуляри при унищожаване на
TPdfс активен AcroForm caret; двойноFPDF_CloseDocumentв error path наImportNPagesToOne; изтичане на Pascal exceptions извън callback-итеFPDF_FILEWRITE/FPDF_FILEACCESSпрез C границата по време на запис и JPEG вмъкване; и integer overflow при извличане на текст при четене от начален индекс до края на страницата TPdfFuture<T>вече надеждно доставя своя callback с резултат; отговорът по-рано почти винаги се губеше (и можеше да докосне освободена нишка), защото worker-ът освобождаваше себе си, преди опашеният отговор да се изпълни- Изходът за PDF/A, PDF/X, PDF/E, PDF/R, PDF/VT и PDF/UA вече записва cross-reference записи, които са точно 20 байта, както изисква ISO 32000-1 §7.5.4
- Вмъкването на маркери за стандарти вече не унищожава речник, когато премахнатият ключ (например
/Trapped) е бил последният запис, което по-рано поглъщаше затварящото>>и създаваше невалиден обект - Потоците с ICC профил в OutputIntent вече декларират необходимия брой компоненти
/Nза PDF/X и PDF/VT (вече налично за PDF/A); криптираните изходни документи се декриптират преди вмъкване на маркери за PDF/X, PDF/E, PDF/R, PDF/VT и PDF/UA, така че изходът е валиден вместо тихомълком повреден - UTF-8 xpacket BOM в генерирания XMP вече се извежда като точни байтове, поправяйки повреда в Delphi инсталации, чиято ANSI code page не е Latin-1; incremental-update trailers вече запазват препратката към документа
/Info SaveAsс компресия вече не отрязва потоци, чийто/Lengthе индиректна препратка, а прегенерираните cross-reference tables вече използват записи от 20 байта, реални generation numbers и премахват остарелия/Prevуказател- Проверката на съответствието вече чете XMP маркери за версия от атрибутен формат за PDF/E и PDF/X (така че PDF/X-4 файлове, сериализирани като атрибути, се разпознават), изисква точния
PDF/E-1идентификатор, чете правилно метаданни потоци с индиректен/Lengthи вече не бърка ключовете/IDили/StructTreeRootна структурален елемент при проверката на PDF/UA trailer; некоректноstartxrefотместване вече не поражда грешка за диапазон TPdfThumbnailView: последната страница вече е достъпна чрез лентата за превъртане, текущата страница на документа-домакин се възстановява след рисуването на миниатюрите, а стандартната обработка при напускане на мишката се изпраща отново- Сивите битмапове на страници и изображения вече не се рендират с грешна палитра;
TPdfViewвече не остава с висяща препратка, когато неговиятTPdfбъде освободен първи - Preflight reports: HTML се записва като UTF-8, за да съвпада с декларирания charset, а JSON escaping на низове произвежда правилни
\uпоследователности за не-ASCII символи във Free Pascal - Trial builds: диалогът за напомняне за trial вече се показва вместо да бъде потиснат преди да може да излезе
TPdfStreamAdapterвече отхвърля потоци по-големи от 4 GiB с ясно съобщение за грешка вместо тихомълком да отрязва дължината, предавана на PDFium
Version 1.60.1
Променено (Променени)
- Демо приложенията AccessibilityReader за Delphi, Lazarus и C++Builder вече изпълняват read-aloud върху
TPdfReadingSession: всяка страница се сглобява в един изговарян фрагмент сBuildSpokenTextFromWords, позициите на SAPI думите захранватFeedSpokenPosition, а сесията преминава през страниците и управлява курсора на думата във view, заменяйки ръчната оркестрация, която всяко демо имаше досега - Проследяването на караоке по дума в демотата вече работи и когато NVDA е speech engine:
EstimatePacingтемпира курсора на четене според изминалото време на говорене, докато преди NVDA четеше на глас без никакво проследяване на думите - Pause и Resume в демотата вече работят и с NVDA:
ResumeRestartsChunkизговаря отново текущата страница от началото ѝ при Resume, докато SAPI запазва своето вградено пауза и възобновяване на място
Version 1.60.0
Добавено (Добавени)
- Live low-vision rendering on
TPdfView: новите render optionsreInvertиreNightDuotoneпренасочват цветовете на всеки изрисуван page tile (пълна инверсия на цветовете или night duotone palette) преди да се изрисуват overlays за search, selection, reading и word-cursor, като пренасят съществуващите bitmap colour transforms в интерактивния viewer както за single-page, така и за facing-pages layouts; превключването на опциите прерисува незабавно NightDuotoneInkиNightDuotonePaperконфигурират нощната палитра, по подразбиране кехлибарен текст върху черна страница;reInvertима приоритет когато и двете опции са зададени
Version 1.59.0
Добавено (Добавени)
TPdfReadingSession: компонент за оркестрация на read-aloud, неутрален спрямо speech engine. Той пази cursor-а на фрагмента, cursor-а на думата и състоянието на възпроизвеждане (Play/PlayFrom/Pause/Resume/Stop), преминава през зареденитеTPdfSpokenTextфрагменти, когато хостът отчете idle на engine-а чрезTick, превежда отместванията на spoken text обратно към символите на страницата и управлява автоматично свързанTPdfViewcursor на думата; хостът свързва всеки speech engine чрезOnSpeakи събитията за cancel / pause / resume request, така че библиотеката сама не свързва speech APIFeedSpokenPositionобработва позициите на думите от engine-а (като SAPIStatus.InputWordPosition);EstimatePacingсEstimatedWordsPerMinuteтемпира engine-и без position signal;ResumeRestartsChunkизговаря отново текущия chunk за engine-и без native pauseOnChunkChange,OnWordChangeиOnFinishedсе задействат само при реални промени, а освободен прикрепен view се откача автоматично, така че кодът на хоста остава без мигане и защитен от сривове
Version 1.58.0
Добавено (Добавени)
EstimateSpokenWordIndexизчислява коя дума говорният engine произнася според изминалото време и скоростта в думи за минута, като дава на по-дългите думи пропорционално повече време, така че engine-и, които не съобщават position на думата (като NVDA controller client), пак могат да управляват word-level reading cursor; извикващият подава изминалото време, така че routine остава без часовник и подходяща за unit тестове
Version 1.57.0
Добавено (Добавени)
- Сглобяване на spoken text с двупосочно съпоставяне за проследяване на read-aloud:
BuildSpokenTextFromWordsиSpokenTextAppendизграждат низа, подаден на text-to-speech engine, от word boxes на страницата, като записват таблица на диапазоните, аSpokenToPageCharпревежда reported spoken offset от engine-а (като SAPIStatus.InputWordPosition) обратно към индекса на символа на страницата, така че word-level highlight tracking да остане правилен, когато spoken text не е целият текст на страницата (пропуснати региони, четене по единици, overrides на произношението) TPdfSpokenTextиTPdfSpokenSpanносят spoken string и source page ranges, от които е сглобен; offset-ите върху вмъкнати separators се разрешават към следващата съпоставена дума, а offset-ите след съпоставените диапазони връщат липса на съвпадение
Version 1.56.9
Добавено (Добавени)
Demo\Delphi\PreflightReportдобавя Action Plan preview, който свива стандартите, които не минават, приоритетите, следващите действия, issue codes и препоръките в checklist за коригиранеDemo\Delphi\PreflightReportCliприемаplan/actionplanкато формат на изхода за единични файлове и batch runs, записвайки същия remediation checklist в text file
Променено (Променени)
- И двата Delphi PreflightReport демо-то вече показват броя на pass / action / review status заедно с общите standards и issues
Version 1.56.8
Променено (Променени)
ViewerInteractionLabвече включва контроли за скачане между страници, ръчни контроли за zoom, регистриране на координати при клик сDeviceToPage/PageToDeviceи по-ясен interaction log за проверки на selection, search, rotation и navigationViewerInteractionLabreadme страниците вече документират добавения interaction работен поток в локализирания набор от demo readme файлове
Version 1.56.7
Добавено (Добавени)
AccessibilityWorkbenchCliсъпоставя всяка задействана finding със съответния WCAG 2.1 Success Criteria и област на клаузата от ISO 14289-1 (PDF/UA-1) и показва standards-coverage секция в отчетитеAccessibilityWorkbenchCliизчислява документиран accessibility score от 0-100 с публикувана схема за penalties и bands excellent / good / needs work / poor, показван за всеки файл и като batch averageAccessibilityWorkbenchCliприемаfailscore=N, за да провали изпълнението (exit code 2), когато някой файл има score под NAccessibilityWorkbenchCliзаписва SARIF 2.1.0 log, когато името на batch summary завършва на.sarif, с по едно rule за всеки finding kind, носещо WCAG 2.1 и PDF/UA таговете си за CI и code-scanning ingestionAccessibilityWorkbenchCliдобавя командаversion, която отпечатва свързаната версия на PDFiumPas
Version 1.56.6
Добавено (Добавени)
IntakeWorkbenchCliизчислява SHA-256 forensic hash на всеки входен файл (с понижение доunavailableпри компилатори безSystem.Hash) и го отчита във всеки форматIntakeWorkbenchCliприемаpasswords=file.txt, за да пробва отключване на документи, защитени с парола, от списък с кандидати, като записва индекса на съвпадащия кандидат, без никога да логва текста на паролатаIntakeWorkbenchCliприемаcopyto=dir, за да насочва всеки одитиран файл в поддиректория според нивото на риска, превръщайки аудитора в intake sorterIntakeWorkbenchCliзаписва SARIF 2.1.0 log, когато името на batch summary завършва на.sarif, с по едно rule за всеки risk flag и по един result за всеки маркиран файл за CI и code-scanning ingestionIntakeWorkbenchCliдобавя командаversion, която отпечатва свързаната версия на PDFiumPas
Version 1.56.5
Добавено (Добавени)
IntakeWorkbenchCliвече извежда препоръчани post-intake actions като accept, request-password, manual-review, quarantine и deduplicate и показва броячите на действията в batch summariesAccessibilityWorkbenchCliвече извежда препоръчани remediation actions като pass-through, remediate-tags, run-ocr, remediate-semantics и manual-review, със съответните броячи на действията в batch
Променено (Променени)
- И двата CLI демота на ниво tool показват препоръчаното действие в console, text, HTML, JSON и CSV изхода, така че batch операторите да могат да насочват файловете без да обработват повторно risk или status полета
Version 1.56.4
Поправено (Коригирани)
- Четенето на annotations, bookmarks или link annotations в цикъл вече не изтича предишните текстови низове на елемента: резултатните записи
TPdfAnnotation,TBookmarkиTLinkAnnotationвече се изчистват с инициализация, съобразена с managed types, вместо сурово зануляване на паметта, така че документи с много голям брой text-bearing annotations вече не увеличават паметта на процеса за целия живот на приложението - Унищожаването на
TPdf, който е регистрирал handlerOnUnsupportedFeature, вече го откачва от глобалния за процеса PDFium callback, така че по-късно зареждане на документ от друг екземплярTPdfбез собствен handler вече не може да се изпрати към освободения компонент (use-after-free)
Version 1.56.3
Поправено (Коригирани)
AccessibilityWorkbenchCliвече не брои празните страници като heuristic reading-order pages, така че tagged документи с празни разделителни страници запазват правилния си accessibility status; страниците без четимо съдържание вече се отчитат отделноAccessibilityWorkbenchCliразпознаването на table headers вече не приписва на външна таблица клеткитеTH, които принадлежат на вложена таблица, а имената на form fields и font-ове се съпоставят case-sensitive, така че различни полета да не се сливатIntakeWorkbenchCliсписъците с URL хостове вече премахват userinfo, query и fragment части, така че конструирана връзка катоtrusted.example@evil.exampleсе приписва на реалния host, аmailto:целите допринасят със своя домейн вместо да са невидимиIntakeWorkbenchCliMarkdown отчетите ескейпват backticks в paths, hosts и attachment names, управлявани от атакуващ, така че форматирането на отчета да не може да бъде нарушено отвътре в документ
Променено (Променени)
AccessibilityWorkbenchCliотчита неуспехите при font-scan и form-field-scan като отделни броячи, маркира не-embedded fonts, които имат и embedded instances, и ограничава дългите font списъци с изричен truncation markerIntakeWorkbenchClibatch summaries добавят колона за attachment-annotation count, а преброяването на annotations на страница е ограничено до 20000 annotations на страница, като ограничението се отчита във всеки формат
Version 1.56.2
Добавено (Добавени)
AccessibilityWorkbenchCliвече проверява font embedding, tooltips на form fields, source на reading order, document outlines, table и list структура, съмнителен alternate text и по-богати per-page review details, така че accessibility batch отчетите да откриват повече remediation целиIntakeWorkbenchCliвече отчита page scan limits, launch и remote-go-to actions, URI host inventories, annotation counts, неподдържани PDFium features, дублирани document identifiers и разширени risk flags за автоматизиран intake review
Променено (Променени)
IntakeWorkbenchCliприемаmaxpages=Nв single-file и batch режими, за да ограничи сканирането на страници на документ, като все пак завършва metadata, attachment, script, XFA, signature и risk reporting
Version 1.56.1
Поправено (Коригирани)
- Зареждането на по-стар
pdfium.dll, който няма по-нов export, вече се проваля чисто: пътят на провал занулява всяка свързана API точка, така чеAssigned()проверки (например наFPDF_GetLastErrorилиFPDF_GetSecurityHandlerRevision) отчитат библиотеката като незаредена вместо да викат в вече разтоварения модул и да сриват приложението с access violation UnloadLibraryвече изчиства всички PDFium API bindings, а не само опциите за V8 helper-и, така че след освобождаване на DLL не остават остарели function pointers
Version 1.56.0
Добавено (Добавени)
- Word-level karaoke reading cursor on
TPdfView:TrackReadingWordAtсъпоставя current-word character offset на text-to-speech engine-а (като SAPIStatus.InputWordPosition) към word boxes на страницата, маркира думата, която го съдържа, като отделен overlay над reading block-а, превърта я в изглед и връща индекса на думата, така че изговорената дума да светва, когато гласът напредва SetReadingWordиClearReadingWordзадават или изчистват маркираната дума директно отTPdfWordBox; повторното задаване на същата дума е no-op, така че per-word tracking никога не кара изгледа да премигваReadingWordColorиReadingWordFollowуправляват цвета на word cursor-а и дали view-ът автоматично превърта изговорената дума в изглед
Version 1.55.2
Поправено (Коригирани)
- ViewerInteractionLab вече дава на toolbar редовете повече вертикално пространство, така че Open PDF, Създай пример, navigation, search и selection контролите вече не се припокриват при мащабирани шрифтове
Version 1.55.1
Поправено (Коригирани)
- ViewerInteractionLab вече поставя Prev, Next и Rotate на втория toolbar ред, като избягва startup припокриването с Open PDF и Създай пример
Version 1.55.0
Добавено (Добавени)
- Word-to-selection bridge за „read it, select it“ четене:
TPdfView.SelectWordBoxиSelectWordSpanизбират една word box или span от word boxes на същата страница (отPageWordBoxes) по техните character ranges, така че думата или редът, който се чете в момента, може и да бъде селектиран и копиран WordBoxIndexAtCharIndexсъпоставя character index обратно към word box-а, който го съдържа, управлявайки word-by-word highlight, докато TTS read cursor-ът напредва
Version 1.54.0
Добавено (Добавени)
- Аксесоарите за voice form-filling, които четат фокусираното поле директно от logical cursor-а:
FocusedFormFieldValue,FocusedFormFieldNameиFocusedFormFieldDetailsнаTPdfиTPdfViewотчитат стойността на текущото поле, човеко-четимото му име (/TUtooltip, с fallback към/T) и пълнияTPdfFormFieldInfo(type, flags, options) — всичко, което voice UI трябва да съобщи, докато минава през форма
Поправено (Коригирани)
FocusedFormFieldValueчете полето поFocusedFormFieldIndex, а не по pdfium interactive focus, така че voice-driven form filler получава правилната стойност дори без видим caret (съществуващиятFocusedFormFieldTextвсе още отразява pdfium focus и не е променен)
Version 1.53.0
Добавено (Добавени)
- Поддръжка за word-level highlighting:
TPdf.PageWordBoxesиTPdfView.PageWordBoxesразделят страница на записиTPdfWordBox, всеки с текста на думата, character range-а ѝ и bounding rectangle в page-space, така че accessibility reader може да подчертава всяка изговорена дума на свой ред ("karaoke" четене), като подава rectangle-а наSetReadingHighlight BuildWordBoxesизлага tokenizer стъпката самостоятелно, превръщайки текст на страница в word boxes с character ranges
Version 1.52.0
Добавено (Добавени)
- Помощните средства за low-vision rendering
InvertPdfBitmap,GrayscalePdfBitmapиDuotonePdfBitmapприлагат in-place colour transforms върху рендериран 32-bit bitmap, така че accessibility reader може да представя страниците инвертирани / dark-mode, в сиво или в персонализирана двуцветна схема (например тъмен фон със светъл текст) за low-vision потребители - Трансформациите се изпълняват за всеки пиксел и се държат еднакво във VCL и Lazarus/LCL, без да променят размерите на bitmap-а
Version 1.51.0
Добавено (Добавени)
- Нива на четене по изречения за assistive listen-reading:
TPdf.ReadingUnits,TPdf.DocumentReadingUnitsиTPdfView.ReadingUnitsлинеаризират потока от четимото съдържание в подредени записиTPdfReadingUnitс размер на изречение — всеки носи текста за изговаряне плюс семантичния си вид, page, highlight rectangles и language tag, така че screen-reader приложение да може да преминава през страница или целия документ по една изговорена единица наведнъж - Семантична навигация с
NextReadingUnitOfKind, която позволява на voice UI да прескача към следващото или предишното heading, figure, list item или table cell без да сканира потока ръчно BuildReadingUnitsпревръща всекиTPdfContentFragmentsдиректно в reading units: headings и figure/alt описанията остават цели, докато paragraphs се разделят по граници на изречения, decimal points се запазват, а reading cursor-ът е обикновен индекс, собственост на извикващия
Version 1.50.0
Добавено (Добавени)
ValidatePdfAвече може да проверява PDF 1.5+ документи, които съхраняват catalog, OutputIntent или други речници вътре в compressed object streams (/Type /ObjStm). Object stream-овете се разархивират и обектите в тях се разрешават, така че такива документи се валидират по същество вместо да бъдат отчетени като липсващи PDF/A marker-и
Version 1.49.5
Поправено (Коригирани)
ValidatePdfAвече не отчита липсващо описание наpdfaExtension:schemasкато проблем. PDF/A identifier schema (pdfaid) е добре известна, така че нито veraPDF, нито PDF/A-2/-3 изискват описание на extension schema за нея, а маркирането на липсата ѝ погрешно отчита всеки съвместим PDF/A от трета страна. Документите, които библиотеката сама произвежда, все още включват описанието
Version 1.49.4
Поправено (Коригирани)
ValidatePdfAвече открива нивото на съответствие, когато PDF/A identifier е записан като XML attributes (pdfaid:part="2"), а не като child elements, така че документи с атрибутивна форма вече не се отчитат с неизвестно ниво. Това също така поправя каскада, при която неоткрито ниво караше частно-специфичните проверки да падат обратно към строгите правила на PDF/A-1 и неправилно да маркират embedded files и transparency, които PDF/A-2 и PDF/A-3 позволяват
Version 1.49.3
Поправено (Коригирани)
ValidatePdfAвече проверява PDF 1.5+ документи, чийто cross-reference data е cross-reference stream (файлове без ключова думаtrailer). Нивото на съответствие, trailer/IDи другите marker-и се четат от dictionary-то на cross-reference stream-а, така че такива документи се валидират по същество вместо да бъдат отчетени като изцяло несъответстващи
Version 1.49.2
Поправено (Коригирани)
ValidatePdfAвече не отчита спурен non-embedded-font проблем за документи, които embed-ват всички свои fonts. Предишната heuristic сравняваше броя на токените/FontDescriptorс embedded font programs, но всеки embedded font допринася с два токена/FontDescriptor(препратката към font dictionary и descriptor object-а), така че всеки файл с embedded fonts беше неправилно маркиран. Проверката вече отчита само документ, който препраща към fonts, но изобщо не embed-ва font program, съгласно съответната корекция вValidatePdfUa
Version 1.49.1
Поправено (Коригирани)
- PDF/A output вече се валидира като съвместим PDF/A-1b и PDF/A-1a с veraPDF: вграденият sRGB OutputIntent ICC profile stream (рефериран чрез
/DestOutputProfile) вече декларира необходимия брой компоненти/N(3 за вградения RGB profile), както изисква ISO 19005-1 6.2.3.2. Документите, произведени отSaveAsPdfA, преди не минаваха строгата PDF/A-1 валидация, защото destination profile stream-ът пропускаше/N; стойността се извежда от ICC profile header-а, така че и подаден от извикващия CMYK или Gray profile получава правилния брой
Version 1.49.0
Поправено (Коригирани)
ValidatePdfUaвече не отчита фалшива липса на XMP identification за съвместими tagged PDF-и — PDF/UA identifier-ът (pdfuaid:part),dc:title, XMP датите и trailer/IDвече се четат от оригиналните байтове на документа, а не от повторно записаното копие, което пропуска/MetadataXMP stream-а и при файлове с cross-reference stream пропуска trailer/IDValidatePdfUaкоригира проверката за font embedding, така че документ, който embed-ва всички свои fonts, вече не се отчита като having non-embedded fonts; сега се маркира само документ, който препраща към fonts, но изобщо не embed-ва font programValidatePdfUaвече приемаFormulastructure element, чийто alternative text е подаден чрезActualText, а не чрез записAlt(ISO 14289-1 §7.7), в съответствие със съществуващото правило заFigure
Version 1.48.0
Добавено (Добавени)
- Програмно text selection на
TPdfView:SelectTextRange(по page и character range) иSetSelection(по изрично подадени per-page ranges) избират текст от код — например за да се прочете и подчертае откъс; и двата метода прерисуват и задействатOnSelectionChange, когато селекцията се промени.SelectionRangesчете текущата селекция като per-page character ranges, аSelectionRectanglesвръща нейните rectangles в page coordinates за персонално подчертаване или scroll-to
Version 1.47.0
Добавено (Добавени)
- Навигация между form fields за voice-driven form filling, както в
TPdf, така и вTPdfView:FormFieldTabOrder,FocusedFormFieldIndex,FocusFormField,FocusNextFormField,FocusPreviousFormField,ClearFormFieldFocusиFocusedFormFieldText. Те преместват logical field cursor върху widget полетата на страницата по tab order (с обхождане в края), така че assistive reader да може да премине през формата, да съобщи всяко поле чрезFormFieldInfo[Index].AlternateName(toolt ip /TU) и да го попълни чрезFormField[Index] TPdfView.OnFormFieldFocusChangeevent, който се вдига, когато field cursor-ът се премести (носейки новия index на полето или -1 при изчистване)
Version 1.46.0
Добавено (Добавени)
- Assistive listen-reading content stream:
TPdf.ReadableContent,TPdf.ReadablePageContent,TPdf.DocumentReadableContentиTPdfView.ReadableContentвръщат подреден списък от семантичниTPdfContentFragmentitems, всеки с изговорения текст (реалните glyph-ове илиActualText/Alt за figures), вид на фрагмента (heading с ниво, paragraph, figure, list item, table cell, link, plain), език, 1-based page и block plus per-line highlight rectangles. Tagged PDF-ите се линеаризират в logical reading order от structure tree-то; untagged pages падат обратно към render order, така че всеки документ може да бъде прочетен на глас - Синхронизиран reading highlight на
TPdfView:SetReadingHighlight,ClearReadingHighlightи публикуваниятReadingHighlightColorподчертават блока, който се чете в момента, върху search и selection overlays - Нови публични типове
TPdfContentFragment,TPdfContentFragments,TPdfReadableContent,TPdfContentFragmentKindиTPdfReadingOrderSource, както и новият helperClassifyStructType
Version 1.45.0
Добавено (Добавени)
ValidatePdfUaвече обхожда и живото tagged structure tree и отчита три високонадеждни content violations, които byte-level scanning не може да открие: елементFigureбез запис Alt и без ActualText (ISO 14289-1, 7.3), елементFormulaбез атрибут Alt (7.7) и елементNoteбез уникален ID (7.9). Три нови стойностиTPdfUaValidationIssueги представят:pvuaiFigureMissingAlt,pvuaiFormulaMissingAltиpvuaiNoteMissingId. Обхождането на tree-то се пропуска за untagged документи- Нов публичен helper
ValidatePdfUaStructureElementsприлага тези правила за structure tree към плосък списък от елементи (както се връща отTPdf.StructureElements), така че проверките да могат да се изпълняват или unit-test-ват без да се зарежда цял документ
Version 1.44.5
Поправено (Коригирани)
- Проверката за font embedding в
ValidatePdfA(pvaiFontNotEmbedded, ISO 19005-1, 6.3.4) вече открива и simple fonts без embedding, които нямат/FontDescriptor, най-вече 14-те стандартни Type 1 fonts (Helvetica, Times, Courier и т.н.), които PDF/A изисква да бъдат embedded без изключение. Преди такъв font оставаше незабелязан; проверката вече брои и simple-font dictionaries (/Type1,/TrueType,/MMType1) спрямо embedded font programs, по модела на корекцията за PDF/UA в 1.44.3
Version 1.44.4
Поправено (Коригирани)
ValidatePdfVTвече отхвърля malformed ISO 16612-2 §6.5 DPart trees, в които/DPartsе плосък масив от препратки вместо изисквания масив от масиви, или когато leaf DPart повтаря своята/Startстраница като/End, въпреки че диапазонът съдържа само една страницаValidatePdfVTвече валидира имената в/NodeNameListкато XML NMTOKEN стойности след разширяването на PDF name#xxescape-овете, така че невалидните имена на ниво в йерархията се отчитат чрезpvviMissingDPartRootвместо да бъдат приемани като използваема DPart структура
Version 1.44.3
Поправено (Коригирани)
- Проверката за font embedding в
ValidatePdfUa(pvuaiFontNotEmbedded, ISO 14289-1, 7.21.4) вече открива и simple fonts без embedding, които нямат/FontDescriptor, най-вече 14-те стандартни Type 1 fonts (Helvetica, Times, Courier и т.н.), за които PDF/UA не допуска изключение от embedding. Преди такъв font оставаше незабелязан и документ, който го използва, можеше да бъде отчетен като съвместим; проверката вече брои и simple-font dictionaries (/Type1,/TrueType,/MMType1) спрямо embedded font programs
Version 1.44.2
Поправено (Коригирани)
ValidatePdfVTвече оставя наличен, но неразпознатpdfvtid:GTS_PDFVTVersionmarker катоpvcUnknownвместо да го понижава доpvcNone. Това запазва различими невалидни низове на ниво файл катоPDF/VT-2sот документи, които нямат никакъв PDF/VT marker; PDF/VT-2s се идентифицира от MIME stream header-а в ISO 16612-2 Annex A, а не от XMP marker-а на PDF файла- Проверката
/DPartRootвече валидира по-стриктно семантиката на дървото по ISO 16612-2 §6.5:/DPartRootNodeи/NodeNameListтрябва да описват действителната DPart дълбочина, DPart parent връзките трябва да образуват дърво,/Startи/DPartsса взаимно изключващи се, а всеки page/DPartтрябва да сочи към покриващия leaf DPart в същия depth-first ред като page tree-то
Version 1.44.1
Поправено (Коригирани)
SaveAsPdfVTвече записва минимална ISO 16612-2 §6.5 Document Part Hierarchy, когато изходният PDF няма използваем/DPartRoot. Генерираното дърво свързва всяка страница чрез/DPart, запазва съществуваща валидна йерархия и оставя по-богатите recipient/DPM метаданни на извикващия работен потокValidatePdfVTвече валидира използваемата DPart структура, чете PDF/VT XMP стойности както от RDF атрибути, така и от element text, и налага точната PDF/VT-to-PDF/X базова комбинация: PDF/VT-1 изисква PDF/X-4, а PDF/VT-2 изисква PDF/X-4p, PDF/X-5g или PDF/X-5pgTPdfVTSaveOptions.Conformance = pvc2вече не записва невалидни single-file PDF/VT-2 marker-и. Записвачът за single-file нормализира изхода до PDF/VT-1, защото PDF/VT-2 изисква file-set semantics
Version 1.44.0
Добавено (Добавени)
ValidatePdfUaвече отчита и content-level PDF/UA нарушения, които могат да се проверят на байтово ниво, освен marker-ите на файловия формат: font program, който не е embedded (ISO 14289-1, 7.21.4), font без/ToUnicodeCMap, когато няма освободено simple-font encoding (7.21.7), и документ, който има annotations, но не декларира page/Tabs /Stab order (7.18.3)- Три нови стойности
TPdfUaValidationIssue—pvuaiFontNotEmbedded,pvuaiFontMissingToUnicodeиpvuaiMissingTabsOrder— се показват отValidatePdfUaи в preflight отчета. Те са груби heuristics, предназначени като preflight подсказки, а не като пълна ISO 14289-1 проверка
Version 1.43.1
Поправено (Коригирани)
SaveAsPdfUaвече налага задължителните ISO 14289-1, 7.1 записи в/ViewerPreferences/DisplayDocTitle trueи в/MarkInfo/Marked true/Suspects falseдори когато изходният документ вече предоставя тези dictionaries с липсващи или противоречащи стойности. Преди marker-ите се вмъкваха само когато dictionary-те изцяло липсваха, така че източник с например/ViewerPreferencesбезDisplayDocTitleили с/MarkInfoи/Marked falseсе записваше обратно като несъответстващ файл- Съществуващите ключове в вече наличен
/ViewerPreferencesили/MarkInfodictionary се запазват, а dictionary, подаден като индиректна препратка, се разрешава преди да се приложат задължителните ключове
Version 1.43.0
Добавено (Добавени)
ValidatePdfAвече прилага правилата на PDF/A-2 / PDF/A-3 за embedded и associated files и за Level U текст. Embedded files все още се отхвърлят за PDF/A-1; за PDF/A-3 embedded файл без изисквания/AFRelationshipключ (ISO 19005-3 Annex E) се маркира, докато PDF/A-2 attachments са позволени (тяхното собствено съответствие не се проверява рекурсивно). Новият проблемpvaiUnicodeMappingMissingотчита PDF/A-2u или PDF/A-3u документ, чийто fonts нямат/ToUnicodemapping (ISO 19005-2 6.2.11.7). Transparency и optional content продължават да се маркират само за PDF/A-1
Version 1.42.0
Добавено (Добавени)
- PDF/A-2 (ISO 19005-2) и PDF/A-3 (ISO 19005-3) вече се поддържат на всички три нива на съответствие — a, b и u — от
SaveAsPdfA,ValidatePdfAи свойствотоPdfAConformance. ЕнумерациятаTPdfAConformanceполучаваpac2a,pac2u,pac3aиpac3u(PDF/A-1 няма Level u). Записването пише съответнияpdfaid:part(2 или 3) иpdfaid:conformance(A, B или U), като запазваGTS_PDFA1OutputIntent subtype-а, който ISO 19005-2 оставя за съвместимост. Заявка за Level A все още се понижава до съответния Level B (за всяка part), когато документът няма tagged structure, изисквана от това ниво
Version 1.41.0
Добавено (Добавени)
ValidatePdfAвече открива content-level PDF/A нарушения, които marker injection не може да поправи, върху вече отчетените структурни marker-и: JavaScript и други забранени actions, additional-actions (/AA), embedded files,LZWDecode, transparency (soft masks и transparency groups), optional content (/OCProperties), забранени annotation подтипове (FileAttachment, Sound, Movie, 3D, Screen), AcroForm/NeedAppearances trueи/XFA, fonts, чиито descriptors нямат embedded font program, и Level A претенция без tagged structure, изисквана от ISO 19005-1 6.8. Проверки за transparency, optional-content и embedded files се прилагат само за PDF/A-1 (тези features са позволени в PDF/A-2 и PDF/A-3). Нови стойностиTPdfAValidationIssueпредставят всеки случай; съществуващите стойности не са променени
Version 1.40.3
Поправено (Коригирани)
SaveAsPdfAвече премахва всяко source-document encryption преди да произведе PDF/A output. ISO 19005-1 6.1.3 забранява trailer/Encryptkey, но пътят за запис преди запазваше security handler-а на източника, така че запазването на криптиран документ като PDF/A произвеждаше криптиран, несъответстващ файл. Записът на PDF/A сега първо декриптира документа. Некриптираните документи не са засегнати
Version 1.40.2
Поправено (Коригирани)
- Спирането на
SaveAsPdfAда издава фалшива PDF/A Level A conformance претенция. Когато Level A (pac1a) е поискан, но изходният документ няма tagged-structure marker-ите, изисквани от ISO 19005-1 6.8 —/StructTreeRootв catalog-а и/MarkInfodictionary с/Marked true— записаният файл вече се идентифицира като съответния Level B (pdfaid:conformance=B) вместо да твърди Level A. Чисто визуалният PDF/A-1b output не е засегнат
Version 1.40.1
Поправено (Коригирани)
- Затегната е проверката за съвместимост на PDF версията, така че action-ът
SetOCGState(set-optional-content-group-state) да се разпознава като PDF 1.5 feature. Записването към PDF 1.2, 1.3 или 1.4 target, който съдържаSetOCGStateaction, вече се отхвърля, за да съвпада с ISO 32000-1 (Table 198); преди такъв action можеше да премине в output с по-ниска версия. Отделният, остарял PDF 1.2 actionSetStateвсе още се приема от PDF 1.2 нататък
Version 1.40.0
Добавено (Добавени)
- Свърза upstream
FPDFPageObj_AddExistingMark()API-то, което прикачва съществуващ content mark към page object. Когато последователни page objects споделят един и същ mark, записаният PDF ги свива в един-единствен mark, който обхваща всички тях; непоследователните обекти получават отделни копия - Свърза upstream
FPDFTextObj_SetFontSize()API-то за промяна на point size на съществуващ text object, допълвайки вече наличния binding заFPDFTextObj_GetFontSize()
Променено (Променени)
- Обнови bundled PDFium runtime DLL-ите (Win32 и Win64, standard и V8 builds) до upstream snapshot 2026-06-02
Version 1.39.53
Променено (Променени)
- Промени Delphi demo-тата
PDFViewer,SplitViewиMultiPageViewerда отварят документи по подразбиране в режимZoom to Page - Първоначалното рендериране сега побира цялата страница в viewer surface-а, преди потребителят да избере ръчно ниво на zoom
- Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.53
Version 1.39.52
Променено (Променени)
- Подобри
Demo\Lazarus\CreatePDF, така че въвеждащият пример вече генерира PDF от две страници с vector paths, table content, embedded image, text annotation, завъртян текст и по-ясно walkthrough за изграждане на документа - Добави изпипани
README.htmlстраници за всяка demo папка на Delphi, C++Builder и Lazarus, като замени останалите demo README файлове само с текст с браузърно-четим guide - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.52
Version 1.39.51
- Подобри batch summaries на
Demo\Delphi\PreflightReportCliсъс суми на стандартите по статус Pass, Action required и Review за избраните standards - В редовете за всеки файл вече се включват броеве за action required и review в TXT / HTML / JSON / CSV summaries, което прави CI артефактите по-лесни за преглед без да се отваря всеки генериран отчет
- Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.51
Version 1.39.50
- Подобри directory batch режима на
Demo\Delphi\PreflightReportCli, така чеbatchdir=folderсъбира откритите PDF пътища, сортира ги и после генерира отчетите в стабилен ред - Рекурсивните directory scans вече произвеждат възпроизводим ред на отчетите и редовете на summary, докато изричната обработка
batch=list.txtпродължава да запазва реда от list файла - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.50
Version 1.39.49
- Подобри batch summaries на
Demo\Delphi\PreflightReportCli, така че да записват настройките на изпълнението: source kind, source path, recursive state, output directory, формат на отчета, избраните standards и режимаfailon= - JSON summaries вече включват обект
run, TXT и HTML summaries показват секция за настройките на изпълнението, а CSV редовете повтарят същите audit колони за spreadsheet и CI pipelines - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.49
Version 1.39.48
- Подобри batch output naming на
Demo\Delphi\PreflightReportCli, така че дублирани входни имена на файлове, които споделят единoutdir=, вече да не си презаписват генерираните отчети - Batch изпълненията вече добавят суфикси
-2,-3и нататък, когато пътят на генериран отчет вече е бил зает в същото изпълнение, а summary-те записват окончателния път към отчета, защитен от collisions - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.48
Version 1.39.47
- Подобри batch summaries на
Demo\Delphi\PreflightReportCli, така че TXT и JSON изходите вече да включват агрегирани totals за общ брой файлове, обработени файлове, неуспешни файлове, issues и съвпаденията поfailon= - CSV summaries остават чиста row table за съществуващите consumers, докато HTML summaries продължават да показват същите aggregate metrics в dashboard header-а
- Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.47
Version 1.39.46
- Подобри
Demo\Delphi\PreflightReportCliсsummary=batch.html/.htm, така че batch изпълненията да могат да изкарват browser-readable dashboard заедно с TXT / CSV / JSON manifests - HTML summaries показват метриките за total, processed, failed, issue и
failon=matches, а след това изброяват всеки вход с връзки към отчета, status, counts и error text - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.46
Version 1.39.45
- Подобри
Demo\Delphi\PreflightReportCliсbatchdir=folderиrecursive, така че скриптовете да могат да сканират PDF папки директно, без първо да записват list файл - Directory batch режимът използва повторно поведението на
outdir=,summary=,standards=иfailon=от list-based batch режима, докато non-recursive сканира само избраната папка, аrecursiveвключва поддиректориите - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.45
Version 1.39.44
- Подобри
Demo\Delphi\PreflightReportCliсsummary=batch.csv|json|txt, така че batch изпълненията да могат да изкарват машинно-четим manifest редом до отчетите за всеки файл - Batch summaries включват всеки входен path, път към отчета, status, броя на standards, passed count, issue count, състоянието на съвпадение по
failon=и error text за CI jobs и външни скриптове - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.44
Version 1.39.43
- Подобри
Demo\Delphi\PreflightReportCliсbatch=list.txtиoutdir=reports, така че скриптовете да могат да генерират preflight reports за списък от PDF файлове в едно изпълнение - Batch режимът пропуска празни редове и коментарни редове с
#, извежда името на всеки отчет.preflight.<ext>от входния PDF, продължава след грешки за отделните файлове и обобщава обработените и неуспешните файлове преди да върне резултат - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.43
Version 1.39.42
- Подобри
Demo\Delphi\PreflightReportCliсfailon=none|issues|action|review, така че CI jobs да могат да превръщат генерираните preflight резултати в детерминирани exit codes - CLI сега връща exit code 2, когато избрано правило
failon=съвпадне след като файлът с отчета и опционалният прикрепен отчетен PDF вече са генерирани, докато runtime грешките все още връщат exit code 1 - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.42
Version 1.39.41
- Подобри
Demo\Delphi\PreflightReportCliсattach=output.pdf, така че генериран preflight отчет да може да бъде вграден като attachment на ниво документ в ново PDF копие - CLI запазва генерирания TXT / HTML / Markdown / JSON / CSV отчет файл на диска и отказва да се прикрепя обратно към оригиналния входен PDF път, което намалява риска от случайно презаписване
- Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.41
Version 1.39.40
- Добави
Demo\Delphi\PreflightReportCli, Delphi console companion за скриптируемо генериране наFPdfPreflightReportбез отваряне на viewer - CLI поддържа създаване на пример без аргументи, както и input / output аргументи, опционална парола, output формати
text/html/md/json/csvи филтриране поstandards=за PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R и PDF/VT - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.40
Version 1.39.39
- Подобри
FPdfPreflightReportсTPdfPreflightReport.ToMarkdownиSaveMarkdownToFile, така че preflight отчет-ите да могат да се експортират като Markdown, удобен за issue tracker - Обнови Delphi, C++Builder и Lazarus примерите
PreflightReportс превключване към Markdown preview и действия Save MD редом до съществуващия TXT / HTML / JSON / CSV работен поток - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.39
Version 1.39.38
- Подобри примерите
SecurityAuditза Delphi, C++Builder и Lazarus с JSON export на audit отчет редом до съществуващия TXT save / copy работен поток - JSON отчетът съдържа
format,generatedAt,summary,findingCountи структурирани редовеfindingsс полета за severity, area и detail - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.38
Version 1.39.37
- Подобри
FPdfPreflightReportсTPdfPreflightReport.ToCsvиSaveCsvToFile, така че preflight отчет-ите да могат да се експортират като CSV, удобен за spreadsheets - Обнови примерите
PreflightReportза Delphi, C++Builder и Lazarus с превключване към CSV preview и действия Save CSV редом до съществуващия TXT / HTML / JSON работен поток - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.37
Version 1.39.36
- Подобри
FPdfPreflightReportсTPdfPreflightReport.IssueCategoryCountsплюс reusable типоветеTPdfPreflightIssueCategoryCountиTPdfPreflightIssueCategoryCountsза агрегиране на marker-level issues по категория - Обнови
TPdfPreflightReport.ToText,ToHtmlиToJson, така че генерираният PreflightReport output да включва обобщения на броя issues по категории редом до редовете по стандарт и подробните препоръки за проблемите - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.36
Version 1.39.35
- Преименува разширения пример
PrintDialogнаPrintPreferencesв Delphi, C++Builder и Lazarus, така че името на демото вече да съвпада с PDF author print preferences, N-up printing, odd / even filtering, grayscale, cell border и duplex mapping работния поток му - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.35
Version 1.39.34
- Подобри
Demo\Delphi\PrintPDFс drag-and-drop зареждане на PDF и документира съществуващия работен поток наDemo\CBuilder\PrintPDFредом до Delphi и Lazarus PrintPDF примерите - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.34
Version 1.39.33
- Добави
Demo\CBuilder\SplitView, с което матрицата на SplitView примерите вече е завършена за Delphi, C++Builder и Lazarus - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.33
Version 1.39.32
- Добави
Demo\Lazarus\SplitView, като пренесе side-by-side PDF сравняването в Lazarus с layouts с две или три панели, навигация на активния view, синхронизирани команди, zoom presets и rotation - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.32
Version 1.39.31
- Добави
Demo\Lazarus\PrintPDF, като пренесе стандартния PDF print работен поток в Lazarus с preview navigation, page ranges, copies, collate mode, progress и cancellation - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.31
Version 1.39.30
- Добави
Demo\Lazarus\FontProperties, с което матрицата на FontProperties примерите вече е завършена за Delphi, C++Builder и Lazarus - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.30
Version 1.39.29
- Добави
Demo\CBuilder\FontProperties, като пренесе инспекцията на indexed characters и font metadata в C++Builder редом до Delphi примера - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.29
Version 1.39.28
- Добави
Demo\Delphi\ExtractTextPages, с което матрицата на примера за извличане на текст по страници вече е завършена за Delphi, C++Builder и Lazarus - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.28
Version 1.39.27
- Добави
Demo\Lazarus\PrintDialog, с което матрицата на PrintDialog примера вече е завършена за Delphi, C++Builder и Lazarus - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.27
Version 1.39.26
- Добави
Demo\CBuilder\PrintDialog, като пренесе работния поток за N-up printing и PDF author print preferences в C++Builder редом до Delphi примера - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.26
Version 1.39.25
- Добави
Demo\CBuilder\ViewerInteractionLab, с което матрицата на ViewerInteractionLab примера вече е завършена за Delphi, C++Builder и Lazarus - Обнови библиотечния build работен поток и Win64 C++Builder package output-ите, така че методите за viewer interaction на
TPdfViewда се линкват правилно в Win64 demo-та - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.25
Version 1.39.24
- Добави
Demo\Lazarus\ViewerInteractionLab, като пренесе фокусирания работен поток за viewer interaction в Lazarus редом до Delphi примера - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.24
Version 1.39.23
- Добави
Demo\Lazarus\SearchAndSelect, с което матрицата на SearchAndSelect примера вече е завършена за Delphi, C++Builder и Lazarus - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.23
Version 1.39.22
- Добави
Demo\CBuilder\ContentExtractionLabиDemo\Lazarus\ContentExtractionLab, като пренесе работния поток за много категории content extraction във всички поддържани demo IDE-та - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.22
Version 1.39.21
- Подобри
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportиDemo\CBuilder\PreflightReportс selector за preview формат, така че потребителите да могат да прегледат text или JSON output преди да запазят отчетите - Обнови
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.21
Version 1.39.20
- Добавен е JSON export към
FPdfPreflightReportчрезTPdfPreflightReport.ToJsonиSaveJsonToFile, който произвежда машинно-четими обобщения, статус / приоритет по стандарти, следващи действия и подробности за проблемите - Обновени са
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportиDemo\CBuilder\PreflightReportс действия Save JSON редом до TXT / HTML export - Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.20
Version 1.39.19
- Подобрен е
FPdfPreflightReportсTPdfPreflightStatus, категории проблеми, приоритет по стандарти и насоки за следващо действие в TXT / HTML отчетите - Обновени са
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportиDemo\CBuilder\PreflightReport, за да показват status, priority, броя на проблемите и next action в summary grid-а - Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.19
Version 1.39.18
- Добавен е
Demo\Lazarus\SecurityAudit, с което матрицата от демота за read-only PDF risk-surface audit работен поток вече е завършена за Delphi, C++Builder и Lazarus - Lazarus примерът изброява permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, XFA state, наличността на V8 / XFA helper-и и unsupported-feature callbacks, а след това записва или копира списъка с findings като TXT отчет
- Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.18
Version 1.39.17
- Добавен е
Demo\CBuilder\SecurityAudit, като пренася read-only PDF risk-surface audit работния поток в C++Builder редом до съществуващия Delphi пример - C++Builder примерът изброява permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, XFA state, наличността на V8 / XFA helper-и и unsupported-feature callbacks, а след това записва или копира списъка с findings като TXT отчет
- Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.17
Version 1.39.16
- Добавен е
Demo\CBuilder\SearchAndSelect, като пренася самостоятелния SearchAndSelect viewer работен поток в C++Builder редом до съществуващия Delphi пример - C++Builder примерът създава или отваря PDFs, изброява съвпаденията за всички страници с page / character-index previews, поддържа Previous / Next и double-click навигация и подчертава съвпаденията на текущата страница с
HighlightSearchText - Той също така излага
AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboard,ClearSelection,OnSelectionChangeи spreadDisplayModeопции; version metadata вече отчитат 1.39.16
Version 1.39.15
- Добавено
Demo\CBuilder\WatermarkStamp, с което се завършва матрицата от демота за Delphi, Lazarus и C++Builder за многократно използваеми работни потоци за воден знак и печат с Form XObject - Примерът за C++Builder създава целеви и печатни PDF-и, използва повторно страницата с печата чрез
CreateXObjectFromPage, прилага трансформации сTPdfMatrixи записва центрирани водни знаци, ъглови печати и етикети с номера на страници - Актуализирани
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора, за да отразяват 1.39.15
Version 1.39.14
- Добавено
Demo\Lazarus\WatermarkStamp, с което многократно използваемият работен поток за воден знак и печат с Form XObject идва и в Lazarus - Примерът за Lazarus създава целеви и печатни PDF-и, използва повторно страницата с печата чрез
CreateXObjectFromPage, прилага трансформации сTPdfMatrixи записва центрирани водни знаци, ъглови печати и етикети с номера на страници - Актуализирани
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора, за да отразяват 1.39.14
Version 1.39.13
- Добавено
Demo\CBuilder\PreflightReport, с което се завършва матрицата от демота за Delphi, Lazarus и C++Builder за многократно използваемия работен потокFPdfPreflightReport - Примерът за C++Builder използва
FPdfPreflightReport.hpp, за да генерира стандартни обобщения, предварителни прегледи на TXT отчети, TXT / HTML файлове с отчет и поведението Отвори последния отчет - Актуализирани
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора, за да отразяват 1.39.13
Version 1.39.12
- Добавено
Demo\Lazarus\PreflightReport, с което работният поток за preflight отчети за PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R и PDF/VT идва и в Lazarus - Примерът за Lazarus може да отваря или създава PDF, да избира целеви стандарти, да преглежда редове с обобщение и изхода на TXT отчета, да записва TXT / HTML отчети и да отваря последно записания отчет
- Актуализирани
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора, за да отразяват 1.39.12
Version 1.39.11
- Разширено
Demo\Delphi\SearchAndSelectс списък с резултати от търсене в цялата страница, който записва номер на страница, индекс на символ и текст за предварителен преглед - Добавена е навигация Previous / Next match и прескачане към резултат с двойно щракване, като се запазва поведението на
HighlightSearchTextза текущата страница - Актуализирани
TPdf.AboutInfo, метаданните на пакета Lazarus и метаданните на инсталатора, за да отразяват 1.39.11
Version 1.39.10
- Подобрен е
Demo\Delphi\SecurityAuditс действия Запази отчета и Копирай отчета, които експортират текущото обобщение и редовете с findings като TXT audit отчет - Демото вече изчиства състоянието на отчет export, когато audit panel-ът се занули, така че копираните или записаните отчет-ове да съответстват на видимите findings
- Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.10
Version 1.39.9
- Подобрен е
Demo\Delphi\ContentExtractionLabс source-PDF save, copy-to-clipboard на отчета и действия за избор на всички / без категории - Демото вече обезсилва текущия отчет, когато изборът на категории се промени, така че TXT / JSON export-ите да отразяват видимия extraction scope
- Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.9
Version 1.39.8
- Добавен е
Demo\Delphi\ContentExtractionLab— обединен пример за content extraction работен поток за document metadata, page text, page objects, images, attachments, links, annotations, bookmarks и font / character metrics - Примерът може да отвори съществуващ PDF или да създаде synthetic PDF със съдържание от text, image, attachment и annotation, след което да генерира summary редове и подробни TXT / JSON отчети
- Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.8
Version 1.39.7
- Добавен е
Lib\FPdfPreflightReport.pas— reusable отчет helper, който обединяваValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRиValidatePdfVTв единTPdfPreflightReportобект - Добавен е
Demo\Delphi\PreflightReport— пример за работен поток, който отваря или създава PDF, избира target standards, преглежда summary редове и препоръки за проблеми и записва TXT или HTML отчети - Генерираните отчети изрично описват вградената граница на валидация на ниво маркери, така че приложенията да могат да ги комбинират със специализирани content-level preflight инструменти при нужда
- Обновени са
TPdf.AboutInfo, Lazarus package metadata, package project lists и installer version metadata, за да отчитат 1.39.7
Version 1.39.6
- Добавен е
Demo\Delphi\SearchAndSelect— фокусиран viewer пример за работен поток за search highlighting, text selection, preview на избрания текст, copy, clear и spread display modes - Примерът демонстрира
HighlightSearchText, match-case / whole-word search options,AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboardиClearSelectionбез да добавя нов library API - Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.6
Version 1.39.5
- Разширен е
Demo\Delphi\ViewerInteractionLabв SearchAndSelect-style viewer UX пример сHighlightSearchText, match-case / whole-word опции, preview на избрания текст и съществуващите selection / clipboard контроли - Разширен е
Demo\Delphi\PrintDialog, за да инспектира PDF author print preferences:PrintCopies,PrintPageRanges,PrintScaling,PrintPaperHandlingи видимото duplex mapping наSetPdfPrintPaperHandlingDevMode - Добавен е
Demo\Delphi\SecurityAudit— read-only risk-surface пример, който изброява permissions, attachments, document JavaScript, URI / Launch links, web links, signatures, XFA state и наличността на V8 / XFA helper-и - Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.5
Version 1.39.4
- Добавени са
Demo\CBuilder\ImageToPDFиDemo\Lazarus\ImageToPDF, с което матрицата на ImageToPDF примерите вече е завършена за Delphi, C++Builder и Lazarus - Новите примери демонстрират multi-image selection, preview на избраното изображение, една PDF страница на изображение, A4 portrait / landscape page sizing, центрирано image scaling, progress по изображение и отваряне на генерирания PDF след запис
- Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.4
Version 1.39.3
- Добавен е
Demo\CBuilder\BatchExport, като пренася работния поток за multi-file PDF to JPG export в C++Builder редом до съществуващите Delphi и Lazarus примери - Примерът демонстрира
LoadCustomDocument,IPdfCancellationTokenSource, streamingTFileStreaminput, progress по файл и по страница, cancel handling, inputs за DPI / quality / password и отваряне на output папката след завършване - Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.3
Version 1.39.2
- Добавен е
Demo\Delphi\WatermarkStamp— runnable Form XObject пример за работен поток, който създава target PDF и reusable stamp PDF, а после прилага центрирани watermarks, stamps горе вдясно и page-number етикети върху всяка страница - Примерът демонстрира
CreateXObjectFromPage,InsertFormObjectFromXObject,TPdfMatrixиFPDFPageObj_SetMatrixбез да добавя нов library API - Обновен е
Docs\en-us\Examples.html, за да използва текущияTPdfMatrix.Handlepattern при подаване на матрици къмFPDFPageObj_SetMatrix - Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.2
Version 1.39.1
- Добавен е
Demo\Delphi\ViewerInteractionLab— фокусиранTPdfViewпример за display modes, fit modes, page colors, rotation, user text selection, clipboard actions и feedback за координати сDeviceToPage - Добавени са
Demo\CBuilder\StandardsLab/Demo\Lazarus\StandardsLab, така че Lazarus потребителите да могат да изпълняват валидация и marker-output работния поток за PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R и PDF/VT - Изброени са standards unit-ите в
Lib\37.0\PDFiumPas.dprojиLib\FPC\PDFiumLaz.lpkи е поправен build-ът на DelphiSplitViewдемото чрез премахване на дублиран import наWinapi.ShellAPI - Поправени са Delphi demo batch-build blockers в
BatchExport,PDFViewer,MultiPageViewerиSplitViewбез промяна на runtime поведението им - Поправена е batch-build съвместимостта на C++Builder демотата
PDFViewerиMultiPageViewerчрез замяна наnullptrсNULLза текущия project mode - Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.1
Version 1.39.0
- Добавен е
Demo\Delphi\StandardsLab— runnable standards пример за работен поток, който зарежда или създава PDF, изпълняваValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRиValidatePdfVTи показва откритото съответствие, pass/fail status и броя на проблемите в една решетка - Бутоните за запис в StandardsLab извикват
SaveAsPdfA,SaveAsPdfUa,SaveAsPdfE,SaveAsPdfX,SaveAsPdfRиSaveAsPdfVT, като правят PDF standards marker output видим без да се пише custom harness - Обновени са
TPdf.AboutInfo, Lazarus package metadata и installer version metadata, за да отчитат 1.39.0
Version 1.38.0
TPdfViewsearch и text-selection overlay-ите вече използват реално alpha blending вместо logical mask painting, като запазват съдържанието на страницата под highlight-ите- Добавен е
SetPdfPrintPaperHandlingDevMode, който съпоставяTPrintPaperHandlingкъм WindowsDEVMODE.dmDuplexстойности:DMDUP_SIMPLEX,DMDUP_HORIZONTALиDMDUP_VERTICAL TPdfView.SmoothScrollвече анимира line/page scrollbar командите в сегменти, управлявани от таймер; thumb tracking остава незабавно- Обновени са
TPdf.AboutInfoи installer version metadata, за да отчитат 1.38.0
Version 1.37.0
TPdfвече притежава per-instance render lock, който сериализираRenderPage,RenderTile,RenderPageProgressive, презареждането на страница и пътищата за document unload. Worker-driven rendering през споделен компонент вече е практично, като приложенията все още координират документните промени и lifetime-а- Поправен е zero-copy bitmap wrapper-ът, така че да отхвърля bottom-up
TBitmapDIB layouts и да пада обратно към PDFium-owned buffer преди copy out, с което се елиминират stride-corruption / access-violation откази във VCL render тестовете - Затегнато е поведението на селекцията в
TPdfView:AllowUserTextSelectionконтролира само user input, code-level selection API-тата все още рисуват, аSelectAllследва реалния visible spread, така че cover page вече не избира страница 2. Delphi, Lazarus и C++Builder тестовете са разширени съответно - Обновени са
TPdf.AboutInfoи installer version metadata, за да отчитат 1.37.0
Version 1.36.0
- Активирана е крайпотребителска text selection в
TPdfView— свойствотоAllowUserTextSelection, запазено във v1.17.0, вече управлява пълен drag-select pipeline. Ляв клик върху текстов символ влиза в select mode (hit-test auto); ляв клик върху празна област продължава да панорамира както досега. Формулярният widget запазва приоритета си, така че клик върху form field все още фокусира полето вместо да започва селекция - Двоен клик избира думата, троен клик избира реда,
Ctrl+Aизбира текущата страница (и двете страници при spread display modes), аCtrl+Cкопира селекцията в Windows clipboard катоCF_UNICODETEXT Shift+Left/Shift+Rightразширява селекцията по един символ наведнъж (преливайки към съседната страница в spread mode);Shift+Начало/Shift+Endразширява до визуалния край на реда, като използва височината на кутията на началния символ като tolerance за line-cluster, така че редове с различни размери на шрифта да останат правилно групирани- Посочване върху текст сменя курсора на
crIBeam; излизане от текста връща курсора по подразбиране. Докато е в ход drag за text selection, влачене в 20-пикселна dead zone при който и да е edge на viewer-а авто-скролва страницата (50 ms tick, 16 px / tick, ограничено в същите граници, които използва pan path), така че селекцията да може да се разшири извън текущия viewport без първо да се пуска мишката - Cross-page selection работи в spread display modes (
dmTwoPageContinuous,dmTwoPageContinuousWithCover): drag, започнат на лявата страница и завършващ на дясната, избира непрекъснатия диапазон, който обхваща и двете.SelectedTextсвързва per-page фрагментите с CR/LF, така че round-tripped текстът да се чете като нормално многострочно съдържание - Новото публикувано свойство
SelectionColor(по подразбиранеclHighlight, Windows system selection color) — независимо отHighlightColor, което оцветява резултатите от търсенето в жълто. Search highlights и жива drag-selection могат да се показват едновременно на екрана без цветен конфликт - Новото публикувано събитие
OnSelectionChangeсе задейства винаги, когато материализираните ranges на селекцията реално се променят — никога при повторно прилагане на същото, така че host приложенията да могат да го вържат директно към status-bar text или състояние на бутони без debouncing - Ново публично API в
TPdfView:HasSelection,SelectionCharCount,SelectedText,ClearSelection,SelectAll,CopySelectionToClipboard. Това са code-level entry points и винаги работят независимо отAllowUserTextSelection— флагът контролира само user input (mouse, Ctrl+C, Ctrl+A, Shift+arrows), така че kiosk host-овете могат да изключат user-driven selection, докато все още изграждат toolbar бутони "Select All / Copy", които използват същото API - По подразбиране се прикачва
Copy/复制popup menu при десен клик, когато host-ът не е задал собственPopupMenu— стандартното "select text, right-click, copy" работи веднага. Надписът се избира между English и Chinese чрезSysLocale.PriLangID; host-овете, които искат пълна локализация (или по-богато меню), просто задават собственPopupMenuи default-ът се потиска - Селекцията автоматично се изчиства при преходи на
SetPdf,SetPageNumber,SetActive(False)иDisplayMode, катоOnSelectionChangeсе задейства точно веднъж, когато предишната селекция не е била празна. Подсистемата за попълване на формуляри запазва приоритет — докато се редактира form field, всички клавишни комбинации за селекция се отлагат, така че полето да получиCtrl+C/Ctrl+A/Shift+arrowsза собствената си селекция - Разширени са Delphi и Lazarus regression suite-овете до 202 case-а всеки, а C++Builder suite-ът до 159 case-а, като покриват default values, round-trip, поведението на публичното API, изчиствания при state changes, mouse drag (hit-text / hit-blank), click срещу drag, смяна на IBeam cursor, double-click word, triple-click line, keyboard shortcuts, default popup attach / defer / caption и spread cross-page selection — включително проверка за clipboard CR/LF round-trip
Version 1.35.0
- Добавена е поддръжка за PDF/VT (ISO 16612-2:2010) marker injection: TPdf.SaveAsPdfVT превръща текущия документ в PDF/VT-1 или PDF/VT-2 съвместим файл (variable и transactional printing PDF subset-а). PDF/VT е изграден върху PDF/X-4 — ISO 16612-2 §6.2.1 изисква всеки PDF/VT-1 файл да съответства и на PDF/X-4 — така че injector-ът записва пълния набор PDF/X-4 marker-и (XMP
pdfxid:GTS_PDFXVersion = "PDF/X-4", Info/GTS_PDFXVersion (PDF/X-4)и/Trapped, catalog/OutputIntentsс препратка към OutputIntent dictionary с embedded ICC profile) заедно със PDF/VT-specific свойствата - PDF/VT-specific injection-ът покрива XMP
pdfvtid:GTS_PDFVTVersion(= "PDF/VT-1" или "PDF/VT-2" според §6.3 Table 2) иpdfvtid:GTS_PDFVTModDate(поддържано в синхрон сxmp:ModifyDateспоред §6.3 NOTE 1), плюс описание pdfaExtension:schemas, което декларира и pdfxid, и pdfvtid namespace-ите (NPES URIhttp://www.npes.org/pdfx/ns/id/иhttp://www.npes.org/pdfvt/ns/id/). Trailer-ът носи масив/ID - Добавен е TPdf.SaveAsPdfVTToStream за in-memory PDF/VT output и shorthand с default options
TPdf.SaveAsPdfVT(FileName), който произвежда PDF/VT-1 с bundled sRGB IEC61966-2.1 OutputIntent (3144 bytes, същият profile като при SaveAsPdfA / SaveAsPdfX) и/Trapped /False - Добавен е TPdf.ValidatePdfVT: проверява отворен PDF за PDF/VT compliance marker-и (наличие на XMP
pdfvtid:GTS_PDFVTVersionиGTS_PDFVTModDate, равенство междуpdfvtid:GTS_PDFVTModDateиxmp:ModifyDate, наличие на подлежащияpdfxid:GTS_PDFXVersionidentifier, наличие на catalog/DPartRootспоред §6.5,/OutputIntentsс/DestOutputProfile, trailer /ID, encryption status иxmp:CreateDate/ModifyDate) и връща TPdfVTВалидацияResult с откритото ниво на съответствие и набора от намерени проблеми - Добавено е свойството TPdf.PdfVTConformance: връща нивото на съответствие на текущо отворения документ (pvc1, pvc2, pvcNone или pvcUnknown) без да е нужно изрично да се извиква ValidatePdfVT
- Нови типове, експортирани в новия unit FPdfPdfvt: TPdfVTConformance (pvcUnknown/None/1/2), TPdfVTTrappedState (ptvUnspecified/True/False/Unknown), TPdfVTВалидацияResult, TPdfVTВалидацияIssue, TPdfVTSaveOptions
- Document Part Hierarchy (
DPartRoot/DParttree по §6.5) е application-level структура, която зависи от mapping-а на recipient / page-range във variable-data print работния поток. SaveAsPdfVT НЕ синтезира DPart tree — ValidatePdfVT показва липсващ/DPartRootкатоpvviMissingDPartRoot, така че извикващите да могат да насочат PDF/VT файловете през отделна стъпка за изграждане на DPart. Content-level PDF/X-4 изискванията (font embedding, transparency, ICC managed color, забрани за OPI / JavaScript / Reference XObject и т.н.) остават отговорност на автора на документа и rendering pipeline-а на PDFium - Обновен е низът TPdf.AboutInfo, за да отчита текущата версия на продукта
Version 1.34.0
- Добавена е поддръжка за PDF/R-1 (ISO 23504-1:2020) marker injection: TPdf.SaveAsPdfR превръща текущия документ в PDF/R-1 съвместим файл (raster-image transport subset-а на PDF, използван за сканирани документи). Injection-ът покрива файлово-форматните изисквания, които могат да се добавят post-processing — уникалния коментар за version identification
%PDF-raster-1.0, записван между trailer dictionary-то и startxref keyword-а (§5), catalog dictionary-то, ограничено до white list-а от §6.3 (остават само Version / ViewerPreferences / PageLayout / PageMode / AcroForm / Metadata), Document Information Dictionary-то, ограничено до white list-а от §6.4.3 (само Creator / Producer / CreationDate / ModDate), catalog /Metadata XMP stream с четирите записи от §6.4.4 Table 1 (xmp:CreatorTool / pdf:Producer / xmp:CreateDate / xmp:ModifyDate) и trailer /ID масив - Добавен е TPdf.SaveAsPdfRToStream за in-memory PDF/R output и shorthand с default options
TPdf.SaveAsPdfR(FileName)за обичайния случай - Добавен е TPdf.ValidatePdfR: проверява отворен PDF за PDF/R-1 compliance marker-и (footer коментара
%PDF-raster-x.y, header version, липсата на /Type /ObjStm, съответствие на catalog с white list-а, съответствие на Info dictionary с white list-а, наличие на XMP metadata stream, trailer /ID) и връща TPdfRВалидацияResult с откритото ниво на съответствие и набора от намерени проблеми - Добавено е свойството TPdf.PdfRConformance: връща нивото на съответствие на текущо отворения документ (prc1, prcNone или prcUnknown) без да е нужно изрично да се извиква ValidatePdfR
- Нови типове, експортирани в новия unit FPdfPdfr: TPdfRConformance, TPdfRВалидацияResult, TPdfRВалидацияIssue, TPdfRSaveOptions.
TPdfRSaveOptions.Defaultзадава StripInfoOptionalEntries и StripCatalogOptionalEntries на True, така че injector-ът по подразбиране да произвежда съответстващи на §6.3 / §6.4.3 catalog и Info dictionary; извикващите могат да ги зададат на False, за да запазят source entries (тогава output-ът няма да покрива тези PDF/R клаузи, но другите marker-и ще останат добавени) - Content-level изискванията остават отговорност на source PDF: per-page Contents структура (§6.5.1), MediaBox
[0 0 w h]форма (§6.5.3), filter ограничения (§6.2.2 — само FlateDecode, CCITTFaxDecode bitonal, DCTDecode 8-bit gray/RGB), липса на object streams (§6.2.4) и strip layout според §6.6. Те не могат да се налагат чрез post-processing — PDF/R е структурно много по-строг subset от останалите PDF/x стандарти и изисква source bytes да бъдат генерирани правилно. ValidatePdfR показва файлово-форматните проблеми, които този unit може да открие; комбинирайте го с TWAIN Working Group PDF/R validator за пълни content-level проверки - Обновен е низът TPdf.AboutInfo, за да отчита текущата версия на продукта
Version 1.33.0
- Добавена е поддръжка за PDF/X (семейството ISO 15930) marker injection: TPdf.SaveAsPdfX превръща текущия документ в PDF/X-1a:2001, PDF/X-3:2002 или PDF/X-4 съвместим файл чрез post-processing на базовия PDF с incremental update. Injection-ът покрива файлово-форматните изисквания, които могат да се добавят post-processing — XMP metadata stream с
pdfxid:GTS_PDFXVersion(иpdfxid:GTS_PDFXConformanceза PDF/X-1a / PDF/X-3) плюс съответното описание pdfaExtension:schemas, пренаписан Document Information Dictionary с записите/GTS_PDFXVersion,/GTS_PDFXConformanceи/Trapped, обновен catalog с/OutputIntents [N 0 R], който препраща към OutputIntent dictionary с/S /GTS_PDFXи embedded ICC profile, и trailer/IDмасив - Добавен е TPdf.SaveAsPdfXToStream за in-memory PDF/X output и shorthand с default options
TPdf.SaveAsPdfX(FileName), който произвежда PDF/X-4 с built-in sRGB IEC61966-2.1 OutputIntent (3144 bytes, идентичен на профила, използван от SaveAsPdfA) - Добавен е TPdf.ValidatePdfX: проверява отворен PDF за PDF/X compliance marker-и (pdfxid идентификатор в XMP и равенство със стойността в Info dictionary, описание на pdfxid extension schema, масив /OutputIntents с /DestOutputProfile, наличие на Title, trailer /ID, encryption status, наличие на xmp:CreateDate / xmp:ModifyDate) и връща TPdfXВалидацияResult с откритото ниво и набора от намерени проблеми
- Добавено е свойството TPdf.PdfXConformance: връща нивото на съответствие на текущо отворения документ (pxc1a, pxc3, pxc4, pxcNone или pxcUnknown) без да е нужно изрично да се извиква ValidatePdfX. Низът за версията в XMP се парсва, за да се различат трите нива на съответствие
- Нови типове, експортирани в новия unit FPdfPdfx: TPdfXConformance (pxcUnknown/None/1a/3/4), TPdfXTrappedState (ptUnspecified/True/False/Unknown), TPdfXВалидацияResult, TPdfXВалидацияIssue, TPdfXSaveOptions.
TPdfXSaveOptions.Defaultнасочва към PDF/X-4 със sRGB OutputIntent и/Trapped /False; извикващите могат да override-натConformance, да подадат CMYKIccProfileDatablob за commercial print работен поток-и или да променятOutputCondition/OutputConditionIdentifier/RegistryName, за да сочат към конкретен ICC characterisation registry запис (напр. FOGRA39, GRACoL2006_Coated1v2) - Content-level изискванията (всички fonts embedded, без JavaScript, без видими annotations, OPI забрана, правила за transparency при PDF/X-1a / PDF/X-3 и т.н.) остават отговорност на автора на документа и rendering pipeline-а на PDFium. Комбинирайте ValidatePdfX с preflight tool като callas pdfaPilot или Ghent PDF Workgroup Output Suite за пълна проверка на съответствието
- Обновен е низът TPdf.AboutInfo, за да отчита текущата версия на продукта
Version 1.32.0
- Добавена е поддръжка за PDF/E-1 (ISO 24517-1:2008) marker injection: TPdf.SaveAsPdfE превръща текущия документ в PDF/E-1 съвместим файл чрез post-processing на базовия PDF с incremental update. Injection-ът покрива файлово-форматните изисквания, които могат да се добавят post-processing — XMP metadata stream с
pdfe:ISO_PDFEVersion = "PDF/E-1"плюс съответното описание pdfaExtension:schemas, пренаписан Document Information Dictionary със задължителния запис/ISO_PDFEVersion (PDF/E-1), изискван от §5, Info-XMP bridging блоковете, наследени от ISO 19005-1 §6.7 през §13.1 (dc:title / dc:creator / dc:description / pdf:Producer / pdf:Keywords / xmp:CreateDate / xmp:ModifyDate / xmp:MetadataDate / xmp:CreatorTool) и trailer/IDмасив, изискван от §6.2 - Добавен е TPdf.SaveAsPdfEToStream за in-memory PDF/E output и shorthand с default options
TPdf.SaveAsPdfE(FileName)за обичайния случай - Добавен е TPdf.ValidatePdfE: проверява отворен PDF за PDF/E-1 compliance marker-и (наличие на XMP pdfe:ISO_PDFEVersion и равенството му със стойността в Info dictionary, описание на pdfe extension schema, запис /ISO_PDFEVersion в Info dictionary, trailer /ID, наличие на xmp:CreateDate / xmp:ModifyDate) и връща структуриран резултат с откритото ниво на съответствие и набора от намерени проблеми
- Добавено е свойството TPdf.PdfEConformance: връща нивото на съответствие на текущо отворения документ (pec1, pecNone или pecUnknown) без да е нужно изрично да се извиква ValidatePdfE
- Нови типове, експортирани в новия unit FPdfPdfe: TPdfEConformance, TPdfEВалидацияResult, TPdfEВалидацияIssue, TPdfESaveOptions
- Пренаписването на Info dictionary е първо за PDFiumPas PDF/x post-processing path-а — то пренаписва съществуващия Info object със същия object number (така че xref subsection / trailer /Info препратката да остане валидна) и синтезира нов Info dictionary, когато source trailer-ът няма /Info запис. Самият PDFium издава Info dictionary във всеки SaveAs output, така че обичайният случай е rewrite path-ът
- Content-level изискванията (font embedding, ToUnicode CMaps, забранени XObjects / ExtGState keys / XFA forms и т.н.) остават отговорност на автора на документа — SaveAsPdfE добавя файлово-форматните marker-и, но не променя съдържанието на страниците и не премахва забранени features
- Обновен е низът TPdf.AboutInfo, за да отчита текущата версия на продукта
Version 1.31.0
- Добавена е поддръжка за инжектиране на маркери за PDF/UA-1 (ISO 14289-1:2014): TPdf.SaveAsPdfUa превръща текущия документ в файл, съвместим с PDF/UA-1, чрез последваща обработка на базовия PDF с инкрементално обновяване. Инжектирането покрива изискванията на ниво файл, които могат да бъдат наложени чрез последваща обработка — XMP поток с метаданни, съдържащ
pdfuaid:part = 1плюс съответното описание pdfaExtension:schemas, задължителенdc:title, каталог/MarkInfo << /Marked true /Suspects false >>и/ViewerPreferences << /DisplayDocTitle true >>(само когато изходният файл няма такива), каталог/Lang(когато извикващият подаде BCP 47 етикет) и масив/IDв трейлъра - Добавена е TPdf.SaveAsPdfUaToStream за PDF/UA изход в паметта и съкратен вариант с настройки по подразбиране
TPdf.SaveAsPdfUa(FileName)за често срещания случай - Добавена е TPdf.ValidatePdfUa: проверява отворен PDF за маркерите за съответствие с PDF/UA-1 (наличие на StructTreeRoot, /Lang, /MarkInfo /Marked true с /Suspects = false, /ViewerPreferences /DisplayDocTitle true, XMP идентификатор pdfuaid:part, наличие на dc:title, трейлър /ID, статус на шифроване) и връща структуриран резултат с откритото ниво на съответствие и набора от намерени проблеми
- Добавено е свойството TPdf.PdfUaConformance: връща нивото на съответствие на текущо отворения документ (puc1, pucNone или pucUnknown), без да е нужно ValidatePdfUa да бъде извиквано изрично
- Нови типове, експортирани в новия модул FPdfPdfua: TPdfUaConformance, TPdfUaВалидацияResult, TPdfUaВалидацияIssue, TPdfUaSaveOptions
- Полетата Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate / DocumentId / InstanceId / Language, оставени празни в TPdfUaSaveOptions, се попълват автоматично от FPDF_GetMetaText / FPDF_GetFileIdentifier / FPDFCatalog_GetLanguage, така че съществуващите извиквания могат да записват с един ред
- Изискванията на ниво съдържание (пълнота на маркирането StructTreeRoot, Alt текст за Figure, ToUnicode CMaps, вграждане на шрифтове и т.н.) остават отговорност на автора на документа — SaveAsPdfUa добавя маркерите на ниво файл, но не променя съдържанието на страниците и не измисля тагове. ValidatePdfUa показва липсата на StructTreeRoot като
pvuaiMissingStructTreeRoot, така че извикващите могат да насочат немаркираните документи през отделен pipeline за тагване - Обновен е низът TPdf.AboutInfo, за да отчита текущата версия на продукта
Version 1.30.0
- Изходът PDF/A-1b вече отговаря на изискванията на ISO 19005-1 (с Cor.1:2007) за еквивалентност между Document Information Dictionary и XMP: всяко поле от Info речника, което PDFium записва в базовия PDF, се огледално записва и в XMP пакета, включително Title (dc:title), Author (dc:creator), Subject (dc:description според Cor.1), Keywords (pdf:Keywords), Creator (xmp:CreatorTool), Producer (pdf:Producer), CreationDate (xmp:CreateDate) и ModDate (xmp:ModifyDate). xmp:MetadataDate също се изписва
- Трейлърът на PDF/A документ вече винаги съдържа масив /ID (строго изискване на ISO 19005-1 6.1.3). Когато TPdf.SaveAsPdfA обработва документ, чийто източник вече има файлов идентификатор, съществуващите 16-байтови постоянен и променлив ID се използват повторно; иначе от байтовете на източника се извежда детерминистичен 16-байтов резервен ID
- Инжектираното XMP вече вгражда описанието на разширената схема pdfaid, изисквано от ISO 19005-1 6.7.8 (заменено от Cor.1) — pdfaid се третира като разширена схема спрямо XMP Specification 2004, така че всички съвместими файлове трябва да декларират имената на свойствата, типовете им на стойност и категориите им в контейнера pdfaExtension:schemas
- TPdfASaveOptions получи пет нови незадължителни полета: Producer, CreationDate, ModDate (PDF низове за дата във форма “D:YYYYMMDDHHmmSSOHH'mm'”), DocumentId и InstanceId (16-байтови байтови низове за масива /ID в трейлъра). TPdf.SaveAsPdfA / SaveAsPdfAToStream автоматично попълват липсващите полета от FPDF_GetMetaText и FPDF_GetFileIdentifier, така че съществуващите извиквания продължават да работят без промени
- TPdf.ValidatePdfA / TPdf.PdfAConformance вече отчитат три допълнителни проблема: pvaiMissingTrailerId (няма /ID в трейлъра), pvaiMissingXmpDates (липсва xmp:CreateDate или xmp:ModifyDate) и pvaiMissingExtensionSchema (липсва описание на разширената схема pdfaid)
- Ненасочените към ASCII символи в Title, Author, Subject, Keywords, Creator и Producer вече се кодират като UTF-8 в XMP пакета (XMP Specification изисква UTF-8), като запазват двупосочното преминаване на многоезичните метаданни през SaveAsPdfA
- Обновен е низът TPdf.AboutInfo, за да отчита текущата версия на продукта
Version 1.29.0
- Обновени са включените PDFium DLL-и (Win32 и Win64, стандартните и V8 сборки) до upstream snapshot от 2026-05-22, като са взети upstream поправки за crash пътищата във FPDFText_SetText / FPDFText_SetCharcodes и различни вътрешни укрепвания от проекта PDFium
- Изложен е новият save флаг FPDF_SUBSET_NEW_FONTS на PDFium във FPdfPageOps.pas, което позволява на извикванията на FPDF_SaveAsCopy да поискат автоматично подмножество от вградените font файлове за новодобавени текстови обекти. Съществуващите константи FPDF_INCREMENTAL, FPDF_NO_INCREMENTAL и FPDF_REMOVE_SECURITY вече са дефинирани с upstream формата с побитово изместване (старото числово значение 3 е запазено като FPDF_REMOVE_SECURITY_DEPRECATED за бинарна съвместимост)
- Добавено е изброяването FPDF_FONT_BACKEND_TYPE (FREETYPE / FONTATIONS) и съответното поле m_FontLibraryType във FPDF_LIBRARY_CONFIG във FPdfView.pas, така че приложенията, които инициализират PDFium със Skia рендера, вече могат да избират font backend при стартиране
- Актуализирана е сигнатурата на TFPDFPage_InsertObject, за да съответства на upstream: C функцията вече връща FPDF_BOOL (TRUE при успех, FALSE ако page_object е NULL или прехвърлянето на собствеността се провали) вместо void. Съществуващите извиквания от PDFiumPas продължават да се компилират без промени, защото Delphi / FPC позволяват стойността на връщане на функция да бъде пренебрегната
- Коригирана е низовата стойност TPdf.AboutInfo, така че да отчита текущата версия на продукта (беше остаряла на v1.27.0 още от документационното издание v1.28.0)
Version 1.28.0
- Съществено е разширена вградената документация в целия API справочник: всеки запис за свойство, метод, събитие и глобална функция вече има описание от три параграфа, списък с бележки, многострочен Delphi пример и по-богат блок Виж също — обхващайки над 200 преди това оскъдни страници, включително всички броячи на TPdf, достъпи до метаданни, достъпи до шрифтове и символи, свойства на ниво страница, индексирани записи, методи на ниво документ и цялата повърхност от състояние / визуализация / събитие на TPdfView
- Фино е настроено оформлението на помощта, за да съвпада с визуалната базова линия на losLab, използвана в референтния HotXLS: изравнени са размерите на h1/h2, стиловете на API навигационната решетка са обединени в споделения StyleSheet и са премахнати вградените CSS override-и по страници в Navigation.html
- Документацията вече се доставя с помощен скрипт (Docs\Build-Expand-Entries.ps1), който регенерира обогатяването на страниците на записите от една единствена таблица с данни за повторяема поддръжка
Version 1.27.0
- Добавена е поддръжка за създаване на PDF/A-1b: TPdf.SaveAsPdfA записва всеки отворен документ като файл, съвместим с PDF/A-1b, чрез последваща обработка на базовия PDF с инкрементално обновяване, което инжектира XMP поток с метаданни, sRGB ICC OutputIntent и обновен документен каталог — без да изисква допълнителни DLL API. Работи на всяка платформа, поддържана от PDFiumPas
- Добавена е TPdf.SaveAsPdfAToStream за PDF/A изход в паметта
- Добавена е TPdf.ValidatePdfA: проверява отворен PDF за съответствие с PDF/A (маркерите pdfaid в XMP, OutputIntent с вграден ICC профил, шифроване) и връща структуриран резултат с откритото ниво на съответствие и набор от конкретни намерени проблеми
- Добавено е свойството TPdf.PdfAConformance: връща нивото на съответствие на текущо отворения документ (pac1b, pac1a, pac2b, pac3b, pacNone или pacUnknown), без да е нужно ValidatePdfA да бъде извиквано изрично
- Нови типове, експортирани: TPdfAConformance, TPdfAВалидацияResult, TPdfAВалидацияIssue, TPdfASaveOptions (в новия модул FPdfPdfa.pas)
- SaveAsPdfA поддържа потребителски ICC профил чрез TPdfASaveOptions.IccProfileData; когато е оставено празно, автоматично се използва вграденият sRGB IEC61966-2.1 (HP/Microsoft, 3144 bytes) профил
- Моноолитният HTML справочник е заменен с преструктурирана уеб помощ система: 302 отделни API страници за записите (по една за всеки property, method, event и global function), покриващи TPdf и TPdfView, всяка с пълно описание, таблица с параметри, Delphi пример и връзки Виж също
- Добавен е Navigation.html: цялостен едностраничен API индекс за навигация, организиран в шест секции (TPdf properties/methods/events, TPdfView properties/methods/events, global functions) с 5-колонна flex мрежа за бързо преглеждане
- Престроени са TPdf.html и TPdfView.html като компактни overview страници на компонентите, запазващи секциите за типовете (Types, Constants, Global Variables) и препращащи към отделните страници на записите за всички членове
- Добавено е пълнотекстово търсене, задвижвано от Search.js, с инкрементално client-side съвпадение върху всички 312 индексирани страници
- Всички навигационни ленти в сайта са обновени да сочат към Navigation.html
Version 1.26.0
- Добавено е Demo/Lazarus/BatchExport, LCL портът на Delphi демото BatchExport от v1.14.0. Същият набор от функции: експортиране от много PDF файлове към JPG с общ напредък за всеки файл, текущ напредък за всяка страница, входове за DPI / качество / парола и пакетна обработка с възможност за кооперативно прекъсване, поддържана от IPdfCancellationToken. Изходната папка се отваря във файловия мениджър на платформата, когато извличането завърши успешно
Version 1.25.0
- Добавено е повторно използване на страници като Form XObject в TPdf, което позволява работни потоци за воден знак, шаблонен overlay и “stamp one page onto many”: CreateXObjectFromPage създава многократно използваем handle от всяка страница на друг документ; InsertFormObjectFromXObject вмъква ЕДНО копие на обвитата страница в текущата страница. Връща вмъкнатия FPDF_PAGEOBJECT, така че извикващият да може да го позиционира / мащабира / завърта с FPDFPageObj_SetMatrix и помощниците TPdfMatrix от v1.9.0
- Новият Pascal клас TPdfXObject обвива handle-а FPDF_XOBJECT на PDFium и го затваря автоматично в своя destructor, като премахва ръчната процедура FPDF_CloseXObject
- Разширени са Delphi и Lazarus regression suite-овете до по 147 случая и C++Builder suite-ът до 123 случая, като се покриват договорите за създаване на handle и вмъкване на page object
Version 1.24.0
- Добавено е TPdf.RenderPageProgressive — прекъсваем вариант на RenderPage, който управлява progressive rendering цикъла на PDFium и проверява v1.7.0 IPdfCancellationToken между итерациите, така че дългите high-DPI рендъри могат да бъдат прекъснати по средата на страницата вместо да блокират извикващия до приключване
- Връща стойност TPdfProgressiveStatus: prsDone, prsCancelled или prsFailed. Подайте AToken = nil, за да рендерира до край без никакви паузи (без възможност за prsCancelled)
- Използва същия zero-copy fast path, въведен във v1.21.0 — PDFium рендерира директно в DIB на целевия TBitmap. Същият стар fallback се прилага, когато DIB не може да бъде обвит
- Разширени са Delphi и Lazarus regression suite-овете до по 145 случая и C++Builder suite-ът до 121 случая, като се покриват nil-token (завършва), предварително прекъснат token (prsCancelled) и пикселно съвпадение със sync RenderPage при активен token
Version 1.23.0
- Добавени са шест нови метода на TPdfView, които излагат на приложенията избора на текст във form widget и Undo/Redo на PDFium: GetSelectedFormText връща текущо избрания текст във фокусирания form widget; SelectAllFormText избира всеки символ; FormUndo / FormRedo / FormCanUndo / FormCanRedo управляват историята на редактиране на фокусирания widget. Подлежащите API на PDFium вече бяха свързани, но нямаха високо ниво на достъп. И шестте прекратяват безопасно, когато изгледът е неактивен или в документа няма фокусиран AcroForm widget
- Разширени са Delphi и Lazarus regression suite-овете до по 142 случая и C++Builder suite-ът до 119 случая, като се покрива договорът no-form-no-focus за всеки нов метод
Version 1.22.0
- Добавени са wrappers за page composition в TPdf: ImportPagesByIndex приема zero-based индексен масив, за да копира конкретни страници от source document; ImportNPagesToOne връща съвсем нов TPdf, чиито страници са N-up composites на този документ; MovePages пренарежда страниците на място. Подлежащите PDFium API-та вече бяха свързани, но нямаха Pascal-friendly entry point
- ImportPagesByIndex приема празен масив, за да импортира всяка source страница (еквивалентно на подаване на nil на ниво C ABI)
- Разширени са Delphi и Lazarus regression suite-овете до 136 case-а всеки, а C++Builder suite-ът до 115 case-а, като покриват subset import, whole-document import, page reorder и N-up composite
Version 1.21.0
- Подобрена е rendering производителността чрез превключване на TPdf.RenderPage / TPdf.RenderTile (и съответните TPdfView helpers) към zero-copy output path. PDFium вече пише директно в DIB буфера на destination TBitmap вместо в internal buffer, който после се копираше ред по ред, с което се спестява едно memory copy от width x height x 4 bytes на render. Подобрението е най-видимо при high DPI (thumbnail панели, print-quality export, batch export)
- Старият per-scanline path се запазва като safety fallback за малко вероятния случай, в който destination DIB не може да бъде wrap-нат (extreme dimensions, unusual stride, OOM). Поведението е byte-identical между двата path-а, просто по-бавно във fallback-а
- Разширени са Delphi и Lazarus regression suite-овете до 132 case-а всеки, а C++Builder suite-ът до 112 case-а, като покриват caller-bitmap pf32bit upgrade, dimensions round-trip и sanity test за large-bitmap stride
Version 1.20.0
- Добавено е search-result highlighting в TPdfView: HighlightSearchText(Text, MatchCase, MatchWholeWord) сканира текущата страница на view-а и връща броя намерени съвпадения, като рисува маска с HighlightColor върху всяко съвпадение при всяко прерисуване. ClearHighlight премахва highlight-ите; превключването на view-а към друга страница ги изчиства автоматично, защото съвпаденията са page-specific
- HighlightColor по подразбиране е clYellow и е published, така че приложенията да могат да темират highlight-а според своята UI palette
- Разширени са Delphi и Lazarus regression suite-овете до 129 case-а всеки, а C++Builder suite-ът до 109 case-а, като покриват default color, color round-trip, „real fixture word matches“ срещу низа пример.pdf и договора „missing word returns zero matches“
Version 1.19.0
- Добавено е свойството FitMode към TPdfView с четири стойности: pfmNone (manual zoom), pfmActualSize (100%), pfmFitPage (цялата страница се побира във viewport-а) и pfmFitWidth (ширината на страницата съвпада с ширината на viewport-а). Активният fit mode се прилага отново автоматично при Resize и когато се промени текущата страница, така че дългите документи с различни размери на страниците да останат прецизно рамкирани
- Задаването на Zoom директно отменя активния fit mode (FitMode се връща към pfmNone), което следва стандартната PDF viewer конвенция, при която въвеждането на zoom стойност излиза от Fit Page / Fit Width
- По подразбиране е pfmNone, така че съществуващите приложения да запазят своето explicit-zoom поведение
- Разширени са Delphi и Lazarus regression suite-овете до 124 case-а всеки, а C++Builder suite-ът до 106 case-а, като покриват default value, mode round-trip, fit-page, който произвежда реален zoom върху зареден документ, и manual-zoom-cancels-fit-mode
Version 1.18.0
- Добавено е свойството PageColor към TPdfView, което отделя фона на рендираната PDF страница от Color на заобикалящия control. По подразбиране е clWhite, така че PDF страниците вече се рендират като paper-white независимо от темата на host приложението. Dark-mode viewer-ите вече могат да оставят scroll area-то тъмно, докато самата PDF страница остава бяла (или в който и да е цвят, който приложението избере)
- Промяна в поведението: приложенията, които са задавали TPdfView.Color, за да променят цвета на PDF страницата, трябва да задават PageColor вместо това. Изживяването по подразбиране се подобрява за често срещания случай (бели страници върху themed control backgrounds) без никаква промяна в кода
- Разширени са Delphi и Lazarus regression suite-овете до 120 case-а всеки, а C++Builder suite-ът до 103 case-а, като покриват default value и color round-trip
Version 1.17.0
- Добавени са toggles за ограничаване на user input в TPdfView, така че приложенията, които вграждат viewer-а в kiosks, preview panes или read-only контексти, да могат да изключват навигационните жестове без subclassing: AllowUserPageChange контролира новите PgUp / PgDn / Ctrl+Начало / Ctrl+End keyboard shortcuts; ChangePageOnMouseScrolling контролира новите wheel-up / wheel-down page jumps; AllowUserTextSelection е запазено за бъдещия mouse-drag text-selection path. И трите по подразбиране са True, така че съществуващите приложения да се обновят без промяна в поведението
- Навигацията по страници с mouse wheel пропуска Ctrl+wheel, така че приложенията да могат да запазят Ctrl+wheel за zoom
- Разширени са Delphi и Lazarus regression suite-овете до 118 case-а всеки, а C++Builder suite-ът до 101 case-а, като покриват default values и toggle round-trip
Version 1.16.2
- Разширено е regression покритието на TPdfView за annotation link clicks, когато страницата на viewer-а е различна от асоциираната TPdf страница, чрез реален headless mouse click path в Delphi, Lazarus и C++Builder
- Delphi и Lazarus suite-овете вече изпълняват по 114 case-а, а C++Builder вече изпълнява 99 case-а
Version 1.16.1
- Поправена е обработката на link-click в TPdfView, така че автоматичните annotation и web-link действия да използват страницата, която viewer-ът показва в момента, дори когато асоциираният TPdf компонент е позициониран на друга страница
- TPdfThumbnailView е подсилен срещу dangling Pdf препратки, когато свързаният TPdf компонент бъде унищожен
- Добавено е regression покритие за lifetime-а на thumbnail препратките; Delphi и Lazarus suite-овете вече изпълняват по 113 case-а, а C++Builder вече изпълнява 98 case-а
- Синхронизирани са README, тестовата документация, съдържанието на HTML Help search/index и генерираните C++ package output-и с integration update-ите от v1.7.0 до v1.16.0
Version 1.16.0
- Добавен е нов Delphi PrintDialog demo (Demo/Delphi/PrintDialog), който се фокусира върху N-up printing (1 / 2 / 4 / 9 pages per sheet) с odd / even page filtering, grayscale rendering и опционални 1-pixel cell borders. Това е съзнателно малък companion към съществуващия PrintPDF demo, който вече покрива preview, recent files, zoom и scaling
Version 1.15.0
- Добавен е нов компонент TPdfThumbnailView (FPdfThumbnail unit), който рендира thumbnail на една страница на ред в scrollable side panel с hover и selection highlighting плюс click-to-go navigation. Проектиран е да стои до TPdfView, така че крайните потребители да могат да преглеждат дълъг документ по страници
- Компонентът е регистриран в losLab palette tab редом до TPdf и TPdfView; ключови свойства: Pdf, CurrentPageIndex, ThumbnailWidth, ThumbnailHeight, TextColor, HoverColor, SelectionColor, BorderColor и събитието OnPageClick
- Разширени са Delphi и Lazarus regression suite-овете до 112 case-а всеки, а C++Builder suite-ът до 97 case-а, като покриват defaults, thumbnail-size round-trip, extreme-value clamping, color round-trip и присвояване на event handler
Version 1.14.0
- Добавен е нов Delphi BatchExport demo (Demo/Delphi/BatchExport), който показва как много PDF файлове да се конвертират в JPG с едно преминаване, използвайки TPdf.LoadCustomDocument за streaming load, IPdfCancellationToken за cooperative cancellation и progress bars за общ напредък по файл и по страница. Демото използва по един TPdf instance на файл (самият PDFium не е thread safe) и отваря output папката в Explorer, когато извличането завърши успешно
Version 1.13.0
- Добавен е async-rendering UI overlay в TPdfView чрез три нови свойства: AsyncRendering, LoadingText и LoadingColor. Когато AsyncRendering е True, single-page paint path рисува малък индикатор “Loading...” върху рендираната страница, така че приложенията, използващи собствен worker за дълги render-и, да споделят последователен визуален affordance
- По подразбиране се запазва съществуващото поведение: AsyncRendering е False, така че приложенията, които не се включат, не виждат визуална промяна
- Документацията уточнява, че самият PDFium не е thread safe — реалното прехвърляне на render към worker изисква извикващият да държи по един TPdf на worker; предстоящото batch-export demo показва този модел
- Разширени са Delphi и Lazarus regression suite-овете до 106 case-а всеки, а C++Builder suite-ът до 93 case-а, като покриват default values и three-property round-trip
Version 1.12.0
- Добавена е click-driven link обработка в TPdfView. Новото свойство LinkOptions управлява автоматичното поведение за четирите PDF link action типа: goto (page jump), URI (ShellExecute), launch (ShellExecute) и embedded GotoR (reserved). По подразбиране са включени loAutoGoto и loAutoOpenURI; loAutoLaunch и loAutoEmbeddedGoto остават изключени, така че случайно кликване да не може да стартира произволна програма
- Добавени са събития OnAnnotationLinkClick и OnWebLinkClick, които се задействат преди всяко автоматично действие и позволяват на приложенията да инспектират връзката, да я маркират като Handled или да я пренасочат (например към security prompt)
- Разпознаването на link click работи само когато жестът е click, а не drag, като използва нов MouseDown anchor, така че panning gestures да продължават по съществуващия scroll path без промяна
- Разширени са Delphi и Lazarus regression suite-овете до 102 case-а всеки, а C++Builder suite-ът до 91 case-а, като покриват default LinkOptions, set round-trip и присвояване на event handler
Version 1.11.0
- Добавен е визуален polish към TPdfView: свойствата PageShadowSize, PageShadowColor и PageBorderColor рисуват опционална drop shadow под правоъгълника на страницата и еднопикселен border около него. По подразбиране се запазва предишният flat изглед (PageShadowSize = 0; border-ът се рисува в default clBlack, но се слива с default white background, докато извикващият не промени цветовете)
- Добавено е свойството SmoothScroll като opt-in flag за бъдеща incremental scroll animation; свойството вече поддържа round-trip и е свързано така, че приложенията да могат да запазват предпочитанието, докато render страната все още използва съществуващото immediate scroll поведение
- Разширени са Delphi и Lazarus regression suite-овете до 98 case-а всеки, а C++Builder suite-ът до 89 case-а, като покриват default values, property round-trip и clamp-а за отрицателен shadow size
Version 1.10.0
- Добавено е директно вмъкване на изображения чрез новите overload-и на TPdf.AddImage и TPdfView.AddImage, които приемат или file path, или TBitmap, в допълнение към съществуващия TPicture-базиран AddPicture. AddImage(FileName) разпознава всеки формат, регистриран във VCL или LCL graphics units (BMP, PNG чрез PngImage unit-а, JPG и т.н.) и минава през същия pipeline като AddPicture, така че поведението да е идентично
- AddImage(TBitmap) пропуска междинния TPicture, което опростява извикващите, които вече имат TBitmap от rendering или batch generation работа
- Разширени са Delphi и Lazarus regression suite-овете до 92 case-а всеки, а C++Builder suite-ът до 84 case-а, като покриват bitmap insertion, page-object bounds, reject на nil bitmap и BMP file loading
Version 1.9.0
- Добавена е high-level поддръжка за transformation matrix чрез новия клас TPdfMatrix в unit-а FPdfMatrix. TPdfMatrix обвива FS_MATRIX на PDFium с OO API за Translate, Scale, Rotate, HorizontalFlip, VerticalFlip, CentralFlip, Skew и Multiply, подходящо за композиция на трансформации, преди да се подадат към FPDFPageObj_SetMatrix и подобни PDFium API-та
- TPdfMatrix.Multiply правилно запазва моментна снимка на шестте matrix елемента, преди да изчисли новите row стойности, като поправя латентен проблем, при който алтернативните Pascal implementations презаписват по-ранни елементи в същото извикване и дават грешни резултати за всяка композиция извън чист translation
- Разширени са Delphi и Lazarus regression suite-овете до 88 case-а всеки, а C++Builder suite-ът до 81 case-а, като покриват identity, reset, translate / scale / flip, post-multiplicative composition order и Multiply regression case-а
Version 1.8.0
- Добавено е on-demand stream loading чрез новия метод TPdf.LoadCustomDocument(AStream, AOwnsStream) и helper класа TPdfStreamAdapter, подпрени от FPDF_LoadCustomDocument на PDFium. PDFium вече чете блокове от подадения TStream само когато е нужно, така че много големи или отдалечени PDFs вече не изискват предварително in-memory копие
- Добавено е опционално ownership на stream: подаването на AOwnsStream = True предава lifetime-а на TStream на TPdf, който го освобождава при изпълнение на UnloadDocument
- Разширени са Delphi и Lazarus regression suite-овете до 79 case-а всеки, а C++Builder suite-ът до 75 case-а, като покриват streaming load чрез TFileStream, cleanup на owned stream и договора externally-owned-stream survives-unload
Version 1.7.0
- Добавени са cooperative async cancellation primitives в новия FPdfAsync unit, които излагат IPdfCancellationToken / IPdfCancellationTokenSource и reusable singleton PdfNoCancellationToken, така че дълго изпълняващи се rendering и export работен поток-и да могат да поддържат чисти cancel-from-UI semantics
- Добавен е лек helper TPdfFuture<T>, който изпълнява worker на background thread и публикува TPdfFutureResult<T> envelope обратно към main thread-а, като различава случаи на success, cancellation и failure
- Разширени са Delphi и Lazarus regression suite-овете до 76 case-а всеки, а C++Builder suite-ът до 73 case-а, със споделено покритие на cancellation state, idempotent cancel, callback fan-out и post-cancel registration
Version 1.6.10
- Добавен е high-level TPdf.PrintPageRanges достъп до PDF viewer preference print page range, който връща one-based page ranges за application code
- Добавени са TPdf.SetFormFieldFlags / SetFormFieldFlagsAt и съответните TPdfView helpers, така че приложенията да могат да обновяват AcroForm field flags през public API-то, включително покритие на password и multi-select flag-овете
- Укрепено е ABI покритието на PDFium binding-ите за Windows-sized FPDF_DWORD, FPDF_FILEACCESS callbacks и V8 embedder slot полета
Version 1.6.9
- Добавени са low-level Skia rendering binding-и за новоекспортираните FPDF_RenderPageSkia и FPDF_FFLDrawSkia API-та в bundled standard и V8 PDFium DLL-ите
- Разширени са проверките за покритие на public binding-ите, така че зареждането на standard и V8 DLL вече проверява Skia render entry point-ите редом до съществуващите V8/XFA capability probes
Version 1.6.8
- Добавени са TPdf.SetTextPositions и TPdfSingleArray за задаване на позициите на всеки символ в съществуващи text object-и чрез новоекспортираното FPDFText_SetPositions API
- FPDFText_SetPositions е издигнато до required binding за текущите bundled PDFium DLL-и, като е потвърдено, че Skia render entry point-ите остават недостъпни, защото DLL-ите все още не ги експортират
- Разширени са Delphi, C++Builder и Lazarus regression suite-овете до 65 case-а всеки с покритие за text-position
Version 1.6.7
- Добавен е high-level TPdf достъп до document JavaScript name-tree actions, който връща имената на action-ите и скриптовете чрез JavaScriptAction и JavaScriptActions
- Добавен е TPdf.FileIdentifier за четене на permanent и changing trailer IDs като binary TBytes без terminator байта на PDFium
- Добавени са TPdf.PageBox, GetPageBox и SetPageBox за MediaBox, CropBox, BleedBox, TrimBox и ArtBox на текущата страница
- Потвърдено е, че текущите bundled PDFium DLL-и оставят само Skia render entry point-ите недостъпни по време на изпълнение, защото тези exports не присъстват
- Разширени са Delphi, C++Builder и Lazarus regression suite-овете до 64 case-а всеки с покритие за document JavaScript, trailer ID и page-box
Version 1.6.6
- Добавена е runtime поддръжка за bundled V8-enabled PDFium DLL. Задаването на EnableV8Engine преди зареждането вече избира pdfium.v8.dll от дървото DLLs\Win32 или DLLs\Win64 и излага V8/XFA-only binding-и, когато заредената DLL ги предоставя
- Добавени са V8FeaturesAvailable, XfaBStrHelpersAvailable, GetRecommendedV8Flags и low-level optional binding-и за FPDF_BStr_*, FPDF_GetRecommendedV8Flags и FPDF_GetArrayBufferAllocatorSharedInstance
- FPDFText_SetPositions е направено optional, така че PDFiumPas да продължи да се зарежда с PDFium DLL-и, които не експортират този експериментален text-position setter
- Разширени са Delphi, C++Builder и Lazarus regression suite-овете до 61 case-а всеки с покритие на capabilities за standard-DLL и V8-DLL
Version 1.6.5
- Добавена е проверка на tagged PDF structure tree чрез TPdf.StructureElements и TPdfView.StructureElements, включително element type, title, alternate text, actual text, expansion text, language, marked-content ID-та, брой на child-овете и брой на атрибутите
- Добавен е избор на Windows PDFium print mode чрез TPdfPrintMode и SetPdfPrintMode, като обхваща EMF, text-only, PostScript, pass-through, image-mask и Type 42 print modes
- Добавени са low-level binding-и за останалите public exports на PDFium от standard DLL, обхващащи JavaScript actions, annotation form flags/font color, page-object active state, indexed insertion, content-mark float стойности, image ICC profile data, form-object removal и text positions
- Разширени са Delphi, C++Builder и Lazarus regression suite-овете до 59 case-а всеки с покритие за tagged PDF structure tree, print mode и public export binding-и
Version 1.6.4
- Обновени са Delphi, C++Builder и Lazarus демотата, така че автоматично да отварят генерираните PDFs, експортирания текст / изображения и batch output папките след успешно създаване
Version 1.6.3
- Разширени са подравнените Delphi, C++Builder и Lazarus regression suite-ове до 56 case-а всеки с TPdfView GUI покритие за fit-zoom helper-и, device/page coordinate round-trips, character hit-testing и mouse panning през hidden-window viewer controls
- TPdfView fixture-ите вече използват изричен viewer размер и test-only subclasses, които упражняват protected mouse handlers, като същевременно оставят suite-овете напълно headless
Version 1.6.2
- Поправен е TPdf.AddPage(0, ...), така че вмъкнатата първа страница да става активната страница веднага. Съществуващият пример код продължава да работи, а PageNumber вече отчита валидна one-based страница след вмъкването
- Синхронизирана е версията на Lazarus package-а и са разширени подравнените Delphi, C++Builder и Lazarus regression suite-ове до 52 case-а всеки
Version 1.6.1
- Поправено е неправилно минимално version изискване във v1.6.0 PDF version compliance validator: action-ът SetState е прекласифициран от PDF 1.5 надолу до PDF 1.2, съответствайки на PDF 1.2 Reference 6.9.9. PDF 1.3 / 1.4 SaveAs targets, които съдържат SetState actions, вече се записват правилно вместо да бъдат отхвърляни
- Добавени са съответстващи PDF 1.2 lexical checks по същата спецификация: Sound, Movie и NOP actions плюс Separation color space вече се блокират, когато избраната target версия е по-стара от PDF 1.2
- Разширени са Delphi, C++Builder и Lazarus regression suite-овете до 50 case-а всеки чрез добавяне на положителен PDF 1.4 SetState acceptance test, който фиксира коригирания граничен случай
Version 1.6.0
- Укрепени са explicit PDF 1.0 до PDF 1.7 SaveAs targets с пълен version-feature validator, който покрива целия feature timeline от PDF 1.1 до ISO 32000-1. Валидаторът вече блокира записите, които съдържат dictionary entries, filter names, annotation subtypes, action types, fonts, color spaces или encryption параметри, въведени след избраната target версия. Примери: JBIG2Decode (1.4+), MarkInfo / Tagged PDF (1.4+), OutputIntents (1.4+), ICCBased / DeviceN / BleedBox / TrimBox / ArtBox / StructTreeRoot (1.3+), Polygon / PolyLine / Caret / Screen / Watermark / Redact annotations, AES и AES-256 encryption (CFM AESV2 / AESV3), Perms / Legal / Requirements / NeedsRendering catalog entries и version-gated actions като JavaScript, Trans, SetState, Rendition, GoToE, GoTo3DView всички се отхвърлят, когато target PDF версията не може да ги представи
Version 1.5.13
- Разширени са Delphi, C++Builder и Lazarus regression suite-овете до 49 case-а всеки, като е добавено директно покритие за отхвърляне на ICCBased color spaces, Tagged PDF MarkInfo, Polygon annotations, AES (V2) encryption и Redact annotations спрямо PDF 1.2 / 1.3 / 1.4 / 1.5 / 1.6 targets съответно
Version 1.5.12
- Поправена е последващата обработка на SaveAs при инкрементални пренаписвания на catalog. PDFiumPas вече валидира последния повторен indirect object, така че съществуващите override-и на catalog /Version се заменят правилно при запис към изрично зададена по-стара target version на PDF
- Разширени са Delphi, C++Builder и Lazarus регресионните набори до по 44 случая, като е добавено пряко покритие за замяна на остарял catalog /Version, нормализиране на catalog версията за PDF 1.4 и отказване на прозрачност и portable-collection функции, когато избраната PDF целева версия не може да ги представи
Version 1.5.11
- Укрепен е versioned SaveAs изходът за изрично зададени цели PDF 1.3, 1.4, 1.5, 1.6 и 1.7. PDFiumPas вече нормализира маркерите за версия в catalog, запазва безопасна за версията default Fit Height OpenAction и отхвърля по-нови PDF функции, когато избраната target version не може да ги представи
- Добавено е регресионно покритие за Delphi, C++Builder и Lazarus, което записва и презарежда изрични PDF 1.3 до PDF 1.7 файлове и проверява крайния header, default Fit Height OpenAction и отчетената PDF версия
Version 1.5.10
- Преминаването от възможност B на спецификацията към възможност C стана чрез добавяне на базови тестове за TPdfView във всички три IDE набора (Tests.PdfView). Всеки набор създава скрит родителски TForm (чрез TForm.CreateNew от Pascal страна и
new TForm(NULL, 0)от страната на C++Builder), прехвърля TPdfView, задава Active := True и после проверява round-trip повърхността за PageCount, подразбираща се PageNumber, Zoom, Rotation, DisplayMode и това, че View.Text съвпада с основния TPdf.Text. Всеки IDE набор вече изпълнява 39 случая
Version 1.5.9
- Преминаването от възможност A на спецификацията към възможност B стана чрез добавяне на базови тестове за рендиране във всички три IDE набора. Всеки набор Tests.Render извиква TPdf.RenderPage върху пример.pdf и проверява три устойчиви сигнала вместо проверки по байт за байт суми: върнатият bitmap точно съвпада с поисканите размери в пиксели; различни поискане размери (200x100, 64x256) произвеждат съвпадащи bitmap-и; и рендираната страница е поне 95% бял фон с поне 50 (Lazarus: 20) непобелени пиксела, маркиращи антиалиасирания текст. Всеки IDE набор вече изпълнява 33 случая
Version 1.5.8
- Затворени са първоначалните групи от тестовия план A(2) чрез добавяне на още седем регресии за всеки IDE: TPdf.CreateAnnotation създава anHighlight анотация плюс SaveAs/LoadDocument round-trip, пътят за четене на AcroForm върху Demo/Delphi/FormFill/cmp_fill_out_and_merge_forms.pdf (FormType е ftAcroForm, FormFieldCount > 0, FlattenAllPages сваля полетата до нула) и безшумно покритие на пътя за четене за Bookmarks, LinkAnnotationCount и WebLinkCount върху документ, който няма нито една от тези функции. Всеки IDE набор вече изпълнява 30 случая
Version 1.5.7
- Разширени са Delphi (DUnitX), Lazarus (FPCUnit) и C++Builder (GoogleTest) наборите с по седем нови регресии за всеки IDE: PdfVersion, PageRotation, търсене на подниз с TPdf.FindFirst / FindNext, съгласуваност на CharacterOrigin / CharacterRectangle спрямо началната точка на AddText, регистрация на CreateAttachment плюс SaveAs/LoadDocument round-trip и round-trip с добавен текст с диакритики, който проверява дали пътят за вграждане на European TrueType от v1.3.0 запазва допълнителните кодови точки от Latin-1
Version 1.5.6
- Записаните PDF-и вече получават по подразбиране първостранично Fit Height open action, когато няма съществуващ OpenAction, така че PDF readers първоначално показват генерираните документи при мащаб на височината на страницата
- Добавено е регресионно покритие за Delphi, Lazarus и C++Builder за генерирания OpenAction и настройката Fit Height
Version 1.5.5
- Добавени са регресионни тестове във всички набори Delphi (DUnitX), Lazarus (FPCUnit) и C++Builder (GoogleTest) за API повърхността за инспекция на индексирани символи и шрифтове (TPdf.FontBaseName, FontFamilyName, FontWeight, FontItalicAngle, FontData, FontIsEmbedded, CharacterFontWeight, CharacterAngle). Наборът за Lazarus умишлено пропуска FontData, който в момента предизвиква access violation във FPDFFont_GetFontData под FPC
Version 1.5.4
- Добавен е C++Builder пример за Attachments, пренесен от Delphi примера, който покрива създаване на PDF-и, добавяне, изброяване, извличане, изтриване и записване на вградени file attachments с показване на MIME subtype
Version 1.5.3
- Изведено е изчислението на разтворените страници, което поддържа режимите на TPdfView с две страници, като помощен елемент на ниво unit ComputeSpreadPages(DisplayMode, PageNumber, PageCount, out LeftPageNo, out RightPageNo). Поведението е непроменено; помощникът прави правилото, съобразено с корицата, независимо тестируемо без инстанциране на viewer
- Добавени са пет регресионни теста във всички набори Delphi (DUnitX), Lazarus (FPCUnit) и C++Builder (GoogleTest), покриващи празни документи, стандартното сдвояване на две страници, самостоятелната корица в dmTwoPageContinuousWithCover, двойките след корицата и поведението при последна страница / ограничаване извън диапазона
Version 1.5.2
- Добавена е поддръжка за езика на документа чрез TPdf.Language, съпоставена със записа /Lang в PDF catalog-а
- Добавен е достъп до MIME subtype на прикачени файлове чрез TPdf.AttachmentType
- Добавено е anRedact към TPdfAnnotationSubtype и са добавени помощници за премахване на page object-и за TPdf и TPdfView
- Обновени са примерите за viewer и attachments, за да показват новата информация за езика и типа на прикачения файл, когато е налична
Version 1.5.1
- Добавено е dmTwoPageContinuousWithCover за TPdfView, така че layout-ите на viewer да могат да показват първата страница самостоятелно и след това да продължат с разтворени двойки страници
- Обновени са Delphi, C++Builder и Lazarus примерите MultiPageViewer, за да излагат режима на показване на две страници, съобразен с корицата
Version 1.5.0
- Добавени са автоматизирани тестови набори на ниво smoke за Delphi (DUnitX), Lazarus (FPCUnit) и C++Builder (GoogleTest). Трите набора споделят един fixture PDF в Tests\TestData и изпълняват по едни и същи седем случая, покриващи зареждане на документ, информация за страница, извличане на текст, метаданни, save round-trip, валидация на PDF header-а и свойството Compressed
Version 1.4.3
- Подобрен е примерът FontProperties, така че да показва API за метаданни на шрифтовете както на TPdfView, така и на TPdf, включително handle-и на шрифтове, размер на данните на шрифта и метрики на символи
- Добавени са индексирани свойства на TPdfView за инспекция на символи и шрифтове и е обновен примерът FontProperties да заявява метаданните на шрифта на text object
Version 1.4.2
- Добавени са индексирани свойства за инспекция на символи и шрифтове към TPdf за анализ на текст без да е нужен viewer. Свойствата с индекс по символ (CharacterAngle, CharacterFontSize, CharacterFontWeight) извличат метрики за всеки символ от text stream-а на текущата страница. Свойствата с индекс по page object (FontAscent, FontBaseName, FontData, FontDescent, FontFamilyName, FontHandle, FontIsEmbedded, FontItalicAngle, FontWeight) извличат метаданни за шрифта на всеки text object на текущата страница
- Page object-ите, които не са текстови, връщат безопасни нулеви или празни стойности за всички свойства Font* вместо да хвърлят грешка, което прави лесно обхождането на всеки page object и проверката само на текстовите
- FontBaseName чете директно PostScript базовото име на шрифта вместо да пада обратно към името на font family, което дава по-точен идентификатор за вградените шрифтове
Version 1.4.1
- Добавени са версии за C++Builder и Lazarus на примера EuropeanText, така че всички поддържани семейства IDE да могат да проверяват генерирането на европейски текст с диакритики със системни TrueType шрифтове
- Добавени са версии за C++Builder и Lazarus на примера FormFill, включително примерни PDF-и с формуляри, редактиране на полета, регенериране на външния вид, запис с попълнени полета и работни потоци за flattening запазване
Version 1.4.0
- Добавена е поддръжка за Lazarus / Free Pascal: новият пакет PDFiumLaz предоставя същите TPdf, TPdfView и свързаните компоненти под LCL widget set-а, като разширява библиотеката към Lazarus IDE и Free Pascal compiler-а редом със съществуващите пакети за Delphi и C++Builder
- Добавени са версии за Lazarus на примерите, така че разработчиците с Lazarus да могат да изпробват всяка функция с изпълними примери
- Поправен е проблем при компилиране в Lazarus, при който условните дефиниции на Free Pascal се оценяваха заедно с проверките за версия на Delphi компилатора, което караше FPC build-овете да се опитват да резолват Delphi-specific имена на unit-и и да се провалят
Version 1.3.1
- Документиран е работният поток за flattening на формуляри в помощния комплект: GenerateFormAppearances, FlattenPage, FlattenAllPages и свързаните константи FLAT_* / FLATTEN_* вече са покрити в TPdf, TPdfView, API справочника, матрицата на функциите и програмните примери
- Поправена е таблицата с архитектурите в обзорната страница, така че да изброява реалните binding unit-и, доставени в папката Lib
Version 1.3.0
- Подобрена е поддръжката на европейски символи при създаване на PDF-и. TPdf.AddText вече зарежда и кешира съответния системен TrueType шрифт преди създаването на text object, като запазва акцентираните символи от чешки, френски, немски, испански, португалски, полски и турски, които вградените стандартни шрифтове на PDFium не могат да представят
- Приложенията, които преди произвеждаха въпросителни или заместителни glyph-ове за латински текст извън ASCII, вече ще се рендират правилно без никаква промяна в кода. Добавен е примерът EuropeanText, за да илюстрира функцията
Version 1.2.0
- Добавено е обновяване на външния вид на AcroForm към TPdf: извикването на GenerateFormAppearances след промяна на стойностите FormField[] обновява външния вид на widget-а, така че попълнените стойности да се виждат в стандартните PDF readers без да е нужна интерактивна редакторска сесия
- Добавени са помощници за flattening на формуляри към TPdf (FlattenPage / FlattenAllPages) и TPdfView (FlattenPage за текущата страница на изгледа). Flattening трайно вгражда попълнените стойности на полетата като обикновено съдържание на страницата и премахва интерактивния формулярeн слой, като така се получава статичен документ, който се рендира последователно във всички viewers
- Добавен е Demo\Delphi\FormFill, за да демонстрира работните потоци fill-and-save и fill-and-flatten с примерен AcroForm PDF
Version 1.1.2
- Добавена е компресия на PDF stream-ове при запис. Новото свойство TPdf.Compressed (включено по подразбиране) пренаписва некопресираните content stream-ове като FlateDecode-копресирани stream-ове при запис, като значително намалява размера на файла за програмно генерирани PDF-и. Приложенията, които изискват обикновен некопресиран изход, могат да зададат Compressed на False преди извикване на SaveAs
Version 1.1.1
- Сборките на Win64 пакета вече не включват design-time registration unit-и, което предотвратява грешки по време на билд, когато Win64 пакетът се разгръща в контекст само за изпълнение
- Зареждащата програма за PDFium DLL-и вече търси първо поддиректорията на Win32 или Win64 приложението, използвайки стандартните имена pdfium.dll и pdfium.v8.dll, и после пада обратно към плоската директория на приложението и системната директория на Windows. Това съвпада с подредбата на DLL-ите, включена в компонентния пакет, и прави инсталацията по-лесна
Version 1.1.0
- Поправен е визуален дефект при изрязването в двустраничния режим на TPdfView: съдържанието на страницата преминаваше през средния канал, защото левият и десният page tile споделяха един clipping rectangle. Всеки tile вече се изрязва независимо, така че съдържанието остава в границите на страницата
- Подобрено е съобщението за грешка в Delphi примера, когато PDFium DLL не може да бъде намерен, като се дава по-ясна подсказка с очакваното име и местоположение на DLL