Регистър на потребителски 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;

Свързани API