Валідація графа сегментів JBIG2
HotPDF перевіряє вбудовані потоки зображення JBIG2 і JBIG2Globals, перш ніж їх отримає рідний чи зовнішній декодер
Валідатор виконує один обмежений прохід сегментами, після чого ітеративний обхід графа залежностей, використовуючи індексований пошук за номером сегмента замість повторних сканувань
Валідація перед власною обробкою
Options := DefaultJBIG2SegmentGraphValidationOptions;
Options.MaxSegments := 32768;
Options.MaxTotalReferences := 131072;
Options.MaxReferenceDepth := 512;
Options.MaxSymbols := 500000;
if not HPDFValidateJBIG2SegmentGraph(ImageData, GlobalData,
Options, Info) then
raise Exception.Create(string(
HPDFJBIG2SegmentGraphValidationStatusName(Info.Status)));
TJBIG2SegmentGraphValidationInfo повідомляє кількість сегментів та ребер, оголошені нові символи, максимальну глибину залежностей, а також потік, зсув байта, номер сегмента та номер посилання, пов'язані з першою помилкою
Бюджети містяться в записі TJBIG2SegmentGraphValidationOptions, поля якого MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth і MaxSymbols обмежують кожен обхід
Кінцевий стан — це значення TJBIG2SegmentGraphValidationStatus: від неперевіреного та валідного до відхилення опцій, збоїв заголовків і посилань, циклів і порушень словника символів, а HPDFJBIG2SegmentGraphValidationStatusName подає його як текст
FailureStreamKind використовує TJBIG2SegmentStreamKind, щоб вказати, чи першу помилку знайдено в потоці globals (jbsskGlobals) чи в потоці зображення (jbsskImage)
THPDFJBIG2Decoder.LastSegmentGraphValidationInfo зберігає той самий звіт після LoadFromByteArray або LoadRegionFromByteArray
Умови безпечної відмови
Валідація відхиляє пошкоджені чи обрізані заголовки, окремі заголовки файлів у вбудованих потоках, заборонені короткі та надмірно великі таблиці довгих посилань, дубльовані чи відсутні ідентифікатори сегментів, фізично перехресні залежності, цикли залежностей, надмірну глибину та перевищення налаштованих бюджетів сегментів чи ребер
Сегменти зображень мають використовувати асоціацію сторінки 1, глобальні сегменти — асоціацію сторінки 0, а глобальний сегмент не може залежати від сегмента зображення
Відхиляються вбудовані сегменти кінця сторінки, кінця файлу та палітри кольорів, так само як і розміщені в JBIG2Globals сегменти регіону лише для сторінки та інформації про сторінку
Заголовки словників символів перевіряються перед декодуванням, тож оголошені лічильники нових та експортованих символів, агреговані пули вхідних символів і неможливі суми експорту завершуються помилкою до виділення растру
Межа декодера та кешу глобальних даних
THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode і вбудовані виклики HPDFJBIG2DecDecodeEx поділяють ту саму політику
Зареєстровані рідний і зовнішній бекенди використовують уже перевірені внутрішні шляхи, уникаючи повторного обходу графа під час звичайного декодування
THPDFJBIG2GlobalsPool.Register приймає лише дійсний потік сегментів лише глобального типу, що запобігає потраплянню пошкоджених спільних словників у повторне використання на рівні документа
Окремі файли JBIG2, передані з Embedded = False, зберігають свій окремий шлях декодування, орієнтований на файли
Див. підтримка стиснення JBIG2, THPDFJBIG2Decoder.LoadFromByteArray та THPDFJBIG2Decoder.LoadRegionFromByteArray