PDFium Delphi Component Docs

境界付きランダムアクセスストレージ

コンポーネント: TPdf  ·  ユニット: PDFium
シーク可能な作業データを呼び出し側が選択したメモリ上限の下に保ち、大きな内容はプライベート一時ストレージへスピルします

構文

const PdfDefaultStorageMemoryLimit = 64 * 1024 * 1024;

type TPdfStorageBackend = (psbMemory, psbTemporaryFile);

constructor TPdfRandomAccessStore.Create(AMemoryLimit: Int64 = PdfDefaultStorageMemoryLimit; const ATemporaryDirectory: string = '');

destructor Destroy; override;

function Read(var Buffer; Count: Longint): Longint; override;

function Seek(Offset: Int64; Origin: TSeekOrigin): Int64; override;

function Write(const Buffer; Count: Longint): Longint; override;

function ReadAt(Offset: Int64; var Buffer; Count: Longint): Longint;

function WriteAt(Offset: Int64; const Buffer; Count: Longint): Longint;

procedure CopyToStream(Destination: TStream; BufferSize: Integer = 1048576);

procedure Flush;

procedure SpillToDisk;

property Backend: TPdfStorageBackend;

property MemoryBytes: Int64;

property MemoryLimit: Int64;

property PeakMemoryBytes: Int64;

property Spilled: Boolean;

property TemporaryDirectory: string;

property TemporaryFileName: string;

TPdf 保存設定

property SaveMemoryLimit: Int64;

property SaveTemporaryDirectory: string;

property LastSaveSpillCount: Integer;

property LastSaveLargestMemoryBuffer: Int64;

SaveMemoryLimitスピルする前に各内部保存ストアが保持できるバッキングメモリ容量の上限。既定値は 64 MiB
SaveTemporaryDirectoryスピルファイルに使用される既存ディレクトリ。空の値ではプロセスの一時ディレクトリを使用します
LastSaveSpillCount最新の保存パイプラインでスピルした内部作業ストアの数
LastSaveLargestMemoryBuffer最新の保存パイプラインで観測された最大の単一バッキングメモリ容量

説明

TPdfRandomAccessStoreTStream から派生し、カーソル非依存の位置指定 I/O に加えて、通常の逐次読み取り、書き込み、シーク、サイズ変更をサポートします

データは論理終端が MemoryLimit 以下である限り、動的サイズのメモリバッファに留まります

上限を越える最初の操作は排他的な一時ファイルを作成し、既存のバイトを 1 回コピーし、メモリバッファをスクラブし、ストアの残りのライフタイムはファイルバックエンドを使い続けます

一時ハンドルは close 時削除とランダムアクセスフラグを使用し、共有を許可せず、通常の破棄またはコンストラクタのロールバックで削除されます

個々の操作は内部クリティカルセクションで直列化されます。並行呼び出し側が逐次カーソルを争奪してはならない場合は、ReadAtWriteAt が推奨されます

ストアは LoadCustomDocument に直接渡せます。PDFium ブロックコールバックは位置指定読み取りを使用し、ストアカーソルを変更しません

TPdf は、コア保存、すべての保存済み PDF 後処理ワークスペース、および中間の標準変換、検証、暗号化、DSS、PAdES ステージングに、構成済みポリシーを使用します

ネイティブのインクリメンタル xref ストリーム修復は、固定サイズのテールウィンドウと辞書ウィンドウを読み取り、変更されていない範囲を有界のチャンクでコピーしながら検証済みの編集を適用します

メモリ計上

制約

var
  Store: TPdfRandomAccessStore;
begin
  Pdf.SaveMemoryLimit := 16 * 1024 * 1024;
  Pdf.SaveTemporaryDirectory := TPath.GetTempPath;
  Pdf.SaveAs('output.pdf');
  Log(Pdf.LastSaveSpillCount, Pdf.LastSaveLargestMemoryBuffer);

  Store := TPdfRandomAccessStore.Create(4 * 1024 * 1024);
  try
    Store.CopyFrom(SourceStream, SourceStream.Size);
    Store.Position := 0;
    Pdf.LoadCustomDocument(Store, False);
  finally
    Pdf.Active := False;
    Store.Free;
  end;
end;

関連項目

LoadCustomDocument, SaveAs