property Attachment[Index: Integer]: TBytes;
Los documentos PDF pueden llevar archivos auxiliares arbitrarios, como hojas de cálculo de origen, documentos Word originales, facturas adjuntas, cargas XML firmadas, paquetes ZIP e incluso otros PDF, dentro de un contenedor a nivel de documento llamado árbol de nombres EmbeddedFiles. Cada entrada es un diccionario de especificación de archivo PDF cuyo flujo contiene los bytes reales del archivo adjunto. PDFiumPas expone ese árbol como un índice plano basado en cero, de 0 a AttachmentCount - 1
Leer Attachment[Index] devuelve el contenido de bytes decodificado del archivo adjunto como un arreglo TBytes, exactamente los bytes que extraería cualquier otro lector de PDF cuando el usuario haga clic en el icono del clip y guarde el adjunto. Los bytes devueltos ya están descomprimidos; puedes escribirlos directamente en disco, enviarlos a un flujo o pasarlos a otra instancia de TPdf si el adjunto es a su vez un PDF
La escritura reemplaza en el sitio el flujo de archivo de una ranura de adjunto existente. La ranura debe existir ya; usa CreateAttachment primero si necesitas añadir una entrada nueva. Las escrituras se almacenan en memoria y solo se vuelven persistentes después de guardar el documento con SaveAs
| Index | Integer. Posición basada en cero en el árbol de nombres EmbeddedFiles. Debe cumplir 0 <= Index < AttachmentCount. Los índices coinciden con los que informan AttachmentName y AttachmentType, así que iterar 0..AttachmentCount - 1 visita cada adjunto exactamente una vez |
TBytes en una sola asignación, así que mide la presión de memoria antes de leer decenas de cargas de varios megabytes en un bucle ajustadoAttachment[Index] nunca cambia el tamaño del árbol EmbeddedFiles; solo reemplaza los bytes del flujo. Para eliminar una entrada usa 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;