function ReadAttachmentMetadata(MaxAttachments: Integer = 10000): TPdfAttachmentMetadataArray;
O método enumera os anexos ao nível do documento uma única vez e devolve records da posse do chamador contendo Index, Name, Description, MimeType, Relationship, o Size descodificado e Readable
MaxAttachments é verificado antes de o array de resultados ser preenchido, impedindo que um documento não fidedigno provoque uma alocação de metadados sem limites
A consulta de tamanho não copia bytes de payload para a memória do PDFium Delphi Component, embora o PDFium possa descodificar um fluxo internamente para determinar o comprimento descodificado
function ExtractAttachmentsToStreams(const Destinations: array of TStream; const Options: TPdfAttachmentBatchOptions; out Report: TPdfAttachmentBatchReport; const CancellationToken: IPdfCancellationToken = nil): Boolean;
Destinations tem de conter exatamente um slot por anexo do documento e segue a mesma ordem baseada em zero de Attachment[Index]
Um destino nil marca esse item como paesSkipped, permitindo aos chamadores selecionar anexos sem uma segunda enumeração
Cada payload não vazio é descodificado através do PDFium para um buffer temporário do PDFium Delphi Component e depois escrito a partir desse buffer em porções de ChunkBytes
O buffer é libertado antes do anexo seguinte, por isso o PDFium Delphi Component nunca retém o lote completo, mas a API pública de anexos do PDFium não suporta leituras por intervalos e pode usar internamente a sua própria memória de descodificação do payload completo
Os fluxos continuam na posse do chamador, a escrita começa na posição atual de cada fluxo e o método não os rebobina nem os trunca
O cancelamento ou uma exceção num destino pode deixar bytes já escritos nesse fluxo, por isso os chamadores que exigem saída transacional devem fornecer fluxos temporários e publicá-los apenas depois de um relatório bem-sucedido
| Campo | Predefinição | Significado |
|---|---|---|
MaxAttachments | 10000 | Número máximo de entradas de metadados e do relatório |
MaxFileBytes | 256 MiB | Tamanho descodificado máximo de um anexo |
MaxTotalBytes | 1 GiB | Número máximo de bytes escritos em todos os destinos |
ChunkBytes | 1 MiB | Número máximo de bytes passados a uma escrita no fluxo |
StopOnError | True | Para no primeiro item ilegível, fora do orçamento ou com falha de escrita |
Cada record TPdfAttachmentMetadata descreve um anexo nativo e TPdfAttachmentMetadataArray guarda o instantâneo dos metadados
Cada TPdfAttachmentBatchItem combina metadados, um TPdfAttachmentExtractionState, os bytes escritos e eventual texto de erro, enquanto TPdfAttachmentBatchItems guarda todos os resultados por item
Os valores de TPdfAttachmentExtractionState são paesNotProcessed, paesSkipped, paesExtracted, paesUnreadable, paesFileLimit, paesAggregateLimit, paesCancelled e paesWriteFailed
O TPdfAttachmentBatchReport contabiliza AttachmentCount, ExtractedCount, SkippedCount e FailedCount, além de BytesWritten e PeakBufferBytes
Completed significa que todos os itens chegaram a um estado terminal sem cancelamento, enquanto o resultado da função exige adicionalmente FailedCount = 0
PeakBufferBytes reporta o maior buffer de payload do PDFium Delphi Component e não inclui a memória privada usada pelo PDFium durante a descodificação
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);