Регистър на потребителски stream филтри
HotPDF може да декодира PDF stream филтри, дефинирани от приложението, в същия ограничен пайплайн, който ползват вградените му декодери Flate, LZW, ASCII85, ASCIIHex и RunLength
Регистриране на push или pull филтри
Имплементирайте IHPDFCustomStreamFilter, изберете csfmPush или csfmPull и регистрирайте интерфейса чрез THotPDF.RegisterCustomStreamFilter
Имената се съпоставят без разлика в регистъра и без водеща наклонена черта, дублираната регистрация е изрична, вградените имена не могат да се заменят, а всеки документ приема най-много 64 потребителски имена
Търсенията в регистъра задържат snapshot на интерфейса под кратка critical section; filter callback-ите и унищожаването на интерфейса вървят извън заключването на регистъра
Един бюджет за всички стъпки
Потребителският изход изразходва DecodeBudgetBytes и DocumentDecodeBudgetBytes през съществуващия агрегиран tracker, така че смесена верига от потребителски и вградени стъпки не може да нулира отчитането на разширение между стъпките
THPDFCustomStreamFilterRequest.MaxOutputBytes докладва остатъка от лимита за верига, а нула означава, че настроеният бюджет за верига е неограничен
Заявката подава и декодираното име на PDF филтъра, индекс на стъпката от нулата, дълбочина на пайплайна, размер на входа, когато е наличен, и cancellation token на извикващия
Отмяна и seek договорки
Cancellation-съзнаващият overload на DecodeLoadedStreamToStream проверява преди и след потребителското изпълнение и по време на transfer на pull stream
Потребителските имплементации трябва да проверяват Request.CancellationToken вътре в дълги push цикли или блокираща външна работа
csscSeekable декларира, че заетият вход, push целта или върнатият pull stream трябва да поддържат seeking; нарушение на договорката дава dpsSeekContractViolation
Изолация на провалите
Всяка потребителска стъпка пише в ограничен THPDFAdaptiveTempStream, преди някой байт да бъде публикуван към следващата стъпка или целта на извикващия
False резултат, изключение, отмяна, seek нарушение или провален бюджет изхвърля този временен изход и връща типизиран pipeline статус, без да пропуска потребителско изключение през публичната decode граница
Успешен pull филтър прехвърля собствеността върнатия му stream към HotPDF; връщане на заетия вход или на nil stream се отхвърля
Телеметрия
GetCustomStreamFilterStatistics докладва регистрирани имена, push и pull опити, успех, провал, брой отменяния и seek нарушения, общи входни и произведени байтове, плюс последното име и диагностика
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;