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 クラス関数を保持します
Password を設定してくださいAStream について何も仮定しません。TFileStream、TMemoryStream、または Seek と Read を正しく実装する任意の TStream サブクラスを使用できますAOwnsStream = True で所有権を移してください
// 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;