function ReadAttachmentMetadata(MaxAttachments: Integer = 10000): TPdfAttachmentMetadataArray;
Метод однократно перечисляет вложения уровня документа и возвращает записи во владении вызывающей стороны, содержащие Index, Name, Description, MimeType, Relationship, декодированный Size и Readable
MaxAttachments проверяется до заполнения массива результата, не позволяя недоверенному документу вызвать неограниченное выделение памяти под метаданные
Запрос размера не копирует байты полезной нагрузки в память PDFium Delphi Component, хотя PDFium может декодировать поток внутри себя, чтобы определить его декодированную длину
function ExtractAttachmentsToStreams(const Destinations: array of TStream; const Options: TPdfAttachmentBatchOptions; out Report: TPdfAttachmentBatchReport; const CancellationToken: IPdfCancellationToken = nil): Boolean;
Destinations должно содержать ровно один слот на каждое вложение документа и следует тому же порядку с нулевым отсчётом, что и Attachment[Index]
Приёмник nil помечает элемент как paesSkipped, позволяя вызывающей стороне выбирать вложения без второго перечисления
Каждая непустая полезная нагрузка декодируется через PDFium в один временный буфер PDFium Delphi Component, а затем записывается из этого буфера кусками по ChunkBytes
Буфер освобождается до перехода к следующему вложению, поэтому PDFium Delphi Component никогда не удерживает весь пакет целиком, но публичный API вложений PDFium не поддерживает чтение диапазонов и может использовать внутри собственную память для декодирования полной полезной нагрузки
Потоки остаются во владении вызывающей стороны, запись начинается с текущей позиции каждого потока, а метод не перематывает и не усекает их
Отмена или исключение в приёмнике могут оставить уже записанные в поток байты, поэтому вызывающей стороне, которой нужен транзакционный результат, следует передавать временные потоки и публиковать их только после успешного отчёта
| Field | Default | Meaning |
|---|---|---|
MaxAttachments | 10000 | Максимум записей метаданных и отчёта |
MaxFileBytes | 256 MiB | Максимальный декодированный размер одного вложения |
MaxTotalBytes | 1 GiB | Максимум байтов, записанных во все приёмники |
ChunkBytes | 1 MiB | Максимум байтов за одну запись в поток |
StopOnError | True | Остановка после первого нечитаемого, сверхлимитного или неудачно записанного элемента |
Каждая запись TPdfAttachmentMetadata описывает одно нативное вложение, а TPdfAttachmentMetadataArray хранит снимок метаданных
Каждый TPdfAttachmentBatchItem объединяет метаданные, TPdfAttachmentExtractionState, число записанных байтов и текст ошибки, а TPdfAttachmentBatchItems хранит все поштучные результаты
Значения TPdfAttachmentExtractionState: paesNotProcessed, paesSkipped, paesExtracted, paesUnreadable, paesFileLimit, paesAggregateLimit, paesCancelled и paesWriteFailed
TPdfAttachmentBatchReport считает AttachmentCount, ExtractedCount, SkippedCount и FailedCount вместе с BytesWritten и PeakBufferBytes
Completed означает, что каждый элемент достиг конечного состояния без отмены, а результат функции дополнительно требует FailedCount = 0
PeakBufferBytes сообщает наибольший буфер полезной нагрузки PDFium Delphi Component и не учитывает приватную память, использованную PDFium при декодировании
var Options: TPdfAttachmentBatchOptions;
var Report: TPdfAttachmentBatchReport;
Options := TPdfAttachmentBatchOptions.Default;
Options.MaxFileBytes := 64 * 1024 * 1024;
Options.MaxTotalBytes := 256 * 1024 * 1024;
if not Pdf1.ExtractAttachmentsToStreams(Destinations, Options, Report) then
HandleAttachmentBatchFailure(Report);