Нотатки до випуску PDFiumPas
Історія версій функцій PDFiumPas, видимих для користувача, виправлень, поліпшень переглядача, створення документів, виводу PDF/A, рендерингу та оновлень документації
Останній випуск
- Остання версія: 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 записи, вікна дочірнього читача з нульовим копіюванням, типізовані декодери примітивів та зрізи вмісту або кодованих значень- Письменники 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, більше не усікаються в нижні п'ять бітів ідентифікатора
- Спотворені high-tag ідентифікатори, не-мінімальні визначені довжини, невалідний UTF-8, ненульове заповнення BIT STRING, невалідні поля часу, кінцеві корені та порушення обмежень ресурсів детерміновано відхиляються
TPdf.AboutInfo, метадані пакета Lazarus та метадані інсталятора тепер однорідно повідомляють Version 2.46.0
Version 2.45.0
Додано (Added)
FPdfPreflightReportтепер призначає серйозність Info, Warning або Error кожній проблемі та викривлює API серйозності, статусу, категорії, issue-code, lookup, search, flattening та фільтрування на рівні стандарту та звіту- Звіти 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 сурогатні кодові одиниці замість видачі спотворених скалярних даних
- Експорт 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 seed PAdES через вирівняні безпечні копії байтів і передають байти відповіді XFA з точним власним типом вказівника
Version 2.43.0
Додано (Added)
- Записи полів та анотацій XFDF тепер надають прапорці присутності, які розрізняють пропущене значення XML від явно порожнього значення
Змінено (Changed)
- Імпорт XFDF приймає елементи та атрибути з префіксами простору імен, змішаний текстовий та CDATA-вміст, посилання на сутності та значення, чутливі до пробільних символів, водночас відхиляючи некоректні посилання на скаляри Unicode
- Імпорт та експорт XFDF використовують індексну прив'язку полів та обмежені геометричні буфери, що покращує пропускну здатність і пікову поведінку виділення пам'яті для глибоко вкладених форм, великих колекцій анотацій, списків чорнил, вершин та розміткових чотирикутників
- Перевірка PDF/A та PDF/UA використовує обмежене зростання для великих колекцій сторінок, потоків, імен структур та RoleMap; розв'язання PDF/UA RoleMap тепер прямує за прямими масивами та непрямими об'єктами-іменами чи масивами з точною генерацією
Виправлено (Fixed)
- Цикли обробки XFDF тепер зберігають глибоко вкладені шляхи полів, явно порожні значення полів, явно порожній вміст анотацій та відмінність між відсутнім і порожнім вмістом
- Некоректні завантаження буферів пам'яті та призначення сторінок поза діапазоном відхиляються без залишення часткового стану документа чи сторінки, а невдалий власний перезавантаження сторінки зберігає попередню активну сторінку
- Великі ідентифікатори позначеного вмісту та буфери метаданих підпису обмежуються та перевіряються перед виділенням пам'яті чи власним доступом
Version 2.42.0
Додано (Added)
TPdfMatrixтепер надаєInvert,TryInvert,TransformPointтаTransformRectдля відображення координат, перевірки попадання, нормалізованих меж та явної обробки сингулярних матрицьTPdf.WrapTextотримав перевантаженняBreakLongWords, яке розбиває CJK та інший текст без пробілів, зберігаючи при цьому коректні сурогатні пари UTF-16TPdfAnnotation.AttachmentPointSetsнадає доступ до кожного чотирикутника в багаторядкових анотаціях-розмітках, тоді як наявне полеAttachmentPointsзалишається псевдонімом для першого набору
Змінено (Changed)
- Видобуток тексту, конструювання придатного до читання вмісту, пошук слів та відображення зміщень мовленнєвого тексту тепер використовують обмежене виділення пам'яті та шляхи бінарного пошуку, зменшуючи повторні виділення та лінійні сканування на великих сторінках
- Серіалізація ASN.1 та створення шифрованих PDF тепер використовують геометричні вихідні буфери; впорядкування шифрованих об'єктів застосовує сортування
O(n log n), а рядки xref записуються безпосередньо у кінцевий буфер WrapTextзберігає межі рядків CR, LF та CRLF і повторно використовує один власний об'єкт вимірювання протягом усієї операції- Імпорт та експорт XFDF зберігають кожен розмітковий чотирикутник; імпорт також застосовує RGB/колори заливки та розбирає десяткові координати незалежно від локалі процесу
Виправлено (Fixed)
- Застарілі викликачі знову можуть оновлювати вміст та автора анотації шляхом привласнення непорожніх рядків без встановлення новіших сигнальних міток
HasContentsтаHasAuthor - Явно порожні рядки анотацій тепер використовують коректний власний буфер із нуль-терміналом, тому очищення
/Contents,/Tта інших необов'язкових текстових ключів більше не передає nil-вказівник до PDFium
Version 2.41.0
Змінено (Changed)
- Звіти Preflight
SaveJsonToFile,SaveMarkdownToFileтаSaveTextToFileтепер записують UTF-8 у Delphi (відповідно до існуючогоSaveHtmlToFile) замість системної кодової сторінки ANSI; символи не-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тепер відхиляє некоректні токени діапазону сторінок та шляхи виводу, що перезаписують джерело, підраховує фактично імпортовані сторінки та відмовляється зберігати порожній результат- Демонстраційні програми
Attachmentдля Delphi та C++Builder тепер здійснюють збереження за тим самим шляхом через безпечну для відкату заміну файлів, тому невдале перейменування не може видалити оригінальний PDF
Version 2.38.0
Змінено (Changed)
SetAnnotationDataтепер захищає записи/Contentsта/Authorсигнальними міткамиHasContents/HasAuthorуTPdfAnnotation, що відповідає існуючому шаблонуHasName/HasSubject/HasIcon; раніше ці два поля записувалися безумовно, тому присвоєння записуDefault(TPdfAnnotation)для оновлення лише кольору чи прапорців негласно перезаписувало існуючий вміст та автора анотації порожніми рядками;GetPageAnnotationтепер встановлює ці сигнальні мітки, щоб цикл читання-модифікації-запису зберігав оригінальні значення
Виправлено (Fixed)
GenerateFormAppearancesтепер читає значення прапорця/перемикача черезFPDFAnnot_GetFormFieldValue(яка переходить до батьківського словника полів згідно з ISO 32000-1 §12.7.5) замістьFPDFAnnot_GetStringValue(Annot, 'V', ...)(яка читає словник віджета); віджет зазвичай не містить/V, тому/ASніколи не синхронізувався з вибраним станом, а плоский прапорець/перемикач відображався як невибраний
Version 2.37.0
Змінено (Changed)
ParseTsaUrlтепер обмежує порт діапазоном1..65535після розбору; інакше завелике значення порту могло б обернутися через усіканняDWORDі потрапити на дійсний порт- XFDF
ParseFieldтепер приймає параметр глибини (за замовчуванням 0, обмежений 64) і повертає порожнє поле на межі, тому зловмисно вкладений ланцюжок<field>глибиною 100 000 більше не може призвести до переповнення стеку
Виправлено (Fixed)
- HTTP-запит TSA тепер захищає від порожнього тіла запиту перед передачею
@ReqDer[0]уWinHttpSendRequest; розіменування динамічного масиву нульової довжини призвело б до доступу за незаземленим вказівником;BuildTimeStampReqзавжди повертає непорожню SEQUENCE, але точка виклику тепер захищає цей контракт
Примітки (Notes)
- Коментар у заголовку
FPdfTsaWinщодо перевірки відкликання HTTPS було виправлено: WinHttp перевіряє ланцюжок сертифікатів сервера за замовчуванням, але не виконує перевірку відкликання CRL/OCSP, якщо це явно не увімкнено за допомогоюWinHttpSetOption; попереднє формулювання стверджувало, що перевірка відкликання “надається безкоштовно”, що вводило в оману
Version 2.36.0
Змінено (Changed)
- HTTP-запити TSA тепер надсилають явний заголовок
Content-Lengthна додаток до заголовківContent-TypeтаAccept; WinHttp синтезує його із загальної довжини, але деякі проксі RFC 3161 вимагають явного заголовка і без нього відхиляють запит із помилкою411 Length Required - Експорт XFDF тепер відкидає керуючі символи C0 (крім TAB/LF/CR, які вже екрановані) замість виведення недійсного послідовності зворотної косої риски та шістнадцяткового числа; попереднє екранування
\-01Fне є дійсним XML (зворотна коса риска не має особливого значення в XML), тому будь-який відповідний зчитувач відхилив би документ як некоректний InjectAssociatedFilesтепер записує/Subtypeу словник потоку EmbeddedFile, коли викликач надаєTAssociateFile.MIMEType; поле було оголошено та задокументовано, але раніше інжектор жорстко кодував/Type /EmbeddedFileта ігнорував його (ISO 32000-2 §7.11.4 дозволяє/Subtypeу потоці)
Виправлено (Fixed)
- Імпорт XFDF пропускав перший байт вмісту після UTF-8 BOM та перший байт, коли BOM був відсутній:
BytesToAnsi(Bytes, 4, ...)(BOM) таBytesToAnsi(Bytes, 1, ...)(без BOM) використовували зміщення початку з помилкою на одиницю, оскількиBytesToAnsiприймає індекс масиву з базою 0; тепер виклики використовують3та0 ExtractSignatureValueмав дві помилки відступу із „висячимif“, колиR.Position:= CNвиконувався безумовно для необов'язкових гілокcertificates [0]таsignedAttrs [0]; тепер гілки загорнуті вbegin/end, так що позиція просувається лише тоді, коли необов'язковий TLV був фактично прочитаний (такий самий клас помилок виправлено вAddSignatureTimestampToCmsу v2.22.0)
Version 2.35.0
Змінено (Changed)
TFPDFAvail_IsDocAvail,TFPDFAvail_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), тому кількість відмальованих рядків відповідає розміру сторінки смуги прокрутки; попередня формула лише для Paint ((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та перебудовує повну класичну таблицю перехресних посилань + трейлер з/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; блочні шифри AES-128 та AES-256 на чистому Pascal разом із помічниками режиму CBC та бекендом CSPRNG, портовані з HotPDF; тести з відомими відповідями FIPS-197 Додаток C.2 / C.3 підтверджують коректність; це криптографічна основа для стеку шифрування PDF 2.0 - Автентифіковане шифрування AES-GCM (NIST SP 800-38D) у новому модулі
FPdfAesGcm.pas; реалізує GHASH (множення у GF(2^128)), GCTR та конструкцію AEAD GCM на основі блочних примітивів AES; тестові випадки NIST GCM 1 та 3 (AES-128) точно відповідають авторитетному шифротексту та тегу; тестовий випадок 13 (AES-256) виконує повний цикл; GCM є режимом ISO/TS 32003 для PDF 2.0 - Валідація цілісності ParentTree та ClassMap для PDF/A рівень A (ISO 19005-1 §6.8.3);
pvaiParentTreeMissingпозначає StructTreeRoot без дерева чисел /ParentTree;pvaiClassMapUnresolvedпозначає посилання на клас /C без /ClassMap
Version 2.30.0
Додано (Added)
- Ін'єкція пов'язаних файлів (
InjectAssociateFiles/TPdf.SaveAsWithAssociateFiles, ISO 32000-2 §7.11.4); новий модульFPdfAssocFilesприкріплює масиви посилань filespec/AFдо каталогу або будь-якого словника сторінки, охоплюючи всі вісім значень/AFRelationshipз Таблиці 45 ISO 32000-2; повторно використовує шаблон інкрементного оновлення, перевірений уInjectPadesDssMarkers - Підтримка PDF/X-6 (ISO 15930-9:2020);
TPdfXConformanceдодаєpxc6; інжектор та валідатор проводять його через ідентифікаціюpdfxid:GTS_PDFXVersion; PDF/X-6 є наступником PDF/X-4 на базі PDF 2.0 для повного обміну - PDF/A забороняє дію
/Thread(прогалина в білому списку ISO 19005-1 §6.6.1); список заборонених дій тепер охоплює Thread разом із Launch, ResetForm, ImportData, SetOCGState, SetState, GoTo3DView, Rendition та Hide
Виправлено (Fixed)
- Шлях валідації PDF/A-4e тепер виконує такі ж перевірки тегованої структури, MarkInfo та розривів слів, як і Level A; зниження вимог з боку збереження у v2.29.0 охоплювало
PdfAIsLevelE, але три умовиValidatePdfAComplianceперевіряли лишеPdfAIsLevelA, тому документ PDF/A-4e без тегованої структури проходив перевірку без зауважень - OCG
/BaseStatetest drift: прохід PostProcess у v2.28.0 правильно розширив прийом до/ONабо/OFF(ISO 32000-1 Таблиця 8.70), але тести Delphi та C++ все ще очікували відхилення/OFF; тепер тести використовують дійсно недійсне значення (/Undefined), а новий позитивний тест фіксує прийняття/OFF - Надмірне співпадіння геопросторового
/Subtype /GEO:ContainsDictionarySubtype('GEO')відповідав будь-якому словнику, що містив цей токен, включаючи непов'язані, такі як випадковий/ViewerPreferences << /Subtype /GEO >>; новийContainsMeasureDictionarySubtypeдодатково вимагає/Type /Measureабо ексклюзивний для міри суміжний ключ, тому словники, що не є Measure, більше не викликають вимогу ADBE ExtensionLevel 3
Version 2.29.0
Додано (Added)
- Підтримка PDF/A-4 (ISO 19005-4:2020) у валідаторі, XMP-інжекторі та шарі об'єктної моделі Pdfium;
TPdfAConformanceдодаєpac4base,pac4fтаpac4e; базовим рівнем є PDF 2.0 (ISO 32000-2), він замінює застарілі рівні A/B/U на base + F (форма) + E (доступність);ValidatePdfAзчитує пакет XMPpdfaid:part=4(у base елемент відповідності опущено),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, позначається прапорцем - PDF/R-1 (ISO 23504-1)
pvriEncryptVersionMismatch— шифрування дозволено лише для заголовка%PDF-2.0; тіло версії 1.x із записом/Encryptтепер позначається прапорцем (раніше це була пуста операція) - PDF/R-1
pvriBadMediaBox—MediaBoxкожної сторінки має бути[0 0 w h];PdfRHasNonZeroMediaBoxOrigin— це незалежний від локалі ASCII-сканер, який пропускає MediaBox із непрямими посиланнями - PDF/A Level A
pvaiRoleMapUnresolved(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 замість> 23FPdfMeasure.MeasureTextтепер кодує назву шрифту як FPCAnsiString/ DelphiUTF8Encode, що відповідає іншим точкам виклику FPDF_BYTESTRING бібліотеки, замість простого приведення типів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)
- Демонстрації viewer обробляють пошук,
Enter/F3і скасування черезEsc - Друк враховує поворот viewer
Виправлено (Fixed)
- Скасування друку зупиняє завдання принтера
Version 2.26.0
Змінено (Changed)
- Bitmap-методи використовують render lock навколо викликів PDFium
RenderPageThumbnailвраховує/Rotate
Виправлено (Fixed)
GetCharacterRectangleповертаєRect(0,0,0,0)у разі помилки
Version 2.25.0
Змінено (Changed)
- Методи редагування скидають кеш тексту та посилань
RenderPage(HDC, ...)використовує lock і маскує FPU/SSE
Виправлено (Fixed)
- Кодові точки вище U+FFFF повертають U+FFFD
TPdf.DestroyочищуєPassword
Version 2.24.0
Додано (Added)
- Індекси перевіряються й викликають
EPdfErrorпоза діапазоном
Виправлено (Fixed)
- Виправлено витоки page-object і відсутній
UpdatePage
Version 2.23.0
Виправлено (Fixed)
- Перевірки приймають дозволені
/OFFі/Design - Geospatial Measure більше не вимагає
/Type /Measure
Version 2.22.0
Змінено (Changed)
- Fit zoom використовує
ClientWidth/ClientHeight AddSignatureTimestampToCmsвикликає явнийException
Виправлено (Fixed)
- CNG handle звільняється через
NCryptFreeObject EcDsaP1363ToDerвідхиляє нульовіr/s
Виправлено (Fixed)
- Явне збереження в PDF 1.5–PDF 1.7 тепер відхиляє неправильно відформатовані структури
/OCPropertiesкаталогу, включаючи відсутні обов'язкові записи/OCGsабо/D, недійсні значення конфігурації за замовчуванням і записи стану, що не є масивами
Version 2.21.12
Виправлено (Fixed)
- Збереження PDF 1.5–PDF 1.7 тепер відхиляє помилкові структури
/OCProperties
Version 2.21.11
Виправлено (Fixed)
- Явне збереження версії PDF тепер відхиляє прямі або непрямі записи сторінки
/Annots, словники анотацій яких не містять необхідного запису/Subtypeабо/Rect
Version 2.21.10
Виправлено (Fixed)
- Явне збереження в PDF 1.7 тепер вимагає, щоб геопросторові словники
/Type /Measure /Subtype /GEOі анотації Projection оголошували/Extensions /ADBEз/BaseVersion /1.7і/ExtensionLevel 3або вище
Version 2.21.9
Виправлено (Fixed)
- Явне збереження в PDF 1.7 тепер вимагає, щоб анотації RichMedia і дії
RichMediaExecuteоголошували/Extensions /ADBEз/BaseVersion /1.7і/ExtensionLevel 3або вище
Version 2.21.8
Виправлено (Fixed)
- Явне збереження в PDF 1.7 тепер вимагає, щоб PRC 3D-потоки оголошували
/Extensions /ADBEз/BaseVersion /1.7і/ExtensionLevel 1або вище, замість того щоб розглядати PRC як основну функцію PDF 1.7
Version 2.21.7
Виправлено (Fixed)
- Явне збереження в PDF 1.4 і старіших тепер відхиляє записи XObject зображення
/SMaskInData, включаючи явне значення0, оскільки вбудовані канали м'якої маски JPEG 2000 вимагають PDF 1.5 або вище
Version 2.21.6
Виправлено (Fixed)
- Явне збереження в PDF 1.4 і старіших тепер відхиляє 16-бітні XObject зображень, що вимагають PDF 1.5 або вище, тоді як цілі PDF 1.5–PDF 1.7 зберігають дані зображення
/BitsPerComponent 16
Version 2.21.5
Виправлено (Fixed)
- Явне збереження в PDF 1.4 і старіших тепер відхиляє значення
/PageLayout /TwoPageLeftі/TwoPageRightкаталогу документа, що вимагають PDF 1.5 або вище, тоді як цілі PDF 1.5–PDF 1.7 зберігають запитане двосторінкове компонування
Version 2.21.4
Виправлено (Fixed)
- Явне збереження в PDF 1.3 тепер відхиляє записи
/Langкаталогу документа, що вимагають PDF 1.4 або вище, тоді як цілі PDF 1.4–PDF 1.7 зберігають ідентифікатор мови
Version 2.21.3
Виправлено (Fixed)
- Явне збереження в PDF 1.3 тепер відхиляє дерева імен
/EmbeddedFilesдокумента, які потребують PDF 1.4 або новіше, не відхиляючи потоки вбудованих файлів, що посилаються через старіші специфікації файлів
Version 2.21.2
Виправлено (Fixed)
- Остання версія: 2.21.2; Дата випуску:
Version 2.21.1
Виправлено (Fixed)
- Валідація гібридних посилань тепер застосовує додаткові записи
/XRefStmдо класичних xref-заповнювачів з тієї самої ревізії, тому стиснені анотації та інші об’єкти з версійними обмеженнями більше не пропускаються
Version 2.21.0
Змінено (Changed)
- Усі приклади переглядачів Delphi, C++Builder і Lazarus тепер можуть відкривати PDF, переданий як перший аргумент командного рядка, а приклади
MultiPageViewerдля C++Builder і Lazarus мають явні сполучення клавіш для вибрати все і копіювання
Виправлено (Fixed)
- Остання версія: 2.21.3; Дата випуску:
Version 2.20.0
Змінено (Changed)
- Усі приклади переглядачів Delphi, C++Builder і Lazarus тепер пропонують узгоджені сполучення клавіш для відкриття, пошуку, збереження, друку, масштабування і навігації сторінками, а кожен варіант
ViewerInteractionLabпідтримує готовность до переходу між сторінками, перевірене ручне масштабування 10–60 %, журнали взаємодії і перевірки координат кліків
Version 2.19.1
Виправлено (Fixed)
- Остання версія: 2.21.4; Дата випуску:
Version 2.19.0
Змінено (Changed)
- Остання версія: 2.19.1; Дата випуску:
Виправлено (Fixed)
- Приклад
CJKTextLabдля C++Builder тепер вимірює текст через експортовані функції редагування PDFium, аMergePDFуникає неоднозначного перевантаження повідомлень VCL, забезпечуючи коректне складання у RAD Studio 37
Version 2.18.3
Виправлено (Fixed)
- Відмітка часу PAdES B-LTA Document Time-stamp тепер реєструється як поле підпису, яке можна знайти, — невидимий віджет, доступний через
/Annotsпершої сторінки та/FieldsAcroForm (ETSI EN 319 142-1 §5.4.3), — замість недосяжного об'єкта-сироти, якого не могли знайти валідатори, що перелічують поля підписів; наявні анотації та поля зберігаються
Version 2.18.2
Виправлено (Fixed)
- Підпис PAdES і запис класичних перехресних посилань тепер видають зрозумілу помилку, коли зміщення байта перевищує фіксовану 10-значну ширину поля (~9,3 ГБ), замість того щоб мовчки залишати заповнювач
/ByteRangeнезаписаним (утворюючи недійсний підпис) або виходити за межі 20-байтового рядка xref (ISO 32000-1 §7.5.4); вивід потоку перехресних посилань використовує 8-байтові бінарні поля і не зачіпається
Version 2.18.1
Виправлено (Fixed)
- Підпис PAdES тепер розв'язує непрямі посилання
/Annots,/AcroFormі/Fieldsпершої сторінки за повним заголовком об'єкта (ISO 32000-1 §7.5.3) та фактичним номером генерації посилання; попередній пошук підрядка міг збігтися з номером об'єкта всередині довшого (розв'язуючи5 0 Rдо15 0 obj), а жорстко закодована генерація пропускала об'єкти зgen>0, що спотворювало масиви полів підпису або відкидало коректні документи - Коли каталог, перша сторінка,
/Annots,/AcroFormабо/Fieldsзнаходяться всередині потоку об'єктів, підпис тепер повторює спробу на розширеній копії перед відмовою, а не відкидає документ одразу
Version 2.18.0
Додано (Added)
ReadPdfVersionInfoповідомляє версію заголовка, ефективну версію ядра, перевизначення каталогу та рівень розширення розробника Adobe з потоку PDF
Змінено (Changed)
- Остання версія: 2.21.12; Дата випуску:
- Збереження за шляхом до файлу тепер записує до тимчасового файлу-сусіда і замінює призначення лише після успішного завершення всіх перевірок стиснення, нормалізації та версії
Виправлено (Fixed)
- Вивід PDF 1.3 тепер містить обов'язковий повний ресурс
/ProcSetі видаляє ключі прозорості PDF 1.4, якщо вони лише повторюють початкові значення графічного стану PDF 1.3 - Файли з гібридними посиланнями, потоком xref та потоком об'єктів більше не перезаписуються класичним компресором xref, що запобігає втраті записів стиснутих об'єктів
- Імена, що нагадують ключі прозорості або каталогу всередині рядків, коментарів або несвязаних карт ресурсів, більше не спричиняють хибних помилок цільової версії
Version 2.17.0
Додано (Added)
- Підписи PAdES тепер реєструються як невидимі анотації Widget у масиві
/Annotsпершої сторінки та в масиві/FieldsAcroForm, зберігаючи наявні анотації та поля форми
Змінено (Changed)
- Інкрементні оновлення PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA, PDF/VT та PAdES тепер зберігають вихідне представлення перехресних посилань: документи з потоком xref отримують оновлення потоку xref, як вимагає ISO 32000-1 §7.5.8.1, тоді як класичні документи продовжують отримувати таблицю xref
- Зміщення перехресних посилань,
startxref,/Prev, значення ByteRange PAdES та обробка діапазонів SHA-256 тепер використовують 64-розрядні позиції з фрагментарним хешуванням, що дозволяє працювати з файлами розміром понад 2 ГБ у 64-розрядних збірках - Пакети XMP, що генеруються для запису, тепер резервують 2048 байт доповнення перед закривальною інструкцією пакета
Version 2.16.10
Виправлено (Fixed)
- Розширення потоку об'єктів більше не воскрешає застарілі копії об'єктів, які інкрементне оновлення перемістило з потоку об'єктів у звичайне визначення (ISO 32000-1 §7.5.7); перевірки відповідності та впровадження маркерів раніше розв'язували застарілий каталог або словник метаданих у таких файлах
Version 2.16.9
Виправлено (Fixed)
- На Free Pascal текстові рядки, вхідні дані яких не є коректним UTF-8, розширюються побайтово як Latin-1 і записуються як шістнадцяткові рядки UTF-16BE; раніше необроблені старші байти потрапляли до буквального рядка, що не є допустимим кодуванням текстового рядка PDF 1.7
- Декодування потоку тепер розпізнає необроблені дані deflate без обгортки zlib RFC 1950 (поширений дефект некоректних програм запису) і декомпресує їх у необробленому режимі, тому перевірки відповідності більше не «сліпнуть» на таких потоках
Version 2.16.8
Виправлено (Fixed)
- Інкрементні оновлення, записані постобробником збереження, тепер оновлюють другий (змінний) елемент трейлера
/ID, як вимагає ISO 32000-1 §14.4; раніше обидва елементи копіювалися дослівно, тому інструменти кешування та синхронізації бачили незмінний ідентифікатор після кожного оновлення
Version 2.16.7
Виправлено (Fixed)
- Обнулення тіла потоку при перевірках відповідності тепер вимагає, щоб ключове слово
streamслідувало за кінцем рядка (ISO 32000-1 §7.3.8.1); слово всередині буквального рядка, наприклад(downstream), раніше обнуляло всі наступні дані до наступногоendstream, приховуючи реальні порушення від побайтових перевірок - Сканування заборонених можливостей PDF/X та PDF/E додатково обнуляє буквальні рядки та коментарі (§7.2.2), тому значення на кшталт
/Title (see /JavaScript docs)або закоментований токен більше не породжують хибні знахідкиJavaScript,AcroFormабоLZWDecode
Version 2.16.6
Виправлено (Fixed)
- Записи DPM PDF/VT тепер перевіряються під час запису, як задокументовано: імена ключів, що порушують правило NMTOKEN ISO 16612-2 §6.6 або правило префікса реєстранта додатку E, а також дублікати імен, відхиляються замість запису до словника DPart — ім'я з пробілом раніше розбивалося на фіктивну пару ключ/значення і спотворювало словник
Version 2.16.5
Виправлено (Fixed)
- Видалення запису словника, значенням якого є шістнадцятковий рядок (наприклад,
/Check <...>), тепер видаляє весь запис; раніше інжектори залишали осиротілий шістнадцятковий рядок, утворюючи синтаксично некоректний словник - Видалення запису, непряме посилання якого використовує символи нового рядка між токенами (ISO 32000-1 §7.3.10 допускає будь-які пробільні символи), більше не залишає номер генерації та ключове слово
R
Version 2.16.4
Виправлено (Fixed)
- Сканування максимального номера об'єкта більше не вимагає, щоб заголовки об'єктів починалися з рядка (ISO 32000-1 §7.5.3 допускає будь-які пробільні символи або роздільники перед ними), тому інжектори більше не можуть виділити номер об'єкта, що збігається з вбудованим заголовком
N G objі мовчки спотворює файл; номери об'єктів обмежені стелею додатку C - Потоки, чий
/Lengthє непрямим посиланням, тепер розв'язують ціле число об'єкта за посиланням і використовують його значення, якщо воно збігається з закривальнимendstream; раніше такі потоки обмежувалися пошуком за шаблоном, що усікало тіла, які законно містять послідовність байтівendstream— типово для вбудованих PDF-вкладень
Version 2.16.3
Виправлено (Fixed)
- Проходи стиснення потоків пропускають документи з потоком перехресних посилань (файли PDF 1.5+ без класичного ключового слова
trailer) без змін; раніше шлях перебудови неправильно розбиравstartxrefяк місце розташування таблиці та синтезував вгаданий трейлер, що могло породжувати файл, який неможливо відкрити - Компресор пропускає потоки метаданих XMP, щоб документ PDF/A зберігав обов'язковий нефільтрований потік метаданих (ISO 19005-1 §6.7.2), і не чіпає потоки зовнішніх файлів (
/Fз/FFilter) - Відновлена таблиця перехресних посилань сканує копію документа з очищеними потоками, тому двійковий вміст потоку більше не може імітувати заголовки об'єктів або роздувати таблицю;
/Sizeвідновленого трейлера тепер відображає реальну таблицю, а номери об'єктів обмежені стелею додатку C - Пошук вихідної таблиці перехресних посилань приймає кінці рядків лише CR (ISO 32000-1 §7.5.1) і більше не може збігтися з літерами
xrefвсерединіstartxref; сканування ключових слів потоку отримало той самий захисний хвістendstream, що використовується в інших місцях, і тепер просувається мимо пропущених тіл потоків
Version 2.16.2
Виправлено (Fixed)
- Розбір цілих чисел у всіх побайтових читачах PDF тепер приймає явний знак
+, дозволений ISO 32000-1 §7.3.3, і відхиляє послідовності цифр, що спричинять переповнення, тому ворожі або пошкоджені документи більше не можуть загорнути розібрані довжини та зміщення у вводячі в оману значення
Version 2.16.1
Виправлено (Fixed)
- Інжектор PDF/UA записує значення
/Langкаталогу як правильний текстовий рядок PDF; раніше значення пропускалося через XML-екранувальник, тому мовний тег, що містив&або дужки, давав пошкоджений запис, а не-ASCII-ввід записувався як необроблений UTF-8 - Запис Info
/ISO_PDFEVersionдля PDF/E використовує спільний кодувальник текстових рядків, зберігаючи коректність не-ASCII-значень у PDF 1.7 - XML-екранування для пакетів XMP видаляє керуючі символи, що є неприпустимими у XML 1.0, щоб метадані, скопійовані з пошкодженого джерела, не робили весь потік метаданих некоректним XML
- Перетворення дат PDF у XMP перевіряє числовий формат полів дат і доповнює відсутнє поле хвилин, запобігаючи спотвореним датам ISO 8601 у згенерованому XMP; на платформах, відмінних від Windows, резервна відмітка часу тепер включає час доби замість голої дати
Version 2.16.0
Додано (Added)
- Декодування потоку тепер відновлює предиктори
/DecodeParms(предиктори PNG 10–15 та TIFF предиктор 2, ISO 32000-1 §7.4.4.4) після FlateDecode, враховуючи/Colors,/BitsPerComponentі/Columns; потоки об'єктів, стиснуті з предиктором — поширений вибір авторів PDF 1.5+ — раніше давали різницеві байти, тому об'єкти, що ними переносяться, були невидимі для перевірок відповідності та впровадження маркерів
Виправлено (Fixed)
- Виявлення FlateDecode тепер розбирає значення
/Filterяк ім'я або масив, а не шукає підрядок, тому каскадні ланцюжки фільтрів і входження слова всередині несвязаних значень більше не спричиняють хибний inflate; непідтримувані ланцюжки повертаються до необроблених байтів, як і раніше
Version 2.15.1
Виправлено (Fixed)
- Сканер словника тепер пропускає буквальні рядки, шістнадцяткові рядки та коментарі при балансуванні
<</>>(ISO 32000-1 §7.2.2), тому словники зі значеннями на кшталт(A >> B)або шістнадцятковим рядком, що примикає до закривального роздільника, більше не усікаються при розборі трейлера, каталогу та перевірках відповідності - Вилучення буквальних рядків тепер декодує повний набір екранувань таблиці 3 §7.3.4.2 —
\n \r \t \b \f, вісімкове\ddd, продовження рядків та нормалізацію EOL — замість буквального копіювання екрануючого символу, відновлюючи коректне порівняння/Producer,/GTS_PDFXVersionі/ISO_PDFEVersionдля авторів, що використовують вісімкові екранування - Буквальні рядки, що записуються інжекторами маркерів, тепер екранують CR, LF та інші керуючі символи, щоб значення побайтово пережили нормалізацію кінця рядка на стороні читача
Version 2.15.0
Виправлено (Fixed)
- Інкрементні оновлення, записані інжекторами маркерів PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA і PDF/VT, а також шляхами підпису PAdES та DSS, тепер зберігають постійний ідентифікатор файлу вихідного документа: перший елемент трейлера
/IDпереноситься дослівно, як вимагає ISO 32000-1 §14.4, і лише другий (змінний) елемент оновлюється; раніше обидва елементи перегенеровувалися, тому зовнішні посилання та робочі процеси довгострокової перевірки бачили інший ідентифікатор документа після кожного збереження - Підписи PAdES, впровадження DSS та відмітки часу B-LTA Document Time-stamp тепер переносять посилання
/Infoтрейлера джерела вперед (ISO 32000-1 §7.5.6), тому властивості документа більше не зникають із панелей читача після підписання; трейлер Document Time-stamp також отримує масив/ID - Резервний варіант трейлера
/Infoдля документів з потоком перехресних посилань тепер коректно знаходить словник потоку XRef і зберігає номер генерації посилання; раніше він ніколи не збігався на коректних файлах PDF 1.5+, мовчки видаляючи/Info
Version 2.14.4
Виправлено (Fixed)
- Дата
/Mсловника підпису, що записуєтьсяTPdf.SignPadesіSignPadesBytes, тепер містить обов'язковий префіксD:та маркер UTC зміщенняZ, що вимагаються ISO 32000-1 §7.9.4; суворі валідатори раніше відхиляли час підписання як неправильно сформований рядок дати
Version 2.14.3
Виправлено (Fixed)
- Пошук ключів словника у спільному читачі PDF тепер збігається з цілими токенами імен (ISO 32000-1 §7.3.5); раніше потік, у словнику якого
/Length1стоїть перед/Length(типово для потоків FontFile), усікався до неправильної кількості байтів, мовчки приховуючи шрифт, CMap або потоки метаданих від перевірок PDF/A, PDF/UA та інших - Пошук ключів трейлера
/Encrypt,/Root,/Sizeі/Infoбільше не збігається з довшими ключами з тим самим префіксом (наприклад,/EncryptMetadata) - Розширення потоку об'єктів більше не довіряє пошкодженому або ворожому значенню
/N: не-цілочислові значення тепер дають 0 замість неініціалізованого числа, а верхня межа, отримана з/First, запобігає надмірним виділенням при скануванні пошкоджених документів
Version 2.14.2
Виправлено (Fixed)
- Інжектори маркерів PDF/X, PDF/VT, PDF/UA, PDF/E та PDF/R тепер пропускають зашифровані вихідні документи без змін замість додавання текстових розділів оновлення; попередня поведінка створювала файли, чий останній трейлер втрачав запис
/Encrypt(ISO 32000-1 §7.5.6), тому сумісні читачі читали зашифроване тіло як відкритий текст TPdf.SignPades,SignPadesBytesіInjectPadesDssMarkersтепер викидаютьEPadesCrypto, коли вихідний документ зашифрований, замість мовчазного створення пошкодженого або непридатного для перевірки файлу; знімайте шифрування перед підписанням або вбудовуванням матеріалу DSS
Version 2.14.1
Виправлено (Fixed)
TPdf.SignPadesіSignPadesBytesтепер заповнюють усі чотири поля/ByteRangeсловника підпису; раніше три останні поля залишалися нульовими заповнювачами, тому створені підписи оголошували порожній діапазон байтів і не проходили перевірку у сумісних валідаторах- Словники Document Time-stamp PAdES B-LTA отримують те саме виправлення заповнення
/ByteRange ValidatePadesComplianceтепер приймає стандартне розташування підпису, де зазор діапазону байтів містить шістнадцяткове значення/Contents, і перевіряє, що другий сегмент діапазону закінчується точно в кінці файлу; раніше лише беззазорні діапазони проходили перевірку покриття
Version 2.14.0
Додано (Added)
TPdf.ExportXFDFсеріалізує кожне значення поля форми та анотацію на всіх сторінках до документа XFDF (ISO 19444-1), генеруючи<fields>для ієрархічних значень форм і<annots>для всіх підтримуваних підтипів анотацій (text, highlight, underline, strikeout, squiggly, line, circle, square, caret, polygon, polyline, stamp, ink, freetext, fileattachment, sound, link, redact)TPdf.ImportXFDFчитає документ XFDF назад у завантажений PDF, відтворюючи анотації на відповідних сторінках та застосовуючи значення полів до їхніх віджет-анотацій- Запис
TPdfAnnotationотримав поляName(NM),Subject,ModificationDate(M),CreationDate,Icon,Opacity(CA), кінцеві точки лінії, вершини полігона/ломаної та жести чорнила, щоб циклічні перетворення XFDF зберігали повні метадані анотації - Новий зразок
XfdfLabу наборах демонстрацій для Delphi, C++Builder та Lazarus демонструє цикл експорту/імпорту
Version 2.13.6
Виправлено (Fixed)
ValidatePdfAтепер розглядає потоки/Metadataкаталогу без/Type /Metadataабо/Subtype /XMLяк відсутні XMP-метадані черезpvaiMissingXmpMetadata- Звіти передпольотної перевірки PDF/A тепер класифікують
pvaiMissingXmpMetadataяк Метадані та рекомендують потік/Metadataкаталогу з/Type /Metadata,/Subtype /XML, нефільтрованим XMP та маркерамиpdfaid
Version 2.13.5
Виправлено (Fixed)
ValidatePdfAтепер повідомляє про віджет-анотації без словника зовнішнього вигляду та анотації PDF/A-2 / PDF/A-3, яким потрібен, але бракує/AP, черезpvaiAnnotationApDictViolation- Звіти передпольотної перевірки PDF/A тепер відносять
pvaiAnnotationApDictViolationдо контенту, який впровадження маркерів не може виправити
Version 2.13.4
Виправлено (Fixed)
ValidatePdfAтепер повідомляє про вбудовані зображення PDF/A-2 та PDF/A-3, чиє значення/Iабо/Interpolateдорівнюєtrue, черезpvaiImageDictionaryViolation, відповідаючи існуючому охопленню словника Image XObject- Звіти передпольотної перевірки PDF/A тепер відносять
pvaiImageDictionaryViolationдо контенту, який впровадження маркерів не може виправити
Version 2.13.3
Виправлено (Fixed)
ValidatePdfAтепер повідомляє про вбудовані зображення PDF/A-1, що використовують фільтри/LZWDecodeабо скорочений/LZWвсередині потоків вмісту, черезpvaiInlineImageLzwForbidden, доповнюючи існуюче охоплення вбудованих зображень PDF/A-2 та PDF/A-3- Сканер фільтрів вбудованих зображень тепер просувається мимо провідних імен ресурсів, таких як
/GS1, уникаючи зависань при скануванні ширших потоків вмісту PDF/A-1
Version 2.13.2
Додано (Added)
TPdf.SetFocusedFormFieldTextзаписує текст до буфера редагування поточного сфокусованого поля форми черезFORM_ReplaceSelection, симетричноFocusedFormFieldText. Для текстових/комбінованих полів AcroForm значення фіксується в/Vпри втраті фокусу та зберігається; для текстових полів XFA запис потрапляє лише до буфера пам'яті (PDFium не надає публічного API для узгодження значень XFA назад до пакета даних, тому воно не зберігається при збереженні)- Хост-платформа JavaScript тепер підключається щоразу, коли доступний рушій V8, незалежно від того, чи є документ XFA — так вбудований JavaScript AcroForm (скрипти рівня документа, обчислення полів,
app.alert) також може виконуватися. Ранішеm_pJsPlatformпідключався лише для документів XFA, залишаючи JS AcroForm мовчазно вимкненим
Змінено (Changed)
- Підключення платформи JavaScript тепер незалежне від рішення XFA в
InitializeFormFill— таблицяm_pJsPlatformбудується щоразу, колиV8FeaturesAvailableдорівнює true, і застосовується після підключення версії/зворотного виклику XFA, а не вкладена в нього
Version 2.13.1
Додано (Added)
- Нові хост-події розкривають інформацію, яку зворотні виклики заповнення форм v2.13.0 раніше поглинали:
OnXfaUriAction,OnXfaPageCountChanged,OnXfaFocusChange,OnXfaEmail,OnXfaHttpRequest,OnXfaOpenFile,OnJavaScriptBeep,OnJavaScriptPrint,OnJavaScriptMail,OnJavaScriptSubmitForm. За замовчуванням кожна подія зберігає існуючу поведінку «нема дії» при непризначенні, тому існуючі хости не зачіпаються - Властивість лише для читання
TPdf.XfaFormPacketsповертає одноразовий знімок усіх XFA-пакетів (TXfaPacketList), реалізуючи типиTXfaPacket/TXfaPacketList, раніше оголошені, але не використовані - Коди помилок PDFium для XFA
FPDF_ERR_XFALOAD/FPDF_ERR_XFALAYOUTтепер прив'язані та відображаються черезLastPdfError, замінюючи узагальнене «Unknown error» при збоях завантаження/макетування XFA
Змінено (Changed)
FFI_DoURIActionWithKeyboardModifierтепер звертається доOnXfaUriActionперед shell-виконанням URI з поля XFA, даючи хосту право вето (безпека: шкідливе поле XFA раніше могло безумовно запускати довільні URL). Непризначені обробники зберігають попередню поведінкуShellExecuteWза замовчуваннямDecodeFormFieldTypeтепер маршрутизує типи полів XFA черезIsXfaFormField, а не через явний case із 8 гілок, зберігаючи узгодженість перерахування зFPDF_FORMFIELD_XFA_*за ординальним зміщенням
Виправлено (Fixed)
ValidatePdfAтепер повідомляє про заяви PDF/A-1, що використовують потоки перехресних посилань або потоки об'єктів PDF 1.5, через новийpvaiPdfA1Pdf15Structure, при цьому досі дозволяючи потоки об'єктів для PDF/A-2 та PDF/A-3
Version 2.13.0
Додано (Added)
- Повна підтримка середовища виконання XFA (XML Forms Architecture):
TPdf.InitializeFormFillтепер підключає всі 14 зворотних викликів версії 2FPDF_FORMFILLINFO(FFI_DisplayCaret,FFI_GotoURL,FFI_PageEvent,FFI_PopupMenu,FFI_OpenFile,FFI_EmailTo,FFI_UploadTo,FFI_GetPlatform,FFI_GetLanguage,FFI_DownloadFromURL,FFI_PostRequestURL,FFI_PutRequestURL,FFI_OnFocusChange,FFI_DoURIActionWithKeyboardModifier) та прикріплюєIPDF_JsPlatform, щоб XFA-суміснийpdfium.dllміг рендерити та скриптувати динамічні XFA-форми - Новий модуль
Lib\FPdfXfa.pasоголошує XFA-константи (FXFA_PAGEVIEWEVENT_*,FXFA_MENU_*,FXFA_SAVEAS_*,FPDF_FORMFIELD_XFA_*) та типиTXfaPacket/TXfaSaveFormat, раніше згадувані лише в коментарях - Статичний читач XFA-пакетів на
TPdf:GetXfaPacketCount/GetXfaPacketName/GetXfaPacketContent/GetXfaPacketByNameплюсGetXfaTemplate/GetXfaDatasets/GetXfaConfigвитягають пакети XFAtemplate,datasetsіconfigяк необроблений XML без потреби в XFA-сумісному середовищі виконання - Зонди можливостей: глобальний
XfaFeaturesAvailable, і для кожного документаTPdf.XfaRuntimeAvailable(чи вдалосяFPDF_LoadXFA) таTPdf.XfaStaticReadable(чи розв'язують експорти читача пакетів) TPdfFormFieldTypeрозширенийfiXfa,fiXfaCheckBox,fiXfaComboBox,fiXfaImageField,fiXfaListBox,fiXfaPushButton,fiXfaSignature,fiXfaTextField, зDecodeFormFieldType, що відображає нові значенняFPDF_FORMFIELD_XFA_*- Хост-події JavaScript на
TPdf:OnJavaScriptAlert,OnJavaScriptResponse,OnXfaGotoUrlтаOnXfaRuntimeMissingдозволяють хосту налаштовувати діалоги JS та навігацію XFA або реагувати, коли XFA-документ не може запустити рушій - Новий зразок
XfaLabдля Delphi, що демонструє виявлення XFA, витягання пакетів, перевірку можливостей та резервний шлях при відсутності середовища виконання
Змінено (Changed)
TPdf.LoadDocumentтепер попередньо сканує вхідні дані на маркери XFA (/XFAу словнику AcroForm або/NeedsRenderingкаталогу) та при їх виявленні автоматично обираєpdfium.v8.dll, встановлюючиEnableV8Engine := Trueперед першим завантаженням бібліотеки-синглтона; після завантаження звичайногоpdfium.dllпроцес не може переключитися, томуOnXfaRuntimeMissingсигналізує про цей випадокTPdf.GetPageCountтепер відображає кількість сторінок, яку рушій XFA повідомляє черезFFI_PageEventпісля динамічної перестановки сторінок, а не лише статичне дерево сторінок PDF- Коли XFA-документ відкрито, але середовище виконання недоступне,
InitializeFormFillтепер фіксуєversion=1таxfa_disabled=1замість запиту версії 2 з непризначеними зворотними викликами, що раніше могло спричинити розіменування поганого вказівника зворотного виклику
Version 2.12.2
Виправлено (Fixed)
ValidatePdfAComplianceтепер повідомляє про використовувані власні простори імен XMP безpdfaExtension:schemas, при цьому досі приймаючи стандартні метаданіpdfaidбез оголошень розширень- Перевірка вбудованих файлів PDF/A-3 тепер вимагає наявності як
/Fверхнього рівня, так і/UFу словниках filespec та ігнорує вкладені ключі потоку/EFпри перевірці цих імен
Version 2.12.1
Виправлено (Fixed)
ValidatePdfAComplianceтепер декодує екрановані токени імен PDF перед зіставленням із JavaScript, LZWDecode, Type1 та іншими забороненими іменами, тому обфусковані, але семантично ідентичні імена коректно повідомляються- Перевірки вбудованих зображень PDF/A тепер відхиляють значення
/Filterі/F, що використовують/LZWDecode, скорочений/LZWабо/Crypt, включно з формою масиву та екранованого імені - Перевірка PDF/A тепер повідомляє про потоки метаданих із забороненими фільтрами, профілі ICC OutputIntent, чий лічильник компонентів
/Nвідсутній або неузгоджений, та специфікації вбудованих файлів PDF/A-3 з відсутнім або недійсним/AFRelationship
Version 2.12.0
Додано (Added)
- HTTP-запити TSA тепер встановлюють явні тайм-аути у 30 с для кожної фази (розв'язання/підключення/відправка/отримання) через
WinHttpSetTimeouts, щоб повільний або недоступний орган відміток часу не міг назавжди підвісити потік підписання - Похідний нонс для кожного запиту PAdES B-T / B-LTA при порожньому
TPadesSignOptions.Nonce: SHA-256-згортка монотонного лічильника + системний годинник +GetTickCount64+ ідентифікатор процесу замінює попередній фіксований резервний варіант$100000000, щоб два запити, видані в одну мілісекунду, не використовували однаковий нонс для захисту від повторного відтворення PdfInflateтепер обмежує декомпресований вивід 256 МіБ, щоб стиснутий zlib потік не вичерпав пам'ять на ворожих або пошкоджених вхідних даних («zlib-бомба»); обмеження достатньо щедре для будь-якого реального потоку PDF
Змінено (Changed)
- Накладання змішування
TPdfView(виділення пошуку, виділення тексту, читане слово, виділення розвороту) більше не використовує попіксельнийGetPixel/SetPixelV; прямокутник тепер змішується через 32-bpp позаекраннийTBitmapтаScanLineза один прохід, усуваючи тисячі перетинань ядра GDI за відрисовку та роблячи великі виділення швидкодіючими FPdfAsn1.TDerReader.ReadIntegerтепер відхиляє INTEGER-поля довші за 8 байтів (та 8-байтові від'ємні, чий знаковий біт потребував биshl >= 64), повертаючи 0 замість обчислення неправильного значення через невизначену поведінку зсуву на ASN.1-введенні CMS/PAdESParseTimeStampRespбільше не відображає нонс запиту назад якTPadesTimestamp.Nonce; до появи обхідника TSTInfo, що перевіряє повернений нонс, поле залишається 0, сигналізуючи «не перевірено» замість того, щоб давати викликаючим хибну впевненість у свіжості відповіді відмітки часу
Виправлено (Fixed)
PointsToPixelsповертав вхідне значення без змін для будь-якого DPI: дільник бувPointsPerInch(константа 72) замість літерала 72, зводячи формулу доResult := Points. Будь-який зовнішній викликаючий, що виконує перерахунок точок у пікселі пристрою через цей помічник, тепер отримує коректнеPoints × PixelsPerInch / 72PdfMaxObjNumнедораховував на документах, що використовують потоки об'єктів (ObjStm PDF 1.5+): об'єкти, стиснуті всередині/ObjStm, не мають маркераN 0 obj, тому побайтове сканування їх пропускало, і інжектори, що виділяютьMaxObj+1для нових об'єктів, могли зіткнутися з прихованими членами ObjStm та мовчазно пошкодити файл. Сканування тепер спочатку розширює потоки об'єктів, щоб кожен номер об'єкта був видимийInjectPdfAMarkersбільше не створює хибну заяву про відповідність PDF/A для зашифрованого документа: PDF/A (ISO 19005-1 §7.1) забороняє шифрування, і інжектор раніше копіював джерело з маркерами, навіть якщо наступна перевірка відхиляла його. Коли встановленоHasEncrypt, джерело тепер передається без змін. Звичайний шляхTPdf.SaveAsPdfAвже знімає шифрування (saRemoveSecurity) перед ін'єкцією, тому це зачіпає лише прямих викликаючихPdfReadStreamBytesтепер відхиляє/Length, що перевищує весь файл, перед виділенням буфера результату, закриваючи ранній шлях виділення на пошкодженій або ворожій непрямій довжині
Version 2.11.0
Додано (Added)
- Запис PDFium
FPDF_FILEHANDLERтепер оголошує шість зворотних викликів (Release,GetSize,ReadBlock,WriteBlock,Flush,Truncate) як реальні поля, а не коментарі, відповідаючи розкладці заголовка C. Зворотні виклики XFA FFI для передачі файлів (FFI_OpenFile/FFI_EmailTo/FFI_UploadTo/FFI_DownloadFromURL), що повертають або споживаютьPFPDF_FILEHANDLER, досі не реалізовані у Pascal-шарі заповнення форм, але тип тепер структурно коректний для будь-якого майбутнього шляху відправки/завантаження XFA - Завантаження та вивантаження бібліотеки PDFium (
LoadLibrary/UnloadLibrary) тепер серіалізовані процесно-глобальним критичним розділом, щоб два робочі потокиTPdfFuture<T>(або робочий потік, що змагається з головним) не могли обидва спостерігатиPDFiumLibrary=0та виконати подвійне прив'язування або звільнити DLL, коли інший потік знаходиться на півдорозі прив'язування - Секція
initialization/finalizationтепер викликаєUnloadLibraryпри вивантаженні модуля, гарантуючи виконанняFPDF_DestroyLibrary(очікування завершення робочих потоків, звільнення ізоляту V8, звільнення шрифтів/кешу) замість того, щоб покладатися на ОС у поверненні DLL
Змінено (Changed)
TPdf.SetActiveтепер придушує будь-який виняток при завантаженні (раніше лишеEPdfError), тому помилка потоку або порушення доступу під час налаштування форми/сторінки залишаєActive=Falseзамість частково завантаженого компонента в невизначеному стані- Узгоджене кодування символів для аргументів ключів метаданих PDFium:
TPdf.GetMetaTextтепер використовує той самий роздільний підхід FPCAnsiString/ DelphiUTF8Encode, щоGetViewerPreferenceі шляхи завантаження, замість голого приведенняAnsiString(Tag) - Дедупліковано помічники
BytesToAnsi,AnsiToBytes,WriteBytesіWriteStr:FPdfCompressтепер імпортує їх ізFPdfPdfCommon(псевдонімиWriteBytesToStream/WriteAnsiToStreamвиведені з використання) та надлишкове трьохаргументне перевантаженняBytesToAnsiуFPdfPdfaвидалено.FPdfAsn1зберігає локальну копію навмисно, щоб криптографічний шар залишався вільним від модуля шару відповідності
Виправлено (Fixed)
- Витік ресурсів у
TPdf.LoadDocument(файл, пам'ять,TBytes,TMemoryStream, власний потік) таTPdf.CreateDocument: якщоInitializeFormFillабоReloadPageкидали виняток після успішногоFPDF_LoadDocument/FPDF_CreateNewDocument, дескрипторFPDF_DOCUMENTвитікав, оскількиFActiveще був False. Кожен шлях тепер обгортає постзавантажувальне налаштування уtry/exceptта закриває документ при невдачі, залишаючи компонент коректно неактивним - Зрозуміліша діагностика завантаження DLL PDFium:
CheckLoadLibraryвиявляєERROR_BAD_EXE_FORMAT(193) та повідомляє про невідповідність архітектури 32/64-біт, вказуючи на відповідну збіркуDLLs/Win32абоDLLs/Win64, замість передачі лише загальної помилки ОС.CheckGetProcAddressтепер повідомляє, що розгорнутийpdfium.dllстаріший за прив'язку, коли потрібний експорт відсутній, а не просто видає текст ОС «procedure not found»
Version 2.10.1
Виправлено (Fixed)
- Стандартизація SignerInfo sid у PAdES: ідентифікатор підписувача тепер використовує форму RFC 5652 §5.3
issuerAndSerialNumber(issuer Name + serialNumber, обидва витягуються дослівно з DER сертифіката підписувача), замінюючи попередній нестандартнийsubjectKeyIdentifier+ SHA-256-заповнювач повного сертифіката, який відхиляли Adobe Acrobat та інші сумісні валідатори. Новий обхідник TbsCertificate DER (ExtractIssuerAndSerial) читає SEQUENCE видавця та INTEGER серійного номера як сирі байти TLV — серійні номери часто перевищують діапазонInt64, тому сирий TLV є обов'язковим. ФормаsubjectKeyIdentifierзалишається як резерв лише у разі невдалого розбору DER сертифіката
Змінено (Changed)
TCmsSignerId.SerialNumber: Int64замінено наSerialDer: TBytes(сирій TLV serialNumber). Будівник CMS вбудовує вирізаний TLV дослівно уIssuerAndSerialNumber, уникаючи переповненняInt64на 20-байтових серійних номерах CA (верхня межа RFC 5280 §4.1.2.2)
Version 2.10.0
Додано
- Довгострокова перевірка PAdES B-LT: коли
TPadesSignOptions.Level >= plB_LT,SignPadesBytesдодає інкрементне оновлення зі словником/DSS, що містить сертифікат підписувача та повне проміжне ланцюжок (самопідписаний корінь виключається згідно з RFC 5652 §10.2.3), плюс маркер/Extensions /ESICрівня Level 1 (EN 319 142-1 §5.4.2) - Архівна печатка часу PAdES B-LTA: коли
Level >= plB_LTAі встановленоTsaUrl, додається словник підпису Document Time-stamp (/SubFilter /ETSI.RFC3161), чий/ByteRangeохоплює весь файл; маркер ESIC підвищується до рівня Level 2. Це завершує чотири базові рівні PAdES (B-B, B-T, B-LT, B-LTA) - Збір ланцюжка сертифікатів:
ResolveWinSignerтепер викликаєCertGetCertificateChainі заповнюєTPadesResolvedSigner.ChainCertDerпроміжними сертифікатами CA, тож B-LT/DSS /Certsмістить кожен сертифікат, необхідний для перевірки підпису без зовнішніх запитів.CertFreeCertificateContextтепер прив'язано, що закриває витік «один контекст на підпис», відмічений у v2.8.0 - Робочий процес інтеграції PDF/A:
TPdf.SignPadesWithPdfAспочатку перетворює документ на PDF/A (найвищий рівень, що бібліотека генерує сьогодні), а потім застосовує запитану підпис PAdES — шаблон контейнера довгострокового архівування, який рекомендує EN 319 142-1 Annex A.7
Version 2.9.0
Додано
- Довіренна печатка часу PAdES B-T:
TPadesSignOptionsотримує поляLevel,TsaUrlіNonce. КолиLevel >= plB_Tі встановленоTsaUrl,SignPadesBytesвитягує значення підпису з побудованого CMS, запитує печатку часу RFC 3161 по ньому і вбудовує повернутий TimeStampToken як непідписаний атрибут SignerInfosignature-time-stamp— крок довіреного часу B-T (EN 319 142-1 §6.3 вимога o) FPdfTsa: кросплатформний клієнт RFC 3161 —BuildTimeStampReq(версія 1, SHA-256 messageImprint по значенню підпису, nonce, certReq=true),ParseTimeStampResp(приймає PKIStatus 0/1, відхиляє 2+, витягує TimeStampToken ContentInfo дослівно) іRequestTimestamp(виконання build+POST+parse за один виклик).PadesTsaAvailableобмежує функцію на платформах без HTTP-бекендуFPdfTsaWin: Windows-бекенд WinHttp, динамічно прив'язаний з winhttp.dll (нульова нова залежність на етапі компіляції; HTTPS узгоджується сховищем сертифікатів Windows). Повторює шаблон динамічного прив'язуванняFPdfCryptoWinFPdfCms:ExtractSignatureValueобходить побудований CMS для відновлення сирих октетів підпису (вхід хеша TSA), аAddSignatureTimestampToCmsперебудовує ContentInfo з новимunsignedAttrs [1](0xA1), що несе атрибут печатки часу. Валідатор першого етапу розпізнає результат як підпис B-T
Version 2.8.0
Додано
- Стек підпису PAdES B-B: чотири нові чисто-Pascal/кросплатформні будівельні блоки (
FPdfSha256,FPdfAsn1,FPdfCms,FPdfCrypto) плюс Windows-бекенд CNG (FPdfCryptoWin) дозволяютьTPdf.SignPades/SignPadesToStreamстворювати підпис PAdES B-B наскрізь. Сертифікат підписувача визначається по відбитку SHA-1 зі сховища Current User “MY”; RSA-PSS (рекомендовано), RSA PKCS#1 v1.5 та ECDSA підтримуються черезNCryptSignHash FPdfSha256: автономний SHA-256 FIPS 180-4 (Init/Update/Final + одновикликові помічники). FPC 3.2.2 не постачається з модулем SHA-2, тож бібліотека володіє одним, щоб тримати кожен шлях коду CMS на єдиному типіTSHA256Digestбез розгалуження RTLFPdfAsn1: кодувальник DER (TDerWriter) і читач (TDerReader), що охоплюють SEQUENCE/SET/OID/INTEGER/OCTET STRING/UTCTime/GeneralizedTime/контекстно-залежні теги з кодуванням визначеної довжини та обробкою IMPLICIT-тегів, яких вимагає CMSFPdfCms: будівник CAdES SignedData (BuildSignedData), що генерує підписані атрибути content-type, message-digest та signing-certificate-v2, обов'язкові для PAdES baseline, з опціональними signing-time та commitment-type-indication. Дайджест signedAttrs обчислюється по формі з тегом SET (0x31) і перевипромінюється з тегом IMPLICIT [0] (0xA0) згідно з RFC 5652 §5.4FPdfCrypto+FPdfCryptoWin: абстракція криптографічного бекенду зPadesCryptoAvailable/ResolvePadesSigner, а Windows-реалізація прив'язує crypt32.dll / ncrypt.dll динамічно (без нової залежності DLL на етапі компіляції). Підписи ECDSA перекодовуються з Windows-форми IEEE P1363 r¦s у DERECDSA-Sig-Value, необхідний CMSSignPadesBytes: ін'єкція підпису на байтовому рівні — резервує hex-слот/Contentsфіксованої ширини, обчислює/ByteRange, що охоплює, робить дайджест документа, будує і вбудовує CMS та додає інкрементне оновлення. Валідатор (v2.7.0) розпізнає результат як підпис PAdES B-B
Version 2.7.0
Додано
- Структурний валідатор PAdES (ETSI EN 319 142-1 V1.2.1): новий модуль
FPdfPadesі методTPdf.ValidatePadesперевіряють словники значень підпису, доступні з/ByteRange, обходять CMSSignedDataвсередині/Contentsдостатньо глибоко, щоб підтвердити відокремлену форму CAdES, і виявляють чотири базові рівні (B-B, B-T, B-LT, B-LTA), а також словники Document Time-stamp (/SubFilter /ETSI.RFC3161) - Набір проблем PAdES на рівні пунктів: 26 перерахувань
ppei*охоплюють прийнятність/SubFilter(adbe.pkcs7.sha1іadbe.x509.rsa_sha1позначені як заборонені), покриття файлу/ByteRange, заборону/Cert, форму CMSSignedData(один підписувач, відокремлений eContent, діапазон версій), обов'язкові підписані атрибути (content-type,message-digest,signing-certificate/v2), заборонені дайджести (MD5, SHA-1), взаємовиключення/Reasonіcommitment-type-indication(вимога d), вимогу довіреного часу B-T, маркер/DSS+/Certs+ ESIC Level 1 для B-LT та печатку Document Time-stamp + ESIC Level 2 для B-LTA - Ін'єктор DSS:
TPdf.SaveAsPadesDss/SaveAsPadesDssToStreamдодають інкрементне оновлення зі словником/DSS(з потоковими масивами/Certs,/OCSPs,/CRLs) та маркером/Extensions /ESIC(Level 1 або 2) на копію документа, зберігаючи вихідні байти — крок вбудовування матеріалів перевірки B-LT/B-LTA (пункт 5.4.2) - Кросплатформний етап без залежностей: валідатор та ін'єктор написані на чистому Pascal і працюють у кожній підтримуваній IDE (Delphi, Lazarus, FPC, C++Builder); для цього випуску криптографічний бекенд не потрібен і нова залежність DLL не вводиться
Version 2.6.0
Змінено (Changed)
- Дедуплікація між стандартами: ще сім дубльованих допоміжних функцій (PdfEnclosingObjNum, PdfDictRefNum, PdfExpandObjectStreams, PdfTextStr, ExtractLiteralString, ExtractXmpAttr) видалено з окремих стандартних модулів і консолідовано у
FPdfPdfCommon, що скорочує близько ~300 рядків тягаря підтримки коду copy-paste - Якість PreflightReport: проблеми content-класу PDF/X та PDF/E, які раніше потрапляли до загальної категорії “missing marker”, тепер несуть точні категорії Content/Metadata/Security та рекомендації для конкретних пунктів (близько 15 перерахувань для обох стандартів)
- Покриття тестами PDF/E та PDF/R: ще шість перерахувань з нульовим покриттям отримали позитивні тести (
pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden,pveiEmbeddedFilesForbidden,pvriBadHeader,pvriProhibitedInfoEntry) - Виправлення збірки Lazarus:
Tests.PdfVT(модуль DUnitX лише для Delphi, доданий у v2.5.x) тепер виключено з проекту Lazarus для відновлення компіляції
Version 2.5.3
Додано
- Повнота OutputIntent (PDF/X-4 §6.2.4):
pvviOutputIntentSchemeпозначає OutputIntent, чий/Sне дорівнює/GTS_PDFX;pvviOutputIntentMissingIdentifierпозначає відсутній/OutputConditionIdentifier - Виняток Reference XObject для PDF/VT-2 (§6.2.2):
pvviReferenceXObjectForbiddenбільше не спрацьовує для файлуPDF/VT-2, який може легально використовувати Reference XObjects на базі X-5g/5pg - Перевірка символів межі MIME (RFC 2046 §5.1.1):
vtmviBoundaryInvalidCharпозначає межу, символи якої виходять за межі множини bchars або чия довжина перевищує 70
Виправлено (Fixed)
InjectPdfVTMarkersтепер записує Info/CreationDateі/ModDateз параметрів збереження, тож отриманий файл проходить зворотний циклValidatePdfVTComplianceбез помилковогоpvviInfoModDateMismatch(раніше ін'єктор перезаписував дати XMP, але залишав дати словника Info застарілими)
Version 2.5.2
Додано
- Узгодженість Info
/ModDate(§6.3 NOTE 2, база PDF/X-4):pvviInfoModDateMismatchпозначає/ModDateсловника Info, який після нормалізації PDF-дати у XMP-дату не дорівнюєxmp:ModifyDate - Відповідність inline-фрагментів PDF/VT-2s (Annex A.2): MIME-валідатор тепер запускає
ValidatePdfVTComplianceна кожній inline-частиніapplication/pdfі позначає тіло, що не є PDF/VT, черезvtmviInlinePdfNotPdfVT
Version 2.5.1
Додано
- Перевірка сегментації DParts (ISO 16612-2 §6.5 Table 4):
pvviDPartsBadChunkingпозначає масив/DParts, чий непослідні підмасиви не містять рівно 8192 елементи або чий останній підмасив виходить за межі 1..8192 - Узгодженість RecordLevel між потоками (Annex A.2): MIME-валідатор PDF/VT-2s тепер витягує
/RecordLevelкожного inline-файлу PDF і позначає розбіжності черезvtmviRecordLevelMismatch, доповнюючи існуючу перевірку NodeNameList - Підказки повторюваних графічних об'єктів (§6.7):
pvviGtsScopeInvalidValueпозначає/GTS_Scopeпоза {SingleUse, Record, File, Stream, Global, Unknown};pvviGtsScopeRecordWithoutRecordLevelпозначає/Recordбез/RecordLevel;pvviGtsXidNotUuidпозначає/GTS_XID, що не є uuid: URI RFC 4122;pvviGtsEnvMissingпозначає відсутній/GTS_Env, коли/GTS_Scopeдорівнює Stream або Global (§6.7.4) - Виявлення прямих посилань MIME (Annex A.2):
vtmviForwardReferenceпозначає inline-файл PDF, що посилається на ім'я файлу (через/EF /F), не введене раніше частиною вкладення у потоці
Виправлено (Fixed)
ExtractNodeNameListFromPdfіExtractRecordLevelFromPdfуFPdfPdfvtMimeвиправили повторювану помилку off-by-one, де 1-базове зміщення, повернутеAnsiFindKey, трактувалося як абсолютне байтове зміщення у розгорнутому PDF
Version 2.5.0
Додано
- Метадані Document Part для PDF/VT (DPM, ISO 16612-2 §6.6):
TPdfVTSaveOptionsотримавDpmEntriesіDpmTarget, щоб письменник міг прикріпити словник/DPMдо синтезованого вузла DPart з перевіркою імен ключів за правилом другого класу префікса Annex E та правилами §6.6 NMTOKEN / унікальності / формиGTS_Managedна боці валідатора - Потоковий обмін PDF/VT-2s (Annex A): новий модуль
FPdfPdfvtMimeнадаєBuildPdfVT2sStreamіValidatePdfVT2sStreamдля MIME-конвертаmultipart/mixed, що несе inline-фрагменти PDF/VT плюс профілі ICC вкладень, з правилом упорядкування заголовкаX-PDFVT-Stream-version: 1та перевіркою узгодженостіNodeNameListміж потоками TPdf.ValidatePdfVTтепер виконує авторитетний підрахунок JavaScript-дій черезFPDFDoc_GetJavaScriptActionCount, доповнюючи побайтове сканування імен/JavaScript
Виправлено (Fixed)
- Коректність PDF/VT
Trappedна базі PDF/X-4: значення перерахуванняptvUnknownвидалено (PDF/X-4 забороняє/Unknown),ptvUnspecifiedнормалізується до/Falseпід час запису (відсутність/Trappedтакож заборонена), а нова проблемаpvviTrappedInvalidпозначає відсутнє абоUnknownзначення ValidatePdfVTComplianceтепер розгортає потоки об'єктів (PdfExpandObjectStreams) перед скануванням, тож каталог, OutputIntent або словник Metadata, збережені всередині стисненого ObjStm (PDF 1.5+, типовий для виробників PDF/X-4), доступні для побайтового пошуку
Змінено (Changed)
- PDF/VT-1 тепер успадковує повні заборони вмісту PDF/X-4:
pvviAcroFormForbidden(/AcroFormабо/XFA),pvviAdditionalActionsForbidden(каталог/AA),pvviMissingTrimBoxіpvviReferenceXObjectForbidden(Reference XObject, лише X-5g/5pg) - Дедуплікація між стандартами:
BuildDictObj,IccComponentCount, вбудований профіль sRGB ICC (GetSrgbIccProfile),PdfTextStr,PdfEnclosingObjNum,PdfDictRefNumіPdfExpandObjectStreamsбули підвищені з потроєних локальних копій уFPdfPdfa/FPdfPdfx/FPdfPdfvtдо єдиного канонічного місця уFPdfPdfCommon; 3144-байтовий ICC-літерал тепер існує рівно один раз у кодовій базі
Version 2.4.0
Виправлено (Fixed)
InjectPdfUaMarkersбільше не втрачає посилання на/Infoтрейлера на базі потоку перехресних посилань (cross-reference-stream): локальна версіяSourceTrailerInfoRef(у якій була відсутня резервна обробка для потоку xref) була замінена на спільнуPdfSourceTrailerInfoRef(перенесену з копії PDF/A, яка мала резервну обробку починаючи з версії v2.0.0)- Спільна функція
PdfReadStreamBytesтепер обробляє непрямі посилання/Length N G R(перенесено з локальної копії PDF/A), тому валідатори PDF/VT, PDF/R та PDF/E більше не зчитують помилково та не пропускають потоки метаданих XMP, створені інструментами, які використовують непряме значення Length (Acrobat, Ghostscript)
Змінено (Changed)
- Дедуплікація між стандартами: локальні копії
PdfReadTrailerуFPdfPdfaтаFPdfPdfx, локальні копіїSourceTrailerInfoRefуFPdfPdfaтаFPdfPdfua, а також локальнаPdfReadStreamBytesуFPdfPdfaбули видалені — тепер скрізь застосовуються спільні версії з модуляFPdfPdfCommon, що дозволило прибрати близько ~330 рядків дубльованого коду та усунуло витрати на підтримку синхронізації копій - Закриття боргу з тестування PDF/X: сім перерахувань класів вмісту (enums), які раніше мали нульове покриття, отримали позитивні тести (
pvxiLzwForbidden,pvxiJavaScriptForbidden,pvxiFormFieldsForbidden,pvxiAdditionalActions,pvxiEmbeddedFilesForbidden,pvxiMissingTrimBox,pvxiTrappedNotSet)
Version 2.3.0
Змінено (Changed)
- Продовження закриття боргу з тестування PDF/A: ще три enums з нульовим покриттям отримали позитивні тести;
pvaiForbiddenRenderingIntent(§6.2.9) позначає нестандартне ім'я rendering-intent у потоці вмісту;pvaiJpeg2000Violation(§6.2.2) позначає зображення JPXDecode із кількістю компонентів/NumComponentsпоза межами {1,3,4} у Part 2;pvaiInlineImageLzwForbidden(§6.1.10) позначає вбудоване зображення, що використовує фільтр LZW у Part 2
Version 2.2.0
Змінено
- Регресійні тести потоку перехресних посилань: існуючий
Validate_XrefStreamTrailer_DetectsConformanceтепер також перевіряє, що посилання каталогу/Metadataрозв'язується, а XMPpdfaid:partзчитується на базі потоку xref (а не лише/Root+/ID); новий тестInjectPdfA_XrefStreamBase_RoundTripsзахищає шлях потоку xref інжектора, доданий у версії v2.0.0; два міжстандартні тести (PdfE_XrefStreamBase_NotRejectedAsUnparsable,PdfR_XrefStreamBase_NotRejectedAsUnparsable) підтверджують, що валідатори PDF/E та PDF/R більше не відхиляють PDF-файли з потоком xref як такі, що не піддаються парсингу - Закриття тестового боргу для PDF/A:
Validate_MinimalPdf_FlagsRequiredMarkersстверджує, що мінімальний порожній PDF викликаєpvaiMissingPdfAIdentifier,pvaiMissingOutputIntent,pvaiMissingIccProfile,pvaiMissingXmpMetadataтаpvaiMissingXmpDates— усуваючи розрив симетрії з валідаторами PDF/E та PDF/X, які вже мали еквівалентні тести; ще два переліки із нульовим покриттям отримали позитивні тести:pvaiUnembeddedFontтаpvaiSubsetMissingCidSet
Version 2.1.0
Виправлено
- PDF/E випадково не було включено до виправлення потоку перехресних посилань у версії v2.0.0: як
InjectPdfEMarkers, так іValidatePdfEComplianceвсе ще викликалиPdfReadTrailerбезAcceptXrefStream, тому інжектор PDF/E мовчки завершувався помилкою на вихідних файлах PDF 1.5+ (значення за замовчуванням дляSaveAsCopyу pdfium); обидва місця виклику тепер передаютьTrue - Спільний механізм резервного копіювання для потоку перехресних посилань у
PdfReadTrailerтепер містить захист/Type /XRef, який уже мали локальні копії PDF/A та PDF/X, тому пошкоджене зміщенняstartxref, яке вказує на сторонній словник, завершується чистою помилкою замість помилкового парсингу як трейлера - Розподілювач непрямих посилань
/LangуValidatePdfUaCompliance(v2.0.0) був недосяжним:PdfFindObjDictзнаходить лише словники<<, тоді як рядковий об'єкт/Langє(...)або<...>без словника; замінено прямим скануванням тіла об'єкта, яке знаходить рядковий токен
Змінено
- Сім дублікатів допоміжних функцій (PdfStructureBytes, PdfHasName, PdfCountName, BuildStreamObj), які були байт-в-байт ідентичними копіями спільних версій з
FPdfPdfCommon, було видалено зFPdfPdfaтаFPdfPdfua— спільні версії тепер застосовуються всюди черезuses
Version 2.0.0
Виправлено
- Прихована помилка між стандартами: спільна допоміжна функція
PdfReadTrailer(що використовується інжекторами та валідаторами маркерів PDF/UA, PDF/X, PDF/VT та PDF/R) тепер приймає параметрAcceptXrefStreamта повертається до словника об'єктів потоку перехресних посилань, якщо ключове словоtrailerвідсутнє (PDF 1.5+); раніше вихідні даніSaveAsCopyу pdfium (які використовують потік перехресних посилань) призводили до непомітної відмови кожного інжектора маркерів — вихідні байти копіювалися без змін, а виклик усе одно повертав успіх; валідатор PDF/R-1.0 (чий базис PDF 2.0 завжди є потоком перехресних посилань) фактично не виконував жодних дій, а зрілу реалізацію валідатора PDF/A було портовано до спільної допоміжної функції, тому це приносить користь кожному стандарту - Сканування словника трейлера в
InjectPdfUaMarkersтаInjectPdfAMarkersтепер використовує чутливий до глибиниPdfDictEndзамість простого пошуку>>, тому трейлер, що містить вкладений словник (наприклад,/Encrypt << ... >>), більше не обривається перед кінцевим записом/Info
Змінено
TPdf.ValidatePdfUaтепер пригнічує грубий перевіряльник байтового рівняpvuaiFontNotEmbedded, якщо точний перевіряльник об'єктної моделі PdfiumpvuaiPdfiumFontNotEmbeddedвже спрацював, тому звіт попередньої перевірки більше не містить двох майже однакових рядків “embed your fonts” для того самого дефектуpvuaiLangInvalidFormat(§7.2) тепер розділяє непряме посилання/Lang(N 0 R) до його рядкового об'єкта та перевіряє вміст, тому непрямо вказаний мовний тег більше не є сліпою зоною
Version 1.99.0
Виправлено
pvuaiLangInvalidFormat(§7.2) більше не пропускає шістнадцятково кодовані рядки `/Lang` без перевірки: пари UTF-16BE (з BOM `FE FF`) та чисті ASCII hex-рядки тепер декодуються і проходять таку саму перевірку граматики BCP 47, як і літеральні рядки `(...)`, тому неправильно сформований шістнадцятковий `/Lang` виявляється, тоді як відповідний стандарту (наприклад, UTF-16BE `en-US`) більше не ризикує бути позначеним як помилковий
Змінено
pvuaiFontMissingToUnicode(§7.21.7) тепер звільняє `/MacExpertEncoding` нарівні з `/WinAnsiEncoding` та `/MacRomanEncoding`, що відповідає чотирьом умовам виключення, наведеним у пункті
Version 1.98.0
Додано
pvuaiNeedAppearancesTrue(§7.18.4) позначає AcroForm, у якого прапорець `/NeedAppearances` встановлено в true, оскільки в такому разі вигляд віджетів не фіксується надійно, а допоміжні технології не можуть пов'язати їх із деревом структури; перенесено з валідатора PDF/A та обмежено наявністю `/AcroForm` для звуження області сканування
Змінено
- veraPDF corpus regression: підключено пару успішних та неуспішних тестів §7.20 Reference-XObject та пари §7.21.4.2 підмножини CharSet/CIDSet до `Live_Corpus_ValidatePdfUaMatchesConformance`; зразки проходження §7.21.7 ToUnicode-forbidden-value та §7.18.6.2 media-clip також підключено як захист від хибнопозитивних результатів (їхні зразки відмов використовують макети словників, які байтове сканування не виявляє, тому підключено лише успішну сторону)
- Список тверджень успішного шляху корпусу отримав 15 нових засобів захисту від хибнопозитивних результатів, тому кожна активна перевірка `pvuai*` на байтовому рівні та рівні структури тепер тестується на відповідних зразках (раніше захищено лише ~30 з 60 активних проблем); захист `pvuaiLangInvalidFormat` було навмисно пропущено, оскільки байтовий перевіряльник консервативно позначає шістнадцятково кодовані рядки `/Lang`, які він не може декодувати
Version 1.97.0
Виправлено
- Посилення безпеки `ValidatePdfUaStructureElements`: обхід батьківського ланцюжка `EnclosingTable` тепер містить лічильник переходів (обмежений кількістю елементів), тому некоректний цикл `ParentIndex` у синтетичному масиві елементів структури більше не може призвести до зависання викликаючої програми; виділення пам'яті під масив ідентифікаторів позначеного вмісту у `ValidatePdfUaPageContentTagging` тепер обмежено одним мільйоном записів, що запобігає виділенню кількох гігабайт пам'яті на некоректному або шкідливому `MarkedContentID`
Змінено
- Коментар до документації enum `pvuaiOrderedListMissingListNumbering` тепер точно описує дію перевірки: вона позначає елемент `L`, значення `ListNumbering` якого знаходиться поза набором таблиці 347 стандарту ISO 32000-1 (відсутній атрибут не позначається); попередній коментар припускав, що вона також виявляє впорядковані списки без цього атрибута, чого реалізація не робить
- Два зразки відмов корпусу `7.21.3.3-t02` щодо невідповідності WMode тепер підключено до `Live_Corpus_ValidatePdfUaMatchesConformance` — починаючи з версії v1.95.0 потік CMap розпаковується за допомогою FlateDecode, порівняння словника та вмісту тепер виконується на читабельному боці; застарілий коментар “not wired” було видалено
Version 1.96.0
Додано
- Узгодженість між стандартами: `TPdf.ValidatePdfUa` отримує дві перевірки, перенесені з валідатора PDF/A; `pvuaiAnnotationFlagsViolation` (§7.18.1) позначає незвільнені анотації з прапорцями Hidden / Invisible / NoView, що порушує послідовність читання допоміжними технологіями; `pvuaiActionTargetMissing` (§7.18.5) позначає дію GoToR / URI / SubmitForm, у якій відсутній обов'язковий цільовий ключ (/F+/D, /URI, /F), що робить посилання непридатним для використання допоміжними технологіями
Виправлено
- Об'єднання дерева структур між сторінками: цикл накопичення `AllElems` у `TPdf.ValidatePdfUa` тепер змінює базу `ParentIndex` кожного елемента з локального масиву сторінки на об'єднаний масив; без цього дочірні елементи сторінки 2 зберігали локальний індекс сторінки, який вказував на зріз сторінки 1, непомітно пошкоджуючи кожну перевірку, що залежить від ParentIndex (структура таблиць/списків, кількість H-дочірніх елементів згідно з §7.4.4, EnclosingTable)
- Парсинг RoleMap: `PdfReadRoleMapPairs` більше не зупиняє сканування всього набору ключ/значення, коли значення є непрямим посиланням (`N 0 R`) або масивом (`[...]`) — обидві форми є допустимими формами RoleMap згідно з ISO 32000-1 14.8.5.1; тепер він просто пропускає цей запис (`Continue`) замість переривання циклу (`Break`), що усуває хибнопозитивні результати `pvuaiRoleMapUnresolved` для типів, відображених після непрямого посилання або масиву
Змінено
FPdfPreflightReport: 18 активних значень `TPdfUaValidationIssue`, які раніше потрапляли до загальної категорії “missing marker” та рекомендацій, тепер мають точні категорії (Structure / Content / Metadata / Security) та рекомендації для конкретних пунктів; також виправлено друкарську помилку `puaNone / pua1` → `pucNone / puc1` у файлі `PDFSpecComplianceMatrix.md`
Version 1.95.0
Змінено
- Аналіз ефективності та коректності `TPdf.ValidatePdfUa`: перевірки `pvuaiCMapWModeMismatch` згідно з §7.21.3.3 та `pvuaiToUnicodeForbiddenValue` згідно з §7.21.7 тепер розпаковують стиснуті за допомогою `FlateDecode` потоки CMap / ToUnicode перед скануванням (раніше перевірялися лише нестиснуті потоки, що було відомим випадком хибнонегативних результатів); спільні допоміжні функції `PdfInflate` / `PdfReadAndDecodeStream` було перенесено з `FPdfPdfa` / `FPdfPdfx` до `FPdfPdfCommon`, тому всі модулі перевірки відповідності використовують одну копію
Додано
pvuaiSubsetCharSetEmpty(§7.21.4.2) позначає підмножину Type 1 `FontDescriptor`, що містить ключ `/CharSet` із порожнім строковим значенням — існуючий `pvuaiSubsetMissingCharSet` виявляв лише відсутність ключа; порожній `/CIDSet` не позначається, оскільки шрифт без CIDs може цілком легітимно мати порожню растрову карту
Version 1.94.0
Додано
- Другий етап аудиту `TPdf.ValidatePdfUa` закрив шість прогалин ISO 14289-1, виявлених під час попунктного аналізу та повторного сканування вбудованих API Pdfium, які вже обгорнуті, але не використовувалися в роботі з PDF/UA; `pvuaiHeadingFormatInvalid` (§7.4.3) позначає визначені користувачем теги заголовків, що починаються з H, але містять роздільники, пробіли або римські цифри замість чистих арабських цифр; `pvuaiMissingDocumentOutline` (§7.17, рекомендовано) позначає багатосторінковий документ, який не містить структури закладок (односторінкові документи звільнені від цієї перевірки); `pvuaiStructElementLangInvalid` (§7.2) позначає значення `/Lang` елемента структури, яке не є коректним тегом BCP 47; `pvuaiWidgetMissingPrintField` (§7.14 / §7.18.4) позначає елемент структури Widget, у якому відсутній власник атрибута PrintField; `pvuaiLinkNotInStructureTree` (§7.18.5) позначає документ, у якому анотації `/Subtype /Link` не представлені як елементи структури Link; `pvuaiPdfiumAnnotationMissingContents` та `pvuaiPdfiumLinkMissingContents` (§7.18.1 / §7.18.5) додають точне сканування анотацій об'єктної моделі Pdfium, яке звільняє приховані, розташовані за межами crop-box, Popup та Widget анотації — це усуває хибнопозитивні результати байтової евристики, яка не може зчитувати прапорці `/F` або `/Rect`
Version 1.93.0
Додано
- `TPdf.ValidatePdfUa` тепер накладає прохід об'єктної моделі Pdfium поверх інспектора байтового рівня, повторюючи архітектуру 7-го раунду PDF/A: здійснюється обхід текстових об'єктів кожної сторінки через `FPDFTextObj_GetFont` → `FPDFFont_GetIsEmbedded` (`pvuaiPdfiumFontNotEmbedded`, §7.21.4) та сканується кожен символ через `FPDFText_HasUnicodeMapError` (`pvuaiPdfiumUnicodeMapError`, §7.21.7) та `FPDFText_GetUnicode` (`pvuaiPdfiumNotDefGlyph`, §7.21.8) — це значно точніше, ніж евристика байтового рівня, яка спрацьовує лише тоді, коли шрифтові програми взагалі відсутні або не відображається `/ToUnicode`; обхід завершується достроково на трьох рівнях: цикл сторінок завершується, коли всі три проблеми шару Pdfium вже встановлені, цикл об'єктів завершується на першому невбудованому шрифті, а сканування символів пропускає перевірку `.notdef`, якщо вже зафіксовано `UnicodeMapError`; PDF/UA був останнім валідатором стандартів PDF без шару об'єктної моделі Pdfium
Version 1.92.0
Додано
- Створено `Tests.PdfR` — перший тестовий файл для валідатора PDF/R-1 (`FPdfPdfr`), що охоплює валідацію заголовків, заборону ObjStm, виявлення растрових маркерів та захист чистого файлу від хибнопозитивних результатів; усі шість тестових наборів стандартів PDF тепер мають спеціальні тестові файли: PdfA(80), PdfUa(101), PdfX(7), PdfE(5), PdfVT(15), PdfR(4) = 212 тестів загалом
Version 1.91.0
Додано
- `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
Додано
- `TPdf.ValidatePdfX` тепер накладає прохід об'єктної моделі Pdfium поверх інспектора байтового рівня: він здійснює обхід текстових об'єктів кожної сторінки через `FPDFTextObj_GetFont` → `FPDFFont_GetIsEmbedded` і повідомляє про невбудований шрифт як `pvxiPdfiumFontNotEmbedded` — це значно точніше, ніж евристика байтового рівня, яка спрацьовує лише тоді, коли шрифтові програми повністю відсутні; обхід завершується достроково на першому знайденому невбудованому шрифті
Змінено
- Обхід дерева структур `TPdf.ValidatePdfUa`: виклик `ValidatePdfUaPageContentTagging` для кожної сторінки (який будує карту заявлених ідентифікаторів позначеного вмісту та перевіряє кожен текстовий/графічний об'єкт) тепер пропускається на наступних сторінках, як тільки виявлено `pvuaiUntaggedContent` — елементи структури все ще збираються для міжсторінкових перевірок (унікальний ідентифікатор примітки, послідовність заголовків), але дорогий прохід тегування вмісту сторінки припиняється раніше
Version 1.89.0
Змінено
- Продуктивність шару об'єктної моделі Pdfium у `TPdf.ValidatePdfA`: обхід сторінок/об'єктів тепер завершується достроково на трьох рівнях — цикл сторінок виходить, коли всі застосовні проблеми шару Pdfium вже знайдені, цикл об'єктів виходить, коли обидва класи проблем об'єктів (вбудовування шрифту + прозорість) встановлені, а сканування символів текстової сторінки пропускає перевірку `.notdef`, якщо вже зафіксовано `UnicodeMapError`; перевірки доступності API `Assigned()` та прапорці відповідності кешуються в локальні логічні змінні один раз перед початком циклу замість повторного обчислення для кожної сторінки/об'єкта/символу; на великому невідповідному документі обхід тепер може зупинитися після першої сторінки замість сканування всіх сторінок; на відповідному документі накладні витрати на сторінку менші (без повторних викликів `Assigned`)
Version 1.88.0
Додано
- `ValidatePdfX` отримав вісім нових значень `TPdfXValidationIssue` на рівні вмісту, що охоплюють обмеження обміну друком, які PDF/X накладає крім маркерів формату файлу: `pvxiLzwForbidden` (`/LZWDecode`), `pvxiJavaScriptForbidden` (`/JavaScript`), `pvxiFormFieldsForbidden` (`/AcroForm` / `/XFA`), `pvxiAdditionalActions` (`/AA`), `pvxiEmbeddedFilesForbidden` (`/EmbeddedFiles` / `/FileAttachment`), `pvxiOpiForbidden` (`/OPI` / `/Alternates`), `pvxiMissingTrimBox` (відсутність `/TrimBox` на будь-кій сторінці) та `pvxiTrappedNotSet` (`/Trapped` відсутній або `/Unknown`); раніше валідатор PDF/X перевіряв лише маркери XMP/OutputIntent; це його перший прохід на рівні вмісту; спільні допоміжні функції `PdfStructureBytes` / `PdfHasName` / `PdfCountName` було додано до `FPdfPdfCommon`, тому всі модулі відповідності можуть використовувати їх
Version 1.87.0
Додано
- Перевірка PDF/UA тепер охоплює правила складених шрифтів ISO 14289-1 §7.21.3:
pvuaiCidSystemInfoMismatchпозначає шрифти Type0, у яких вбудована CMap і нащадний CIDFont розходяться заRegistry/Orderingабо деSupplementCIDFont перевищує значення CMap,pvuaiCMapNotEmbeddedпозначає CMaps, на які посилаються за іменем (якEncodingабоUseCMap) і які не є стандартними CMaps, визначеними в таблиці 118 ISO 32000-1, аpvuaiCMapWModeMismatchпозначає вбудовані CMaps, у якихWModeсловника відрізняється від WMode у вмісті потоку
Виправлено
- Перевірка
pvuaiCidFontMissingCidToGidMapзгідно з §7.21.3.2 пропускала словники CIDFontType2, у яких пара ключ/значенняSubtypeрозділена символом нового рядка; тепер також позначає значення іменіCIDToGIDMap, відмінне відIdentity
Version 1.86.0
Додано
- Перевірка PDF/UA тепер охоплює правила кодування TrueType ISO 14289-1 §7.21.6:
pvuaiTrueTypeEncodingInvalidпозначає несимволічні шрифти TrueType, у яких відсутнєEncodingабо воно не є аніMacRomanEncoding, аніWinAnsiEncoding(безпосередньо або черезBaseEncoding), аpvuaiSymbolicTrueTypeEncodingпозначає символічні шрифти TrueType, що мають нестандартне ім'яEncoding
Version 1.85.1
Змінено
- Перевірка порядку табуляції
pvuaiMissingTabsOrderзгідно з ISO 14289-1 §7.18.3 тепер виконується для кожної сторінки: кожна сторінка з анотаціями повинна оголошувати/Tabs /Sу власному словнику сторінки, тому відповідна сторінка-сусід більше не приховує сторінку без такого оголошення
Version 1.85.0
Додано
- Перевірка PDF/UA тепер розрізняє динамічні та статичні форми XFA відповідно до ISO 14289-1 §7.15:
pvuaiXfaDynamicпозначає форми, у яких конфігурація XFA встановлюєdynamicRenderу значенняrequired
Змінено
- Колишній загальний прапор кандидата XFA
pvuaiXfaPresentвиведено з обігу і більше не підіймається (статичний XFA відповідає §7.15); значення enum залишається для сумісності API
Version 1.84.0
Додано
- Перевірка PDF/UA тепер виявляє непомічений реальний вміст, що вимагається ISO 14289-1 §7.1:
pvuaiUntaggedContentпозначає відрендерені текстові та графічні об'єкти, які не включені до дерева структур сторінки (через їхні ідентифікатори marked-content) і не позначені як 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-імені#hh) іValidatePdfUaRoleMapUsageдля безпосереднього використання
Version 1.81.0
Додано
- Перевірка PDF/UA тепер охоплює теги списків ISO 32000-1, що вимагаються ISO 14289-1 §7.6:
pvuaiListStructureInvalidпозначає елементи LI поза контейнером L і частини Lbl/LBody поза елементом LI, водночас допускаючи вкладені списки та легітимне використання Lbl всередині елементів Note та BibEntry
Version 1.80.0
Додано
- Перевірка PDF/UA тепер охоплює теги таблиць ISO 32000-1, що вимагаються ISO 14289-1 §7.5:
pvuaiTableStructureInvalidпозначає комірки TH/TD поза рядком TR і рядки або групи рядків поза контейнером Table,pvuaiTableHeaderMissingScopeпозначає комірки заголовка, зв'язок яких не може бути визначений ані через атрибут Scope, ані через асоціацію Headers/ID, аpvuaiTableHeadersUndefinedIdпозначає посилання Headers у документах, де не визначено жодного ідентифікатора елемента структури TPdfStructureElementнадає атрибути таблиціScope,HasHeaders,HeadersIds,ColSpanіRowSpan, що визначаються під час обходу дерева структур
Змінено
- Обхід дерева структур тепер зчитує всі атрибути макету та таблиці за один прохід по словниках атрибутів кожного елемента замість одного сканування на атрибут
Version 1.79.1
Нові можливості
- Портовано приклад
AnnotationsLabдля Lazarus та C++Builder, приєднавши його до існуючого консольного прикладу для Delphi
Виправлення
- Метод
TPdf.CreateAnnotationміг викликати помилку “Cannot set attachment points” для розмічальних анотацій, які використовують quad points (Highlight, Underline, StrikeOut, Squiggly), оскільки нова анотація ще не мала quad слота для заміни; тепер він замість цього додає перший quad
Version 1.79.0
Нові можливості
- Новий консольний приклад
AnnotationsLabдля Delphi: створює анотації Text, Highlight, Square та Circle, записує їх у PDF, після чого перезавантажує файл та перелічує список анотацій сторінки
Version 1.78.0
Нові можливості
- Нові
TPdf.MeasureTextтаTPdf.MeasureTextWidth: вимірюють відрендерені ширину та висоту рядка для заданого шрифту та розміру (у користувацьких одиницях PDF, 1 одиниця = 1/72 дюйма) без додавання вмісту на сторінку, уможливлюючи логіку розміщення та перенесення слів поверхAddText; надається автономним модулемFPdfMeasureяк class helper - Новий
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 — рядок show у потоці вмісту, довший за 20 символів без пробілів, що ймовірно є порушенням злиття слів; груба евристика, що уникає хибних спрацьовувань CJK), таpvaiLinkActionMissingTarget(6.6.3 — дія GoToR/URI/SubmitForm, в якій відсутній ключ цілі відображення (target), тому зчитувач не може її відобразити)
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поза стандартним набором режимів накладання (blend-mode) 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, що виявляється за патерном словника дій (action-dict)/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). Це перевірки, які інспектор на рівні байтів виконати не може — він бачить лише іменні маркери, а не вирішені дескриптори (handles) шрифтів або стан відображення для кожного символу — і їх результати об'єднуються з результатом на рівні байтів. Самостійна функція на рівні байтів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 — підмножина CIDFontDescriptorповинна оголошувати/CIDSet),pvuaiToUnicodeForbiddenValue(7.21.7 — ToUnicode CMap не повинен зіставляти жоден код зU+FEFFабоU+FFFE; нестиснуті потоки скануються на наявність вихідних форм<FEFF>/<FFFE>),pvuaiLangInvalidFormat(7.2 —/Langмає бути коректним тегом RFC 1766 / BCP 47; дозволяюча граматика приймаєen,en-US,zh-Hans,es-419і позначає явно невідповідні значення) таpvuaiOrderedListMissingListNumbering(7.6 — збережено для повноти API; ще не генерується валідатором, оскільки для надійного розрізнення впорядкованих списків від невпорядкованих потрібне значення атрибутаListNumbering, яке обхідник дерева структури не розкриває)
Version 1.69.0
Додано
ValidatePdfUaотримав два нові значенняTPdfUaValidationIssue(додані в кінець переліку, наявні значення не змінено):pvuaiWidgetOutsideForm(ISO 14289-1 7.18.4 — елемент структури Widget повинен бути вкладеним в елементForm; тепер обхідник дерева структури перевіряє тип безпосереднього батьківського елемента кожного Widget) таpvuaiSubsetMissingCharSet(7.21.4.2 — підмножина Type 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 — вбудований CIDFont Type 2 повинен містити/CIDToGIDMap)
Version 1.66.0
Додано
ValidatePdfUaотримав п'ять нових значеньTPdfUaValidationIssue(додані в кінець переліку, наявні значення не змінено):pvuaiRoleMapMissing(ISO 14289-1 7.1 — тегований документ із нестандартними типами структури повинен містити/RoleMap),pvuaiOptionalContentAsKey(7.10 — словник конфігурації необов'язкового вмісту не повинен містити ключ автоматичного стану/AS),pvuaiXfaPresent(7.15 — наявність/XFAу AcroForm позначається як помилка, оскільки динамічний XFA заборонений),pvuaiTrapNetAnnotation(7.18.2 — анотації/TrapNetзаборонені) таpvuaiReferenceXObject(7.20 — Reference XObjects, визначені за допомогою маркера/Ref, заборонені)
Виправлено
ValidatePdfUaбільше не видає хибних спрацьовуваньpvuaiEncryptionPresentдля кожного зашифрованого файлу: PDF/UA дозволяє шифрування, якщо ключ словника шифрування/Pмає встановлену бітову позицію 10 (значення 1024), що надає доступ допоміжним технологіям (7.16). Точне порушення тепер повідомляється за допомогою новогоpvuaiEncryptionPBitMissing;pvuaiEncryptionPresentзбережено в переліку (enum) для сумісності API, але більше не генерується валідатором на рівні байтів
Version 1.65.0
Додано
ValidatePdfAотримав п'ять нових значеньTPdfAValidationIssue(додані в кінець переліку, наявні значення не змінено):pvaiCidFontMissingCidToGidMap(ISO 19005-1 6.3.3.2 Cor.2 — вбудований CIDFont Type 2 повинен містити/CIDToGIDMap),pvaiSubsetMissingCharSet(6.3.5 — підмножина Type 1FontDescriptorповинна містити/CharSet),pvaiSubsetMissingCidSet(6.3.5 — підмножина CIDFontDescriptorповинна містити/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 — OutputIntent/Sмає бути/GTS_PDFA1),pvaiInfoXmpDateMismatch(6.7.3 — InfoCreationDate/ModDateтакож має бути присутнім якxmp:CreateDate/xmp:ModifyDate),pvaiMarkInfoMissing(6.8.2.2 — Level 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
Змінено (Змінено)
- Демо-проєкти
Demo\Delphi\MergePDF,Demo\CBuilder\MergePDF,Demo\Lazarus\MergePDFрозширено для всіх трьох IDE: діапазон сторінок на файл, необов'язковий шлях виведення, дедуплікація, журнал виконання, кнопка скасування, підсумок злиття; закладки та метадані з першого джерела - Демо-проєкти
CreatePDFтепер містять параметр «Європейський текст» для тексту з діакритичними знаками чеської, французької, німецької, іспанської, португальської, польської та турецької мов, перевіряючи вибір шрифту та обробку Unicode (колишнійEuropeanTextоб'єднано) - Видалено
ExtractTextPagesтаEuropeanText: посторінкове вилучення тексту охоплено параметрами діапазону сторінок/роздільника уExtractText; багатомовне відображенняEuropeanTextоб'єднано зCreatePDF
Version 1.62.2
Виправлено
- Повторно згенеровано заголовки C++Builder (
.hpp) для кожної версії RAD Studio та платформи (Win32/Win64/Win64x); вони відхилилися від вихідних файлів Pascal, через що лишилися застарілі сигнатури функцій і відсутні модулі, які потрапляли до користувачів C++Builder через вихідний дистрибутив
Version 1.62.1
Виправлено
- Відновлено компіляцію з вихідних кодів у RAD Studio 12 Athens і раніших версіях: присвоєння
TArray<Byte>у шляху перевірки PDF/UA використовувало неявне перетворення масиву, доступне лише в Delphi 13, яке не компілювалося в старіших IDE
Version 1.62.0
Додано (Додано)
TPdf.RenderPageThumbnailвідтворює будь-яку сторінку за index у bitmap із підігнаним співвідношенням сторін без зміни поточної сторінки документа, завантаженої сторінки або викликуOnPageChange
Виправлено (Виправлено)
TPdfThumbnailViewпід час малювання більше не змінюєPageNumberдокумента host; раніше кожне перемальовування перезавантажувало сторінки, викликалоOnPageChangeі скидало text page, що могло порушувати зв’язанийTPdfViewі запускати цикли перемальовування. Тепер мініатюри відтворюються черезRenderPageThumbnailбез таких побічних ефектів- Перевірка відповідності PDF/X тепер аналізує документи з cross-reference streams (PDF 1.6, типовий для PDF/X-4) та об’єкти, що зберігаються у стиснених object streams, замість того щоб цілком позначати такі файли як невідповідні; маркер
GTS_PDFXVersionчитається як з element-form, так і з RDF attribute-form у XMP - Перевірка PDF/R тепер повідомляє
pvriInfoXmpMismatch, коли Info dictionary і XMP розходяться щодо Producer або Creator; раніше ця проблема була лише оголошена, але не піднімалась - Таймери form-fill відстежуються окремо для кожного запиту, тож документ, у якому одночасно працює кілька таймерів (наприклад, JavaScript interval поруч із миготінням field caret), зберігає їх усі замість того, щоб втрачати все, крім найновішого
- Малювання
TPdfViewі його публічні методиRenderPage/RenderTileтепер утримують document render lock, серіалізуючись із worker-thread rendering того самогоTPdf(PDFium не є thread-safe) - Не-ASCII текст, записаний у metadata PDF/X, PDF/R і PDF/VT (назви умов OutputIntent, Creator, Producer), тепер кодується як рядок UTF-16BE згідно з ISO 32000-1 §7.9.2.2 замість raw UTF-8, який сумісні reader могли б прочитати неправильно
- Помічники відповідності правильно читають embedded metadata streams, у яких
/Lengthє indirect reference, завантажують source bytes черезReadBuffer(тож short read завершується чистою помилкою) і відхиляють від’ємний offsetstartxrefзамість ризику читання поза діапазоном
Version 1.61.0
Змінено (Змінено)
- Виправлення оголошень FFI/ABI, які можуть вимагати перекомпіляції коду, що реалізував відповідні callback-и: callback заповнення форм
FFI_OpenFileтепер маєcdecl(Win32 stack convention), а параметрvalueуFPDFAnnot_SetStringValueіFPDFAttachment_SetStringValueтепер єFPDF_WIDESTRING(UTF-16LE), щоб відповідати заголовкам PDFium - Callback-и progressive-load
FX_FILEAVAIL.IsDataAvailіFX_DOWNLOADHINTS.AddSegmentтепер приймають зсувиsize_t, аsize_tмає ширину вказівника у Free Pascal / Lazarus Win64 (раніше обрізалось до 32 біт), що виправляє виклики API перевірки доступності даних іoutsize_tна FPC Win64
Виправлено (Виправлено)
- Безпека пам’яті: use-after-free таймера form-fill під час знищення
TPdfз активним AcroForm caret; подвійний викликFPDF_CloseDocumentна шляху помилки вImportNPagesToOne; вихід винятків Pascal за межі callback-івFPDF_FILEWRITE/FPDF_FILEACCESSчерез межу C під час збереження та вставлення JPEG; і переповнення цілого числа під час вилучення тексту при читанні від початкового індексу до кінця сторінки TPdfFuture<T>тепер надійно доставляє свій callback результату; відповідь раніше майже завжди губилася і могла торкатися звільненого потоку, бо worker звільняв сам себе ще до виконання queued reply- Вивід PDF/A, PDF/X, PDF/E, PDF/R, PDF/VT і PDF/UA тепер записує записи cross-reference рівно по 20 байтів, як того вимагає ISO 32000-1 §7.5.4
- Вставлення standards marker більше не руйнує словник, коли видалений ключ, наприклад
/Trapped, був останнім записом, через що раніше з’їдався закривальний>>і утворювався пошкоджений об’єкт - Потоки ICC profile в OutputIntent тепер оголошують потрібну кількість компонентів
/Nдля PDF/X і PDF/VT (для PDF/A це вже було), а зашифровані вихідні документи розшифровуються до вставлення маркерів PDF/X, PDF/E, PDF/R, PDF/VT і PDF/UA, тож вихід є коректним, а не мовчки пошкодженим - BOM xpacket UTF-8 у згенерованому XMP тепер виводиться як точні байти, що виправляє пошкодження в Delphi-інсталяціях, де ANSI code page не Latin-1; трейлери інкрементального оновлення тепер зберігають посилання
/Infoдокумента SaveAsіз compression більше не обрізає потоки, у яких/Lengthє indirect reference, а перебудовані cross-reference tables тепер використовують записи по 20 байтів, реальні generation numbers і відкидають застарілий покажчик/Prev- Перевірка відповідності читає маркери версії XMP у форматі атрибутів для PDF/E і PDF/X, тож файли PDF/X-4, серіалізовані як атрибути, розпізнаються, вимагає точний ідентифікатор
PDF/E-1, правильно читає metadata streams з непрямим/Lengthі більше не хибно зіставляє ключі/IDабо/StructTreeRootелемента структури під час перевірки PDF/UA trailer; некоректний зсувstartxrefбільше не спричиняє помилку діапазону TPdfThumbnailView: тепер до останньої сторінки можна дістатися через смугу прокручування, поточна сторінка host-документа відновлюється після малювання мініатюр, а стандартна обробка mouse-leave знову виконується- Сірі bitmap сторінок і зображень більше не рендеряться з хибною палітрою;
TPdfViewбільше не лишається з висячим посиланням, коли йогоTPdfзвільняють першим - Звіти Preflight: HTML зберігається як UTF-8, щоб відповідати оголошеному charset, а екранування рядків JSON формує коректні
\uпослідовності для не-ASCII символів у Free Pascal - Триальні збірки: діалог нагадування про trial тепер з’являється замість того, щоб бути прихованим до показу
TPdfStreamAdapterтепер відхиляє потоки більші за 4 GiB із чіткою помилкою замість того, щоб мовчки обрізати довжину, передану до PDFium
Version 1.60.1
Змінено
- Демо AccessibilityReader для Delphi, Lazarus і C++Builder тепер виконують читання вголос через
TPdfReadingSession: кожна сторінка збирається в один озвучуваний фрагмент за допомогоюBuildSpokenTextFromWords, позиції слів SAPI передаються вFeedSpokenPosition, а сесія перемикає сторінки й керує словесним курсором перегляду, замінюючи рукописну оркестрацію, яку раніше мав кожен демопроєкт - Відстеження караоке на рівні слів у демо тепер працює і з NVDA як рушієм мовлення:
EstimatePacingведе курсор читання за часом, що минув від початку озвучення, тоді як раніше NVDA читав уголос взагалі без відстеження слів - Pause і Resume у демо тепер теж працюють з NVDA:
ResumeRestartsChunkпід час Resume знову озвучує поточну сторінку з початку, тоді як SAPI зберігає власну вбудовану паузу й відновлення
Version 1.60.0
Додано
- Інтерактивний low-vision рендеринг у
TPdfView: нові параметри рендерингуreInvertіreNightDuotoneперефарбовують кожну відрендерену плитку сторінки (повна інверсія кольорів або нічна duotone-палітра) до того, як буде намальовано накладки пошуку, виділення, читання і словесного курсора, переносячи наявні перетворення кольору bitmap у інтерактивний переглядач як для односторінкового, так і для двосторінкового режимів; перемикання параметрів перемальовує вигляд негайно NightDuotoneInkіNightDuotonePaperналаштовують нічну палітру; типово це бурштиновий текст на чорній сторінці; якщо задано обидва параметри, пріоритет маєreInvert
Version 1.59.0
Додано
TPdfReadingSession: компонент оркестрації читання вголос, нейтральний до рушія мовлення. Він зберігає курсор фрагмента, курсор слова і стан відтворення (Play/PlayFrom/Pause/Resume/Stop), переходить між завантаженими фрагментамиTPdfSpokenText, коли host черезTickповідомляє, що рушій простоює, перетворює зсуви озвученого тексту назад у символи сторінки й автоматично керує словесним курсором прив’язаногоTPdfView; host підключає будь-який рушій мовлення черезOnSpeakта події запиту скасування, паузи й відновлення, тому бібліотека сама не лінкує жодного speech APIFeedSpokenPositionприймає позиції слів від рушія мовлення, наприклад SAPIStatus.InputWordPosition;EstimatePacingразом ізEstimatedWordsPerMinuteведе рушії без сигналу позиції;ResumeRestartsChunkповторно озвучує поточний фрагмент для рушіїв без вбудованої паузиOnChunkChange,OnWordChangeіOnFinishedспрацьовують лише за реальних змін, а звільнений прив’язаний перегляд від’єднується автоматично, тож код host-застосунку лишається без мерехтіння і без аварій
Version 1.58.0
Додано
EstimateSpokenWordIndexоцінює, яке саме слово зараз озвучує рушій мовлення, за часом, що минув, і швидкістю слів за хвилину, віддаючи довшим словам пропорційно більше часу, тож навіть рушії без повідомлення позиції слова, як-от NVDA controller client, усе ще можуть керувати курсором читання на рівні слів; час, що минув, передає викликач, тому процедура не залежить від годинника і придатна до unit-тестування
Version 1.57.0
Додано
- Збирання spoken-text із двозонним відображенням для відстеження читання вголос:
BuildSpokenTextFromWordsіSpokenTextAppendформують рядок, який передається рушію text-to-speech, із word box-ів сторінки, одночасно записуючи таблицю span-ів, аSpokenToPageCharперетворює озвучений зсув, повідомлений рушієм, наприклад SAPIStatus.InputWordPosition, назад на індекс символу сторінки, тож відстеження підсвічування на рівні слів лишається коректним, коли озвучуваний текст не збігається з повним текстом сторінки, наприклад через пропущені області, читання по одиницях або перевизначення вимови - Типи
TPdfSpokenTextіTPdfSpokenSpanмістять озвучуваний рядок і вихідні діапазони сторінки, з яких його було побудовано; зсуви на вставлених роздільниках переходять до наступного зіставленого слова, а зсуви поза зіставленими ділянками повертають відсутність збігу
Version 1.56.9
Додано
Demo\Delphi\PreflightReportдодає попередній перегляд Action Plan, який зводить стандарти, що не пройшли перевірку, пріоритети, наступні дії, коди проблем і рекомендації до одного контрольного списку виправленьDemo\Delphi\PreflightReportCliприймаєplan/actionplanяк формат виводу для запуску над одним файлом або пакетом, записуючи той самий контрольний список виправлень у текстовий файл
Змінено
- Обидва демо Delphi PreflightReport тепер показують кількість станів pass / action / review поряд із загальною кількістю стандартів і проблем
Version 1.56.8
Змінено
ViewerInteractionLabтепер містить елементи переходу до сторінки, ручне керування масштабом, журналювання координатDeviceToPage/PageToDeviceза кліком і зрозуміліший журнал взаємодії для перевірок виділення, пошуку, обертання та навігації- Сторінки readme для
ViewerInteractionLabтепер описують доданий сценарій взаємодії в усьому локалізованому наборі demo readme
Version 1.56.7
Додано
AccessibilityWorkbenchCliзіставляє кожне спрацьоване зауваження з відповідним WCAG 2.1 Success Criteria та розділом ISO 14289-1 (PDF/UA-1), а також показує у звітах секцію покриття стандартівAccessibilityWorkbenchCliобчислює задокументовану оцінку доступності 0-100 за оприлюдненою шкалою штрафів і градаціями excellent / good / needs work / poor, показуючи її для кожного файла і як середнє по пакетуAccessibilityWorkbenchCliприймаєfailscore=N, щоб завершити запуск помилкою, код виходу 2, якщо хоча б один файл набирає менше за NAccessibilityWorkbenchCliзаписує журнал SARIF 2.1.0, коли ім’я підсумку пакета закінчується на.sarif, з одним правилом на кожен тип зауваження, що несе його теги WCAG 2.1 і PDF/UA для завантаження в CI та code scanningAccessibilityWorkbenchCliдодає командуversion, яка виводить версію підключеного PDFiumPas
Version 1.56.6
Додано
IntakeWorkbenchCliобчислює криміналістичний SHA-256 hash для кожного вхідного файла, із деградацією доunavailableна компіляторах безSystem.Hash, і виводить його в кожному форматіIntakeWorkbenchCliприймаєpasswords=file.txt, щоб пробувати відкривати захищені паролем документи зі списку кандидатів, записуючи індекс відповідного кандидата без будь-якого логування самого пароляIntakeWorkbenchCliприймаєcopyto=dir, щоб розкладати кожен перевірений файл у підпапку відповідного рівня ризику, перетворюючи аудитор на сортувальник intakeIntakeWorkbenchCliзаписує журнал SARIF 2.1.0, коли ім’я підсумку пакета закінчується на.sarif, з одним правилом на кожен risk flag і одним результатом на кожен позначений файл для завантаження в CI та code scanningIntakeWorkbenchCliдодає командуversion, яка виводить версію підключеного PDFiumPas
Version 1.56.5
Додано
IntakeWorkbenchCliтепер визначає рекомендовані дії після intake, як-от accept, request-password, manual-review, quarantine і deduplicate, та показує кількість таких дій у зведеннях пакетівAccessibilityWorkbenchCliтепер визначає рекомендовані дії з усунення проблем, як-от pass-through, remediate-tags, run-ocr, remediate-semantics і manual-review, із відповідними підрахунками дій по пакету
Змінено
- Обидва CLI-демо інструментального рівня тепер показують рекомендовану дію в console, text, HTML, JSON і CSV output, щоб оператори пакетної обробки могли маршрутизувати файли без післяобробки полів ризику чи стану
Version 1.56.4
Виправлено
- Читання анотацій, закладок або link-annotation у циклі більше не протікає текстовими рядками попереднього елемента: результуючі записи
TPdfAnnotation,TBookmarkіTLinkAnnotationтепер очищаються через ініціалізацію, що враховує managed types, замість сирого занулення пам’яті, тож документи з дуже великою кількістю анотацій із текстом більше не роздувають пам’ять процесу на весь час життя застосунку - Знищення
TPdf, у якому був зареєстрований обробникOnUnsupportedFeature, тепер від’єднує його від глобального для процесу callback PDFium, тож пізніше завантаження документа з іншого екземпляраTPdfбез власного обробника вже не може звернутися до звільненого компонента, тобто усунуто use-after-free
Version 1.56.3
Виправлено
AccessibilityWorkbenchCliбільше не рахує порожні сторінки як сторінки евристичного порядку читання, тож теговані документи з порожніми сторінками-розділювачами зберігають правильний статус доступності; сторінки без читабельного вмісту тепер звітуються окремоAccessibilityWorkbenchCliбільше не зараховує зовнішній таблиці коміркиTH, що належать вкладеній таблиці, а імена form field і шрифтів тепер порівнюються з урахуванням регістру, щоб різні поля не зливалися докупи- У
IntakeWorkbenchCliінвентаризація URL host тепер відкидає частини userinfo, query і fragment, тож підроблене посилання на кшталтtrusted.example@evil.exampleправильно приписується реальному host, а ціліmailto:тепер додають свій домен замість того, щоб лишатися невидимими - Markdown-звіти
IntakeWorkbenchCliтепер екранують backtick у шляхах, host і назвах вкладень, що контролюються атакувальником, тож форматування звіту не можна зламати зсередини документа
Змінено
AccessibilityWorkbenchCliтепер подає збої сканування шрифтів і form field як окремі лічильники, позначає не вбудовані шрифти, для яких водночас існують вбудовані екземпляри, і обмежує довгі списки шрифтів явним маркером обрізання- Пакетні зведення
IntakeWorkbenchCliтепер містять колонку з кількістю attachment-annotation, а перепис анотацій по сторінках обмежено 20000 анотаціями на сторінку з повідомленням про це обмеження в кожному форматі
Version 1.56.2
Додано
AccessibilityWorkbenchCliтепер перевіряє вбудовування шрифтів, підказки form field, джерело порядку читання, outline документа, структуру таблиць і списків, підозрілий alternate text та докладніші деталі перевірки по сторінках, щоб пакетні звіти з доступності виявляли більше цілей для виправленняIntakeWorkbenchCliтепер звітує про межі сканування сторінок, дії launch і remote-go-to, інвентаризацію URI host, кількість анотацій, непідтримувані можливості PDFium, дублікати ідентифікаторів документа та розширені risk flag для автоматизованого intake-review
Змінено
IntakeWorkbenchCliприймаєmaxpages=Nу режимах одного файла і пакета, щоб обмежити сканування сторінок для кожного документа, але при цьому все одно завершувати звітування по metadata, attachment, script, XFA, signature і risk
Version 1.56.1
Виправлено
- Завантаження старішої
pdfium.dll, у якій бракує новішого export, тепер завершується коректно: шлях помилки скидає всі прив’язані точки входу API, тож перевіркиAssigned(), наприклад дляFPDF_GetLastErrorабоFPDF_GetSecurityHandlerRevision, повідомляють, що бібліотеку не завантажено, замість звернення до вже вивантаженого модуля й падіння з access violation UnloadLibraryтепер очищає всі прив’язки PDFium API, а не лише необов’язкові помічники V8, тож після вивільнення DLL не лишається жодних застарілих вказівників на функції
Version 1.56.0
Додано
- Караоке-курсор читання на рівні слів у
TPdfView:TrackReadingWordAtзіставляє зсув символу поточного слова, який надходить від рушія text-to-speech, наприклад SAPIStatus.InputWordPosition, із word box-ами сторінки, підсвічує слово, якому він відповідає, окремою накладкою над блоком читання, прокручує його в область видимості й повертає індекс слова, тож озвучуване слово загоряється в міру руху голосу SetReadingWordіClearReadingWordнапряму встановлюють або очищають підсвічене слово зTPdfWordBox; повторне встановлення того самого слова нічого не робить, тож відстеження по словах не спричиняє мерехтіння переглядуReadingWordColorіReadingWordFollowкерують кольором словесного курсора та тим, чи буде перегляд автоматично прокручувати озвучуване слово в поле зору
Version 1.55.2
Виправлено
- ViewerInteractionLab тепер виділяє рядкам toolbar більше вертикального простору, тож елементи Open PDF, Create Sample, navigation, search і selection більше не накладаються один на одного при масштабованих шрифтах
Version 1.55.1
Виправлено
- ViewerInteractionLab тепер розміщує Prev, Next і Rotate в другому рядку toolbar, уникаючи початкового накладання з Open PDF і Create Sample
Version 1.55.0
Додано
- Місток від слова до виділення для читання формату "прочитай і виділи":
TPdfView.SelectWordBoxіSelectWordSpanвиділяють один word box або діапазон word box-ів на тій самій сторінці, узятий ізPageWordBoxes, за їхніми діапазонами символів, тож слово або рядок, що зараз читається, також можна виділити і скопіювати WordBoxIndexAtCharIndexзіставляє індекс символу назад із word box-ом, який його містить, забезпечуючи підсвічування слово за словом під час руху курсора читання TTS
Version 1.54.0
Додано
- Доступори для голосового заповнення форм, які читають фокусоване поле безпосередньо з логічного курсора:
FocusedFormFieldValue,FocusedFormFieldNameіFocusedFormFieldDetailsуTPdfтаTPdfViewповідомляють поточне значення поля, людинозрозумілу назву, тобто tooltip/TUз резервом на/T, і повнийTPdfFormFieldInfo, включно з type, flags та options, тобто все, що voice UI має оголосити, проходячи форму
Виправлено
FocusedFormFieldValueчитає поле черезFocusedFormFieldIndex, а не через інтерактивний focus pdfium, тож голосовий заповнювач форми отримує правильне значення навіть без видимого caret на екрані, при цьому наявнийFocusedFormFieldTextі далі відображає focus pdfium без змін
Version 1.53.0
Додано
- Підтримка підсвічування на рівні слів:
TPdf.PageWordBoxesіTPdfView.PageWordBoxesрозбивають сторінку на записиTPdfWordBox, кожен із текстом слова, його діапазоном символів і прямокутником межі в координатах сторінки, тож accessibility reader може по черзі підсвічувати кожне озвучуване слово, тобто в режимі "караоке", передаючи цей прямокутник уSetReadingHighlight BuildWordBoxesвідкриває крок токенізації як окремий API, перетворюючи текст сторінки на word box-и з діапазонами символів
Version 1.52.0
Додано
- Помічники рендерингу для користувачів зі слабким зором
InvertPdfBitmap,GrayscalePdfBitmapіDuotonePdfBitmapзастосовують перетворення кольору на місці до відрендереного 32-бітного bitmap, тож accessibility reader може показувати сторінки в інверсії, dark-mode, grayscale або у власній двоколірній схемі, наприклад темний фон зі світлим текстом, для користувачів із порушеннями зору - Ці перетворення працюють по пікселях і поводяться однаково у VCL та Lazarus/LCL, не змінюючи розміри bitmap
Version 1.51.0
Додано
- Одиниці читання на рівні речень для assistive listen-reading:
TPdf.ReadingUnits,TPdf.DocumentReadingUnitsіTPdfView.ReadingUnitsлінеаризують потік читабельного вмісту в упорядковані записиTPdfReadingUnitрозміром із речення, де кожен несе текст для озвучення, його semantic kind, сторінку, прямокутники підсвічування та language tag, тож screen-reader застосунок може проходити сторінку або весь документ по одній озвучуваній одиниці за раз - Семантична навігація через
NextReadingUnitOfKind, яка дає voice UI змогу перейти до наступного або попереднього heading, figure, list item чи table cell без ручного сканування потоку BuildReadingUnitsнапряму перетворює будь-якіTPdfContentFragmentsна одиниці читання: heading-и та figure/alt-описи лишаються цілісними, тоді як paragraph розбиваються на межах речень, десяткові крапки зберігаються, а курсор читання є звичайним індексом, яким володіє викликач
Version 1.50.0
Додано
ValidatePdfAтепер може перевіряти документи PDF 1.5+, які зберігають catalog, OutputIntent або інші словники всередині стиснених object stream, тобто/Type /ObjStm; object stream-и розпаковуються, а об’єкти всередині них розв’язуються, тож такі документи перевіряються за своїм реальним вмістом, а не помилково позначаються як такі, що не мають PDF/A marker
Version 1.49.5
Виправлено
ValidatePdfAбільше не вважає відсутність описуpdfaExtension:schemasпроблемою. Схема ідентифікатора PDF/A, тобто pdfaid, є загальновідомою, тож ані veraPDF, ані PDF/A-2/-3 не вимагають для неї опису extension-schema, а позначення її відсутності раніше хибно повідомляло про проблему в кожному сторонньому PDF/A, що фактично відповідав стандарту. Документи, створені самою бібліотекою, усе ще містять цей опис
Version 1.49.4
Виправлено
ValidatePdfAтепер визначає рівень відповідності, коли ідентифікатор PDF/A записано як XML-атрибути, тобтоpdfaid:part="2", а не як дочірні елементи, тож документи в attribute-form більше не отримують невідомий рівень. Це також виправляє каскадну проблему, за якої невизначений рівень змушував перевірки конкретної частини повертатися до суворих правил PDF/A-1 і хибно позначати вкладені файли та прозорість, які PDF/A-2 і PDF/A-3 дозволяють
Version 1.49.3
Виправлено
ValidatePdfAтепер перевіряє документи PDF 1.5+, у яких дані cross-reference збережено як cross-reference stream, тобто файли без ключового словаtrailer. Рівень відповідності, trailer/IDта інші marker-и тепер читаються зі словника cross-reference stream, тож такі документи перевіряються за фактичними властивостями, а не позначаються як повністю невідповідні
Version 1.49.2
Виправлено
ValidatePdfAбільше не повідомляє про хибну проблему з не вбудованими шрифтами в документах, які насправді вбудовують усі свої шрифти. Попередня евристика порівнювала кількість токенів/FontDescriptorіз кількістю вбудованих шрифтових програм, але кожен вбудований шрифт дає два токени/FontDescriptor, посилання зі словника шрифту і сам descriptor object, тож кожен файл із вбудованими шрифтами хибно позначався проблемним. Тепер перевірка повідомляє лише про документ, який посилається на шрифти, але не вбудовує жодної шрифтової програми, що узгоджується з відповідним виправленням уValidatePdfUa
Version 1.49.1
Виправлено
- Вивід PDF/A тепер проходить перевірку veraPDF як сумісний із PDF/A-1b і PDF/A-1a: вбудований stream ICC profile sRGB OutputIntent, на який посилається
/DestOutputProfile, тепер оголошує потрібну кількість компонентів/N, тобто 3 для вбудованого RGB profile, як того вимагає ISO 19005-1 6.2.3.2. Документи, створені черезSaveAsPdfA, раніше провалювали сувору перевірку PDF/A-1, бо stream profile призначення пропускав/N; значення тепер виводиться із заголовка ICC profile, тож і CMYK або Gray profile, переданий викликачем, також отримує правильний лічильник
Version 1.49.0
Виправлено
ValidatePdfUaбільше не повідомляє про хибну відсутність XMP-ідентифікації в коректних тегованих PDF: ідентифікатор PDF/UA, тобтоpdfuaid:part,dc:title, дати XMP та trailer/IDтепер читаються з оригінальних байтів документа, а не з повторно збереженої копії, яка пропускає stream XMP/Metadata, а для файлів із cross-reference stream ще й trailer/ID- Перевірку вбудованих шрифтів у
ValidatePdfUaвиправлено так, що документ, який вбудовує всі свої шрифти, більше не позначається як такий, що має не вбудовані шрифти; тепер зауваження з’являється лише для документа, який посилається на шрифти, але не вбудовує жодної шрифтової програми ValidatePdfUaтепер приймає елемент структуриFormula, альтернативний текст якого подано черезActualText, а не через записAlt, відповідно до ISO 14289-1 §7.7 і узгоджено з наявним правилом дляFigure
Version 1.48.0
Додано
- Програмне виділення тексту в
TPdfView:SelectTextRange, за сторінкою та діапазоном символів, іSetSelection, за явними діапазонами по сторінках, дають змогу виділяти текст із коду, наприклад для читання й підсвічування уривка; обидва методи перемальовують вигляд і викликаютьOnSelectionChangeпри зміні виділення.SelectionRangesчитає поточне виділення як посимвольні діапазони по сторінках, аSelectionRectanglesповертає його прямокутники в координатах сторінки для власного підсвічування або scroll-to
Version 1.47.0
Додано
- Навігація по form field для голосового заповнення форми, і в
TPdf, і вTPdfView:FormFieldTabOrder,FocusedFormFieldIndex,FocusFormField,FocusNextFormField,FocusPreviousFormField,ClearFormFieldFocusіFocusedFormFieldText. Вони переміщують логічний курсор полів по widget field поточної сторінки в tab order із зацикленням на краях, тож assistive reader може пройти форму, оголосити кожне поле черезFormFieldInfo[Index].AlternateName, тобто tooltip /TU, і заповнити його черезFormField[Index] - Подія
TPdfView.OnFormFieldFocusChange, яка спрацьовує, коли рухається курсор поля, передаючи новий індекс поля або -1 після очищення
Version 1.46.0
Додано
- Потік вмісту для assistive listen-reading:
TPdf.ReadableContent,TPdf.ReadablePageContent,TPdf.DocumentReadableContentіTPdfView.ReadableContentповертають упорядкований список семантичних елементівTPdfContentFragment, де кожен містить текст для озвучення, тобто реальні glyph абоActualText/Alt для figure, тип фрагмента, наприклад heading із рівнем, paragraph, figure, list item, table cell, link або plain, мову, номер сторінки від 1 і прямокутники підсвічування блоку та окремих рядків. Tagged PDF лінеаризуються в логічному порядку читання зі structure tree; для untagged pages використовується render order, тож читання вголос можливе для будь-якого документа - Синхронізоване підсвічування читання в
TPdfView:SetReadingHighlight,ClearReadingHighlightі published-властивістьReadingHighlightColorпідсвічують блок, що зараз читається, поверх накладок пошуку й виділення - Нові публічні типи
TPdfContentFragment,TPdfContentFragments,TPdfReadableContent,TPdfContentFragmentKindіTPdfReadingOrderSource, а також новий helperClassifyStructType
Version 1.45.0
Додано
ValidatePdfUaтепер також проходить живе tagged structure tree і повідомляє про три високодостовірні порушення вмісту, які неможливо виявити байтовим скануванням: елементFigureбез запису Alt і без ActualText, ISO 14289-1, 7.3, елементFormulaбез атрибута Alt, 7.7, та елементNoteбез унікального ID, 7.9. Для цього додано три нові значенняTPdfUaValidationIssue:pvuaiFigureMissingAlt,pvuaiFormulaMissingAltіpvuaiNoteMissingId. Для untagged documents обхід дерева пропускається- Новий публічний helper
ValidatePdfUaStructureElementsзастосовує ці правила structure tree до плаского списку елементів, якого повертаєTPdf.StructureElements, тож перевірки можна запускати й unit-тестувати без завантаження повного документа
Version 1.44.5
Виправлено
- Перевірка вбудовування шрифтів у
ValidatePdfA, тобтоpvaiFontNotEmbeddedза ISO 19005-1, 6.3.4, тепер також виявляє не вбудовані simple font, які не мають/FontDescriptor, насамперед 14 стандартних шрифтів Type 1, таких як Helvetica, Times, Courier тощо, які PDF/A вимагає вбудовувати без жодних винятків. Раніше такий шрифт залишався непоміченим; тепер перевірка також зіставляє словники simple font/Type1,/TrueTypeі/MMType1з вбудованими шрифтовими програмами, віддзеркалюючи виправлення PDF/UA з 1.44.3
Version 1.44.4
Виправлено
ValidatePdfVTтепер відхиляє некоректні дерева DPart за ISO 16612-2 §6.5, де/DPartsє пласким масивом посилань замість обов’язкового масиву масивів, або де листовий DPart повторює свою сторінку/Startяк/End, хоча діапазон містить лише одну сторінкуValidatePdfVTтепер перевіряє імена/NodeNameListяк XML NMTOKEN після розгортання escape-послідовностей PDF name#xx, тож некоректні назви рівнів ієрархії повідомляються черезpvviMissingDPartRootзамість того, щоб прийматися як придатна структура DPart
Version 1.44.3
Виправлено
- Перевірка вбудовування шрифтів у
ValidatePdfUa, тобтоpvuaiFontNotEmbeddedза ISO 14289-1, 7.21.4, тепер також виявляє не вбудовані simple font без/FontDescriptor, насамперед 14 стандартних шрифтів Type 1, таких як Helvetica, Times, Courier тощо, для яких PDF/UA не дає жодного винятку щодо вбудовування. Раніше такий шрифт залишався непоміченим, і документ, що його використовував, міг бути помилково визнаний сумісним; тепер перевірка також зіставляє словники simple font/Type1,/TrueTypeі/MMType1з вбудованими шрифтовими програмами
Version 1.44.2
Виправлено
ValidatePdfVTтепер залишає наявний, але нерозпізнаний маркерpdfvtid:GTS_PDFVTVersionякpvcUnknownзамість зниження доpvcNone. Це дає змогу відрізняти некоректні рядки файлового рівня, як-отPDF/VT-2s, від документів без маркера PDF/VT; PDF/VT-2s визначається заголовком MIME stream в ISO 16612-2 Annex A, а не XMP-маркером PDF-файла- Перевірка
/DPartRootтепер суворіше валідовує семантику дерева ISO 16612-2 §6.5:/DPartRootNodeі/NodeNameListмають описувати фактичну глибину DPart, батьківські зв’язки DPart мають утворювати дерево,/Startі/DPartsє взаємовиключними, а кожен сторінковий/DPartмає вказувати на листовий DPart, що його покриває, у тому самому порядку depth-first, що й дерево сторінок
Version 1.44.1
Виправлено
SaveAsPdfVTтепер записує мінімальну Document Part Hierarchy за ISO 16612-2 §6.5, коли у вихідному PDF немає придатного/DPartRoot. Згенероване дерево пов’язує кожну сторінку через/DPart, зберігає наявну коректну ієрархію та лишає багатші метадані recipient/DPM на рівні викликаного workflowValidatePdfVTтепер перевіряє придатну структуру DPart, читає значення PDF/VT XMP як з RDF-атрибутів, так і з тексту елементів, і суворо дотримується точного базового зіставлення PDF/VT до PDF/X: PDF/VT-1 вимагає PDF/X-4, тоді як PDF/VT-2 вимагає PDF/X-4p, PDF/X-5g або PDF/X-5pgTPdfVTSaveOptions.Conformance = pvc2більше не записує некоректні marker-и PDF/VT-2 для одного файла. Однофайловий записувач нормалізує вивід до PDF/VT-1, оскільки PDF/VT-2 вимагає семантики file-set
Version 1.44.0
Додано
ValidatePdfUaтепер, окрім marker-ів файлового формату, повідомляє й про порушення PDF/UA на рівні вмісту, які можна перевірити по байтах: шрифтову програму, що не вбудована, ISO 14289-1, 7.21.4, шрифт без/ToUnicodeCMap, коли немає дозволеного simple-font encoding, 7.21.7, і документ з анотаціями, який не оголошує порядок табуляції сторінки/Tabs /S, 7.18.3- Три нові значення
TPdfUaValidationIssue, а самеpvuaiFontNotEmbedded,pvuaiFontMissingToUnicodeіpvuaiMissingTabsOrder, тепер повертаються черезValidatePdfUaі в preflight report. Це грубі евристики, призначені як preflight-підказки, а не як повна перевірка ISO 14289-1
Version 1.43.1
Виправлено
SaveAsPdfUaтепер примусово забезпечує обов’язкові записи каталогу ISO 14289-1, 7.1, а саме/ViewerPreferences/DisplayDocTitle trueі/MarkInfo/Marked true/Suspects false, навіть якщо вихідний документ уже містить ці словники з відсутніми або суперечливими значеннями. Раніше marker-и вставлялися лише коли словники були відсутні повністю, тож джерело, що містило, наприклад,/ViewerPreferencesбезDisplayDocTitleабо/MarkInfoз/Marked false, повторно зберігалося як невідповідний файл- Наявні ключі в уже існуючому словнику
/ViewerPreferencesабо/MarkInfoзберігаються, а словник, поданий як непряме посилання, попередньо розв’язується до застосування обов’язкових ключів
Version 1.43.0
Додано
ValidatePdfAтепер застосовує правила PDF/A-2 і PDF/A-3 для вбудованих та асоційованих файлів, а також для тексту Level U. Вбудовані файли, як і раніше, відхиляються для PDF/A-1; для PDF/A-3 позначається вбудований файл без обов’язкового ключа/AFRelationship, ISO 19005-3 Annex E, тоді як вкладення PDF/A-2 дозволені, хоч їхня власна відповідність рекурсивно не перевіряється. Нова проблемаpvaiUnicodeMappingMissingповідомляє про документ PDF/A-2u або PDF/A-3u, чиї шрифти не мають зіставлення/ToUnicode, ISO 19005-2 6.2.11.7. Прозорість і 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 рівня u немає. Під час збереження записуються відповідніpdfaid:part, 2 або 3, іpdfaid:conformance, A, B або U, зі збереженням підтипу OutputIntentGTS_PDFA1, який ISO 19005-2 лишає для сумісності. Запит на Level A, як і раніше, знижується до відповідного Level B для будь-якої частини, якщо документ не має потрібної для цього рівня tagged structure
Version 1.41.0
Додано
ValidatePdfAтепер виявляє порушення PDF/A на рівні вмісту, які не можна виправити вставленням marker-ів, додатково до структурних marker-ів, про які він уже звітував: JavaScript та інші заборонені дії, additional-actions, тобто/AA, вбудовані файли,LZWDecode, прозорість, включно з soft mask і transparency group, optional content, тобто/OCProperties, заборонені підтипи анотацій, FileAttachment, Sound, Movie, 3D і Screen, AcroForm/NeedAppearances trueта/XFA, шрифти, descriptor яких не містить вбудованої шрифтової програми, і заяву про Level A без tagged structure, потрібної ISO 19005-1 6.8. Перевірки прозорості, optional content і вбудованих файлів застосовуються лише до PDF/A-1, бо в PDF/A-2 і PDF/A-3 ці можливості дозволені. Для кожного випадку додано нові значенняTPdfAValidationIssue; наявні значення не змінено
Version 1.40.3
Виправлено
SaveAsPdfAтепер прибирає будь-яке шифрування вихідного документа перед створенням PDF/A. ISO 19005-1 6.1.3 забороняє ключ trailer/Encrypt, але шлях збереження раніше зберігав security handler джерела, тож збереження зашифрованого документа як PDF/A давало зашифрований невідповідний файл. Тепер збереження PDF/A спершу розшифровує документ. Не зашифровані документи не зачіпаються
Version 1.40.2
Виправлено
SaveAsPdfAбільше не видає хибну заяву про відповідність PDF/A Level A. Коли запитується Level A, тобтоpac1a, але вихідний документ не має marker-ів tagged structure, яких вимагає ISO 19005-1 6.8, а саме/StructTreeRootу catalog і словника/MarkInfoз/Marked true, збережений файл тепер позначається як відповідний Level B, тобтоpdfaid:conformance=B, замість заяви про Level A. Суто візуальний вивід PDF/A-1b цим не зачіпається
Version 1.40.1
Виправлено
- Посилено перевірку відповідності версії PDF так, щоб дія
SetOCGState, тобто set-optional-content-group-state, розпізнавалася як можливість PDF 1.5. Збереження у цільовий PDF 1.2, 1.3 або 1.4, який містить діюSetOCGState, тепер відхиляється відповідно до ISO 32000-1, Table 198; раніше така дія могла пройти у вивід нижчої версії. Окрема застаріла дія PDF 1.2SetStateі далі приймається, починаючи з PDF 1.2
Version 1.40.0
Додано
- Прив’язано upstream API
FPDFPageObj_AddExistingMark(), який приєднує наявну content mark до page object. Коли послідовні page object мають спільний той самий mark, збережений PDF згортає їх в один mark, що охоплює всі ці об’єкти; непослідовні об’єкти отримують окремі копії - Прив’язано upstream API
FPDFTextObj_SetFontSize()для зміни розміру шрифту в пунктах у вже наявному text object, на додачу до вже існуючої прив’язкиFPDFTextObj_GetFontSize()
Змінено
- Оновлено комплектні runtime DLL PDFium, Win32 і Win64, стандартні та V8-збірки, до upstream snapshot від 2026-06-02
Version 1.39.53
Змінено
- Змінено демо Delphi
PDFViewer,SplitViewіMultiPageViewerтак, щоб вони типово відкривали документи в режиміZoom to Page - Початковий рендеринг тепер уміщує всю сторінку в область перегляду ще до того, як користувач вибере ручний рівень масштабування
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.53
Version 1.39.52
Змінено
- Покращено
Demo\Lazarus\CreatePDFтак, що вступний приклад тепер генерує двосторінковий PDF із vector path, вмістом таблиці, вбудованим зображенням, текстовою анотацією, повернутим текстом і зрозумілішим покроковим поясненням побудови документа - Додано відшліфовані сторінки
README.htmlдля кожної демо-теки Delphi, C++Builder і Lazarus, замінивши решту суто текстових demo README на guide, зручний для перегляду в браузері - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.52
Version 1.39.51
- Покращено пакетні зведення
Demo\Delphi\PreflightReportCli, додавши підсумки стандартних статусів для Pass, Action required і Review у межах вибраних стандартів - Рядки по окремих файлах тепер містять кількість action-required і review у підсумках TXT / HTML / JSON / CSV, що полегшує перевірку CI artifacts без відкриття кожного згенерованого звіту
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.51
Version 1.39.50
- Покращено режим пакетної обробки каталогів у
Demo\Delphi\PreflightReportCliтак, щоbatchdir=folderзбирає знайдені шляхи до PDF, сортує їх, а потім генерує звіти у стабільному порядку - Рекурсивне сканування каталогів тепер дає відтворюваний порядок звітів і рядків зведення, тоді як явна обробка через
batch=list.txtі далі зберігає порядок із файла списку - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.50
Version 1.39.49
- Покращено пакетні зведення
Demo\Delphi\PreflightReportCli, щоб вони фіксували налаштування запуску: тип джерела, шлях до джерела, рекурсивний стан, каталог виводу, формат звіту, вибрані стандарти та режимfailon= - Підсумки JSON тепер містять об’єкт
run, зведення TXT і HTML показують секцію параметрів запуску, а рядки CSV повторюють ті самі колонки аудиту для spreadsheet та CI pipeline - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.49
Version 1.39.48
- Покращено іменування пакетного виводу в
Demo\Delphi\PreflightReportCli, тож дубльовані назви вхідних файлів у спільномуoutdir=більше не перезаписують згенеровані звіти один одного - Пакетні запуски тепер додають суфікси
-2,-3і далі, коли шлях до згенерованого звіту вже було призначено в тому самому запуску, а зведення фіксують фінальний collision-safe шлях звіту - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.48
Version 1.39.47
- Покращено пакетні зведення
Demo\Delphi\PreflightReportCliтак, що вивід TXT і JSON тепер містить агреговані підсумки для загальної кількості файлів, оброблених файлів, файлів із помилками, проблем і збігів за правиломfailon= - Зведення CSV лишаються суто таблицею рядків для наявних споживачів, тоді як зведення HTML і надалі показують ті самі агреговані метрики в заголовку dashboard
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.47
Version 1.39.46
- Покращено
Demo\Delphi\PreflightReportCliчерезsummary=batch.html/.htm, щоб пакетні запуски могли створювати dashboard для браузера поряд із manifest-файлами TXT / CSV / JSON - HTML-зведення показують метрики total, processed, failed, issue і збігів
failon=, а потім перелічують кожен вхід із посиланнями на звіт, статусом, лічильниками та текстом помилки - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.46
Version 1.39.45
- Покращено
Demo\Delphi\PreflightReportCliпідтримкоюbatchdir=folderіrecursive, щоб скрипти могли сканувати теки PDF напряму без попереднього створення файла списку - Режим пакетної обробки каталогів повторно використовує поведінку
outdir=,summary=,standards=іfailon=із режиму списку, тоді як не рекурсивний режим сканує лише вибрану теку, аrecursiveохоплює підтеки - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.45
Version 1.39.44
- Покращено
Demo\Delphi\PreflightReportCliчерезsummary=batch.csv|json|txt, щоб пакетні запуски могли створювати machine-readable manifest поряд зі звітами по окремих файлах - Пакетні зведення містять шлях до кожного входу, шлях до звіту, статус, кількість стандартів, кількість проходжень, кількість проблем, стан збігу
failon=і текст помилки для CI job та зовнішніх скриптів - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.44
Version 1.39.43
- Покращено
Demo\Delphi\PreflightReportCliчерезbatch=list.txtіoutdir=reports, щоб скрипти могли за один запуск генерувати preflight-звіти для списку PDF-файлів - Пакетний режим пропускає порожні рядки та рядки коментарів
#, виводить кожну назву звіту.preflight.<ext>із вхідного PDF, продовжує роботу після помилок окремих файлів і перед завершенням підсумовує оброблені та помилкові файли - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.43
Version 1.39.42
- Покращено
Demo\Delphi\PreflightReportCliчерезfailon=none|issues|action|review, щоб CI job могли перетворювати згенеровані результати preflight на детерміновані коди виходу - CLI тепер повертає код виходу 2, коли вибране правило
failon=спрацьовує після створення файла звіту й необов’язкового PDF із прикріпленим звітом, тоді як runtime-помилки й далі повертають код 1 - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.42
Version 1.39.41
- Покращено
Demo\Delphi\PreflightReportCliчерезattach=output.pdf, щоб згенерований preflight-звіт можна було вбудувати як вкладення рівня документа в нову копію PDF - CLI зберігає згенерований файл звіту TXT / HTML / Markdown / JSON / CSV на диску й відмовляється прикріплювати його назад до шляху оригінального вхідного PDF, зменшуючи ризик випадкового перезапису
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.41
Version 1.39.40
- Додано
Demo\Delphi\PreflightReportCli, консольний компаньйон Delphi для скриптованого створенняFPdfPreflightReportбез відкриття viewer - CLI підтримує створення зразка без аргументів, вхідні та вихідні аргументи, необов’язковий пароль, формати виводу
text/html/md/json/csvі фільтраціюstandards=для PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R і PDF/VT - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.40
Version 1.39.39
- Покращено
FPdfPreflightReportчерезTPdfPreflightReport.ToMarkdownіSaveMarkdownToFile, щоб preflight-звіти можна було експортувати як Markdown, зручний для issue tracker - Оновлено зразки
PreflightReportдля Delphi, C++Builder і Lazarus, додавши перемикання попереднього перегляду Markdown та дії Save MD поряд із наявним workflow TXT / HTML / JSON / CSV - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.39
Version 1.39.38
- Покращено зразки
SecurityAuditдля Delphi, C++Builder і Lazarus, додавши експорт JSON audit report поряд із наявним workflow збереження або копіювання TXT - JSON-звіт містить
format,generatedAt,summary,findingCountі структуровані рядкиfindingsз полями severity, area і detail - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.38
Version 1.39.37
- Покращено
FPdfPreflightReportчерезTPdfPreflightReport.ToCsvіSaveCsvToFile, щоб preflight-звіти можна було експортувати як CSV, зручний для spreadsheet - Оновлено зразки
PreflightReportдля Delphi, C++Builder і Lazarus, додавши перемикання попереднього перегляду CSV та дії Save CSV поряд із наявним workflow TXT / HTML / JSON - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.37
Version 1.39.36
- Покращено
FPdfPreflightReportчерезTPdfPreflightReport.IssueCategoryCountsта повторно використовувані типиTPdfPreflightIssueCategoryCountіTPdfPreflightIssueCategoryCountsдля агрегування marker-level проблем за категоріями - Оновлено
TPdfPreflightReport.ToText,ToHtmlіToJson, щоб згенерований вивід PreflightReport містив підсумки кількості проблем за категоріями поряд із рядками по стандартах і детальними рекомендаціями щодо проблем - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.36
Version 1.39.35
- Перейменовано розширений зразок
PrintDialogнаPrintPreferencesу Delphi, C++Builder і Lazarus, щоб назва демо відповідала workflow авторських параметрів друку PDF, N-up printing, фільтрації odd / even, grayscale, меж осередків і duplex mapping - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.35
Version 1.39.34
- Покращено
Demo\Delphi\PrintPDF, додавши завантаження PDF через drag-and-drop, і задокументовано наявний workflowDemo\CBuilder\PrintPDFпоряд із зразками PrintPDF для Delphi та Lazarus - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.34
Version 1.39.33
- Додано
Demo\CBuilder\SplitView, завершивши матрицю зразків SplitView для Delphi, C++Builder і Lazarus - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.33
Version 1.39.32
- Додано
Demo\Lazarus\SplitView, яке приносить до Lazarus порівняння PDF поруч із дво- або трипанельними макетами, навігацією активного перегляду, синхронізованими командами, пресетами масштабу та обертанням - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.32
Version 1.39.31
- Додано
Demo\Lazarus\PrintPDF, яке приносить до Lazarus стандартний workflow друку PDF з навігацією попереднього перегляду, діапазонами сторінок, копіями, режимом collate, індикатором прогресу та скасуванням - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.31
Version 1.39.30
- Додано
Demo\Lazarus\FontProperties, завершивши матрицю зразків FontProperties для Delphi, C++Builder і Lazarus - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.30
Version 1.39.29
- Додано
Demo\CBuilder\FontProperties, яке приносить до C++Builder перегляд індексованих метаданих символів і шрифтів поряд із зразком Delphi - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.29
Version 1.39.28
- Додано
Demo\Delphi\ExtractTextPages, завершивши матрицю зразків вилучення тексту по сторінках для Delphi, C++Builder і Lazarus - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.28
Version 1.39.27
- Додано
Demo\Lazarus\PrintDialog, завершивши матрицю зразків PrintDialog для Delphi, C++Builder і Lazarus - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.27
Version 1.39.26
- Додано
Demo\CBuilder\PrintDialog, яке приносить до C++Builder workflow друку N-up і авторських параметрів друку PDF поряд зі зразком Delphi - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.26
Version 1.39.25
- Додано
Demo\CBuilder\ViewerInteractionLab, завершивши матрицю зразків ViewerInteractionLab для Delphi, C++Builder і Lazarus - Оновлено workflow складання бібліотеки та виходи пакета Win64 C++Builder, щоб методи взаємодії viewer у
TPdfViewкоректно лінкувалися в демо Win64 - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.25
Version 1.39.24
- Додано
Demo\Lazarus\ViewerInteractionLab, яке приносить до Lazarus сфокусований workflow взаємодії з viewer поряд зі зразком Delphi - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.24
Version 1.39.23
- Додано
Demo\Lazarus\SearchAndSelect, завершивши матрицю зразків SearchAndSelect для Delphi, C++Builder і Lazarus - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.23
Version 1.39.22
- Додано
Demo\CBuilder\ContentExtractionLabіDemo\Lazarus\ContentExtractionLab, які приносять workflow багатокатегорійного вилучення вмісту до всіх підтримуваних demo IDE - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.22
Version 1.39.21
- Покращено
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportіDemo\CBuilder\PreflightReport, додавши селектор формату попереднього перегляду, щоб користувачі могли перевірити text або JSON output перед збереженням звітів - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.21
Version 1.39.20
- Додано експорт JSON у
FPdfPreflightReportчерезTPdfPreflightReport.ToJsonіSaveJsonToFile, який формує machine-readable зведення, статуси й пріоритети по стандартах, наступні дії та деталі проблем - Оновлено
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportіDemo\CBuilder\PreflightReport, додавши дії Save JSON поряд з експортом TXT / HTML - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.20
Version 1.39.19
- Покращено
FPdfPreflightReport, додавшиTPdfPreflightStatus, категорії проблем, пріоритет по стандартах і підказки щодо наступних дій у звітах TXT / HTML - Оновлено
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportіDemo\CBuilder\PreflightReport, щоб у підсумковій сітці показувати статус, пріоритет, кількість проблем і наступну дію - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.19
Version 1.39.18
- Додано
Demo\Lazarus\SecurityAudit, завершивши матрицю демо для Delphi, C++Builder і Lazarus щодо read-only workflow аудиту поверхні ризику PDF - Зразок Lazarus перелічує permissions, attachments, дії JavaScript, URI / Launch link annotation, web links, signature, стан XFA, доступність V8 / XFA helper і callback непідтримуваних можливостей, а потім зберігає або копіює список знахідок як TXT-звіт
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.18
Version 1.39.17
- Додано
Demo\CBuilder\SecurityAudit, яке приносить до C++Builder read-only workflow аудиту поверхні ризику PDF поряд із наявним зразком Delphi - Зразок C++Builder перелічує permissions, attachments, дії JavaScript, URI / Launch link annotation, web links, signature, стан XFA, доступність V8 / XFA helper і callback непідтримуваних можливостей, а потім зберігає або копіює список знахідок як TXT-звіт
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.17
Version 1.39.16
- Додано
Demo\CBuilder\SearchAndSelect, яке приносить до C++Builder автономний workflow viewer SearchAndSelect поряд із наявним зразком Delphi - Зразок C++Builder створює або відкриває PDF, показує збіги на всіх сторінках із попереднім переглядом номера сторінки та індексу символу, підтримує навігацію Previous / Next і перехід подвійним клацанням, а також підсвічує збіги на поточній сторінці через
HighlightSearchText - Він також відкриває
AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboard,ClearSelection,OnSelectionChangeі параметри розворотногоDisplayMode; метадані версії тепер показують 1.39.16
Version 1.39.15
- Додано
Demo\CBuilder\WatermarkStamp, завершивши матрицю демо Delphi, Lazarus і C++Builder для повторно використовуваних workflow watermark і stamp на основі Form XObject - Зразок C++Builder створює цільові PDF і PDF зі stamp, повторно використовує сторінку stamp через
CreateXObjectFromPage, застосовує перетворенняTPdfMatrixі зберігає центровані watermark, кутові stamp та мітки номерів сторінок - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.15
Version 1.39.14
- Додано
Demo\Lazarus\WatermarkStamp, яке приносить до Lazarus повторно використовуваний workflow watermark і stamp на основі Form XObject - Зразок Lazarus створює цільові PDF і PDF зі stamp, повторно використовує сторінку stamp через
CreateXObjectFromPage, застосовує перетворенняTPdfMatrixі зберігає центровані watermark, кутові stamp та мітки номерів сторінок - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.14
Version 1.39.13
- Додано
Demo\CBuilder\PreflightReport, завершивши матрицю демо Delphi, Lazarus і C++Builder для повторно використовуваного workflowFPdfPreflightReport - Зразок C++Builder використовує
FPdfPreflightReport.hppдля створення зведень по стандартах, попереднього перегляду TXT-звіту, файлів звітів TXT / HTML і поведінки Open Last Report - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.13
Version 1.39.12
- Додано
Demo\Lazarus\PreflightReport, яке приносить до Lazarus workflow preflight-звітування для PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R і PDF/VT - Зразок Lazarus може відкривати або створювати PDF, вибирати цільові стандарти, переглядати рядки зведення й TXT output звіту, зберігати звіти TXT / HTML і відкривати останній збережений звіт
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.12
Version 1.39.11
- Покращено
Demo\Delphi\SearchAndSelect, додавши список результатів пошуку по всіх сторінках, який зберігає номер сторінки, індекс символу та текст попереднього перегляду - Додано навігацію по збігах Previous / Next і перехід до результату подвійним клацанням зі збереженням поточної поведінки
HighlightSearchTextна активній сторінці - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.11
Version 1.39.10
- Покращено
Demo\Delphi\SecurityAudit, додавши дії Save Report і Copy Report, які експортують поточне зведення та рядки знахідок як TXT audit report - Демо тепер очищає стан експорту звіту під час скидання панелі аудиту, зберігаючи узгодженість скопійованих або збережених звітів із видимими знахідками
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.10
Version 1.39.9
- Покращено
Demo\Delphi\ContentExtractionLab, додавши збереження вихідного PDF, копіювання звіту до буфера обміну та дії вибору всіх / жодної категорії - Демо тепер анулює поточний звіт при зміні вибору категорій, тож експорт TXT / JSON відображає видимий обсяг вилучення
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.9
Version 1.39.8
- Додано
Demo\Delphi\ContentExtractionLab, уніфікований зразок workflow вилучення вмісту для метаданих документа, тексту сторінки, page object, зображень, вкладень, посилань, анотацій, закладок і метрик шрифтів / символів - Зразок може відкривати наявний PDF або створювати синтетичний PDF із текстом, зображенням, вкладенням і вмістом анотацій, а потім формувати рядки зведення та докладні звіти TXT / JSON
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.8
Version 1.39.7
- Додано
Lib\FPdfPreflightReport.pas, повторно використовуваний помічник звітів, який об’єднуєValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRіValidatePdfVTв один об’єктTPdfPreflightReport - Додано
Demo\Delphi\PreflightReport, зразок workflow, який відкриває або створює PDF, вибирає цільові стандарти, переглядає рядки зведення та рекомендації щодо проблем і зберігає звіти TXT або HTML - Згенеровані звіти явно описують вбудовану межу перевірки на рівні marker-ів, щоб застосунки могли за потреби поєднувати їх із спеціалізованими content-level preflight tools
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus, списки package project і метадані версії інсталятора до 1.39.7
Version 1.39.6
- Додано
Demo\Delphi\SearchAndSelect, сфокусований зразок workflow viewer для підсвічування пошуку, виділення тексту, попереднього перегляду вибраного тексту, копіювання, очищення та режимів відображення розвороту - Приклад демонструє
HighlightSearchText, параметри пошуку з урахуванням регістру / за цілим словом,AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboardіClearSelectionбез додавання нового API бібліотеки - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.6
Version 1.39.5
- Розширено
Demo\Delphi\ViewerInteractionLabдо зразка UX viewer у стилі SearchAndSelect ізHighlightSearchText, параметрами match-case / whole-word, попереднім переглядом вибраного тексту та наявними засобами виділення / буфера обміну - Розширено
Demo\Delphi\PrintDialogдля перегляду авторських параметрів друку PDF:PrintCopies,PrintPageRanges,PrintScaling,PrintPaperHandlingі видимого duplex mapping черезSetPdfPrintPaperHandlingDevMode - Додано
Demo\Delphi\SecurityAudit, read-only зразок поверхні ризику, який перелічує permissions, attachments, JavaScript документа, URI / Launch links, web links, signature, стан XFA та доступність V8 / XFA helper - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.5
Version 1.39.4
- Додано
Demo\CBuilder\ImageToPDFіDemo\Lazarus\ImageToPDF, завершивши матрицю зразків ImageToPDF для Delphi, C++Builder і Lazarus - Нові зразки демонструють вибір кількох зображень, попередній перегляд вибраного зображення, одну сторінку PDF на кожне зображення, розмір сторінки A4 portrait / landscape, центроване масштабування зображення, прогрес по кожному зображенню та відкриття згенерованого PDF після збереження
- Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.4
Version 1.39.3
- Додано
Demo\CBuilder\BatchExport, яке приносить до C++Builder workflow експорту кількох PDF у JPG поряд із наявними зразками Delphi та Lazarus - Приклад демонструє
LoadCustomDocument,IPdfCancellationTokenSource, потокове введення зTFileStream, прогрес для кожного файла й кожної сторінки, обробку скасування, введення DPI / якості / пароля та відкриття папки виводу після завершення - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.3
Version 1.39.2
- Додано
Demo\Delphi\WatermarkStamp, працездатний зразок workflow Form XObject, який створює цільовий PDF і PDF зі stamp для повторного використання, а потім застосовує центровані watermark, stamp у правому верхньому куті та мітки номерів сторінок на кожній сторінці - Приклад демонструє
CreateXObjectFromPage,InsertFormObjectFromXObject,TPdfMatrixіFPDFPageObj_SetMatrixбез додавання нового API бібліотеки - Оновлено
Docs\en-us\Examples.html, щоб використовувати актуальний шаблонTPdfMatrix.Handleпід час передавання матриць доFPDFPageObj_SetMatrix - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.2
Version 1.39.1
- Додано
Demo\Delphi\ViewerInteractionLab, сфокусований зразокTPdfViewдля режимів відображення, fit mode, кольорів сторінки, обертання, користувацького вибору тексту, дій буфера обміну та зворотного зв’язку по координатахDeviceToPage - Додано
Demo\CBuilder\StandardsLab/Demo\Lazarus\StandardsLab, щоб користувачі Lazarus могли запускати workflow валідації та marker-output для PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R і PDF/VT - Перелічено units стандартів у
Lib\37.0\PDFiumPas.dprojіLib\FPC\PDFiumLaz.lpkта виправлено складання демо DelphiSplitView, прибравши дубльований importWinapi.ShellAPI - Виправлено блокери пакетного складання демо Delphi в
BatchExport,PDFViewer,MultiPageViewerіSplitViewбез зміни їхньої runtime-поведінки - Виправлено сумісність пакетного складання демо C++Builder у
PDFViewerіMultiPageViewer, замінившиnullptrнаNULLдля поточного режиму проєкту - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.1
Version 1.39.0
- Додано
Demo\Delphi\StandardsLab, працездатний зразок workflow стандартів, який завантажує або створює PDF, запускаєValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRіValidatePdfVTта показує в одній сітці визначену відповідність, статус pass/fail і кількість проблем - Кнопки збереження StandardsLab викликають
SaveAsPdfA,SaveAsPdfUa,SaveAsPdfE,SaveAsPdfX,SaveAsPdfRіSaveAsPdfVT, роблячи marker-output стандартів PDF видимим без написання окремого harness - Оновлено
TPdf.AboutInfo, метадані пакета Lazarus і метадані версії інсталятора до 1.39.0
Version 1.38.0
- Накладки пошуку та виділення тексту в
TPdfViewтепер використовують справжнє alpha blending замість логічного малювання маскою, зберігаючи вміст сторінки під підсвічуванням - Додано
SetPdfPrintPaperHandlingDevModeдля відображенняTPrintPaperHandlingу значення WindowsDEVMODE.dmDuplex:DMDUP_SIMPLEX,DMDUP_HORIZONTALіDMDUP_VERTICAL TPdfView.SmoothScrollтепер анімує команди line/page scrollbar сегментами, керованими таймером; перетягування thumb лишається миттєвим- Оновлено
TPdf.AboutInfoі метадані версії інсталятора до 1.38.0
Version 1.37.0
TPdfтепер має власний render lock на екземпляр, який серіалізує шляхиRenderPage,RenderTile,RenderPageProgressive, повторного завантаження сторінки та вивантаження документа. Rendering із worker-thread через спільний компонент тепер став практичним, хоча застосунки й далі координують мутації документа та його життєвий цикл- Виправлено zero-copy wrapper для bitmap: він відхиляє bottom-up DIB-розкладки
TBitmapі перед копіюванням назад переходить на buffer, що належить PDFium, усуваючи збої stride-corruption / access-violation у VCL render tests - Посилено поведінку виділення в
TPdfView:AllowUserTextSelectionблокує лише користувацьке введення, API вибору на рівні коду й далі малюють виділення, аSelectAllслідує фактично видимому розвороту, тож cover page більше не вибирає сторінку 2. Відповідно розширено тести Delphi, Lazarus і C++Builder - Оновлено
TPdf.AboutInfoі метадані версії інсталятора до 1.37.0
Version 1.36.0
- Активовано вибір тексту користувачем у
TPdfView— властивістьAllowUserTextSelection, зарезервована у v1.17.0, тепер керує повним ланцюжком перетягування для виділення. Ліве клацання по символу тексту вмикає режим вибору (автовизначення hit-test); ліве клацання по порожній ділянці й далі панорамуватиме як і раніше. Віджет form-fill зберігає пріоритет, тож клацання по полю форми й надалі фокусується на полі, а не запускає виділення - Подвійне клацання виділяє слово, потрійне клацання виділяє рядок,
Ctrl+Aвиділяє поточну сторінку (обидві сторінки в режимах розвороту), аCtrl+Cкопіює виділення до буфера обміну Windows якCF_UNICODETEXT Shift+Left/Shift+Rightрозширює виділення на один символ за раз (із переходом на сусідню сторінку в режимі розвороту);Shift+Home/Shift+Endрозширює до візуального краю рядка, використовуючи висоту рамки початкового символу як допуск для кластера рядка, тож рядки зі змішаними розмірами шрифту лишаються згрупованими правильно- Наведення на текст змінює курсор на
crIBeam; наведення поза текстом відновлює типовий курсор. Поки триває перетягування для виділення тексту, потяг у мертву зону завширшки 20 пікселів на будь-якому краї переглядача вмикає автопрокрутку сторінки (такт 50 ms, 16 px / tick, з обмеженням тими самими межами, що використовує шлях панорамування), тож виділення може виходити за межі поточного вікна без попереднього відпускання миші - Перехресне виділення між сторінками працює в режимах розвороту (
dmTwoPageContinuous,dmTwoPageContinuousWithCover): перетягування, розпочате на лівій сторінці й завершене на правій, виділяє суцільний діапазон через обидві.SelectedTextпоєднує фрагменти кожної сторінки через CR/LF, тож текст після round-trip читається як звичайний багаторядковий вміст - Нова опублікована властивість
SelectionColor(типовоclHighlight, системний колір виділення Windows) — незалежна відHighlightColor, яка фарбує результати пошуку в жовтий. Підсвічування пошуку та активне виділення перетягуванням можуть одночасно відображатися на екрані без конфлікту кольорів - Нова опублікована подія
OnSelectionChangeспрацьовує щоразу, коли матеріалізовані діапазони виділення справді змінюються — ніколи під час повторного застосування без змін, тож програми-хости можуть напряму прив’язати її до тексту рядка стану або стану кнопки без дебаунсингу - Новий публічний API у
TPdfView:HasSelection,SelectionCharCount,SelectedText,ClearSelection,SelectAll,CopySelectionToClipboard. Це точки входу на рівні коду, і вони завжди працюють незалежно відAllowUserTextSelection— прапорець лише обмежує введення користувача (миша, Ctrl+C, Ctrl+A, Shift+arrows), тож kiosk-хости можуть вимкнути вибір, керований користувачем, і водночас будувати панельні кнопки "Select All / Copy", які викликають той самий API - Стандартне спливаюче меню
Copy/复制для правого кліка під’єднується автоматично, коли хост не призначив власнеPopupMenu— стандартний сценарій "виділити текст, клацнути правою кнопкою, скопіювати" працює з коробки. Підпис вибирається між англійською та китайською черезSysLocale.PriLangID; хости, яким потрібна повна локалізація (або багатше меню), просто призначають власнеPopupMenu, і стандартне меню вимикається - Виділення автоматично очищується під час
SetPdf,SetPageNumber,SetActive(False)та переходівDisplayMode, аOnSelectionChangeспрацьовує рівно один раз, коли попереднє виділення не було порожнім. Підсистема form-fill зберігає пріоритет — під час редагування поля форми всі клавіатурні скорочення для виділення відкладаються, щоб поле отримувалоCtrl+C/Ctrl+A/Shift+arrowsдля власного виділення - Розширено регресійні набори Delphi та Lazarus до 202 кейсів кожен, а набір C++Builder до 159 кейсів, із покриттям значень за замовчуванням, round-trip, поведінки public API, очищення під час змін стану, перетягування мишею (hit-text / hit-blank), click vs drag, перемикання курсора IBeam, подвійного клацання по слову, потрійного клацання по рядку, клавіатурних скорочень, під’єднання / відкладення / підпису стандартного popup, а також перехресного виділення через сторінку в режимі розвороту — включно з перевіркою round-trip буфера обміну CR/LF
Version 1.35.0
- Додано підтримку інʼєкції marker-ів PDF/VT, ISO 16612-2:2010: TPdf.SaveAsPdfVT підвищує поточний документ до файла, сумісного з PDF/VT-1 або PDF/VT-2, тобто підмножиною PDF для змінного й транзакційного друку. PDF/VT побудовано поверх PDF/X-4, а ISO 16612-2 §6.2.1 вимагає, щоб кожен файл PDF/VT-1 також відповідав PDF/X-4, тому інʼєктор записує повний набір marker-ів PDF/X-4, тобто XMP
pdfxid:GTS_PDFXVersion = "PDF/X-4", Info/GTS_PDFXVersion (PDF/X-4)і/Trapped, а також catalog/OutputIntents, що посилається на словник OutputIntent із вбудованим ICC profile, разом із властивостями, специфічними для PDF/VT - Специфічна для PDF/VT інʼєкція охоплює XMP
pdfvtid:GTS_PDFVTVersion, тобто "PDF/VT-1" або "PDF/VT-2" за §6.3 Table 2, іpdfvtid:GTS_PDFVTModDate, яке синхронізується зxmp:ModifyDateза §6.3 NOTE 1, а також опис pdfaExtension:schemas, що оголошує простори імен pdfxid і pdfvtid, тобто NPES URIhttp://www.npes.org/pdfx/ns/id/таhttp://www.npes.org/pdfvt/ns/id/. Trailer містить масив/ID - Додано TPdf.SaveAsPdfVTToStream для виводу PDF/VT у пам’ять і скорочений запис з параметрами за замовчуванням
TPdf.SaveAsPdfVT(FileName), який створює PDF/VT-1 із комплектним OutputIntent sRGB IEC61966-2.1, 3144 bytes, тим самим profile, що й у SaveAsPdfA / SaveAsPdfX, та з/Trapped /False - Додано TPdf.ValidatePdfVT: він перевіряє відкритий PDF на marker-и сумісності PDF/VT, включно з наявністю XMP
pdfvtid:GTS_PDFVTVersionіGTS_PDFVTModDate, рівністю міжpdfvtid:GTS_PDFVTModDateтаxmp:ModifyDate, наявністю базового ідентифікатораpdfxid:GTS_PDFXVersion, наявністю catalog/DPartRootза §6.5, наявністю/OutputIntentsз/DestOutputProfile, trailer /ID, станом шифрування та наявністюxmp:CreateDate/ModifyDate, і повертає TPdfVTValidationResult із виявленим рівнем сумісності та набором знайдених проблем - Додано властивість TPdf.PdfVTConformance: вона повертає рівень сумісності поточного відкритого документа, тобто pvc1, pvc2, pvcNone або pvcUnknown, без потреби явно викликати ValidatePdfVT
- Експортовано нові типи в новому unit FPdfPdfvt: TPdfVTConformance, pvcUnknown/None/1/2, TPdfVTTrappedState, ptvUnspecified/True/False/Unknown, TPdfVTValidationResult, TPdfVTValidationIssue і TPdfVTSaveOptions
- Document Part Hierarchy, тобто дерево
DPartRoot/DPartза §6.5, є структурою рівня застосунку, що залежить від зіставлення одержувачів і діапазонів сторінок у workflow змінного друку. SaveAsPdfVT НЕ синтезує дерево DPart; ValidatePdfVT повідомляє про відсутній/DPartRootякpvviMissingDPartRoot, щоб викликачі могли пропускати файли PDF/VT через окремий крок побудови DPart. Вимоги PDF/X-4 на рівні вмісту, як-от вбудовування шрифтів, прозорість, керований ICC колір, заборони OPI / JavaScript / Reference XObject тощо, лишаються відповідальністю автора документа та rendering pipeline PDFium - Оновлено рядок TPdf.AboutInfo, щоб він показував поточну версію продукту
Version 1.34.0
- Додано підтримку інʼєкції marker-ів PDF/R-1, ISO 23504-1:2020: TPdf.SaveAsPdfR підвищує поточний документ до файла, сумісного з PDF/R-1, тобто транспортною підмножиною PDF для raster image, що використовується для сканованих документів. Інʼєкція охоплює вимоги файлового формату, які можна додати постобробкою, а саме унікальний коментар ідентифікації версії
%PDF-raster-1.0, записаний між словником trailer і ключовим словом startxref, §5, словник catalog, скорочений до білого списку §6.3, де лишаються тільки Version / ViewerPreferences / PageLayout / PageMode / AcroForm / Metadata, Document Information Dictionary, скорочений до білого списку §6.4.3, тобто лише Creator / Producer / CreationDate / ModDate, потік XMP у catalog /Metadata з чотирма записами з §6.4.4 Table 1, тобто xmp:CreatorTool / pdf:Producer / xmp:CreateDate / xmp:ModifyDate, та масив trailer /ID - Додано TPdf.SaveAsPdfRToStream для виводу PDF/R у пам’ять і скорочений запис з параметрами за замовчуванням
TPdf.SaveAsPdfR(FileName)для типового випадку - Додано TPdf.ValidatePdfR: він перевіряє відкритий PDF на маркери сумісності PDF/R-1, а саме footer-коментар
%PDF-raster-x.y, версію заголовка, відсутність /Type /ObjStm, відповідність білому списку для catalog, відповідність білому списку для Info dictionary, наявність потоку XMP metadata та trailer /ID, і повертає TPdfRValidationResult з виявленим рівнем сумісності та набором знайдених проблем - Додано властивість TPdf.PdfRConformance: вона повертає рівень сумісності поточного відкритого документа, тобто prc1, prcNone або prcUnknown, без потреби явно викликати ValidatePdfR
- Експортовано нові типи в новому unit FPdfPdfr: TPdfRConformance, TPdfRValidationResult, TPdfRValidationIssue і TPdfRSaveOptions.
TPdfRSaveOptions.Defaultвстановлює StripInfoOptionalEntries і StripCatalogOptionalEntries у True, тож інʼєктор типово створює catalog і Info dictionary, сумісні з §6.3 / §6.4.3; викликачі можуть встановити їх у False, щоб зберегти вихідні записи, хоча тоді результат уже не відповідатиме цим пунктам PDF/R, але інші marker-и лишаться прикріпленими - Вимоги на рівні вмісту лишаються відповідальністю вихідного PDF: структура Contents для кожної сторінки, §6.5.1, форма MediaBox
[0 0 w h], §6.5.3, обмеження на фільтри, §6.2.2, тобто лише FlateDecode, CCITTFaxDecode для bitonal і DCTDecode для 8-bit gray/RGB, відсутність object stream, §6.2.4, та strip layout за §6.6. Це неможливо примусово забезпечити постобробкою, адже PDF/R структурно є значно суворішою підмножиною, ніж інші стандарти сімейства PDF/x, і вимагає правильного генерування вихідних байтів. ValidatePdfR показує проблеми файлового формату, які цей unit може виявити; для повної перевірки на рівні вмісту його слід поєднувати з валідатором PDF/R від TWAIN Working Group - Оновлено рядок TPdf.AboutInfo, щоб він показував поточну версію продукту
Version 1.33.0
- Додано підтримку інʼєкції marker-ів PDF/X, сімейство ISO 15930: TPdf.SaveAsPdfX підвищує поточний документ до файла, сумісного з PDF/X-1a:2001, PDF/X-3:2002 або PDF/X-4, через постобробку базового PDF інкрементальним оновленням. Інʼєкція охоплює вимоги файлового формату, які можна додати постобробкою, а саме потік XMP metadata з
pdfxid:GTS_PDFXVersion, а для PDF/X-1a / PDF/X-3 ще йpdfxid:GTS_PDFXConformance, разом із відповідним описом pdfaExtension:schemas, переписаний Document Information Dictionary з записами/GTS_PDFXVersion,/GTS_PDFXConformanceі/Trapped, оновлений catalog з/OutputIntents [N 0 R], який посилається на словник OutputIntent з/S /GTS_PDFXі вбудованим ICC profile, та масив trailer/ID - Додано TPdf.SaveAsPdfXToStream для виводу PDF/X у пам’ять і скорочений запис з параметрами за замовчуванням
TPdf.SaveAsPdfX(FileName), який створює PDF/X-4 із вбудованим OutputIntent sRGB IEC61966-2.1, 3144 bytes, ідентичним profile, який використовується в SaveAsPdfA - Додано TPdf.ValidatePdfX: він перевіряє відкритий PDF на маркери сумісності PDF/X, включно з ідентифікатором XMP pdfxid та його рівністю значенню в Info dictionary, описом схеми розширення pdfxid, масивом /OutputIntents з /DestOutputProfile, наявністю Title, trailer /ID, станом шифрування та наявністю xmp:CreateDate / xmp:ModifyDate, і повертає TPdfXValidationResult з виявленим рівнем і набором знайдених проблем
- Додано властивість TPdf.PdfXConformance: вона повертає рівень сумісності поточного відкритого документа, тобто pxc1a, pxc3, pxc4, pxcNone або pxcUnknown, без потреби явно викликати ValidatePdfX. Рядок версії XMP розбирається, щоб розрізняти три рівні сумісності
- Експортовано нові типи в новому unit FPdfPdfx: TPdfXConformance, pxcUnknown/None/1a/3/4, TPdfXTrappedState, ptUnspecified/True/False/Unknown, TPdfXValidationResult, TPdfXValidationIssue і TPdfXSaveOptions.
TPdfXSaveOptions.Defaultнацілюється на PDF/X-4 із sRGB OutputIntent і/Trapped /False; викликачі можуть перевизначитиConformance, передати blobIccProfileDataдля CMYK у workflow комерційного друку або змінитиOutputCondition/OutputConditionIdentifier/RegistryName, щоб вказати на конкретний запис у реєстрі характеристик ICC, наприклад FOGRA39 або GRACoL2006_Coated1v2 - Вимоги на рівні вмісту, як-от вбудовування всіх шрифтів, відсутність JavaScript, відсутність видимих анотацій, заборона OPI, правила прозорості для PDF/X-1a / PDF/X-3 тощо, лишаються відповідальністю автора документа та rendering pipeline PDFium. Для повної перевірки сумісності ValidatePdfX слід поєднувати з preflight tool на кшталт callas pdfaPilot або Ghent PDF Workgroup Output Suite
- Оновлено рядок TPdf.AboutInfo, щоб він показував поточну версію продукту
Version 1.32.0
- Додано підтримку інʼєкції marker-ів PDF/E-1, ISO 24517-1:2008: TPdf.SaveAsPdfE підвищує поточний документ до файла, сумісного з PDF/E-1, через постобробку базового PDF інкрементальним оновленням. Інʼєкція охоплює вимоги файлового формату, які можна додати постобробкою, а саме потік XMP metadata з
pdfe:ISO_PDFEVersion = "PDF/E-1"разом із відповідним описом pdfaExtension:schemas, переписаний Document Information Dictionary з обов’язковим записом/ISO_PDFEVersion (PDF/E-1)за §5, Info-XMP bridging blocks, успадковані з 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 для виводу PDF/E у пам’ять і скорочений запис з параметрами за замовчуванням
TPdf.SaveAsPdfE(FileName)для типового випадку - Додано TPdf.ValidatePdfE: він перевіряє відкритий PDF на marker-и сумісності PDF/E-1, а саме наявність XMP pdfe:ISO_PDFEVersion і його рівність значенню в Info dictionary, опис схеми розширення pdfe, запис /ISO_PDFEVersion у Info dictionary, trailer /ID та наявність xmp:CreateDate / xmp:ModifyDate, і повертає структурований результат із виявленим рівнем сумісності та набором знайдених проблем
- Додано властивість TPdf.PdfEConformance: вона повертає рівень сумісності поточного відкритого документа, тобто pec1, pecNone або pecUnknown, без потреби явно викликати ValidatePdfE
- Експортовано нові типи в новому unit FPdfPdfe: TPdfEConformance, TPdfEValidationResult, TPdfEValidationIssue і TPdfESaveOptions
- Переписування Info dictionary є першим таким кроком у шляху постобробки PDF/x у PDFiumPas: воно переписує наявний об’єкт Info з тим самим номером об’єкта, тож посилання xref subsection / trailer /Info лишаються валідними, і синтезує новий Info dictionary, коли вихідний trailer не має запису /Info. Сам PDFium записує Info dictionary в кожен результат SaveAs, тому типовим випадком є саме шлях переписування
- Вимоги на рівні вмісту, як-от вбудовування шрифтів, CMap ToUnicode, заборонені ключі XObject / ExtGState або форми XFA, лишаються відповідальністю автора документа; SaveAsPdfE додає маркери файлового формату, але не змінює вміст сторінок і не видаляє заборонені можливості
- Оновлено рядок TPdf.AboutInfo, щоб він показував поточну версію продукту
Version 1.31.0
- Додано підтримку інʼєкції marker-ів PDF/UA-1, ISO 14289-1:2014: TPdf.SaveAsPdfUa підвищує поточний документ до файла, сумісного з PDF/UA-1, через постобробку базового PDF інкрементальним оновленням. Інʼєкція охоплює вимоги файлового формату, які можна забезпечити постобробкою, а саме потік XMP metadata з
pdfuaid:part = 1разом із відповідним описом pdfaExtension:schemas, обов’язковимdc:title, catalog/MarkInfo << /Marked true /Suspects false >>і/ViewerPreferences << /DisplayDocTitle true >>, але лише коли у джерелі їх немає, catalog/Lang, якщо викликач передав BCP 47 tag, та масив trailer/ID - Додано TPdf.SaveAsPdfUaToStream для виводу PDF/UA у пам’ять і скорочений запис з параметрами за замовчуванням
TPdf.SaveAsPdfUa(FileName)для типового випадку - Додано TPdf.ValidatePdfUa: він перевіряє відкритий PDF на marker-и сумісності PDF/UA-1, тобто наявність StructTreeRoot, /Lang, /MarkInfo /Marked true з /Suspects = false, /ViewerPreferences /DisplayDocTitle true, ідентифікатора XMP pdfuaid:part, наявність dc:title, trailer /ID і стан шифрування, та повертає структурований результат із виявленим рівнем сумісності й набором знайдених проблем
- Додано властивість TPdf.PdfUaConformance: вона повертає рівень сумісності поточного відкритого документа, тобто puc1, pucNone або pucUnknown, без потреби явно викликати ValidatePdfUa
- Експортовано нові типи в новому unit FPdfPdfua: TPdfUaConformance, TPdfUaValidationResult, TPdfUaValidationIssue і TPdfUaSaveOptions
- Поля Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate / DocumentId / InstanceId / Language, залишені порожніми в TPdfUaSaveOptions, автоматично заповнюються з FPDF_GetMetaText / FPDF_GetFileIdentifier / FPDFCatalog_GetLanguage, тож наявні виклики можуть зберігати документ одним рядком
- Вимоги на рівні вмісту, як-от повнота тегування StructTreeRoot, альтернативний текст Figure, CMap ToUnicode, вбудовування шрифтів тощо, лишаються відповідальністю автора документа; 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 dictionary, який PDFium записує в базовий PDF, тепер дзеркалиться в пакет XMP, включно з Title, dc:title, Author, dc:creator, Subject, dc:description за Cor.1, Keywords, pdf:Keywords, Creator, xmp:CreatorTool, Producer, pdf:Producer, CreationDate, xmp:CreateDate, і ModDate, xmp:ModifyDate. Також виводиться xmp:MetadataDate
- Trailer документа PDF/A тепер завжди містить масив /ID, що є жорсткою вимогою ISO 19005-1 6.1.3. Коли TPdf.SaveAsPdfA обробляє документ, чиє джерело вже має ідентифікатор файла, наявні 16-byte постійний і змінний ID повторно використовуються; інакше з байтів джерела виводиться детермінований резервний 16-byte ID
- Вставлений XMP тепер містить опис схеми розширення pdfaid, потрібний за ISO 19005-1 6.7.8, заміненим Cor.1; pdfaid трактується як extension schema відносно XMP Specification 2004, тож усі сумісні файли мають оголошувати її назви властивостей, типи значень і категорії в контейнері pdfaExtension:schemas
- TPdfASaveOptions отримав п’ять нових необов’язкових полів: Producer, CreationDate, ModDate, тобто рядки дат PDF у формі “D:YYYYMMDDHHmmSSOHH'mm'”, а також DocumentId і InstanceId, тобто 16-byte byte string для масиву trailer /ID. TPdf.SaveAsPdfA / SaveAsPdfAToStream автоматично заповнюють відсутні поля з FPDF_GetMetaText і FPDF_GetFileIdentifier, тож наявні виклики продовжують працювати без змін
- TPdf.ValidatePdfA / TPdf.PdfAConformance тепер повідомляють про три додаткові проблеми: pvaiMissingTrailerId, тобто відсутність /ID у trailer, pvaiMissingXmpDates, тобто відсутність xmp:CreateDate або xmp:ModifyDate, і pvaiMissingExtensionSchema, тобто відсутність опису схеми розширення pdfaid
- Не ASCII символи в Title, Author, Subject, Keywords, Creator і Producer тепер кодуються в пакеті XMP як UTF-8, що й вимагає XMP Specification, зберігаючи multilingual round-trip метаданих через SaveAsPdfA
- Оновлено рядок TPdf.AboutInfo, щоб він показував поточну версію продукту
Version 1.29.0
- Оновлено комплектні DLL PDFium, Win32 і Win64, як стандартні, так і V8-збірки, до upstream snapshot від 2026-05-22, що принесло upstream-виправлення для аварійних шляхів FPDFText_SetText / FPDFText_SetCharcodes та додаткове внутрішнє посилення з проєкту PDFium
- Відкрито новий прапорець збереження PDFium FPDF_SUBSET_NEW_FONTS у FPdfPageOps.pas, дозволяючи викликачам FPDF_SaveAsCopy запитувати автоматичне субсетування вбудованих шрифтових файлів для новододаних text object. Наявні константи FPDF_INCREMENTAL, FPDF_NO_INCREMENTAL і FPDF_REMOVE_SECURITY тепер визначено через upstream-форму bit shift, а застаріле числове значення 3 збережено як FPDF_REMOVE_SECURITY_DEPRECATED для бінарної сумісності
- Додано enum FPDF_FONT_BACKEND_TYPE, FREETYPE / FONTATIONS, і відповідне поле m_FontLibraryType у FPDF_LIBRARY_CONFIG у FPdfView.pas, тож застосунки, які ініціалізують PDFium зі Skia renderer, тепер можуть вибирати font backend під час запуску
- Оновлено сигнатуру TFPDFPage_InsertObject відповідно до upstream: C-функція тепер повертає FPDF_BOOL, TRUE при успіху і FALSE, якщо page_object дорівнює NULL або передача володіння не вдалася, замість void. Наявні виклики PDFiumPas і далі компілюються без змін, оскільки Delphi / FPC дозволяють ігнорувати значення, що повертає функція
- Виправлено рядок TPdf.AboutInfo так, щоб він показував поточну версію продукту, оскільки від v1.28.0, яка була лише документаційним випуском, там лишався застарілий v1.27.0
Version 1.28.0
- Substantially expanded the in-page documentation across the entire API reference: every property, method, event, and global function entry now carries a 3-paragraph Опис, a Примітки list, a multi-line Delphi Приклад, and a richer Див. також block — covering 200+ previously thin pages including all TPdf counters, metadata getters, font and character accessors, page-level properties, indexed records, document-level methods, and the full TPdfView state / display / event surface
- Тонко підлаштовано макет довідки під візуальний baseline losLab, що використовується в довіднику HotXLS: вирівняно розміри h1/h2, зведено стилі сітки навігації API до спільного StyleSheet і прибрано посторінкові inline CSS overrides у Navigation.html
- Документація now ships with a helper script (Docs\Build-Expand-Entries.ps1) that regenerates the entry-page enrichment from a single data table for repeatable maintenance
Version 1.27.0
- Додано підтримку створення PDF/A-1b: TPdf.SaveAsPdfA зберігає будь-який відкритий документ як файл, сумісний із PDF/A-1b, через постобробку базового PDF інкрементальним оновленням, яке вставляє потік XMP metadata, sRGB ICC OutputIntent та оновлений document catalog, і все це без вимоги до додаткових DLL API. Працює на будь-якій платформі, яку підтримує PDFiumPas
- Додано TPdf.SaveAsPdfAToStream для виводу PDF/A у пам’ять
- Додано TPdf.ValidatePdfA: він перевіряє відкритий PDF на відповідність PDF/A, тобто marker-и XMP pdfaid, OutputIntent із вбудованим ICC profile та шифрування, і повертає структурований результат із виявленим рівнем сумісності та набором знайдених проблем
- Додано властивість TPdf.PdfAConformance: вона повертає рівень сумісності поточного відкритого документа, тобто pac1b, pac1a, pac2b, pac3b, pacNone або pacUnknown, без потреби явно викликати ValidatePdfA
- Експортовано нові типи: TPdfAConformance, TPdfAValidationResult, TPdfAValidationIssue і TPdfASaveOptions, у новому unit FPdfPdfa.pas
- SaveAsPdfA підтримує користувацький ICC profile через TPdfASaveOptions.IccProfileData; коли він порожній, автоматично використовується вбудований profile sRGB IEC61966-2.1, HP/Microsoft, 3144 bytes
- Монолітний HTML-довідник замінено на перебудовану web help system: 302 окремі сторінки записів API, по одній на кожну властивість, метод, подію та глобальну функцію, що охоплюють TPdf і TPdfView, і кожна містить повний опис, таблицю параметрів, приклад коду Delphi та посилання Див. також
- Додано Navigation.html: повний односторінковий індекс навігації API, організований у шість секцій, тобто властивості/методи/події TPdf, властивості/методи/події TPdfView і глобальні функції, з 5-колонковою flex grid для швидкого перегляду
- TPdf.html і TPdfView.html перебудовано як компактні overview-сторінки компонентів, що зберігають секції type reference, тобто Types, Constants і Глобальні змінні, та посилаються на окремі сторінки записів для всіх членів
- Додано повнотекстовий пошук на основі Search.js з інкрементальним client-side matching на всіх 312 проіндексованих сторінках
- Оновлено всі navigation bar по всьому сайту так, щоб вони вказували на Navigation.html
Version 1.26.0
- Додано Demo/Lazarus/BatchExport, LCL-порт демо Delphi BatchExport із v1.14.0. Має той самий набір можливостей: експорт кількох PDF у JPG із загальним прогресом по файлу, поточним прогресом по сторінці, введенням DPI / quality / password і пакетною обробкою з кооперативним скасуванням на основі IPdfCancellationToken. Папка виводу відкривається у файловому менеджері платформи після успішного завершення вилучення
Version 1.25.0
- Додано повторне використання сторінки Form XObject у TPdf, що відкриває workflow watermark, template overlay та “stamp one page onto many”: CreateXObjectFromPage створює повторно використовуваний handle з будь-якої сторінки іншого документа, а InsertFormObjectFromXObject вставляє ОДНУ копію загорнутої сторінки в поточну сторінку. Повертає вставлений FPDF_PAGEOBJECT, щоб викликач міг позиціювати, масштабувати й обертати його через FPDFPageObj_SetMatrix та helper-и TPdfMatrix з v1.9.0
- Новий клас Pascal TPdfXObject обгортає handle FPDF_XOBJECT із PDFium і автоматично закриває його у своєму деструкторі, усуваючи ручну церемонію з FPDF_CloseXObject
- Розширено набори регресійних тестів Delphi і Lazarus до 147 випадків кожен, а набір C++Builder - до 123 випадків, покривши контракти створення handle і вставлення page object
Version 1.24.0
- Додано TPdf.RenderPageProgressive - скасовану версію RenderPage, яка запускає progressive rendering loop PDFium і опитує IPdfCancellationToken із v1.7.0 між ітераціями, тож тривалий high-DPI render може перерватися посеред сторінки замість блокування викликача до завершення
- Повертає значення TPdfProgressiveStatus: prsDone, prsCancelled або prsFailed. Передайте AToken = nil, щоб відрендерити до кінця без пауз і без можливості prsCancelled
- Використовує той самий zero-copy fast path, запроваджений у v1.21.0 - PDFium рендерить напряму в DIB цільового TBitmap. Такий самий legacy fallback застосовується, коли DIB не вдається обгорнути
- Розширено набори регресійних тестів Delphi і Lazarus до 145 випадків кожен, а набір C++Builder - до 121 випадку, покривши nil-token, тобто завершення, попередньо скасований token, тобто prsCancelled, і піксельну еквівалентність із синхронним RenderPage на живому token
Version 1.23.0
- Додано шість нових методів TPdfView, які відкривають для застосунків вибір тексту всередині form-widget PDFium та Undo/Redo: GetSelectedFormText повертає наразі вибраний текст усередині сфокусованого form widget, SelectAllFormText вибирає кожен символ, а FormUndo / FormRedo / FormCanUndo / FormCanRedo керують історією редагування сфокусованого widget. Базові API PDFium уже були прив’язані, але не мали high-level точки входу. Усі шість методів безпечно завершуються без дії, коли view неактивний або документ не має сфокусованого widget AcroForm
- Розширено набори регресійних тестів Delphi і Lazarus до 142 випадків кожен, а набір C++Builder - до 119 випадків, покривши контракт no-form-no-focus для кожного нового методу
Version 1.22.0
- Додано обгортки композиції сторінок для TPdf: ImportPagesByIndex приймає масив індексів із нульовою базою для копіювання вибраних сторінок із вихідного документа; ImportNPagesToOne повертає абсолютно новий TPdf, сторінки якого є N-up композиціями цього документа; MovePages переставляє сторінки на місці. Базові API PDFium уже були прив’язані, але не мали зручної для Pascal точки входу
- ImportPagesByIndex приймає порожній масив, щоб імпортувати кожну сторінку джерела, що еквівалентно передачі nil на рівні C ABI
- Розширено регресійні набори Delphi і Lazarus до 136 випадків кожен, а набір C++Builder - до 115 випадків, покривши імпорт підмножини, імпорт усього документа, перестановку сторінок і N-up композицію
Version 1.21.0
- Покращено швидкодію рендерингу, перевівши TPdf.RenderPage / TPdf.RenderTile, а також відповідні helper-и TPdfView, на zero-copy шлях виводу. PDFium тепер пише прямо в DIB buffer цільового TBitmap замість внутрішнього buffer, який потім копіювався рядок за рядком, заощаджуючи одне копіювання пам’яті розміром width x height x 4 bytes на кожен рендер. Найпомітніше це на високому DPI, зокрема в панелях мініатюр, експорті друкарської якості й batch export
- Застарілий шлях по scanline збережено як захисний fallback на малоймовірний випадок, коли цільовий DIB неможливо обгорнути, наприклад через екстремальні розміри, незвичний stride або OOM. Поведінка в обох шляхах побайтно однакова, просто fallback працює повільніше
- Розширено регресійні набори Delphi і Lazarus до 132 випадків кожен, а набір C++Builder - до 112 випадків, покривши підвищення caller-bitmap до pf32bit, round-trip розмірів і sanity-test для stride великого bitmap
Version 1.20.0
- Додано підсвічування результатів пошуку в TPdfView: HighlightSearchText(Text, MatchCase, MatchWholeWord) сканує поточну сторінку перегляду й повертає кількість знайдених збігів, малюючи маску HighlightColor поверх кожного збігу під час кожного перемальовування. ClearHighlight прибирає підсвічування; перехід перегляду на іншу сторінку очищає його автоматично, оскільки збіги прив’язані до сторінки
- HighlightColor типово дорівнює clYellow і є published-властивістю, тож застосунки можуть стилізувати підсвічування під власну UI palette
- Розширено регресійні набори Delphi і Lazarus до 129 випадків кожен, а набір C++Builder - до 109 випадків, покривши типовий колір, round-trip кольору, перевірку “real fixture word matches” на рядку з sample.pdf і контракт “missing word returns zero matches”
Version 1.19.0
- Додано властивість FitMode до TPdfView із чотирма значеннями: pfmNone, тобто ручний масштаб, pfmActualSize, тобто 100%, pfmFitPage, коли вся сторінка вміщується у viewport, і pfmFitWidth, коли ширина сторінки збігається з шириною viewport. Активний fit mode автоматично застосовується знову під час Resize і коли змінюється поточна сторінка, тож довгі документи зі змішаними розмірами сторінок лишаються ідеально вписаними
- Пряме встановлення Zoom скасовує активний fit mode, тобто FitMode повертається до pfmNone, що відповідає стандартній поведінці PDF viewer, де введення значення масштабу виводить із режиму Fit Page / Fit Width
- За замовчуванням pfmNone, тому існуючі застосунки зберігають поведінку явного масштабування
- Розширено регресійні набори Delphi і Lazarus до 124 випадків кожен, а набір C++Builder - до 106 випадків, покривши значення за замовчуванням, round-trip режиму, fit-page, що дає реальний масштаб на завантаженому документі, та manual-zoom-cancels-fit-mode
Version 1.18.0
- Додано властивість PageColor до TPdfView, яка відокремлює тло відтвореної PDF-сторінки від властивості Color навколишнього елемента керування. За замовчуванням використовується clWhite, тому сторінки PDF тепер відображаються як папір незалежно від теми застосунку-розміщувача. Переглядачі в темному режимі можуть залишати темною область прокручування, а саму PDF-сторінку — білою або будь-якого кольору, який обере застосунок
- Зміна поведінки: застосунки, які раніше встановлювали TPdfView.Color, щоб перефарбувати сторінку PDF, тепер мають використовувати PageColor. Типовий досвід покращується для звичного випадку, коли білі сторінки лежать на тематичному тлі елемента керування, і це без жодних змін коду
- Розширено регресійні набори Delphi і Lazarus до 120 випадків кожен, а набір C++Builder - до 103 випадків, покривши значення за замовчуванням і round-trip кольору
Version 1.17.0
- Додано перемикачі блокування користувацького введення в TPdfView, щоб застосунки, які вбудовують viewer у kiosk, preview pane або read-only контекст, могли вимикати жести навігації без subclassing: AllowUserPageChange керує новими клавіатурними скороченнями PgUp / PgDn / Ctrl+Home / Ctrl+End; ChangePageOnMouseScrolling керує новими переходами сторінок wheel-up / wheel-down; AllowUserTextSelection зарезервовано для майбутнього шляху виділення тексту перетягуванням миші. Усі три параметри типово мають значення True, тож наявні застосунки оновлюються без зміни поведінки
- Навігація сторінками колесом миші пропускає Ctrl+wheel, щоб застосунки могли лишити Ctrl+wheel зарезервованим для масштабування
- Розширено регресійні набори Delphi і Lazarus до 118 випадків кожен, а набір C++Builder - до 101 випадку, покривши значення за замовчуванням і round-trip перемикачів
Version 1.16.2
- Розширено регресійне покриття TPdfView для натискань на annotation link, коли сторінка viewer відрізняється від пов’язаної сторінки TPdf, використовуючи реальний headless шлях кліку мишею в Delphi, Lazarus і C++Builder
- Набори Delphi і Lazarus тепер виконують по 114 випадків кожен, а C++Builder тепер виконує 99 випадків
Version 1.16.1
- Виправлено обробку натискання на посилання в TPdfView, щоб автоматичні дії анотацій і вебпосилань використовували сторінку, яку зараз показує переглядач, навіть якщо пов'язаний компонент TPdf перебуває на іншій сторінці
- Посилено TPdfThumbnailView проти висячих посилань Pdf, коли пов'язаний компонент TPdf знищується
- Додано регресійне покриття життєвого циклу thumbnail-reference; набори Delphi і Lazarus тепер виконують по 113 випадків кожен, а C++Builder тепер виконує 98 випадків
- Синхронізовано README, тестову документацію, вміст пошуку/індексу HTML Help і згенеровані виходи пакетів C++ з інтеграційними оновленнями від v1.7.0 до v1.16.0
Version 1.16.0
- Додано новий демонстраційний проєкт Delphi PrintDialog (Demo/Delphi/PrintDialog), який зосереджено на друку N-up (1 / 2 / 4 / 9 сторінок на аркуш) з фільтрацією непарних / парних сторінок, відтворенням у відтінках сірого та необов'язковими межами клітинок у 1 піксель. Це свідомо невеликий супутник до наявної демонстрації PrintPDF, яка вже охоплює попередній перегляд, недавні файли, масштабування та підгонку
Version 1.15.0
- Додано новий компонент TPdfThumbnailView (модуль FPdfThumbnail), який відображає одну мініатюру сторінки в кожному рядку в прокручуваній боковій панелі з підсвічуванням наведення й виділення та навігацією одним натисканням. Його спроєктовано поруч із TPdfView, щоб кінцеві користувачі могли переглядати довгий документ по сторінках
- Компонент зареєстровано на вкладці палітри losLab поряд з TPdf і TPdfView; основні властивості: Pdf, CurrentPageIndex, ThumbnailWidth, ThumbnailHeight, TextColor, HoverColor, SelectionColor, BorderColor і подія OnPageClick
- Розширено набори регресійних тестів Delphi і Lazarus до 112 випадків кожен, а набір C++Builder - до 97 випадків, з покриттям типових значень, циклу збереження і відновлення розміру мініатюр, обмеження крайніх значень, циклу кольорів і призначення обробника подій
Version 1.14.0
- Додано новий демонстраційний проєкт Delphi BatchExport (Demo/Delphi/BatchExport), який показує, як за один прохід перетворювати багато PDF-файлів у JPG за допомогою TPdf.LoadCustomDocument для потокового завантаження, IPdfCancellationToken для кооперативного скасування та індикаторів прогресу для кожного файла й кожної сторінки. Демонстрація використовує один екземпляр TPdf на файл, оскільки сам PDFium не є потокобезпечним, і відкриває папку виводу в Explorer після успішного завершення витягу
Version 1.13.0
- Додано UI-накладку асинхронного відтворення для TPdfView через три нові властивості: AsyncRendering, LoadingText і LoadingColor. Коли AsyncRendering має значення True, шлях відтворення однієї сторінки малює невеликий індикатор “Loading...” поверх відтвореної сторінки, щоб застосунки, які використовують власного worker для довгих операцій, мали узгоджений візуальний сигнал
- Типові значення зберігають наявну поведінку: AsyncRendering дорівнює False, тому застосунки, які не вмикають цю функцію, не побачать візуальних змін
- Документація уточнює, що сам PDFium не є потокобезпечним, а винос відтворення в worker вимагає від викликача зберігати один TPdf на кожен worker; майбутня демонстрація batch-export показує саме такий шаблон
- Розширено набори регресійних тестів Delphi і Lazarus до 106 випадків кожен, а набір C++Builder - до 93 випадків, з покриттям типових значень і циклу збереження та відновлення для трьох властивостей
Version 1.12.0
- Додано обробку посилань за натисканням у TPdfView. Нова властивість LinkOptions керує автоматичною поведінкою для чотирьох типів дій PDF-посилань: goto (перехід по сторінці), URI (ShellExecute), launch (ShellExecute) і embedded GotoR (зарезервовано). За замовчуванням увімкнено loAutoGoto і loAutoOpenURI; loAutoLaunch і loAutoEmbeddedGoto залишаються вимкненими, щоб випадкове натискання не запускало довільну програму
- Додано події OnAnnotationLinkClick і OnWebLinkClick, які спрацьовують перед будь-якою автоматичною дією і дозволяють застосункам перевірити посилання, позначити його як Handled або перенаправити його, наприклад до запиту безпеки
- Визначення натискання на посилання спрацьовує лише тоді, коли жест є саме натисканням, а не перетягуванням, і використовує нову прив'язку MouseDown, щоб жести панорамування йшли через наявний шлях прокручування без змін
- Розширено набори регресійних тестів Delphi і Lazarus до 102 випадків кожен, а набір C++Builder - до 91 випадку, з покриттям типових значень LinkOptions, циклу запису й читання набору та призначення обробника подій
Version 1.11.0
- Додано візуальне шліфування для TPdfView: властивості PageShadowSize, PageShadowColor і PageBorderColor малюють необов'язкову тінь під прямокутником сторінки та однопіксельну рамку навколо нього. Типові значення зберігають попередній плаский вигляд (PageShadowSize = 0; рамка малюється стандартним clBlack, але зливається зі стандартним білим тлом, доки викликач не змінить кольори)
- Додано властивість SmoothScroll як прапорець добровільного ввімкнення для майбутньої інкрементної анімації прокручування; зараз властивість коректно зберігається і відновлюється та вже підключена так, щоб застосунки могли зберігати цей параметр, тоді як частина відтворення ще використовує наявну миттєву поведінку прокручування
- Розширено набори регресійних тестів Delphi і Lazarus до 98 випадків кожен, а набір C++Builder - до 89 випадків, з покриттям типових значень, циклу збереження й відновлення властивостей та обмеження від'ємного розміру тіні
Version 1.10.0
- Додано пряме вставлення зображень через нові перевантаження TPdf.AddImage і TPdfView.AddImage, які приймають або шлях до файла, або TBitmap, на додачу до наявного AddPicture на основі TPicture. AddImage(FileName) розпізнає будь-який формат, зареєстрований у графічних модулях VCL або LCL, зокрема BMP, PNG через модуль PngImage, JPG тощо, і проходить той самий pipeline, що й AddPicture, тому поведінка збігається
- AddImage(TBitmap) оминає проміжний TPicture, що спрощує код викликачів, які вже мають TBitmap після відтворення або пакетної генерації
- Розширено набори регресійних тестів Delphi і Lazarus до 92 випадків кожен, а набір C++Builder - до 84 випадків, з покриттям вставлення bitmap, меж page object, відхилення nil bitmap і завантаження BMP-файлів
Version 1.9.0
- Додано високорівневу підтримку матриць перетворення через новий клас TPdfMatrix у модулі FPdfMatrix. TPdfMatrix обгортає FS_MATRIX із PDFium в OO API для Translate, Scale, Rotate, HorizontalFlip, VerticalFlip, CentralFlip, Skew і Multiply, придатний для складання перетворень перед передаванням їх до FPDFPageObj_SetMatrix та схожих API PDFium
- TPdfMatrix.Multiply тепер правильно знімає знімок шести елементів матриці перед обчисленням нових значень рядка, усуваючи приховану проблему, коли альтернативні реалізації Pascal перезаписували попередні елементи в межах того самого виклику і давали неправильний результат для будь-якої композиції, складнішої за просте перенесення
- Розширено набори регресійних тестів Delphi і Lazarus до 88 випадків кожен, а набір C++Builder - до 81 випадку, з покриттям identity, reset, translate / scale / flip, порядку композиції після множення та регресійного випадку для Multiply
Version 1.8.0
- Додано потокове завантаження на вимогу через новий метод TPdf.LoadCustomDocument(AStream, AOwnsStream) і допоміжний клас TPdfStreamAdapter, який спирається на FPDF_LoadCustomDocument з PDFium. Тепер PDFium читає блоки з переданого TStream лише за потреби, тож дуже великі або віддалені PDF більше не потребують попередньої копії в пам'яті
- Додано необов'язкове володіння потоком: передавання AOwnsStream = True передає життєвий цикл TStream до TPdf, який звільняє його під час виконання UnloadDocument
- Розширено набори регресійних тестів Delphi і Lazarus до 79 випадків кожен, а набір C++Builder - до 75 випадків, з покриттям потокового завантаження через TFileStream, очищення для потоків із переданим володінням і контракту, за яким зовнішній потік переживає UnloadDocument
Version 1.7.0
- Додано примітиви кооперативного асинхронного скасування в новому модулі FPdfAsync, які надають IPdfCancellationToken / IPdfCancellationTokenSource і повторно використовуваний singleton PdfNoCancellationToken, щоб довгі workflow відтворення та експорту підтримували коректну семантику скасування з UI
- Додано легкий helper TPdfFuture<T>, який запускає worker у фоновому потоці та повертає оболонку TPdfFutureResult<T> назад у головний потік, розрізняючи успіх, скасування і помилку
- Розширено набори регресійних тестів Delphi і Lazarus до 76 випадків кожен, а набір C++Builder - до 73 випадків, зі спільним покриттям стану скасування, ідемпотентного cancel, розгалуження callback і реєстрації після скасування
Version 1.6.10
- Додано високорівневий доступ TPdf.PrintPageRanges до діапазону сторінок друку з налаштувань PDF viewer, який повертає діапазони сторінок з нумерацією від 1 для коду застосунку
- Додано TPdf.SetFormFieldFlags / SetFormFieldFlagsAt і відповідні helper-и TPdfView, щоб застосунки могли оновлювати прапорці полів AcroForm через public API, включно з покриттям прапорців пароля та множинного вибору
- Посилено покриття ABI для прив'язок PDFium щодо FPDF_DWORD розміру Windows, callback FPDF_FILEACCESS і полів slot embedder у V8
Version 1.6.9
- Додано низькорівневі прив'язки відтворення Skia для щойно експортованих API FPDF_RenderPageSkia і FPDF_FFLDrawSkia у вбудованих standard та V8 PDFium DLL
- Розширено перевірки покриття public bindings, тож завантаження standard і V8 DLL тепер перевіряє точки входу відтворення Skia разом із наявними перевірками можливостей V8/XFA
Version 1.6.8
- Додано TPdf.SetTextPositions і TPdfSingleArray для встановлення позицій окремих символів у наявних text object через щойно експортований API FPDFText_SetPositions
- FPDFText_SetPositions переведено до обов'язкових прив'язок для поточних вбудованих PDFium DLL, водночас підтверджено, що точки входу відтворення Skia й далі недоступні, бо DLL їх досі не експортують
- Розширено набори регресійних тестів Delphi, C++Builder і Lazarus до 65 випадків кожен із покриттям позиціонування тексту
Version 1.6.7
- Додано високорівневий доступ TPdf до дій JavaScript з дерева імен документа, який повертає назви дій і скрипти через JavaScriptAction і JavaScriptActions
- Додано TPdf.FileIdentifier для читання постійних і змінних trailer ID як двійкових TBytes без байта-термінатора PDFium
- Додано TPdf.PageBox, GetPageBox і SetPageBox для MediaBox, CropBox, BleedBox, TrimBox і ArtBox на поточній сторінці
- Підтверджено, що у поточних вбудованих PDFium DLL недоступними під час виконання залишаються лише точки входу відтворення Skia, бо цих export немає
- Розширено набори регресійних тестів Delphi, C++Builder і Lazarus до 64 випадків кожен із покриттям JavaScript документа, trailer ID і page-box
Version 1.6.6
- Додано підтримку під час виконання для вбудованої PDFium DLL з увімкненим V8. Установлення EnableV8Engine перед завантаженням тепер вибирає pdfium.v8.dll з дерева DLLs\Win32 або DLLs\Win64 і відкриває прив'язки лише для V8/XFA, коли завантажена DLL їх надає
- Додано V8FeaturesAvailable, XfaBStrHelpersAvailable, GetRecommendedV8Flags і низькорівневі необов'язкові прив'язки для FPDF_BStr_*, FPDF_GetRecommendedV8Flags і FPDF_GetArrayBufferAllocatorSharedInstance
- FPDFText_SetPositions зроблено необов'язковим, щоб PDFiumPas і надалі завантажувався з PDFium DLL, які не експортують цей експериментальний setter позицій тексту
- Розширено набори регресійних тестів Delphi, C++Builder і Lazarus до 61 випадку кожен із покриттям можливостей standard-DLL і V8-DLL
Version 1.6.5
- Додано перевірку structure-tree для tagged PDF через TPdf.StructureElements і TPdfView.StructureElements, включно з типом елемента, заголовком, alternate text, actual text, expansion text, мовою, ID marked-content, кількістю дочірніх елементів і кількістю атрибутів
- Додано вибір режиму друку Windows PDFium через TPdfPrintMode і SetPdfPrintMode з покриттям режимів EMF, text-only, PostScript, pass-through, image-mask і Type 42
- Додано низькорівневі прив'язки для решти public export PDFium у standard-DLL, що охоплюють дії JavaScript, прапорці полів анотацій і колір шрифту, активний стан page object, вставлення за індексом, float-значення content-mark, дані ICC profile зображення, видалення form object і позиції тексту
- Розширено набори регресійних тестів Delphi, C++Builder і Lazarus до 59 випадків кожен із покриттям structure-tree для tagged PDF, режиму друку та прив'язок public export
Version 1.6.4
- Оновлено демонстраційні проєкти Delphi, C++Builder і Lazarus, щоб вони автоматично відкривали створені PDF, експортовані текстові файли й зображення, а також папки пакетного виводу після успішного створення
Version 1.6.3
- Розширено вирівняні набори регресійних тестів Delphi, C++Builder і Lazarus до 56 випадків кожен із покриттям GUI TPdfView для helper-ів fit-zoom, циклів перетворення координат пристрою та сторінки, hit-testing символів і панорамування мишею через елементи viewer у прихованому вікні
- Фікстури TPdfView тепер використовують явний розмір viewer і підкласи лише для тестів, які задіюють protected-обробники миші, зберігаючи набори повністю headless
Version 1.6.2
- Виправлено TPdf.AddPage(0, ...), тож вставлена перша сторінка відразу стає активною. Наявний прикладний код і далі працює, а PageNumber тепер повідомляє коректний номер сторінки з нумерацією від 1 після вставлення
- Синхронізовано версію пакета Lazarus і розширено вирівняні набори регресійних тестів Delphi, C++Builder і Lazarus до 52 випадків кожен
Version 1.6.1
- Виправлено некоректну вимогу до мінімальної версії у валідаторі сумісності версій PDF з v1.6.0: дію SetState перекласифіковано з PDF 1.5 до PDF 1.2 відповідно до PDF 1.2 Reference 6.9.9. Цілі SaveAs для PDF 1.3 / 1.4, що містять дії SetState, тепер зберігаються коректно замість відхилення
- Додано відповідні лексичні перевірки для PDF 1.2 за тим самим розділом специфікації: дії Sound, Movie і NOP, а також колірний простір Separation тепер блокуються, коли вибрана цільова версія старіша за PDF 1.2
- Розширено набори регресійних тестів Delphi, C++Builder і Lazarus до 50 випадків кожен шляхом додавання позитивного тесту прийняття SetState для PDF 1.4, який фіксує виправлену межу
Version 1.6.0
- Посилено цільові версії SaveAs від PDF 1.0 до PDF 1.7 за допомогою повного валідатора можливостей, який охоплює весь часовий ряд функцій від PDF 1.1 до ISO 32000-1. Валідатор тепер блокує збереження, якщо документ містить записи словника, імена фільтрів, підтипи анотацій, типи дій, шрифти, колірні простори або параметри шифрування, додані після обраної цільової версії. Приклади: JBIG2Decode (1.4+), MarkInfo / Tagged PDF (1.4+), OutputIntents (1.4+), ICCBased / DeviceN / BleedBox / TrimBox / ArtBox / StructTreeRoot (1.3+), анотації Polygon / PolyLine / Caret / Screen / Watermark / Redact, шифрування AES і AES-256 (CFM AESV2 / AESV3), записи каталогу Perms / Legal / Requirements / NeedsRendering, а також дії з прив'язкою до версії, такі як JavaScript, Trans, SetState, Rendition, GoToE, GoTo3DView, тепер відхиляються, коли цільова версія PDF не може їх представити
Version 1.5.13
- Розширено набори регресійних тестів Delphi, C++Builder і Lazarus до 49 випадків кожен, додавши пряме покриття для відхилення колірних просторів ICCBased, Tagged PDF MarkInfo, анотацій Polygon, шифрування AES (V2) і анотацій Redact для цілей PDF 1.2 / 1.3 / 1.4 / 1.5 / 1.6 відповідно
Version 1.5.12
- Виправлено постобробку SaveAs для інкрементних переписувань catalog. PDFiumPas тепер перевіряє найновіший повторений indirect object, тому наявні перевизначення catalog /Version коректно замінюються під час збереження в явно задану старішу цільову версію PDF
- Розширено набори регресійних тестів Delphi, C++Builder і Lazarus до 44 випадків кожен, додавши пряме покриття для заміни застарілого catalog /Version, нормалізації версії catalog для PDF 1.4 і відхилення прозорості та можливостей portable collection, коли вибрана цільова версія PDF не може їх представити
Version 1.5.11
- Посилено версіонований вивід SaveAs для явних цілей PDF 1.3, 1.4, 1.5, 1.6 і 1.7. PDFiumPas тепер нормалізує маркери версії catalog, зберігає стандартний Fit Height OpenAction безпечним щодо версії і відхиляє новіші можливості PDF, коли вибрана цільова версія не може їх представити
- Додано покриття регресійних тестів Delphi, C++Builder і Lazarus, яке зберігає й повторно завантажує явні файли PDF 1.3 - PDF 1.7, перевіряючи підсумковий header, стандартний Fit Height OpenAction і повідомлену версію PDF
Version 1.5.10
- Перейдено з варіанта B у специфікації до варіанта C шляхом додавання smoke-тестів TPdfView у всі три набори IDE (Tests.PdfView). Кожен набір будує прихований батьківський TForm, через TForm.CreateNew на сторонах Pascal і
new TForm(NULL, 0)на боці C++Builder, переприв'язує TPdfView, встановлює Active := True, а потім перевіряє поверхню циклу збереження й відновлення для PageCount, типового значення PageNumber, Zoom, Rotation, DisplayMode і відповідність View.Text базовому TPdf.Text. Кожен набір IDE тепер виконує 39 випадків
Version 1.5.9
- Перейдено з варіанта A у специфікації до варіанта B шляхом додавання smoke-тестів відтворення в усі три набори IDE. Кожен набір Tests.Render викликає TPdf.RenderPage для sample.pdf і перевіряє три надійні сигнали замість контрольних сум байт у байт: повернений bitmap точно відповідає запитаному розміру в пікселях; різні запитані розміри, 200x100 і 64x256, дають відповідні bitmap; а відтворена сторінка має щонайменше 95% білого тла і щонайменше 50, для Lazarus 20, небілих пікселів, що позначають згладжений текст. Кожен набір IDE тепер виконує 33 випадки
Version 1.5.8
- Closed out the original A(2) test plan groups by adding seven more regressions per IDE: TPdf.CreateAnnotation building an anHighlight annotation plus a SaveAs/LoadDocument round-trip, the AcroForm read path on Demo/Delphi/FormFill/cmp_fill_out_and_merge_forms.pdf (FormТип is ftAcroForm, FormFieldCount > 0, FlattenAllPages drops the fields to zero), and quiet read-path coverage for Bookmarks, LinkAnnotationCount, and WebLinkCount on a document that has none of those features. Each IDE suite now runs 30 cases
Version 1.5.7
- Expanded the Delphi (DUnitX), Lazarus (FPCUnit), and C++Builder (GoogleTest) suites with seven new regressions per IDE: PdfVersion, PageRotation, TPdf.FindFirst / FindNext substring lookup, CharacterOrigin / CharacterRectangle agreement against the AddText origin, CreateAttachment registration plus a SaveAs/LoadDocument round-trip, and an accented-text AddText round-trip that verifies the v1.3.0 European TrueТип embedding path keeps Latin-1 supplemental code points intact
Version 1.5.6
- Збережені PDF тепер отримують стандартну дію відкриття Fit Height для першої сторінки, коли наявний OpenAction відсутній, тож PDF reader спочатку показують створені документи з масштабуванням за висотою сторінки
- Додано регресійне покриття 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
- Додано демонстраційний проєкт Attachment для C++Builder, перенесений із прикладу Delphi, з покриттям створення PDF, додавання, переліку, витягання, видалення і збереження вбудованих файлових вкладень із показом MIME subtype
Version 1.5.3
- Винесено обчислення розвороту сторінок, на якому побудовані двосторінкові режими TPdfView, у helper рівня модуля ComputeSpreadPages(DisplayMode, PageNumber, PageCount, out LeftPageNo, out RightPageNo). Поведінка не змінилася; helper дає змогу окремо тестувати правило з обкладинкою без створення viewer
- Додано п'ять регресійних тестів у наборах Delphi (DUnitX), Lazarus (FPCUnit) і C++Builder (GoogleTest), які покривають порожні документи, стандартне парування двох сторінок, окреме розташування обкладинки в dmTwoPageContinuousWithCover, пари після обкладинки та обмеження для останньої сторінки й виходу за межі
Version 1.5.2
- Додано підтримку мови документа через TPdf.Language, прив'язану до запису /Lang у PDF catalog
- Додано attachment MIME subtype access with TPdf.AttachmentТип
- Додано anRedact до TPdfAnnotationSubtype, а також helper-и видалення page object для TPdf і TPdfView
- Оновлено демонстраційні проєкти viewer і attachment, щоб вони показували нову інформацію про мову та тип вкладення, коли вона доступна
Version 1.5.1
- Додано dmTwoPageContinuousWithCover для TPdfView, щоб макети viewer могли показувати першу сторінку окремо, а потім продовжувати двосторінковими розворотами
- Оновлено демонстраційні проєкти MultiPageViewer для Delphi, C++Builder і Lazarus, щоб вони показували двосторінковий режим із урахуванням обкладинки
Version 1.5.0
- Додано автоматизовані набори тестів рівня smoke для Delphi (DUnitX), Lazarus (FPCUnit) і C++Builder (GoogleTest). Усі три набори використовують один спільний fixture PDF у Tests\TestData і виконують ті самі сім випадків, що покривають завантаження документа, інформацію про сторінку, витяг тексту, metadata, цикл збереження й повторного читання, перевірку PDF header і властивість Compressed
Version 1.4.3
- Покращено демонстраційний проєкт FontProperties, щоб він показував API metadata шрифтів як для TPdfView, так і для TPdf, включно з дескрипторами шрифтів, розміром даних шрифту та метриками символів
- Додано індексовані властивості перевірки символів і шрифтів для TPdfView та оновлено демонстраційний проєкт FontProperties, щоб він опитував metadata шрифтів text object
Version 1.4.2
- Додано до TPdf індексовані властивості перевірки символів і шрифтів для аналізу тексту без потреби у viewer. Властивості з індексацією за символом, CharacterAngle, CharacterFontSize і CharacterFontWeight, запитують метрики окремих символів із текстового потоку поточної сторінки. Властивості з індексацією за page object, FontAscent, FontBaseName, FontData, FontDescent, FontFamilyName, FontHandle, FontIsEmbedded, FontItalicAngle і FontWeight, запитують metadata шрифту для будь-якого text object на поточній сторінці
- Page object, що не є текстовими, повертають безпечні нульові або порожні значення для всіх властивостей Font* замість помилки, що спрощує перебір усіх page object і перевірку лише текстових
- FontBaseName тепер читає базову назву шрифту PostScript безпосередньо, а не повертається до font family name, що дає точніший ідентифікатор для вбудованих шрифтів
Version 1.4.1
- Додано C++Builder and Lazarus versions of the EuropeanText demo so all supported IDE families can verify accented European text generation with system TrueТип fonts
- Додано версії демонстраційного проєкту FormFill для C++Builder і Lazarus, включно зі зразками form PDF, редагуванням полів, повторною генерацією appearance, збереженням заповнених форм і workflow зі сплющенням
Version 1.4.0
- Додано підтримку Lazarus / Free Pascal: новий пакет PDFiumLaz надає ті самі TPdf, TPdfView і пов'язані компоненти в межах набору віджетів LCL, розширюючи бібліотеку на IDE Lazarus і компілятор Free Pascal поряд із наявними пакетами Delphi і C++Builder
- Додано версії демонстраційних проєктів для Lazarus, щоб розробники Lazarus могли досліджувати кожну можливість на виконуваних прикладах
- Виправлено проблему компіляції Lazarus, за якої умовні визначення Free Pascal обчислювалися разом із перевірками версії компілятора Delphi, через що збірки FPC намагалися розв'язати специфічні для Delphi назви модулів і завершувалися помилкою
Version 1.3.1
- Задокументовано workflow зі сплющенням форм у наборі довідки: GenerateFormAppearances, FlattenPage, FlattenAllPages і пов'язані константи FLAT_* / FLATTEN_* тепер описані для TPdf, TPdfView, у довіднику API, матриці можливостей і прикладах програмування
- Виправлено таблицю архітектури на сторінці огляду, щоб вона перелічувала фактичні модулі прив'язок, що постачаються в папці Lib
Version 1.3.0
- Improved European character support when creating PDFs. TPdf.AddText now loads and caches the matching system TrueТип font before creating a text object, preserving accented characters from Czech, French, German, Spanish, Portuguese, Polish, and Turkish that PDFium’s built-in standard fonts cannot represent
- Застосунки, які раніше показували знаки питання або glyph заміни для не-ASCII латинського тексту, тепер відтворюються коректно без жодних змін коду. Додано демонстраційний проєкт EuropeanText, щоб показати цю можливість
Version 1.2.0
- Додано оновлення appearance AcroForm до TPdf: виклик GenerateFormAppearances після зміни значень FormField[] оновлює appearance widget, щоб заповнені значення були видимі у standard PDF reader без потреби в інтерактивному сеансі редагування
- Додано helper-и сплющення форм до TPdf, FlattenPage / FlattenAllPages, і до TPdfView, FlattenPage для поточної сторінки view. Сплющення назавжди вбудовує заповнені значення полів як звичайний вміст сторінки та прибирає інтерактивний шар форми, утворюючи статичний документ, який однаково відтворюється в усіх viewer
- Додано Demo\Delphi\FormFill для демонстрації workflow заповнення і збереження та workflow заповнення і сплющення на прикладі AcroForm PDF
Version 1.1.2
- Додано стиснення PDF stream під час збереження. Нова властивість TPdf.Compressed, увімкнена типово, переписує нестиснені content stream як stream, стиснені FlateDecode, під час збереження, що істотно зменшує розмір файла для PDF, створених програмно. Застосунки, яким потрібен звичайний нестиснений вивід, можуть встановити Compressed у False перед викликом SaveAs
Version 1.1.1
- Збірки пакета Win64 більше не включають модулі реєстрації design-time, що запобігає помилкам під час збірки, коли пакет Win64 розгортається лише в runtime-контексті
- Завантажувач PDFium DLL тепер спочатку шукає підкаталог застосунку Win32 або Win64, використовуючи стандартні назви pdfium.dll і pdfium.v8.dll, а потім переходить до плоского каталогу застосунку та системного каталогу Windows. Це відповідає компонуванню DLL, яке постачається разом із пакетом компонентів, і робить встановлення простим
Version 1.1.0
- Виправлено візуальний дефект обрізання в двосторінковому режимі TPdfView: вміст сторінки просочувався через корінець, бо ліва і права плитки сторінок використовували один спільний прямокутник обрізання. Тепер кожна плитка обрізається незалежно, тому вміст лишається в межах своєї сторінки
- Покращено повідомлення про помилку в демонстраційному проєкті Delphi, коли PDFium DLL не вдається знайти: воно тепер чіткіше вказує очікувану назву DLL і місце розташування