property Attachment[Index: Integer]: TBytes;
PDF-документы могут нести с собой произвольные вспомогательные файлы (исходные таблицы, оригинальные Word-документы, приложенные счета, подписанные XML-нагрузки, ZIP-архивы и даже другие PDF) внутри контейнера уровня документа — дерева имён EmbeddedFiles. Каждая запись — словарь файловой спецификации PDF, чей поток хранит фактические байты приложенного файла. PDFium Delphi Component показывает это дерево плоским индексом с нуля от 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;