PDFium Delphi Component Docs

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 の引数の形は同一ですが、セマンティクスはまったく異なります (バッファリング vs オンデマンド)

ポリシーオーバーロードは、LoadDocument に文書化されている互換 / 厳格 / 復元の各動作と上限付き xref 監査を同じく適用します。監査は位置指定読み取りを使用し、PDFium がオンデマンドアクセスを続ける前にソースのカーソルを復元します

TPdfLoadOptions は、Mode、AuditByteLimit、MaxIssues、MaxXrefSections、MaxXrefEntries、MaxObjectNumber、ValidateObjectOffsets、RequireFinalEndOfFileMarker に加えて、Default クラス関数を保持します

備考

例

// Streaming load with stream ownership transferred to Pdf1
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create('C:\Huge.pdf', fmOpenRead or fmShareDenyWrite);
  Pdf1.LoadCustomDocument(Stream, True); // Pdf1 frees Stream on UnloadDocument
  Pdf1.Active := True;
  ShowMessage('Pages: ' + IntToStr(Pdf1.PageCount));
end;

// Externally-owned stream — caller frees it after 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