Реєстр спеціальних фільтрів потоків
HotPDF може декодувати визначені застосунком фільтри потоків PDF у межах того самого обмеженого конвеєра, який використовують його вбудовані декодери Flate, LZW, ASCII85, ASCIIHex і RunLength
Реєстрація push- або pull-фільтрів
Реалізуйте IHPDFCustomStreamFilter, оберіть csfmPush або csfmPull та зареєструйте інтерфейс через THotPDF.RegisterCustomStreamFilter
Імена зіставляються без урахування регістру без провідного слеша, явною є повторна реєстрація, вбудовані імена не можна замінити, а кожен документ приймає щонайбільше 64 спеціальних імен
Пошук у реєстрі зберігає знімок інтерфейсу під короткою критичною секцією; зворотні виклики фільтрів та знищення інтерфейсу виконуються поза блокуванням реєстру
Один бюджет на всіх етапах
Спеціальний вивід споживає DecodeBudgetBytes і DocumentDecodeBudgetBytes через наявний агрегатний трекер, тому змішаний ланцюг спеціальних і вбудованих фільтрів не може скинути облік розширення між етапами
THPDFCustomStreamFilterRequest.MaxOutputBytes повідомляє залишок дозволу ланцюга, тоді як нуль означає, що налаштований бюджет ланцюга необмежений
Запит також надає декодоване ім'я фільтра PDF, нульовий індекс етапу, глибину конвеєра, розмір введення, коли доступний, і токен скасування викликаючого коду
Контракти скасування та пошуку
Overload DecodeLoadedStreamToStream з підтримкою скасування перевіряє токен до і після виконання користувацького коду та під час передавання pull-потоку
Спеціальні реалізації мають перевіряти Request.CancellationToken усередині довгих циклів push або блокуючої зовнішньої роботи
csscSeekable оголошує, що запозичене введення, призначення push або повернений потік pull мають підтримувати пошук; порушення контракту створюють dpsSeekContractViolation
Ізоляція збоїв
Кожен спеціальний етап записує в обмежений THPDFAdaptiveTempStream до публікації будь-яких байтів наступному етапу або призначенню викликаючого коду
Помилковий результат, виняток, скасування, порушення пошуку або невдача бюджету відкидають цей тимчасовий вивід і повертають типізований статус конвеєра, не пропускаючи спеціальний виняток через публічну межу декодування
Успішний фільтр pull передає право власності на свій повернений потік HotPDF; повернення запозиченого введення або потоку nil відхиляється
Телеметрія
GetCustomStreamFilterStatistics повідомляє зареєстровані імена, спроби push і pull, успіх, збій, кількість скасувань і порушень пошуку, сукупні вхідні та створені байти, а також останнє ім'я та діагностику
THPDFDecodePipelineInfo.CustomFilterCount і CustomFilterFailureCount описують поточний ланцюг
Приклад
Filter := TApplicationFilter.Create;
PDF.RegisterCustomStreamFilter(Filter);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output,
CancellationToken, Info) then
HandleDecodeFailure(Info.Status, Info.Diagnostic);
finally
PDF.UnregisterCustomStreamFilter(Filter.FilterName);
end;