Метод THotPDF.DecodeLoadedStreamToStream
Декодує завантажений потік PDF через повний ланцюг фільтрів і записує фінальну стадію безпосередньо у потік, що належить виклику
Оголошення
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject; Output: TStream; out Info: THPDFDecodePipelineInfo): boolean;
Модуль
HPDFDoc
Параметри
| Ім'я | Призначення |
|---|---|
AStream | Завантажений THPDFStreamObject, чиї запис /Filter декодується |
Output | Призначення, що належить виклику та приймає декодовані байти у своїй поточній позиції |
CancellationToken | Опційне кооперативне скасування, спільне зі стадіями користувацьких фільтрів |
Info | Приймає підрахунки вхідних і вихідних байтів, кількості фільтрів, глибину, стан, фільтр, що зазнав невдачі, та діагностику |
Повернене значення
Повертає True лише тоді, коли кожна запитана стадія завершується успішно
Примітки щодо використання
- Останній фільтр пише у
Outputбез створення другого повнорозмірного фінального потоку в пам'яті - Проміжні стадії використовують
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;