Метод THotPDF.DecodeLoadedStreamToStream
Декодира зареден PDF поток през цялата му филтърна верига и записва крайния етап директно във властвен от извикващия поток
Декларация
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject; Output: TStream; out Info: THPDFDecodePipelineInfo): boolean;
Модул
HPDFDoc
Параметри
| Име | Цел |
|---|---|
AStream | Зареден THPDFStreamObject, чийто запис /Filter се декодира |
Output | Властвана от извикващия дестинация, която приема декодираните байтове на текущата си позиция |
Info | Приема броя входни и изходни байтове, броя филтри, дълбочина, състояние, провалил се филтър и диагностика |
Info | Получава бройки на входни и изходни байтове, бройки на филтри, дълбочина, статус, провалящ се филтър и диагностики |
Връщана стойност
Връща True само когато всеки заявен етап успее
Бележки за употреба
- Крайният филтър пише в
Output, без да създава втори краен поток в паметта с пълен размер - Междинните етапи остават ограничени от
DecodeBudgetBytes, а всеки декодиран байт консумира иDocumentDecodeBudgetBytes - Всяка стъпка остава ограничена от
DecodeBudgetBytes, а всеки декодиран байт консумира иDocumentDecodeBudgetBytes - ASCII85 изисква точен краен маркер
~>, а ASCIIHex изисква>; повредени заредени pipeline-и се провалят, вместо да приемат отрязани данни DecodePipelineDepthLimit, откриване на циклични индиректни препратки и откриване на рекурсия в същия поток ограничават враждебни обектни графи- Позицията на изходния поток се възстановява след успех или неуспех
DecodePipelineDepthLimit, засичането на цикли в индиректни препратки и засичането на рекурсия в същия поток ограничават враждебни графи от обекти - Позицията в източниковия поток се възстановява след успех или провал
- Регистрираните стъпки
IHPDFCustomStreamFilterсподелят същите агрегирани бюджети и дълбочина на pipeline - Потребителският push и pull изход е изолиран в адаптивен временен поток, докато тази потребителска стъпка succeeds
- Overload-ът с отмяна връща
dpsCancelledinstead of leakingEHPDFOperationCancelled - Провалила се поточна дестинация може да съдържа байтове, приети преди неуспеха; използвайте временна дестинация, когато се изисква атомарен изход
Диагностика
THPDFDecodePipelineInfo = record
Status: THPDFDecodePipelineStatus;
InputBytes: Int64;
OutputBytes: Int64;
FilterCount: Integer;
AppliedFilterCount: Integer;
PipelineDepth: Integer;
StopBeforeLast: Boolean;
FailedFilter: AnsiString;
Diagnostic: AnsiString;
end;
Status разграничава невалидни потоци и филтри, ограничения за брой филтри и дълбочина, циклични препратки, рекурсивни потоци, неподдържани филтри, неуспехи на бюджета и неуспехи на декодери
Пример
Output := TFileStream.Create('payload.bin', fmCreate);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output, Info) then
raise Exception.Create(String(Info.Diagnostic));
finally
Output.Free;
end;