property Attachment[Index: Integer]: TBytes;
يمكن لمستندات PDF أن تحمل ملفات مساعدة عشوائية، مثل جداول البيانات المصدرية أو مستندات Word الأصلية أو الفواتير المرفقة أو حمولات XML الموقعة أو حِزم ZIP أو حتى ملفات PDF أخرى، داخل حاوية على مستوى المستند تسمى شجرة الأسماء EmbeddedFiles. كل مدخل هو قاموس مواصفات ملف PDF يحمل تدفقه البايتات الفعلية للملف المرفق. يعرض PDFiumPas هذه الشجرة كفهرس صفري مسطح من 0 إلى AttachmentCount - 1
تعيد قراءة Attachment[Index] المحتوى البايتـي المفكوك للملف المرفق على شكل مصفوفة TBytes، أي البايتات نفسها التي سيستخرجها أي قارئ PDF آخر عندما ينقر المستخدم أيقونة مشبك الورق ويحفظ المرفق. البايتات المعادة مفكوكة الضغط بالفعل؛ ويمكنك كتابتها مباشرة إلى القرص أو دفعها إلى تدفق أو تمريرها إلى مثيل TPdf آخر إذا كان المرفق نفسه ملف PDF
الكتابة تستبدل تدفق الملف للموضع المرفق الموجود في مكانه. يجب أن يكون الموضع موجودا مسبقا؛ فاستخدم CreateAttachment أولا إذا كنت تحتاج إلى إضافة مدخل جديد. تُخزَّن الكتابات مؤقتا في الذاكرة ولا تصبح دائمة إلا بعد حفظ المستند باستخدام SaveAs
| Index | Integer. الموضع الصفري في شجرة الأسماء EmbeddedFiles. يجب أن يحقق 0 <= Index < AttachmentCount. تتطابق الفهارس مع تلك التي تعيدها AttachmentName وAttachmentType، لذا فإن التكرار على 0..AttachmentCount - 1 يزور كل مرفق مرة واحدة فقط |
TBytes بعملية تخصيص واحدة؛ لذا قِس ضغط الذاكرة قبل قراءة عشرات الحمولات متعددة الميغابايت في حلقة ضيقةAttachment[Index] لا يغير حجم شجرة EmbeddedFiles أبدا؛ بل يستبدل بايتات التدفق فقط. ولإزالة مدخل استخدم DeleteAttachment
var
I: Integer;
Data: TBytes;
OutPath: string;
begin
Pdf1.LoadFromFile('with-attachments.pdf');
for I := 0 to Pdf1.AttachmentCount - 1 do
begin
Data := Pdf1.Attachment[I];
OutPath := 'extracted\' + Pdf1.AttachmentName[I];
TFile.WriteAllBytes(OutPath, Data);
Memo1.Lines.Add(Format('%s (%s, %d bytes)',
[Pdf1.AttachmentName[I], Pdf1.AttachmentType[I], Length(Data)]));
end;
end;