property AttachmentCount: Integer; // read only
AttachmentCount перечисляет встроенные файловые потоки, доступные через дерево имён /Names /EmbeddedFiles в каталоге (раздел 7.11 спецификации PDF 1.7). Это произвольные файлы (XML, таблицы, исходники CAD, подписанный XML, ZIP-архивы…), упакованные внутрь PDF и показываемые ридерами в боковой панели “Attachments”. PDF/A-3 специально требует встраивать так каждый релевантный исходный артефакт ради долгосрочной воспроизводимости
Значение равно 0, когда Active равно False или в документе нет встроенных файлов. Аннотации file-attachment (подтип /FileAttachment) здесь не считаются — это аннотации уровня страницы, и они видны через AnnotationCount. PDFium Delphi Component отдаёт встроенные потоки как TBytes через Attachment[Index]; человекочитаемое имя файла и тип в стиле MIME доступны через AttachmentName[Index] и AttachmentType[Index]
Типичный цикл: for I := 0 to Pdf.AttachmentCount - 1 do. Каждое обращение к Attachment[I] распаковывает встроенный файловый поток в память, поэтому закэшируйте TBytes, если их нужно записать на диск и отдать парсеру. Добавление или удаление вложения делает индексы недействительными — после изменения перечитайте AttachmentCount
Перечисляется только дерево имён /EmbeddedFiles. Связанный файл PDF 2.0 (ISO 32000-2 §7.11.4), на который ссылаются исключительно из массива /AF — в каталоге, на странице, в аннотации или любом другом объекте — и который заодно не зарегистрирован в дереве имён, не учитывается и не имеет индекса для Attachment, AttachmentName или AttachmentRelationship. Это касается и файлов, записанных SaveAsWithAssociateFiles, который добавляет только записи /AF. Большинство производителей PDF/A-3, включая инструменты Factur-X и ZUGFeRD, регистрируют каждый связанный файл в обоих местах, поэтому такие файлы отображаются как обычно
FeatureSupported(feAttachment), чтобы понять, поддерживает ли установленный билд PDFium изменение имён вложений
var I: Integer;
var Data: TBytes;
for I := 0 to Pdf1.AttachmentCount - 1 do
begin
Data := Pdf1.Attachment[I];
TFile.WriteAllBytes(Pdf1.AttachmentName[I], Data);
end;