type TPdfStreamInspector = class ... end;
| Constructor | Description |
|---|---|
Create(Source: TStream) | Czyta przeszukiwalne źródło PDF przy domyślnych budżetach i przywraca jego pierwotną pozycję |
Create(Source: TStream; const Options: TPdfStreamInspectOptions) | Czyta przeszukiwalne źródło PDF przy budżetach wybranych przez wywołującego |
Create(const Data: TBytes) | Analizuje istniejącą tablicę bajtów PDF przy domyślnych budżetach |
Create(const Data: TBytes; const Options: TPdfStreamInspectOptions) | Analizuje istniejącą tablicę bajtów PDF przy budżetach wybranych przez wywołującego |
| Method | Description |
|---|---|
CopyRawData(Index, Destination, out Report) | Kopiuje pełny zakodowany ładunek jednego obiektu strumieniowego |
CopyRawData(Index, Destination, Offset, Count, out Report) | Kopiuje zwalidowane okno bajtów bez dekodowania łańcucha filtrów |
DecodeData(Index, Destination, Level, out Report) | Zwraca dane surowe albo stosuje obsługiwane filtry ogólne w kolejności deklaracji |
PdfStreamFilterKindFromName(Name) | Mapuje pełną lub skróconą nazwę filtra PDF na TPdfStreamFilterKind |
| Constant | Value | Purpose |
|---|---|---|
PdfStreamInspectDefaultSourceLimit | 512 MiB | Maksymalny przetrzymywany rozmiar źródła |
PdfStreamInspectDefaultRawLimit | 256 MiB | Maksymalny surowy ładunek kopiowany przez jedną operację |
PdfStreamInspectDefaultDecodedLimit | 256 MiB | Maksymalny zdekodowany ładunek produkowany przez jedną operację |
PdfStreamInspectDefaultExpansionRatio | 100 | Maksymalny stosunek ekspansji zdekodowane do zakodowanej |
PdfStreamInspectDefaultMaxStreams | 1,000,000 | Maksymalna liczba zinwentaryzowanych obiektów strumieniowych |
PdfStreamInspectDefaultDictionaryLimit | 1 MiB | Maksymalna liczba bajtów słownika analizowanych dla jednego strumienia |
| Type | Description |
|---|---|
TPdfStreamFilterKind | Klasyfikuje filtry jako psfkUnknown, psfkASCIIHex, psfkASCII85, psfkLZW, psfkFlate, psfkRunLength, psfkCCITTFax, psfkJBIG2, psfkDCT, psfkJPX, psfkCrypt lub psfkBrotli |
TPdfStreamNativeAccess | Wybiera brak ścieżki natywnej, dostęp do obiektu obrazu albo dostęp do pliku osadzonego |
TPdfStreamDecodeLevel | Wybiera dane surowe, obsługiwane filtry ogólne albo wymagane pełne dekodowanie łańcucha |
TPdfStreamReadStatus | Raportuje psrsCompleted, psrsPartiallyDecoded, psrsInvalidIndex, psrsInvalidRange, psrsSourceLimitExceeded, psrsRawLimitExceeded, psrsDecodedLimitExceeded, psrsExpansionRatioExceeded, psrsUnsupportedFilter, psrsUnsupportedDecodeParameters, psrsEncrypted, psrsExternalData, psrsMalformed lub psrsWriteError |
TPdfStreamFilterInfo | Nazwa filtra, Kind, obecność DecodeParms w HasDecodeParameters, Predictor, Colors, BitsPerComponent, Columns oraz wartość LZW EarlyChange |
TPdfStreamFilterInfos | Tablica dynamiczna rekordów TPdfStreamFilterInfo |
TPdfStreamInfo | Tożsamość obiektu (ObjectNumber, Generation, TypeName), przesunięcia i długości (ObjectOffset, DictionaryOffset, DictionaryLength, RawOffset, RawLength, DecodedLengthHint), flagi układu (LengthIsIndirect, UsedEndStreamFallback), flagi szyfrowania i pliku zewnętrznego (HasExternalFile, IsEncryptedDocument), nazwy typów (SubtypeName), granica natywna (NativeAccess o wartości psnaNone, psnaImageObject lub psnaEmbeddedFile) oraz zadeklarowany łańcuch Filters |
TPdfStreamInfos | Tablica dynamiczna rekordów TPdfStreamInfo |
TPdfStreamInspectOptions | Budżety źródła, ładunku (MaxRawBytes, MaxDecodedBytes), ekspansji (MaxExpansionRatio), liczby obiektów (MaxStreams), słownika (MaxDictionaryBytes), tokenów (MaxTokens), alokacji (MaxAllocationBytes) i terminu DeadlineMilliseconds wybrane przez wywołującego, ze statycznym inicjalizatorem Default |
TPdfStreamReadReport | Status, liczniki bajtów (InputByteCount, OutputByteCount), liczby filtrów zastosowanych i pozostałych (AppliedFilterCount, RemainingFilterCount), indeks filtra, który zawodzi (FailedFilterIndex), oraz tekst ErrorMessage dla jednego odczytu |
| Member | Type | Description |
|---|---|---|
Count | Integer | Liczba fizycznych obiektów strumieniowych lub rewizji znalezionych w źródle |
Infos[Index] | TPdfStreamInfo | Numer obiektu, generacja, przesunięcia, długości, filtry, DecodeParms i klasyfikacja dostępu natywnego |
Encrypted | Boolean | Czy trailer deklaruje szyfrowanie dokumentu |
Options | TPdfStreamInspectOptions | Znormalizowane budżety zasobów używane przez inspektor |
SourceByteCount | Int64 | Liczba bajtów wejściowych przetrzymanych do analizy |
psdlRaw kopiuje zakodowane bajty strumienia bez stosowania filtrówpsdlGeneral stosuje ASCIIHex, ASCII85, LZW, Flate, RunLength, predyktory TIFF 8-bit i PNG, a następnie zwraca psrsPartiallyDecoded, gdy pozostaje obraz lub nieznany kodekpsdlFull wymaga, aby cały łańcuch korzystał z obsługiwanych filtrów ogólnych, a w przeciwnym razie zwraca psrsUnsupportedFilterpsnaImageObject kieruje wywołujących na poziomie dokumentu do natywnych FPDFImageObj_GetImageDataRaw, FPDFImageObj_GetImageDataDecoded i API filtrów obrazówpsnaEmbeddedFile kieruje wywołujących załączników do natywnej ścieżki FPDFAttachment_GetFilepsrsEncrypted, ponieważ publiczne natywne ABI nie odszyfrowuje dowolnego strumienia pośredniego po numerze obiektuTPdfStreamInspectOptions.Default łączy swoje limity źródła, ładunku, ekspansji, słownika i strumieni z bieżącą polityką tokenów, obiektów, bajtów zdekodowanych, stosunku ekspansji, alokacji i terminu TPdfParserResourceBudget
TPdfStreamReadReport zapisuje status, liczniki bajtów wejściowych i wyjściowych, filtry zastosowane i pozostałe, indeks filtra, który zawodzi, oraz błędy zapisu do miejsca docelowego
Bieżąca implementacja przetrzymuje jedną ograniczoną kopię źródła, aby wspierać niezawodne rozwiązywanie długości pośrednich i powtarzalne odczyty swobodne strumieni; przy przetwarzaniu niezaufanych uploadów pod ostrzejszym budżetem pamięci użyj niższego 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;