procedure LoadCustomDocument(AStream: TStream; AOwnsStream: Boolean = False);
procedure LoadCustomDocument(AStream: TStream; AOwnsStream: Boolean; const Options: TPdfLoadOptions; out Report: TPdfLoadReport);
LoadCustomDocument 是带缓冲的
LoadDocument 各重载的流式对应版本。它通过 v1.8.0 引入的
TPdfStreamAdapter 辅助类由 PDFium 的
FPDF_LoadCustomDocument 入口点支撑,PDFium 仅在需要时才从
AStream 拉取数据块,因此流不会被复制进内存:覆盖 4 GB
PDF 的 TFileStream、HTTP 支撑的 TStream 或数据库 BLOB 流都无需先把整个数据
驻留到 RAM 即可使用
AStream 必须支持定位。其生命周期必须延续到文档关闭(调用
UnloadDocument 或把
Active 置回 False)。传入
AOwnsStream = True 可把流的所有权交给该
TPdf — 适配器随后会在
UnloadDocument 执行时释放 AStream。若调用方希望在
文档关闭后继续保留流,请传入 False
LoadCustomDocument 特意设计为独立方法(而非又一个
LoadDocument 重载),这样传入 TMemoryStream
子类的调用方就不会意外绑定到带缓冲的
LoadDocument(TMemoryStream, Boolean) 重载 —
Pascal 参数形状完全相同,但语义截然不同(缓冲与
按需)
策略重载应用与 LoadDocument 所述相同的兼容、严格或恢复行为以及有界 xref 审计。审计使用定位读取,并在 PDFium 继续按需访问之前恢复源游标
TPdfLoadOptions 携带 Mode、AuditByteLimit、MaxIssues、MaxXrefSections、MaxXrefEntries、MaxObjectNumber、ValidateObjectOffsets 和 RequireFinalEndOfFileMarker,以及 Default 类函数
PasswordAStream 做任何假设 — 它可以是 TFileStream、TMemoryStream,或任何遵守 Seek 和 Read 的 TStream 子类AOwnsStream = True 转移所有权
// 流式加载,流所有权转移给 Pdf1
var
Stream: TFileStream;
begin
Stream := TFileStream.Create('C:\Huge.pdf', fmOpenRead or fmShareDenyWrite);
Pdf1.LoadCustomDocument(Stream, True); // Pdf1 在 UnloadDocument 时释放 Stream
Pdf1.Active := True;
ShowMessage('Pages: ' + IntToStr(Pdf1.PageCount));
end;
// 外部持有的流 — 调用方在 UnloadDocument 之后释放它
var
Stream: TFileStream;
begin
Stream := TFileStream.Create('C:\Live.pdf', fmOpenRead or fmShareDenyNone);
try
Pdf1.LoadCustomDocument(Stream, False);
Pdf1.Active := True;
DoWork;
Pdf1.Active := False;
finally
Stream.Free;
end;
end;