function SaveAsPdfAToStream(Stream: TStream; const Options: TPdfASaveOptions): Boolean;
SaveAsPdfAToStream es la contrapartida de streaming de
SaveAsPdfA — produce la misma salida PDF/A-1b,
pero escribe el resultado en cualquier TStream posicionable que proporcione el
llamador en lugar de pasar por un archivo temporal. Útil para canalizaciones
de subida HTTP, columnas BLOB, capas de caché en memoria, contenedores de
archivo (ZIP / TAR) o cualquier flujo de trabajo donde los bytes PDF/A nunca
necesiten tocar disco.
La lógica de posprocesado es idéntica a
SaveAsPdfA(FileName, Options): primero se ejecuta el SaveAs base,
luego una actualización incremental inyecta el flujo de metadatos XMP
(que tiende un puente del Document Information Dictionary a la forma XMP
según ISO 19005-1 6.7.3 / Cor.1 Tabla 1 e incrusta la descripción del
esquema de extensión pdfaid exigida por 6.7.8), el OutputIntent
que referencia un perfil ICC incrustado (sRGB por defecto, personalizado
mediante Options.IccProfileData), una actualización del catalog
que los enlaza y un array /ID de tráiler requerido
por 6.1.3. Los campos de Options dejados vacíos se autorrellenan desde
FPDF_GetMetaText y FPDF_GetFileIdentifier
de modo que el llamador habitual solo establece Conformance.
Devuelve True en caso de éxito. El flujo de salida queda en
la posición tras el último byte escrito. Devuelve False
si el SaveAs base falló o si el posprocesado PDF/A no pudo
adjuntarse (normalmente porque el PDF de origen estaba cifrado, lo cual
PDF/A prohíbe).
Write y Seek — un TMemoryStream, TFileStream o cualquier subclase que respete ambos sirve.SaveAsPdfAToStream no se conservan si el flujo tiene datos más allá de la posición actual; la función no asume semántica de posicionarse al final.Memory + Size directamente al cliente HTTP.saRemoveSecurity primero.
var
Stream: TMemoryStream;
Opts: TPdfASaveOptions;
begin
Stream := TMemoryStream.Create;
try
Opts := Default(TPdfASaveOptions);
Opts.Conformance := pac1b;
if Pdf1.SaveAsPdfAToStream(Stream, Opts) then
begin
Stream.Position := 0;
UploadToArchive(Stream);
end;
finally
Stream.Free;
end;
end;