function ExtractAttachmentsToStreams(const Destinations: array of TStream; const Options: TPdfAttachmentBatchOptions; out Report: TPdfAttachmentBatchReport; const CancellationToken: IPdfCancellationToken = nil): Boolean;
| Destinations | Open array of TStream. Jeden stream na přílohu, v pořadí v dokumentu. Slot s nil danou přílohu přeskočí bez zápisu čehokoli. Streamy zůstávají ve vlastnictví volajícího |
| Options | TPdfAttachmentBatchOptions. Limity a chování dávky: MaxAttachments, MaxFileBytes, MaxTotalBytes, ChunkBytes a StopOnError. Vycházejte z TPdfAttachmentBatchOptions.Default |
| Report | TPdfAttachmentBatchReport. Při návratu nese jednu položku na přílohu (Metadata, State, BytesWritten, ErrorMessage) plus souhrnné čítače (AttachmentCount, ExtractedCount, SkippedCount, FailedCount, BytesWritten, PeakBufferBytes, Cancelled, Completed) |
| CancellationToken | IPdfCancellationToken. Volitelný token dotazovaný před každou přílohou a mezi zápisovými chunky; nil spustí dávku bez kontrol zrušení |
| Result | Boolean. True jen když dávka dokončila bez zrušení a s nulovým počtem selhaných příloh; přeskočené položky se nepočítají jako selhání |
Dávkový protějšek čtení Attachment po jednom indexu. Přílohy dokumentu se zachytí jednou a každý obsah se dekóduje a zatlačí do svého cílového streamu, přičemž každý výsledek se zaznamená na přílohu v Report.Items
Cílové pole musí obsahovat přesně jeden stream na přílohu v dokumentu, jinak se EPdfError vyvolá dřív, než se přečte jediný bajt. Položka nil v poli označí danou přílohu jako přeskočenou (paesSkipped) místo přerušení dávky
Možnosti se validují předem a při neplatnosti vyvolají EPdfError: MaxAttachments musí být větší než nula, MaxFileBytes a MaxTotalBytes nesmí být záporné a ChunkBytes musí být větší než nula. TPdfAttachmentBatchOptions.Default dodává 10000 příloh, limit 256 MB na soubor, souhrnný limit 1 GB, zapisovací chunky 1 MB a StopOnError = True
Každá příloha skončí v jednom ze stavů TPdfAttachmentExtractionState: paesExtracted při úspěchu, paesSkipped pro nil cíl, paesUnreadable, když obsah nelze otevřít nebo dekódovat, paesFileLimit nebo paesAggregateLimit, když se překročí limit velikosti, paesWriteFailed, když cílový stream vyvolá výjimku, a paesCancelled, když token spustí. Se zapnutým StopOnError první selhání zastaví smyčku a zbývající položky zůstanou paesNotProcessed
Funkce vrací True jen když je nastaveno Report.Completed (bez zrušení, nic nezůstalo nezpracované) a FailedCount je nula. Cesta zrušení vrací False s nastaveným Report.Cancelled místo vyvolání výjimky
ChunkBytes řídí, jak po malých kusech se ten buffer zatlačuje do streamu, nikoli velikost alokace. Report.PeakBufferBytes zaznamenává největší použitý buffer
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;