function ExtractAttachmentsToStreams(const Destinations: array of TStream; const Options: TPdfAttachmentBatchOptions; out Report: TPdfAttachmentBatchReport; const CancellationToken: IPdfCancellationToken = nil): Boolean;
| Destinations | Open array of TStream. Um fluxo por anexo, pela ordem do documento. Uma posição nil ignora esse anexo sem escrever nada. Os fluxos continuam a pertencer ao chamador. |
| Options | TPdfAttachmentBatchOptions. Limites e comportamento do lote: MaxAttachments, MaxFileBytes, MaxTotalBytes, ChunkBytes e StopOnError. Comece por TPdfAttachmentBatchOptions.Default. |
| Report | TPdfAttachmentBatchReport. No retorno contém um item por anexo (Metadata, State, BytesWritten, ErrorMessage) além de contadores agregados (AttachmentCount, ExtractedCount, SkippedCount, FailedCount, BytesWritten, PeakBufferBytes, Cancelled, Completed). |
| CancellationToken | IPdfCancellationToken. Token opcional consultado antes de cada anexo e entre blocos de escrita; nil executa o lote sem verificações de cancelamento. |
| Result | Boolean. True apenas quando o lote concluiu sem cancelamento e sem nenhum anexo com falha; as entradas ignoradas não contam como falhas. |
Contraparte em lote da leitura de Attachment um índice de cada vez. Os anexos do documento são capturados uma única vez, e cada payload é descodificado e enviado para o seu fluxo de destino, com todos os desfechos registados por anexo em Report.Items
O array de destino tem de conter exatamente um fluxo por anexo do documento, caso contrário é gerado um EPdfError antes de ler qualquer byte. Uma entrada nil no array marca esse anexo como ignorado (paesSkipped) em vez de abortar o lote
As opções são validadas de imediato e geram EPdfError quando inválidas: MaxAttachments tem de ser maior que zero, MaxFileBytes e MaxTotalBytes não podem ser negativos, e ChunkBytes tem de ser maior que zero. TPdfAttachmentBatchOptions.Default fornece 10000 anexos, um limite de 256 MB por ficheiro, um limite agregado de 1 GB, blocos de escrita de 1 MB e StopOnError = True
Cada anexo termina num dos estados de TPdfAttachmentExtractionState: paesExtracted em caso de sucesso, paesSkipped para um destino nil, paesUnreadable quando o payload não pode ser aberto ou descodificado, paesFileLimit ou paesAggregateLimit quando um limite de tamanho é excedido, paesWriteFailed quando o fluxo de destino gera um erro, e paesCancelled quando o token é acionado. Com StopOnError ativo, a primeira falha interrompe o ciclo e os restantes itens permanecem paesNotProcessed
A função devolve True apenas quando Report.Completed está definido (sem cancelamento, nada por processar) e FailedCount é zero. O caminho de cancelamento devolve False com Report.Cancelled definido, em vez de gerar um erro
ChunkBytes controla a granularidade com que esse buffer é enviado para o fluxo, não o tamanho da alocação. Report.PeakBufferBytes regista o maior buffer utilizado
var
Options: TPdfAttachmentBatchOptions;
Report: TPdfAttachmentBatchReport;
Streams: array of TStream;
I: Integer;
begin
Pdf1.LoadFromFile('with-attachments.pdf');
SetLength(Streams, Pdf1.AttachmentCount);
for I := 0 to High(Streams) do
Streams[I] := TFileStream.Create('out\' + Pdf1.AttachmentName[I], fmCreate);
try
Options := TPdfAttachmentBatchOptions.Default;
Options.StopOnError := False;
if not Pdf1.ExtractAttachmentsToStreams(Streams, Options, Report) then
ShowMessage(Format('%d extracted, %d failed, %d skipped',
[Report.ExtractedCount, Report.FailedCount, Report.SkippedCount]));
finally
for I := 0 to High(Streams) do
Streams[I].Free;
end;
end;