function SaveAsPdfAToStream(Stream: TStream; const Options: TPdfASaveOptions): Boolean;
SaveAsPdfAToStream 是 SaveAsPdfA 的串流版本,產生的 PDF/A-1b 輸出完全相同,只是結果會寫進呼叫端提供的任何可定位 TStream,不用經過暫存檔,適合 HTTP 上傳流程、BLOB 欄位、記憶體快取層、封存容器(ZIP / TAR)或任何不想讓 PDF/A 位元組碰到磁碟的工作流程
後處理邏輯和 SaveAsPdfA(FileName, Options) 完全一致,先執行基底 SaveAs,再以遞增更新注入 XMP 中繼資料串流,按照 ISO 19005-1 6.7.3 / Cor.1 Table 1 把 Document Information Dictionary 轉成 XMP 形式,並嵌入 6.7.8 要求的 pdfaid extension schema 說明,再加入參照內嵌 ICC profile 的 OutputIntent,預設使用 sRGB,也可透過 Options.IccProfileData 自訂,接著更新 catalog 讓它們彼此連結,最後補上 6.1.3 所需的 trailer /ID 陣列,留白的 Options 欄位會由 FPDF_GetMetaText 和 FPDF_GetFileIdentifier 自動補值,所以一般呼叫只要設 Conformance
成功時回傳 True,輸出串流會停在最後一個寫入位元組之後的位置,若基底 SaveAs 失敗,或 PDF/A 後處理無法掛上去,則回傳 False,常見原因是來源 PDF 已加密,而 PDF/A 不允許這種情況
Write 和 Seek,像 TMemoryStream、TFileStream 或任何同時支援兩者的子類別都可以SaveAsPdfAToStream 不會保留原本位置之前的內容,這個函式不會假設你要把資料寫到尾端TMemoryStream,再把它的 Memory 加 Size 交給 HTTP clientsaRemoveSecurity
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;