property Attachment[Index: Integer]: TBytes;
PDF 文件可以在名為 EmbeddedFiles 的名稱樹中,攜帶任意輔助檔案(原始試算表、原始 Word 文件、附加發票、已簽署 XML 負載、ZIP 封裝,甚至其他 PDF)。每個項目都是一個 PDF 檔案規格字典,其串流保存著附加檔案的實際位元組。PDFiumPas 會將該樹公開為從 0 到 AttachmentCount - 1 的平面索引
讀取 Attachment[Index] 會將附加檔案的解碼後位元組內容以 TBytes 陣列傳回,這正是其他 PDF 閱讀器在使用者按下迴紋針圖示並儲存附件時會擷取到的位元組。傳回的位元組已經完成解壓縮;你可以直接寫入磁碟、送入串流,或在附件本身就是 PDF 時再交回另一個 TPdf 執行個體
寫入會原地取代既有附件槽位的檔案串流。該槽位必須已存在;若需要新增項目,請先使用 CreateAttachment。寫入會先暫存於記憶體中,只有在文件透過 SaveAs 儲存後才會真正生效
| Index | Integer。EmbeddedFiles 名稱樹中從 0 起算的位置。必須滿足 0 <= Index < AttachmentCount。索引會與 AttachmentName 和 AttachmentType 回報的值一致,因此逐一走訪 0..AttachmentCount - 1 時,每個附件都只會被存取一次 |
TBytes 陣列 — 在緊密迴圈中讀取數十個數 MB 的負載之前,請先衡量記憶體壓力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;