PDFium Delphi Component Справочник API

Пакетное извлечение вложений

Компонент: TPdf  ·  Модуль: PDFium
Однократно инвентаризирует встроенные вложения и записывает их декодированные полезные нагрузки в потоки вызывающей стороны под явным контролем ресурсов

ReadAttachmentMetadata

function ReadAttachmentMetadata(MaxAttachments: Integer = 10000): TPdfAttachmentMetadataArray;

Метод однократно перечисляет вложения уровня документа и возвращает записи во владении вызывающей стороны, содержащие Index, Name, Description, MimeType, Relationship, декодированный Size и Readable

MaxAttachments проверяется до заполнения массива результата, не позволяя недоверенному документу вызвать неограниченное выделение памяти под метаданные

Запрос размера не копирует байты полезной нагрузки в память PDFium Delphi Component, хотя PDFium может декодировать поток внутри себя, чтобы определить его декодированную длину

ExtractAttachmentsToStreams

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 не поддерживает чтение диапазонов и может использовать внутри собственную память для декодирования полной полезной нагрузки

Потоки остаются во владении вызывающей стороны, запись начинается с текущей позиции каждого потока, а метод не перематывает и не усекает их

Отмена или исключение в приёмнике могут оставить уже записанные в поток байты, поэтому вызывающей стороне, которой нужен транзакционный результат, следует передавать временные потоки и публиковать их только после успешного отчёта

Options

FieldDefaultMeaning
MaxAttachments10000Максимум записей метаданных и отчёта
MaxFileBytes256 MiBМаксимальный декодированный размер одного вложения
MaxTotalBytes1 GiBМаксимум байтов, записанных во все приёмники
ChunkBytes1 MiBМаксимум байтов за одну запись в поток
StopOnErrorTrueОстановка после первого нечитаемого, сверхлимитного или неудачно записанного элемента

Report

Каждая запись 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 при декодировании

Example

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);

See Also

Attachment, AttachmentCount, AttachmentDescription, AttachmentName, AttachmentType