property AttachmentCount: Integer; // read only
AttachmentCount zählt die eingebetteten Datei-Streams, die über den /Names /EmbeddedFiles-Name-Tree des Katalogs erreichbar sind (PDF 1.7 spec section 7.11). Das sind beliebige Dateien (XML, Tabellen, CAD-Quellen, signiertes XML, ZIP-Archive,…), die im PDF verpackt sind und die Viewer als “Attachments”-Seitenleiste zeigen. PDF/A-3 verlangt genau dafür, dass jedes relevante Quelldatei-Artefakt für langfristige Reproduzierbarkeit so eingebettet wird
Der Wert ist 0, wenn Active False ist und wenn das Dokument keine eingebetteten Dateien trägt. File-Attachment-Annotationen (Subtyp /FileAttachment) werden hier nicht gezählt — das sind Annotationen auf Seitenebene und laufen stattdessen über AnnotationCount. PDFium Delphi Component stellt eingebettete Streams als TBytes über Attachment[Index] bereit; den lesbaren Dateinamen und den MIME-artigen Typ gibt es über AttachmentName[Index] und AttachmentType[Index]
Die typische Schleife ist for I := 0 to Pdf.AttachmentCount - 1 do. Jeder Attachment[I]-Zugriff dekomprimiert den eingebetteten Datei-Stream in den Speicher, cachen Sie also die TBytes, wenn Sie sie auf die Platte schreiben und an einen Parser übergeben wollen. Das Hinzufügen oder Entfernen eines Anhangs macht Indizes ungültig — lesen Sie AttachmentCount nach einer Änderung erneut
Aufgezählt wird nur der /EmbeddedFiles-Namensbaum. Eine zugeordnete PDF-2.0-Datei (ISO 32000-2 §7.11.4), die ausschließlich über ein /AF-Array referenziert wird — am Katalog, an einer Seite, einer Annotation oder einem anderen Objekt — und nicht zusätzlich im Namensbaum registriert ist, wird nicht gezählt und hat keinen Index für Attachment, AttachmentName oder AttachmentRelationship. Das gilt auch für Dateien aus SaveAsWithAssociateFiles, das nur /AF-Einträge hinzufügt. Die meisten PDF/A-3-Erzeuger, einschließlich Factur-X- und ZUGFeRD-Werkzeugen, registrieren jede zugeordnete Datei an beiden Stellen, solche Dateien tauchen also normal auf
FeatureSupported(feAttachment), um zu erkennen, ob der installierte PDFium-Build das Ändern von Anhangsnamen unterstützt
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;