property AttachmentCount: Integer; // read only
AttachmentCount enumera os fluxos de arquivo incorporados acessíveis através da árvore de nomes
do catálogo /Names /EmbeddedFiles (especificação PDF 1.7 seção 7.11). Estes são
arquivos arbitrários (XML, planilhas, CAD fonte, XML assinado, arquivos ZIP,…)
empacotados dentro do PDF e expostos pelos visualizadores como a barra lateral “Attachments”.
PDF/A-3 especificamente requer que todo artefato fonte relevante seja incorporado
desta forma para reprodutibilidade de longo prazo.
O valor é 0 quando Active é False e quando
o documento não possui arquivos incorporados. Anotações de anexo de arquivo
(subtipo /FileAttachment) não são contadas aqui —
estas são anotações de nível de página e aparecem através de AnnotationCount.
O PDFium Delphi Component expõe fluxos incorporados como TBytes via
Attachment[Index]; o nome de arquivo legível e o tipo MIME estão
disponíveis através de AttachmentName[Index] e
AttachmentType[Index].
O loop típico é for I := 0 to Pdf.AttachmentCount - 1 do. Cada
acesso a Attachment[I] descomprime o fluxo de arquivo incorporado na memória,
então armazene em cache o TBytes se precisar gravá-lo em disco e passá-lo a um
analisador. Adicionar ou remover um anexo invalida índices — releia
AttachmentCount após uma mutação
Apenas a árvore de nomes /EmbeddedFiles é enumerada. Um associated file
do PDF 2.0 (ISO 32000-2 §7.11.4) referenciado somente por um array /AF
— no catálogo, em uma página, em uma anotação ou em qualquer outro objeto —
e que também não esteja registrado na árvore de nomes não é contado e não tem índice
para Attachment, AttachmentName ou
AttachmentRelationship. Isso inclui arquivos gravados por
SaveAsWithAssociateFiles, que adiciona
apenas entradas /AF. A maioria dos produtores de PDF/A-3, incluindo
ferramentas Factur-X e ZUGFeRD, registra cada associated file nos dois lugares, então
esses arquivos são listados normalmente
FeatureSupported(feAttachment) para detectar se a
versão do PDFium instalada suporta modificar nomes de anexos.
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;