PDFium Delphi Component 文件

LoadCustomDocument 方法

组件: TPdf  ·  单元: PDFium
使用 PDFium 的按需块读取器从任何可定位的 TStream 加载 PDF,因此数 GB 的文档以及远程或数据库支撑的数据源无需事先完整读入内存

语法

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 类函数

备注

示例

// 流式加载,流所有权转移给 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;

参见

LoadDocument, Active, Password, FileName