PDFium Delphi Component Docs

Método ExtractAttachmentsToStreams

Componente: TPdf  ·  Unidade: PDFium
Descodifica todos os anexos incorporados ao nível do documento e escreve os bytes em fluxos fornecidos pelo chamador, sob controlos explícitos de tamanho, fragmentação, cancelamento e comunicação de erros

Syntax

function ExtractAttachmentsToStreams(const Destinations: array of TStream; const Options: TPdfAttachmentBatchOptions; out Report: TPdfAttachmentBatchReport; const CancellationToken: IPdfCancellationToken = nil): Boolean;

DestinationsOpen 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.
OptionsTPdfAttachmentBatchOptions. Limites e comportamento do lote: MaxAttachments, MaxFileBytes, MaxTotalBytes, ChunkBytes e StopOnError. Comece por TPdfAttachmentBatchOptions.Default.
ReportTPdfAttachmentBatchReport. 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).
CancellationTokenIPdfCancellationToken. Token opcional consultado antes de cada anexo e entre blocos de escrita; nil executa o lote sem verificações de cancelamento.
ResultBoolean. True apenas quando o lote concluiu sem cancelamento e sem nenhum anexo com falha; as entradas ignoradas não contam como falhas.

Description

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

Remarks

Example

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;

See Also

ReadAttachmentMetadata, Attachment, AttachmentCount, AttachmentName