THotPDF.DecodeLoadedStreamToStream 方法
透過完整篩選器鏈解碼已載入的 PDF 串流,並將最終階段直接寫入呼叫端擁有的串流
宣告
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject; Output: TStream; out Info: THPDFDecodePipelineInfo): boolean;
單元
HPDFDoc
參數
| 名稱 | 用途 |
|---|---|
AStream | 要解碼其 /Filter 項目的已載入 THPDFStreamObject |
Output | 呼叫端擁有的目的地,在其目前位置接收已解碼位元組 |
Info | 接收輸入與輸出位元組計數、篩選器計數、深度、狀態、失敗的篩選器與診斷 |
Info | 接收輸入與輸出位元組數、filter 計數、深度、狀態、失敗的 filter 與診斷資訊 |
傳回值
僅當每個要求的階段都成功時才傳回 True
使用說明
- 最終篩選器會寫入
Output,而不會建立第二個全尺寸的最終記憶體串流 - 中間階段仍受
DecodeBudgetBytes限制,且每個解碼位元組也會耗用DocumentDecodeBudgetBytes DecodeFilterLimit在階段配置之前拒絕過大的陣列DocumentDecodeBudgetBytes- ASCII85 需要確切的
~>結尾標記,ASCIIHex 需要> DecodePipelineDepthLimit、循環間接參考偵測與相同串流遞迴偵測可限制敵意的物件圖- 來源串流位置會在成功或失敗之後還原
DecodePipelineDepthLimit、循環間接參照偵測與同 stream 遞迴偵測,共同約束惡意的物件圖 - 成功或失敗之後,來源 stream 位置都會被還原
- 已註冊的
IHPDFCustomStreamFilter階段共用相同的彙總預算與管線深度 - 自訂 push 與 pull 輸出會隔離在調適性的暫存 stream 中,直到該自訂階段成功
- 取消 overload 回傳
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;