type TPdfStreamInspector = class ... end;
| Constructor | Description |
|---|---|
Create(Source: TStream) | 在預設額度下讀取可搜尋的 PDF 來源,並還原其原始位置 |
Create(Source: TStream; const Options: TPdfStreamInspectOptions) | 在呼叫端選擇的額度下讀取可搜尋的 PDF 來源 |
Create(const Data: TBytes) | 在預設額度下檢查現有的 PDF 位元組陣列 |
Create(const Data: TBytes; const Options: TPdfStreamInspectOptions) | 在呼叫端選擇的額度下檢查現有的 PDF 位元組陣列 |
| Method | Description |
|---|---|
CopyRawData(Index, Destination, out Report) | 複製一個串流物件的完整編碼承載 |
CopyRawData(Index, Destination, Offset, Count, out Report) | 在不解碼濾波器鏈的情況下複製經驗證的位元組視窗 |
DecodeData(Index, Destination, Level, out Report) | 傳回原始資料,或依宣告順序套用支援的一般濾波器 |
PdfStreamFilterKindFromName(Name) | 將完整或縮寫的 PDF 濾波器名稱映射到 TPdfStreamFilterKind |
| Constant | Value | Purpose |
|---|---|---|
PdfStreamInspectDefaultSourceLimit | 512 MiB | 保留來源的大小上限 |
PdfStreamInspectDefaultRawLimit | 256 MiB | 單一操作複製的原始承載上限 |
PdfStreamInspectDefaultDecodedLimit | 256 MiB | 單一操作產生的解碼承載上限 |
PdfStreamInspectDefaultExpansionRatio | 100 | 解碼對編碼的最大膨脹比 |
PdfStreamInspectDefaultMaxStreams | 1,000,000 | 清點的串流物件數上限 |
PdfStreamInspectDefaultDictionaryLimit | 1 MiB | 單一串流檢查的字典位元組上限 |
| Type | Description |
|---|---|
TPdfStreamFilterKind | 將濾波器分類為 psfkUnknown、psfkASCIIHex、psfkASCII85、psfkLZW、psfkFlate、psfkRunLength、psfkCCITTFax、psfkJBIG2、psfkDCT、psfkJPX、psfkCrypt 或 psfkBrotli |
TPdfStreamNativeAccess | 選擇無原生路徑、影像物件存取或內嵌檔案存取 |
TPdfStreamDecodeLevel | 選擇原始、支援的一般濾波器,或必要的完整鏈解碼 |
TPdfStreamReadStatus | 回報 psrsCompleted、psrsPartiallyDecoded、psrsInvalidIndex、psrsInvalidRange、psrsSourceLimitExceeded、psrsRawLimitExceeded、psrsDecodedLimitExceeded、psrsExpansionRatioExceeded、psrsUnsupportedFilter、psrsUnsupportedDecodeParameters、psrsEncrypted、psrsExternalData、psrsMalformed 或 psrsWriteError |
TPdfStreamFilterInfo | 濾波器名稱、Kind、HasDecodeParameters 的 DecodeParms 存在與否、Predictor、Colors、BitsPerComponent、Columns,以及 LZW EarlyChange 值 |
TPdfStreamFilterInfos | TPdfStreamFilterInfo 記錄的動態陣列 |
TPdfStreamInfo | 物件識別(ObjectNumber、Generation、TypeName)、位移與長度(ObjectOffset、DictionaryOffset、DictionaryLength、RawOffset、RawLength、DecodedLengthHint)、布局旗標(LengthIsIndirect、UsedEndStreamFallback)、加密與外部檔案旗標(HasExternalFile、IsEncryptedDocument)、類型名稱(SubtypeName)、原生邊界(NativeAccess 為 psnaNone、psnaImageObject 或 psnaEmbeddedFile),以及宣告的 Filters 鏈 |
TPdfStreamInfos | TPdfStreamInfo 記錄的動態陣列 |
TPdfStreamInspectOptions | 呼叫端選擇的來源、承載(MaxRawBytes、MaxDecodedBytes)、膨脹(MaxExpansionRatio)、物件數(MaxStreams)、字典(MaxDictionaryBytes)、語彙單元(MaxTokens)、配置(MaxAllocationBytes)與 DeadlineMilliseconds 期限額度,並附靜態 Default 初始化器 |
TPdfStreamReadReport | 單次讀取的狀態、位元組計數(InputByteCount、OutputByteCount)、已套用與剩餘濾波器數(AppliedFilterCount、RemainingFilterCount)、失敗濾波器索引(FailedFilterIndex)與 ErrorMessage 文字 |
| Member | Type | Description |
|---|---|---|
Count | Integer | 在來源中找到的實體串流物件或修訂版數量 |
Infos[Index] | TPdfStreamInfo | 物件編號、世代、位移、長度、濾波器、DecodeParms 與原生存取分類 |
Encrypted | Boolean | trailer 是否宣告文件加密 |
Options | TPdfStreamInspectOptions | 檢查器使用的正規化資源額度 |
SourceByteCount | Int64 | 為檢查而保留的輸入位元組數 |
psdlRaw 複製編碼的串流位元組,不套用濾波器psdlGeneral 套用 ASCIIHex、ASCII85、LZW、Flate、RunLength、TIFF 8 位元與 PNG 預測器,當仍有影像或未知編解碼器時傳回 psrsPartiallyDecodedpsdlFull 要求完整鏈使用支援的一般濾波器,否則傳回 psrsUnsupportedFilterpsnaImageObject 將文件層級呼叫端導向原生 FPDFImageObj_GetImageDataRaw、FPDFImageObj_GetImageDataDecoded 與影像濾波器 APIpsnaEmbeddedFile 將附件呼叫端導向原生 FPDFAttachment_GetFile 路徑psrsEncrypted,因為公開原生 ABI 無法依物件編號解密任意間接串流TPdfStreamInspectOptions.Default 將其來源、承載、膨脹、字典與串流上限,與目前的 TPdfParserResourceBudget 語彙單元、物件、解碼位元組、膨脹比、配置與期限政策結合
TPdfStreamReadReport 記錄狀態、輸入與輸出位元組計數、已套用與剩餘的濾波器、失敗的濾波器索引,以及目的地寫入錯誤
目前的實作會保留一份有界的來源副本,以支援可靠的間接長度解析與可重複的隨機串流讀取;在更緊的記憶體額度下處理不受信任的上傳時,請使用較低的 MaxSourceBytes
var
Inspector: TPdfStreamInspector;
Output: TMemoryStream;
Report: TPdfStreamReadReport;
begin
Inspector := TPdfStreamInspector.Create(PdfBytes);
Output := TMemoryStream.Create;
try
if Inspector.Count > 0 then
Inspector.DecodeData(0, Output, psdlGeneral, Report);
finally
Output.Free;
Inspector.Free;
end;
end;