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, присутствие DecodeParms в HasDecodeParameters, Predictor, Colors, BitsPerComponent, Columns и значение EarlyChange для LZW |
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-bit и предикторы PNG, а затем возвращает psrsPartiallyDecoded, когда остаётся изображение или неизвестный кодекpsdlFull требует, чтобы вся цепочка использовала поддерживаемые общие фильтры, и иначе возвращает psrsUnsupportedFilterpsnaImageObject направляет вызывающих на уровне документа к нативным FPDFImageObj_GetImageDataRaw, FPDFImageObj_GetImageDataDecoded и API фильтров изображенийpsnaEmbeddedFile направляет вызывающих с вложениями к нативному пути FPDFAttachment_GetFilepsrsEncrypted, потому что публичный нативный 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;