function ExtractAttachmentsToStreams(const Destinations: array of TStream; const Options: TPdfAttachmentBatchOptions; out Report: TPdfAttachmentBatchReport; const CancellationToken: IPdfCancellationToken = nil): Boolean;
| Destinations | Open array of TStream หนึ่ง stream ต่อไฟล์แนบหนึ่งรายการ เรียงตามลำดับในเอกสาร ช่องที่เป็น nil จะข้ามไฟล์แนบนั้นโดยไม่เขียนอะไรเลย และ stream ยังคงเป็นของผู้เรียก |
| Options | TPdfAttachmentBatchOptions ขีดจำกัดและพฤติกรรมของชุดงาน: MaxAttachments, MaxFileBytes, MaxTotalBytes, ChunkBytes และ StopOnError เริ่มจาก TPdfAttachmentBatchOptions.Default |
| Report | TPdfAttachmentBatchReport เมื่อคืนค่าจะมีหนึ่งรายการต่อไฟล์แนบ (Metadata, State, BytesWritten, ErrorMessage) บวกตัวนับรวม (AttachmentCount, ExtractedCount, SkippedCount, FailedCount, BytesWritten, PeakBufferBytes, Cancelled, Completed) |
| CancellationToken | IPdfCancellationToken token เสริมที่ถูกตรวจก่อนขึ้นกับไฟล์แนบแต่ละรายการและระหว่างการเขียนแต่ละชิ้น หากเป็น nil จะรันชุดงานโดยไม่ตรวจการยกเลิก |
| Result | Boolean คืน True เมื่อชุดงานเสร็จสมบูรณ์โดยไม่ถูกยกเลิกและไม่มีไฟล์แนบใดล้มเหลว รายการที่ถูกข้ามไม่นับเป็นความล้มเหลว |
ฉบับทำเป็นชุดของการอ่าน Attachment ทีละ index ไฟล์แนบของเอกสารถูกเก็บภาพไว้ครั้งเดียว แล้ว payload แต่ละรายการถูกถอดรหัสและส่งเข้า stream ปลายทางของมัน โดยบันทึกผลของทุกไฟล์แนบไว้ใน Report.Items
อาร์เรย์ปลายทางต้องมี stream พอดีหนึ่งตัวต่อไฟล์แนบหนึ่งรายการในเอกสาร มิฉะนั้นจะเกิด EPdfError ก่อนที่ไบต์ใดจะถูกอ่าน ส่วนรายการที่เป็น nil ในอาร์เรย์จะทำเครื่องหมายไฟล์แนบนั้นว่าถูกข้าม (paesSkipped) แทนการยุติชุดงานทั้งหมด
options จะถูกตรวจตั้งแต่ต้นและเกิด EPdfError เมื่อค่าไม่ถูกต้อง: MaxAttachments ต้องมากกว่าศูนย์ MaxFileBytes และ MaxTotalBytes ติดลบไม่ได้ และ ChunkBytes ต้องมากกว่าศูนย์ ค่าจาก TPdfAttachmentBatchOptions.Default ให้ไฟล์แนบสูงสุด 10000 รายการ, ขีดจำกัดต่อไฟล์ 256 MB, ขีดจำกัดรวม 1 GB, เขียนทีละ 1 MB และ StopOnError = True
ไฟล์แนบแต่ละรายการจะจบในสถานะใดสถานะหนึ่งของ TPdfAttachmentExtractionState: paesExtracted เมื่อสำเร็จ, paesSkipped เมื่อปลายทางเป็น nil, paesUnreadable เมื่อเปิดหรือถอดรหัส payload ไม่ได้, paesFileLimit หรือ paesAggregateLimit เมื่อขนาดเกินขีดจำกัด, paesWriteFailed เมื่อ stream ปลายทาง raise และ paesCancelled เมื่อ token ยิง หากเปิด StopOnError ไว้ ความล้มเหลวแรกจะหยุดลูปทันที และรายการที่เหลือจะยังคงเป็น paesNotProcessed
function คืน True เฉพาะเมื่อ Report.Completed ถูกตั้ง (ไม่มีการยกเลิก ไม่มีรายการค้าง) และ FailedCount เป็นศูนย์ กรณียกเลิกจะคืน False พร้อมตั้ง Report.Cancelled แทนการ raise
ChunkBytes ควบคุมความละเอียดของการส่งบัฟเฟอร์นั้นลง stream ไม่ใช่ขนาดที่จองไว้ ส่วน Report.PeakBufferBytes จดบัฟเฟอร์ที่ใหญ่ที่สุดที่เคยใช้
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;