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;
property SaveMemoryLimit: Int64;
property SaveTemporaryDirectory: string;
property LastSaveSpillCount: Integer;
property LastSaveLargestMemoryBuffer: Int64;
| SaveMemoryLimit | スピルする前に各内部保存ストアが保持できるバッキングメモリ容量の上限。既定値は 64 MiB |
| SaveTemporaryDirectory | スピルファイルに使用される既存ディレクトリ。空の値ではプロセスの一時ディレクトリを使用します |
| LastSaveSpillCount | 最新の保存パイプラインでスピルした内部作業ストアの数 |
| LastSaveLargestMemoryBuffer | 最新の保存パイプラインで観測された最大の単一バッキングメモリ容量 |
TPdfRandomAccessStore は TStream から派生し、カーソル非依存の位置指定 I/O に加えて、通常の逐次読み取り、書き込み、シーク、サイズ変更をサポートします
データは論理終端が MemoryLimit 以下である限り、動的サイズのメモリバッファに留まります
上限を越える最初の操作は排他的な一時ファイルを作成し、既存のバイトを 1 回コピーし、メモリバッファをスクラブし、ストアの残りのライフタイムはファイルバックエンドを使い続けます
一時ハンドルは close 時削除とランダムアクセスフラグを使用し、共有を許可せず、通常の破棄またはコンストラクタのロールバックで削除されます
個々の操作は内部クリティカルセクションで直列化されます。並行呼び出し側が逐次カーソルを争奪してはならない場合は、ReadAt と WriteAt が推奨されます
ストアは LoadCustomDocument に直接渡せます。PDFium ブロックコールバックは位置指定読み取りを使用し、ストアカーソルを変更しません
TPdf は、コア保存、すべての保存済み PDF 後処理ワークスペース、および中間の標準変換、検証、暗号化、DSS、PAdES ステージングに、構成済みポリシーを使用します
ネイティブのインクリメンタル xref ストリーム修復は、固定サイズのテールウィンドウと辞書ウィンドウを読み取り、変更されていない範囲を有界のチャンクでコピーしながら検証済みの編集を適用します
MemoryBytes は論理コンテンツサイズではなくバッキングバッファ容量を報告しますPeakMemoryBytes は MemoryLimit を超えませんLastSaveLargestMemoryBuffer は同時にアクティブなストアの合計ではなく、最大の単一内部ストアですTBytes は含まれませんMemoryLimit は 0 から High(Integer) の間でなければなりませんFPDF_FILEACCESS ABI は、バッキングストア自体がより大きな Int64 サイズを持つ場合でも、4 GiB のファイル長制限を保持しますTemporaryFileName は診断用のみです。ライブファイルは排他的に開かれており、呼び出し側が再び開いてはなりません
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;