THotPDF.DecodeLoadedStreamToStream Method
Декодирует загруженный поток PDF через полную цепочку фильтров и записывает результат последней стадии напрямую в принадлежащий вызывающему коду поток
Объявление
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject; Output: TStream; out Info: THPDFDecodePipelineInfo): boolean;
Модуль
HPDFDoc
Параметры
| Имя | Назначение |
|---|---|
AStream | Загруженный THPDFStreamObject, чья запись /Filter декодируется |
Output | Принадлежащее вызывающему назначение, принимающее декодированные байты с текущей позиции |
CancellationToken | Опциональная кооперативная отмена, разделяемая с пользовательскими стадиями фильтров |
Info | Принимает счётчики входных и выходных байтов, число фильтров, глубину, статус, сбойный фильтр и диагностику |
Возвращаемое значение
Возвращает True только при успешном выполнении всех запрошенных стадий
Примечания по использованию
- Финальный фильтр пишет в
Outputбез создания второго полноразмерного финального memory stream - Промежуточные стадии используют
THPDFAdaptiveTempStreamи сбрасываются в собственные временные файлы послеLoadedStreamMemoryThreshold - Каждая стадия ограничена
DecodeBudgetBytesи каждый декодированный байт также расходуетDocumentDecodeBudgetBytes - ASCII85 требует точный
~>конечный маркер, а ASCIIHex —>; повреждённые загруженные конвейеры завершаются ошибкой вместо приёма обрезанных данных DecodeFilterLimitотвергает чрезмерно большие массивы до выделения стадийDecodePipelineDepthLimit, обнаружение циклических косвенных ссылок и рекурсии в одном потоке ограничивают враждебные графы объектов- Позиция исходного потока восстанавливается после успеха или неудачи
- Зарегистрированные
IHPDFCustomStreamFilterстадии разделяют общие бюджеты и глубину конвейера - Пользовательский push- и pull-вывод изолируется в адаптивном временном потоке, пока пользовательская стадия не завершится успешно
- Перегрузка с отменой возвращает
dpsCancelledвместо пробросаEHPDFOperationCancelled - Сбойное потоковое назначение может содержать байты, принятые до сбоя; когда нужна атомарность вывода, используйте временное назначение
Диагностика
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;